0

我对 EtherCAT/CANopen 世界很陌生,并试图实现一个自定义从站。到目前为止,从站正在通过一致性测试,并且想要写入我的从站数据对象之一,从站连接到 CX5120,它被 XAE 发现并且还显示了从站设备。为此,我将我的 ESI 文件复制到了 TwinCAT 文件夹 (C:\TwinCAT\3.1\Config\Io\EtherCAT)。

项目树 从属数据对象 我创建了一个小型结构化文本 PLC 程序,它使用 FB_EcCoESdoWrite 将数据写入地址 0x607A。但是当我将其设置为活动并尝试连接时,Visual Studio 告诉我该设备至少需要一个 Sync Master。此外,当将 bExecute 设置为 TRUE 时,我从函数中收到错误消息。据我了解,我必须在我的 ST 程序和从站之间链接变量,但我不认为需要链接变量,因为 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
4

1 回答 1

0

通过将变量从 PLC 代码链接到设备的 DevState 输入来解决问题。不过,链接到普通的 InfoData 似乎不起作用。

于 2020-03-06T08:59:14.990 回答