опечатку, как объяснение не рассматриваете?
Вид для печати
Конечно рассматриваю. Если бы Владислав ответил, что это опечатка, то вопрос был бы сразу закрыт.
Да, очепятка.
Владислав, добрый день!
Подскажите по такому вопросу:
Делаю архивирование на флешку.
С записью все ОК.
Некая проблема с чтением.
При MinCycleLenght в 1 мс - выходит статус ASYNC_BLOCK_ACCESS
Опытным путем понял, что при цикле в 4 мс ошибка не вылетает, и все нормально работает.
Флешка пустая, 8 гб.
Далее от ошибки не избавиться никак, помогает лишь перезагрузка.
Пробовал при ошибке выполнять OwenFileCloseAllOpenAsync, так же не помогает.
И подскажите - SysLibDir не поддерживается?
Можно как то папки создавать?
Если всё и сразу делать с циклом 1 мс - конечно будет блокировка, вы сколько файлов за раз пытаетесь обрабатывать? Максимум можно 5 штук.
Файл один.
Чтение и запись разнесены (и блокируют друг друга, чтобы избежать одновременной работы с файлом).
Все обращения к файл разделены на два этапа (как в примере).
Цитата:
CASE state OF
0: (*Открытие файла - этап 1*)
res:=OwenFileOpenAsync(Queue[0],'r',ADR(handle));(*возвращает дескриптор файла, либо 0 (в некоторых случаях 4 294 967 295 или -1) в случае ошибки*)
IF res=ASYNC_WORKING THEN
state:=1;(*нет ошибок, переход на открытие файла этап 2*)
ELSE
state:=0;
END_IF
1: (*Открытие файла - этап 2*)
res:=OwenFileOpenAsync(Queue[0],'r',ADR(handle));
IF res=ASYNC_DONE THEN (*если "готов", и нет ошибок, то переход в состояние 2*)
IF handle<>0 THEN
state:=11;(*нет ошибок, переход на чтение длины файла 1*)
ELSE
state:=0;(*иначе можно перейти на 1 этап открытия файла, либо предусмотреть собственное действие самостоятельно *)
END_IF
ELSIF res<0 THEN
state:=0;
END_IF
11: (*Чтение размера, этап 1*)
res:=OwenFileGetSizeAsync(Queue[0],ADR(sizeRead));(*возвращает дескриптор файла, либо 0 (в некоторых случаях 4 294 967 295 или -1) в случае ошибки*)
IF res=ASYNC_WORKING THEN
state:=12;(*нет ошибок, переход на открытие файла этап 2*)
ELSE
state:=4;
END_IF
12: (*Чтение размера, этап 2*)
res:=OwenFileGetSizeAsync(Queue[0],ADR(sizeRead));(*возвращает дескриптор файла, либо 0 (в некоторых случаях 4 294 967 295 или -1) в случае ошибки*)
IF res=ASYNC_DONE THEN
(*нет ошибок, переход на открытие файла этап 2*)
По условию либо state:=13; либо state:=2;
ELSE
state:=4;
END_IF
13: (*Установим начальную позиция для чтения этап 1*)
res:=OwenFileSetPosAsync(handle,posQueue,ADR(resul t));(*возвращает дескриптор файла, либо 0 (в некоторых случаях 4 294 967 295 или -1) в случае ошибки*)
IF res=ASYNC_WORKING THEN
state:=14;(*нет ошибок, переход на открытие файла этап 2*)
ELSE
state:=4;
END_IF
14: (*Установим начальную позиция для чтения этап 1*)
res:=OwenFileSetPosAsync(handle,posQueue,ADR(resul t));(*возвращает дескриптор файла, либо 0 (в некоторых случаях 4 294 967 295 или -1) в случае ошибки*)
IF res=ASYNC_DONE THEN
state:=2;(*нет ошибок, переход на открытие файла этап 2*)
ELSE
state:=4;
END_IF
2: (*Чтение из файл - этап 1*)
(*Читаем кусок из файла*)
res:=OwenFileReadAsync(handle,ADR(arrPostData), sizeRead, ADR(result));(*пишем данные *)
IF res=ASYNC_WORKING THEN
state:=3;(*нет ошибок, переход на запись файла этап 2, либо по усмотрению пользователя*)
ELSE
state:=4;(*иначе можно перейти на этап закрытия файла, либо предусмотреть собственное действие самостоятельно *)
END_IF
3: (*Запись в файл - этап 2*)
res:=OwenFileReadAsync(handle,ADR(arrPostData), sizeRead, ADR(result));(*пишем данные *)
IF res=ASYNC_DONE THEN
SysMemCpy(ADR(strAll),ADR(arrPostData),2048);
state:=4;
bGoGet:=TRUE;
ELSIF res<0 THEN
state:=0;
END_IF
4: (*Закрываем файл - этап 1*)
res:=OwenFileCloseAsync(handle, ADR(result));
IF res=ASYNC_WORKING THEN
state:=5;(*нет ошибок, переход на закрытие файла этап 2*, либо по усмотрению пользователя*)
ELSE
state:=0;(*иначе можно перейти на этап открытия файла, либо предусмотреть собственное действие самостоятельно *)
END_IF
5: (*Закрываем файл - этап 2*)
res:=OwenFileCloseAsync(handle, ADR(result));
IF res=ASYNC_DONE THEN
bDataRead:=FALSE;
handle:=0;
IF result=0 THEN
state:=0;(*если файл закрыт успешно, то выходим из условного оператора CASE *)
ELSE
state:=0;(*иначе всё равно выходим, либо предусмореть собственное действие*)
END_IF
ELSIF res<0 THEN (*выход, либо собственное действие*)
state:=0;
END_IF
ELSE state:=0;
END_CASE
ASYNC_BLOCK_ACCESS возвращается если есть доступ к библиотеке с др. запросом до окончания первого.
Как же тогда возможность работы с 5 файлами?
Тогда точно будет доступ к библиотеке с другим запросом, до окончания первого.
Что делать с этим ASYNC_BLOCK_ACCESS?
Только перезагружать?
Чтобы не плодить тем:
Столкнулся с аналогичной проблемой.
Использовал работающий блок на ПЛК160/ПЛК110[М01] записи в файл на библиотеке SysLibFile на ПЛК110[M02]. На выходе получал пустой файл. Перепроверил опять же на ПЛК160 - работает. Переписал блок на библиотеке OwenLibFileAsync - на выходе пустой файл. Писал на внутреннюю флэш. Подумал, что возможно дело в старой прошивке (стояла 0.52). При попытке записать файл прошивки: либо практически сразу отваливалась связь и записывался только кусок файла, либо сразу ошибка 80. Помучился с этим делом, но записать так и не получилось. А вот после этого попробовал создать загрузочный проект - и ошибка 80:. Также обнаружил, что при включении плк зуммер не пищит (но правда не помню работал ли он вообще, так что возможно этот момент не принципиален).
С чем такое поведение может быть связано и можно ли это победить не отправляя в СЦ?