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.