PDA

Просмотр полной версии : Чтение и запись файлов при помощи библиотеки OwenLibFileAsync



FPavel
17.02.2023, 17:49
Доброго дня!

Обучаюсь работе с файлами на ПЛК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),SIZE OF(tTime),ADR(iResult));
IF res=ASYNC_WORKING THEN
state_resRead:=41;
ELSE
state_resRead:=50;
END_IF
41:
res:=OwenFileReadAsync(iReadHandle,ADR(tTime),SIZE OF(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),SI ZEOF(tTime),ADR(iResult));
IF res=ASYNC_WORKING THEN
state_resWrite:=41;
ELSE
state_resWrite:=50;
END_IF
41: (* запись - 2 этап *)
res:=OwenFileWriteAsync(iWriteHandle,ADR(tTime),SI ZEOF(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;

Не могу понять в какой части ошибка и какая.

FPavel
17.02.2023, 18:15
Прошу прощения - глупая ошибка.
При копировании исходника в записи файла на шаге 30 не поменял переменную описателя файла в условии на iWriteHandle.

FPavel
17.02.2023, 18:39
Подскажите, как сохранять разнородные данные?

Хотел сделать два массива - указателей на переменные и размеры переменных.
Но определение указателя требует указания типа. И получается, что массив указателей не соберу.

Как же поступить, чтобы не сохранять/считывать по одной переменной?

Валенок
17.02.2023, 19:01
Подскажите, как сохранять разнородные данные...
struct
...

FPavel
17.02.2023, 19:10
Спасибо!
......

Aera2021
23.04.2024, 10:21
Добрый день. Стоит задача записи данных на FLASH карту с помощью библиотеки OwenLibFileAsync.lib, с записью и чтением разобрался, но возникла проблема с функцией OwenFileEOFAsync(handle,ADR(End_file)). Из описания она должна возвратить значение TRUE если файл закончился но этого не происходит, хотя прочитал уже весь файл.