Как реализовать FB GetLocalAmsNetId?

это мой первый вопрос здесь, в stackoverflow, и я надеюсь, что кто-то сможет мне помочь. Я пытаюсь получить локальный AmsNetId моей системы TwinCat PLC. Код работает в системе TwinCat локально. Функция работает корректно, проблем с компиляцией нет. Но функциональный блок FB_GetLocalAmsNetId никогда не возвращает идентификатор сети Ams. fbGetAmsNetId.bBusy всегда занят. Я не знаю, что я делаю неправильно.

Переменные:

FUNCTION_BLOCK FB_GetAmsNetId
VAR_INPUT
END_VAR
VAR_OUTPUT
END_VAR
VAR
    fbGetAmsNetId : FB_GetLocalAmsNetId;
    bRequestStarted : BOOL := FALSE;
    sAmsNetId : T_AmsNetId;
END_VAR

Программный код:

IF(bRequestStarted = FALSE) THEN
    fbGetAmsNetId(bExecute := TRUE, tTimeOut := T#2S);
    bRequestStarted := TRUE;
ELSE
    IF(NOT fbGetAmsNetId.bBusy) THEN
        sAmsNetId := fbGetAmsNetId.AddrString;
        fbGetAmsNetId.bExecute := FALSE;
        bRequestStarted := FALSE;
    END_IF
END_IF

person manuel2705    schedule 06.12.2019    source источник


Ответы (1)


Вам необходимо циклически вызывать fbGetAmsNetId в вашем коде, иначе FB_GetLocalAmsNetId не сможет завершить свои внутренние операции, выполняющиеся только за один цикл ПЛК.

Например:

fbGetAmsNetId();
IF(bRequestStarted = FALSE) THEN
    fbGetAmsNetId(bExecute := TRUE, tTimeOut := T#2S);
    bRequestStarted := TRUE;
ELSE
    IF(NOT fbGetAmsNetId.bBusy) THEN
        sAmsNetId := fbGetAmsNetId.AddrString;
        fbGetAmsNetId.bExecute := FALSE;
        bRequestStarted := FALSE;
    END_IF
END_IF
person Filippo Boido    schedule 06.12.2019
comment
Большое спасибо, с вашим решением все работает! Почему fbGetAmsNetId.bBusy не работает как «вызов функции»? - person manuel2705; 06.12.2019
comment
Часть реализации функционального блока выполняется только тогда, когда экземпляр функционального блока вызывается, как это fbInstance(). Когда вы вызываете fbInstance.someVariable, вы просто читаете или записываете (в зависимости от операции) переменную, определенную в части объявления этого FB. - person Filippo Boido; 06.12.2019