Э..?
При чтении/записи указатель сдвигается сам.
Вид для печати
Владислав, а как с ответами на вопросы из поста #79 ?
Напишите библиотеку работы с такими протоколами, выложите её тут. Все будут рады, а Вы наконец покажете класс работы, тов. Newcomer.
Такое возможно в программе для обновленного ПЛК110 изобразить ?
Работа с типизированными файлами
Типизированный файл - это последовательность компонент любого заданного типа (кроме типа "файл"). Доступ к компонентам файла осуществляется по их порядковым номерам. Компоненты нумеруются, начиная с 0. После открытия файла указатель (номер текущей компоненты) стоит в его начале на нулевом компоненте. После каждого чтения или записи указатель сдвигается к следующему компоненту.
Владислав, правильно ли записана функция, и сколько этапов у этой функции ?
res:=OwenSysFileSetPosAsync(handle, (state));
Спасибо за тёплые слова, но завязываться на одного конкретного человека в большинстве случаев неправильно.
Перефразируя известный анекдот:
Владислав говорит, что OwenLogicСчастьеEdition уже на горизонте. Ему - вопрос:
— А что такое горизонт?
— Это воображаемая линия, в которой небо сходится с землей и которая удаляется от нас, когда мы пытаемся к ней приблизиться.
А так, да, ждём.
OwenLogicСчастьеEdition уже есть в виде беты, и полнофункционален. Пользуйтесь.
А новые ФБ, графический редактор и пр. вкусности да, на горизонте.
Уважаемый В.Филоненко, проясните, пожалуйста такой вопрос.
На внешней флешке записан большой текстовый файл. Чтение из файла осуществляется блоками по 4 байта посредством функции
res:=OwenFileReadAsync(handle,ADR(bufin),4,ADR(res ult));
Правильно ли я понимаю, что после чтения четырех байт смещение автоматически изменится на 4 и при следующем обращении к функции будут считаны следующие четыре байта ?
Вот тут, вроде, "понятно" было:
Вроде, Владислав недвусмысленно рассказал, что функции, подобные OwenFileReadAsync ведут себя подобно POSIX аналогам.
Операция read сдвигает указатель, и этой операции без разницы что хранится в файле.
Теперь все понятно. ;)
В.Филоненко сегодня что-то явно не в духе. Во всех темах рвет и мечет ;)
Здравствуйте!
Еще вопрос: функция SysFileCopyAsync сама по себе не создает файлы? Т.е., для копирования при отсутствии файла приемника сначала нужно
- создать файл OwenFileOpenAsync(NAME, 'w', ADR(handle));
- закрыть файл OwenFileCloseAsync(handle, ADR(result));
- скопировать один файл в другой OwenFileCopyAsync(NAME, NAME2, result)...
или по-другому?
ПЛК 110-32 М(02) не пишет данные в открытый файл. Файл создается и сохраняется на внутреннюю флэш-память ПЛК. Но массив байт (размером 300...600 байт) не сохраняется в файл - размер файла 0 байт!
Проверял на библиотеках SysLibFileAsync и SysLibFile, возвращаемое значение записанных байт 0...
Проект:
Еще, как выяснилось, при попытке создать загрузочный проект кодесис выдал ошибку 80:
Вложение 23869
Да. На Ваших примерах. Так же в проект включен кусок кода для SysLibFile с другого (рабочего) проекта, который на данном ПЛК не работает
там где блок CASE мне кажется не хватает дефолтного условия, state может присваиваться например число 11, а такого кейса нет
Копи-паст не удался :) Ищите ошибку в программе
Я прошу прощения - Вы смотрели проект или это просто утверждение на основе уверенности в работоспособности кода в примере?
Перед тем как писать я все проверял. Со своей стороны я ошибок не нашел.
Допустим косяк в куске программы на библиотеке SysLibFileAsync. Тогда как же быть с кодом на библиотеке SysLibFile, который работает на ПЛК110-60 (старой версии).... Или библиотека SysLibFile в новой версии ПЛК 110 не поддерживается?
Еще одни момент: ошибка 80 при попытке создать загрузочный проект. Данная ошибка не дает создать проект даже с (*;*) в plc_prg. На форуме есть посты в которых решением данной проблемы была перепрошивка ПО самого микроконтроллера.
В руководстве по программированию со вкладки ПЛК110-M[02] описано, что при изменении прошивки контроллера нужно снять перемычку на плате.
На плате моего контроллера подобных перемычек нет, следовательно вопрос - как перепрошить ПО моего ПЛК?
P.S. Архив с файлами прошивок *.bin скачал.
Итак. Если на одном и том же ПЛК пример пишет а Ваша программа нет, то проблема, конечно же, не в Вашей программе.
Перемычку не надо снимать, это информация для других модификаций ПЛК.
Перемычку XP2 надо ставить, если прошивка через bat-файл. В большинстве случаев прошивка через UpdateCore достаточна.
Из Архива, приведенного в посте №6.
Проект 110_60_click_asyncfile.pro
Почему при открытии файла используются разные пути?
Как я понимаю по первому состоянию мы инициализируем открытие файла, по второму проверяем, что файл открыт. Но почему пути разные? Где-то на форуме читал, что префикс "usb:" для обращения к порту на корпусе ПЛК, а запись без префикса - обращение к внутренней флешке. Или я что-то путаю?Код:0:
res:=OwenFileOpenAsync('usb:test.dat','a',ADR(handle));
IF res=ASYNC_WORKING THEN
state:=1;
END_IF
1:
res:=OwenFileOpenAsync('test.dat','a',ADR(handle));
IF res=ASYNC_DONE THEN
IF handle<>0 THEN
state:=2;
ELSE
state:=0;
END_IF
ELSIF res<0 THEN
state:=0;
END_IF
usb:test.dat и test.dat - это 2 разных файла
Хорошо, пусть так. При запуске программы на ПЛК в браузере вижу, что файл создается. Какой из них? тот который просто test.dat?
То есть логику этих операций нужно понимать следующим образом:
Пробуем открыть файл на внешней флешке. Если ответа нет, переходим к попытке открытия файла на внутренней флешке. Далее анализируем удачная ли попытка, есть ли такой файл и т.д. Так?
если набираете filedir - видим внутренний диск. Если набираем filedir usb - то флешку, Если filedir ram - то RAM-диск
Владислав, спасибо за ваши ответы. Это очень полезная информация, но вопрос так и остался без ответа. Почему используются разные пути. Ведь как я понимаю пример написан для работы с одним файлом. Это не придирка к вашему коду, а желание разобраться в примере и не использовать его как бездумный копи-паст.