如何实现FB GetLocalAmsNetId?

问题描述 投票:1回答:1

这是我在stackoverflow上遇到的第一个问题,我希望有人能够帮助我。我正在尝试获取TwinCat PLC系统的本地AmsNetId。该代码在本地TwinCat系统上运行。该功能正常运行,编译没有问题。但是功能块FB_GetLocalAmsNetId似乎从不返回Ams网络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
plc twincat
1个回答
0
投票

您需要在代码中循环调用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
© www.soinside.com 2019 - 2024. All rights reserved.