TwinCAT CoE: запись в SDO - PullRequest
       93

TwinCAT CoE: запись в SDO

0 голосов
/ 04 марта 2020

Я довольно новичок во вселенной EtherCAT / CANopen и пытаюсь реализовать собственное ведомое устройство. Пока ведомое устройство проходит тест на соответствие и хочет записать в один из моих ведомых объектов данных, ведомое устройство подключено к CX5120, который обнаружен XAE и также показывает ведомое устройство. Для этого я скопировал свой ESI-файл в папку TwinCAT (C: \ TwinCAT \ 3.1 \ Config \ Io \ EtherCAT).

Project Tree Slave Data Objects Я создал небольшую программу структурированного текста PL C, которая использует FB_EcCoESdoWrite для записи данных по адресу 0x607A. Но когда я устанавливаю его активным и пытаюсь подключиться, Visual Studio сообщает, что устройству нужен хотя бы один Syn c Master. Кроме того, при установке bExecute на TRUE я получаю сообщение об ошибке от функции. Насколько я понимаю, мне приходится связывать переменные между моей ST-программой и ведомым, но я не вижу необходимости связывать переменные, потому что на самом деле вызов функции должен управлять передачей? Какие шаги для записи в SDO ES C? Может кто-нибудь сказать мне, что мне не хватает или у меня есть маленький пример под рукой?

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

1 Ответ

0 голосов
/ 06 марта 2020

Исправлена ​​проблема, связывая переменную из кода PL C с DevState-вводом устройства. Связывание с обычными инфо-данными, похоже, не работает.

...