Доброго дня!
Обучаюсь работе с файлами на ПЛК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;


Ответить с цитированием
