TwinCAT CoE:写入 SDO
TwinCAT CoE: Write to SDO
我是 EtherCAT/CANopen 世界的新手,正在尝试实现自定义从属。
到目前为止,从属设备正在通过一致性测试并且想要写入我的一个从属数据对象,从属设备连接到 CX5120,它被 XAE 找到并且还显示了从属设备。
为此,我将 ESI-file 复制到 TwinCAT 文件夹 (C:\TwinCAT.1\Config\Io\EtherCAT).
我创建了一个小型结构化文本 PLC 程序,它使用 FB_EcCoESdoWrite 将数据写入地址 0x607A。但是当我将其设置为活动状态并尝试连接时,Visual Studio 告诉我该设备至少需要一个 Sync Master。此外,当将 bExecute 设置为 TRUE 时,我从函数中得到一个错误。据我所知,我必须 link 我的 ST 程序和从机之间的变量,但我没有看到 linking 变量的需要,因为 afaik 函数调用应该管理传输?写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
通过将变量从 PLC 代码链接到设备的 DevState 输入解决了问题。
链接到纯 InfoData 似乎不起作用。
我是 EtherCAT/CANopen 世界的新手,正在尝试实现自定义从属。 到目前为止,从属设备正在通过一致性测试并且想要写入我的一个从属数据对象,从属设备连接到 CX5120,它被 XAE 找到并且还显示了从属设备。 为此,我将 ESI-file 复制到 TwinCAT 文件夹 (C:\TwinCAT.1\Config\Io\EtherCAT).
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
通过将变量从 PLC 代码链接到设备的 DevState 输入解决了问题。 链接到纯 InfoData 似乎不起作用。