我是EtherCAT/CANopen领域的新手,正在尝试实现一个自定义的从属。到目前为止,slave正在通过一致性测试,并且想要写入我的Slave数据对象之一,slave连接到一个CX5120,这是XAE发现的,也显示了Slave设备。为此,我将ESI-file复制到TwinCAT文件夹(C:\TwinCAT\3.1Config\Io\EtherCAT)。
我已经创建了一个小的结构化文本PLC程序,它使用FB_EcCoESdoWrite将数据写入地址0x607A。但当我将其设置为活动状态并尝试连接时,Visual Studio告诉我该设备至少需要一个Sync Master。此外,当将bExecute设置为TRUE时,我从函数中得到一个错误。据我所知,我必须链接我的ST程序和从属程序之间的变量,但我认为没有必要链接变量,因为函数调用应该管理传输?向ESC的SDO写入的步骤是什么?有人能告诉我我遗漏了什么吗?或者手头有一个小例子?
PROGRAM MAIN
VAR
heartbeat : UINT;
fbSdoWrite : FB_EcCoESdoWrite;
sNetId : T_AmsNetId := '5.76.204.148.1.1'; (* NetId of EtherCAT Master *)
nSlaveAddr : UINT := 1001; (* Port Number of EtherCAT Slave *)
nIndex : WORD := 16#607A; (* CoE Object Index *)
nSubIndex : BYTE := 0; (* Subindex of CoE Object *)
nValue : UINT := 16#AAAA; (* variable to be written to the CoE Object *)
bExecute : BOOL; (* rising edge starts writing to the CoE Object *)
bError : BOOL;
nErrId : UDINT;
END_VAR
fbSdoWrite(
sNetId := sNetId,
nSlaveAddr := nSlaveAddr,
nIndex := nIndex,
nSubIndex := nSubIndex,
pSrcBuf := ADR(nValue),
cbBufLen := SIZEOF(nValue),
bExecute := bExecute
);
IF NOT fbSdoWrite.bBusy THEN
bExecute := FALSE;
IF NOT bError THEN
(* write successful *)
bError := FALSE;
nErrId := 0;
ELSE
(* write failed *)
bError := fbSdoWrite.bError;
nErrId := fbSdoWrite.nErrId;
END_IF
fbSdoWrite(bExecute := FALSE);
END_IF
发布于 2020-03-06 16:59:15
通过将PLC代码中的变量链接到设备的DevState输入,修复了此问题。不过,链接到普通InfoData似乎不起作用。
https://stackoverflow.com/questions/60522006
复制相似问题