TwinCAT 3: блок остается занятым

Я хочу сохранить некоторые данные в файл.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 на шаге 1, но затем перестаете его вызывать. Флаг bBusy поднимается до высокого уровня (true) на шаге 1, но никогда не может быть изменен на что-либо еще, поскольку вы никогда больше не вызовете FB. Вам нужно позвонить на шаг 2. Помните, что bExecute также является триггером для ADS-команды, поэтому, как только вы сделали это на шаге 2, вы можете установить для bExecute-input значение FALSE на шаге 2 и вперед, так как вы уже запустили команду.

...
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.

Другие вопросы по тегам