如何实现FB GetLocalAmsNetId?

How to implement FB GetLocalAmsNetId?

这是我在 Whosebug 上的第一个问题,我希望有人能帮助我。 我正在尝试获取我的 TwinCat PLC 系统的本地 AmsNetId。本地 TwinCat 系统上的代码是 运行。 该函数运行正常,编译没有问题。但是功能块 FB_GetLocalAmsNetId 似乎从来没有 return Ams Net Id。 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

您需要在您的代码中循环调用 fbGetAmsNetId,否则 FB_GetLocalAmsNetId 将无法完成仅执行一个 plc 周期的内部操作。

例如:

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