Доброго дня!
Обучаюсь работе с файлами на ПЛК110-32 [M02].
На основе примеров собрал свой минимальный тестовый пример.
Устанавливаю биты команд записи bWriteFile и чтения bReadFile по которым запускается обмен с файлом.
Файл разместил в RAM области.
Для быстрого изменения переменной - удваиваю её установкой бита bDoubleTime.
Но переменная не восстанавливается.
Код:
PROGRAM PLC_PRG
VAR
tTime: TIME;
blinkTest: BLINK;
bReadFile: BOOL;
bWriteFile: BOOL;
bDoubleTime: BOOL;
res: ASYNC_RET_VALUE;
iResult:DWORD;
sFileName:STRING := 'ram:configure.dat';
iFileReadState:INT;
iReadHandle:DWORD:=0;
state_resRead: INT;
iFileWriteState: INT;
iWriteHandle: DWORD := 0;
state_resWrite: INT;
END_VAR
Код:
(* сохраняемая в файле переменная tTime: её использование и быстрое изменение для теста *)
blinkTest(enable:=TRUE, timelow:=tTime, timehigh:=tTime);
(*out:=blinkTest.OUT;*)
IF tTime<t#500ms THEN
tTime := t#500ms;
END_IF;
IF bDoubleTime THEN
bDoubleTime:=FALSE;
tTime:=tTime+tTime;
END_IF;
(* конечный автомат чтения переменной *)
CASE iFileReadState OF
10: (* ожидание "внешней" команды чтения *)
IF bReadFile THEN
state_resRead:=20;
bReadFile:=FALSE;
END_IF;
20: (* открытие файла для чтения - 1 этап *)
res:=OwenFileOpenAsync(sFileName, 'r', ADR(iReadHandle));
IF res=ASYNC_WORKING THEN
state_resRead:=30;
END_IF;
30: (* открытие файла для чтения - 2 этап *)
res:=OwenFileOpenAsync(sFileName, 'r', ADR(iReadHandle));
IF res=ASYNC_DONE THEN
IF iReadHandle<>0 THEN
state_resRead:=40;
ELSE
state_resRead:=20;
END_IF
ELSIF res<0 THEN
state_resRead:=10;
END_IF
40: (* чтение из файла - 1 этап *)
res:=OwenFileReadAsync(iReadHandle,ADR(tTime),SIZEOF(tTime),ADR(iResult));
IF res=ASYNC_WORKING THEN
state_resRead:=41;
ELSE
state_resRead:=50;
END_IF
41:
res:=OwenFileReadAsync(iReadHandle,ADR(tTime),SIZEOF(tTime),ADR(iResult));
IF res=ASYNC_DONE THEN
IF iResult>=0 THEN
state_resRead:=50;
ELSE
state_resRead:=50;
END_IF
ELSIF res<0 THEN
state_resRead:=50;
END_IF
50: (* закрытие *)
res:=OwenFileCloseAsync(iReadHandle,ADR(iResult));
IF res=ASYNC_DONE THEN
IF iResult=0 THEN
state_resRead:=10;
ELSE
state_resRead:=10;
END_IF
ELSIF res<0 THEN
state_resRead := 10;
END_IF;
ELSE
state_resRead:=10;
END_CASE;
CASE iFileWriteState OF
10:
IF bWriteFile THEN
state_resWrite:=20;
bWriteFile:=FALSE;
END_IF;
20:
res:=OwenFileOpenAsync(sFileName, 'w', ADR(iWriteHandle));
IF res=ASYNC_WORKING THEN
state_resWrite:=30;
END_IF;
30:
res:=OwenFileOpenAsync(sFileName, 'w', ADR(iWriteHandle));
IF res=ASYNC_DONE THEN
IF iReadHandle<>0 THEN
state_resWrite:=40;
ELSE
state_resWrite:=10;
END_IF
ELSIF res<0 THEN
state_resWrite:=10;
END_IF
40: (* запись *)
res:=OwenFileWriteAsync(iWriteHandle,ADR(tTime),SIZEOF(tTime),ADR(iResult));
IF res=ASYNC_WORKING THEN
state_resWrite:=41;
ELSE
state_resWrite:=50;
END_IF
41: (* запись - 2 этап *)
res:=OwenFileWriteAsync(iWriteHandle,ADR(tTime),SIZEOF(tTime),ADR(iResult));
IF res=ASYNC_DONE THEN
IF iResult>=0 THEN
state_resWrite:=50;
ELSE
state_resWrite:=50;
END_IF
ELSIF res<0 THEN
state_resWrite:=50;
END_IF
50: (* закрытие *)
res:=OwenFileCloseAsync(iWriteHandle,ADR(iResult));
IF res=ASYNC_WORKING THEN
state_resWrite:=51;
ELSE
state_resWrite:=10;
END_IF;
51: (* закрытие *)
res:=OwenFileCloseAsync(iWriteHandle,ADR(iResult));
IF res=ASYNC_DONE THEN
IF iResult=0 THEN
state_resWrite:=10;
ELSE
state_resWrite:=10;
END_IF
ELSIF res<0 THEN
state_resWrite := 10;
END_IF;
ELSE
state_resWrite:=10;
END_CASE;
(* обновление стадий чтения или записи *)
iFileReadState:=state_resRead;
iFileWriteState:=state_resWrite;
Не могу понять в какой части ошибка и какая.