TwinCAT 3:块保持忙碌

TwinCAT 3 : Block stays busy

我想将一些数据保存到 .txt 文件中。我可以创建它,但我无法向其中写入文本,因为 FB 一直很忙。

    CASE counter OF
    1:
        fileOpen.sNetId := '';
        fileOpen.sPathName := 'C:\test\test.txt';
        fileOpen.nMode := FOPEN_MODEWRITE;
        fileOpen.bExecute := TRUE;
        fileOpen.tTimeout := T#200MS;

        fileOpen();

        counter := 2;
    2:
        IF NOT fileOpen.bBusy AND NOT fileOpen.bError THEN (* bBusy stays true*)
            counter := 3;
        END_IF
    3:
        fileOpen.bExecute := FALSE;
        fbPutFile(sNetId := '', hFile := fileOpen.hFile, sLine := 'FOO', bExecute := TRUE, tTimeout := INT_TO_TIME(200), bBusy =>, bError =>, nErrId =>);
     END_CASE

我进入了第2步,但是我无法进入第3步,问题出在哪里?

因为您已经停止调用打开文件功能块。您在这里所做的是在第 1 步中调用 FB_FileOpen,然后停止调用它。 bBusy 标志在步骤 1 中变高(真),但永远不能更改为任何其他内容,因为您再也不会调用 FB。您还需要在步骤 2 中调用它。请记住,bExecute 也是 ADS 命令的触发器,因此在第 2 步中完成后,您可以在第 2 步中将 bExecute-input 设置为 FALSE,因为您已经触发了命令。

...
2:
    fileOpen(bExecute := false);
    IF NOT fileOpen.bBusy AND NOT fileOpen.bError THEN (* bBusy stays true*)
        counter := 3;
    END_IF
...

还要记住,Beckhoffs FB_FileOpen 假定目录 C:\test 存在(尽管文件 test.txt 不存在,如果您使用 FOPEN_MODEWRITE 打开它,它将自动创建)。要创建所有必要的目录(如果它们尚不存在)使用 TwinCATs FB_CreateDir.