PDA

Просмотр полной версии : Работа с USB Flash карт в новом ПЛК110



Newcomer
02.01.2016, 11:40
Добрый день.

В новом ПЛК110 есть возможность работы с USB Flash картой. Где можно почитать о том, как это делается ? Интересуют процедуры чтения/записи.

Николаев Андрей
03.01.2016, 02:01
На данном этапе это делается с помощью SysLibFile.
ссылка есть в руководстве пользователя и в описании самой библиотеки.

Newcomer
03.01.2016, 13:10
На данном этапе это делается с помощью SysLibFile.
ссылка есть в руководстве пользователя и в описании самой библиотеки.

Программирование программируемых логических контроллеров ОВЕН ПЛК110 и ПЛК160
Руководство пользователя
Версия 1.9

В этом документе есть раздел 7.4.10 Модуль «Архиватор» (Archiver), в котором, в частности, написано

Модуль «Archiver (Архиватор)» используется для архивирования требуемых данных. Архивируемые данные могут храниться на Flash диске ПЛК и извлекаться оттуда при необходимости ...

Как я понял там речь идет о внутренней Flash ПЛК объемом 6 Мб доступной для хранения файлов и архивов.

Меня же интересует работа с внешней Flash картой, которая вставляется В USB разъем (USB A) обновленного ПЛК110.

В описании Библиотека SysLibFile.lib вообще ни слова о том как работать с файлами. размещенными во внешней Flash ПЛК.

Филоненко Владислав
03.01.2016, 20:56
Задаёте в имени файла префикс usb: и наслаждаетесь. В архиваторе в т.ч.
Внимание, Флешка должна поддерживать USB1.1 ! Многие дешёвые флешки этого не умеют.
SysLibFile для работы с файлами (ну кроме Ram-диска) мы настоятельно не рекомендуем. Используйте OwenAsyncLibFile

Также по префиксам usb: и ram: можно смотреть файлы в PLCBrowser и работать с ними. Ограниченно поддерживаются каталоги (без создания, но возможен просмотр и перемещение файлов в /из)

Newcomer
04.01.2016, 09:19
Спасибо за ответ по существу вопроса. А где найти OwenAsyncLibFile ?

Филоненко Владислав
04.01.2016, 13:22
Там же где РЭ на ПЛК. На нашем сайте. Но пока не выложили. Приношу свои извинения.

Ну а чтобы наши клиенты не испытывали проблем с М02 - выкладываю пакет библиотек с примерами.

Newcomer
04.01.2016, 13:30
Там же где РЭ на ПЛК. На нашем сайте. Но пока не выложили. Приношу свои извинения.

Ну а чтобы наши клиенты не испытывали проблем с М02 - выкладываю пекет библиотек с примерами.

Спасибо. Настоящий Новогодний подарок.

Newcomer
04.01.2016, 15:45
Еще бы надо описание к этой библиотеке сделать.

Филоненко Владислав
04.01.2016, 16:02
Сообщите, что вы приобрели ПЛК110 М02 и хотите получить РЭ и пр. на support@owen.ru

Newcomer
08.01.2016, 15:29
Уважаемый, В.Филоненко, дайте, пожалуйста, краткие пояснения к той библиотеке, которую вы недавно любезно выложили.

Лично меня интересуют два простых вопроса, как прочитать из USB-Flash в ОЗУ (в массив) ПЛК и обратная процедура.

Филоненко Владислав
09.01.2016, 17:54
Там же пример есть. Работа с USB ничем не отличается от работы с файлами на внутреннем диске, окромя префикса.
Что у Вас не получается то?

Newcomer
14.01.2016, 11:39
В чем разница между библиотеками SysLibFile.lib и OwenLibFileAsync.lib ? Зачем понадобилась новая библиотека ?

Newcomer
14.01.2016, 11:51
К библиотеке OwenLibFileAsync.lib нет описаний, к кодам функций библиотеки нет ни единого комментария.

Филоненко Владислав, вы хоть опишите назначения функций библиотеки OwenLibFileAsync.lib.

Также важно знать, что передается в функции и что возвращают функции.

capzap
14.01.2016, 12:19
К библиотеке OwenLibFileAsync.lib нет описаний, к кодам функций библиотеки нет ни единого комментария.

Филоненко Владислав, вы хоть опишите назначения функций библиотеки OwenLibFileAsync.lib.

Также важно знать, что передается в функции и что возвращают функции.
да как везде, слово async обозначает что работает так же как в обычной бибке только в асинхронном режиме, в архиве есть примеры работы, что там сложного. Причем я это смортел даже без КДС проста в винраре и комменты есть, ну разве что DONE без комментария, так и смысл оного понятен

Newcomer
14.01.2016, 12:26
да как везде, слово async обозначает что работает так же как в обычной бибке только в асинхронном режиме, в архиве есть примеры работы, что там сложного. Причем я это смортел даже без КДС проста в винраре и комменты есть, ну разве что DONE без комментария, так и смысл оного понятен

Вот то что выложил Филоненко Владислав. capzap, где там комментарии ?

capzap
14.01.2016, 12:53
ну и что собственно требуется комментировать то?
комменты есть что означают ошибки возвращаемого результата, в добавок без комментариев остались две позиции это идет процесс обработки и успешное окончание, working и done - их Вам надо объяснять что ли?

Лень искасть на русском, на диске нашел такой файл, мне больше и не надо

Newcomer
14.01.2016, 12:59
Спасибо. А где этот диск на сайте найти.

capzap
14.01.2016, 13:05
где то в разделе плк110 ссыль, я не помню

Newcomer
14.01.2016, 14:10
Вот обращение к функции Чтения данных из файла: res:=OwenFileReadAsync(handle,ADR(bufin),14,ADR(re sult));

res объявлена как ASYNC_RET_VALUE

Что это за тип возвращаемого значения ASYNC_RET_VALUE ?

capzap, что эта функция возвращает, т.е. что будет присвоено res ?

Филоненко Владислав
14.01.2016, 14:10
Вот то что выложил Филоненко Владислав. где там комментарии ?
А это что?
TYPE ASYNC_RET_VALUE :
(

ASYNC_PAUSED:= -1000, (*Система по своим внутренним причинам приостановила обработку асинхронных запросов*)
ASYNC_QUERY_FULL:= -1001, (*>5 запросов в очереди*)
ASYNC_BLOCK_ACCESS := -1002,(*Запрос к уже обрабатываемому объекту с другой функцией*)
ASYNC_GENERAL_ERROR:= -1003,
ASYNC_INVALID_HANDLE_ERROR:= -1004, (*Запрос к неоткрытому/открытому не через асинхронную библиотеку файлу*)
ASYNC_WORKING:= 16#7FFE,
ASYNC_DONE:=16#7FFF

);
END_TYPE

capzap
14.01.2016, 14:12
Вот обращение к функции Чтения данных из файла: res:=OwenFileReadAsync(handle,ADR(bufin),14,ADR(re sult));

capzap, что эта функция возвращает ?

Вот то что Владислав выложил из бибки то и возвращает, либо ошибки, либо вайтинги либо конец обработки

Филоненко Владислав
14.01.2016, 14:19
Библиотека асинхронного доступа нужна для ускорения работы цикла управления.
Т.к. появились внешние флешки, а они могут тормозить операцию (например записи) до секунды спокойно, то при использовании обычной синхронной библиотеки весь цикл управления на 1 секунду замирает.
Что неприемлемо.
Доступ к внутренней Flash, конечно быстрее, но тоже возможны задержки при записи.

Поэтому мы настоятельно рекомендуем в новых проектах использовать только функции асинхронного доступа к файлам.

Newcomer
14.01.2016, 14:30
Туман потихоньку рассеивается. ;)

Newcomer
14.01.2016, 14:31
Вот то что Владислав выложил из бибки то и возвращает, либо ошибки, либо вайтинги либо конец обработки

А вайтинг это что ?

Newcomer
14.01.2016, 14:34
Что это за тип возвращаемого значения ASYNC_RET_VALUE ? С чем его едят ? Как с ним работать ? Это число или что-то другое ?

Филоненко Владислав
14.01.2016, 14:45
Waiting -
waiting for function result — ожидание результата функции
I am still in waiting for my plc M02. — Я всё ещё жду ПЛК М02.

ASYNC_RET_VALUE - Обычный пользовательский тип. Есть его не надо, просто сравниваете возвращаемое значение с константами в библиотеке.

Newcomer
14.01.2016, 14:56
ASYNC_RET_VALUE - Обычный пользовательский тип. Есть его не надо, просто сравниваете возвращаемое значение с константами в библиотеке.

Сравнивать с символьными константами ? ASYNC_PAUSED, ASYNC_QUERY_FULL и т.д.

Филоненко Владислав
14.01.2016, 14:59
ну да, именно так

Newcomer
14.01.2016, 15:01
Еще вопрос. Как прочитать файл по частям, сначала первую половину файла, а через n минут вторую половину файла ?

Hemann
14.01.2016, 15:24
Если знаете размер файла, то вычисляете до какой позиции нужно читать, и двигаете указатель файла от его начала до нужной позиции с помощью OwenFileSetPosAsync, ну и читаете что Вам нужно с помощью OwenFileReadAsync. Если не знаете размер файла - воспользуйтесь OwenFileGetSizeAsync для выяснения размера файла

Newcomer
14.01.2016, 15:27
Большое спасибо.

Newcomer
02.03.2016, 13:46
Добрый день.

На флешке записан текстовый файл. В файле через запятую перечисляются целые положительные числа в диапазоне от 0 до 255 (1,3,7,5,11,13 ...). Надо прочитать файл в ОЗУ ПЛК110-М[02]. Какой тип данных может иметь буфер, куда будет считываться файл ? В программе мне надо работать с числами.

Евгений Дударев
02.03.2016, 15:37
Добрый день.

На флешке записан текстовый файл. В файле через запятую перечисляются целые положительные числа в диапазоне от 0 до 255 (1,3,7,5,11,13 ...). Надо прочитать файл в ОЗУ ПЛК110-М[02]. Какой тип данных может иметь буфер, куда будет считываться файл ? В программе мне надо работать с числами.

Я когда-то писал пример на чтение констант с текстового файла, перечисленных через точку с запятой (приложил к письму). Пользовался массивом типа string и на тот момент не асинхронной библиотекой SysLibFile (я думаю, если поймете этот пример, то и на асинхронной библиотеке получится).
Код назвать профессиональным не могу, но в помощь сойдет:)

Newcomer
02.03.2016, 17:00
Я когда-то писал пример на чтение констант с текстового файла, перечисленных через точку с запятой (приложил к письму). Пользовался массивом типа string и на тот момент не асинхронной библиотекой SysLibFile (я думаю, если поймете этот пример, то и на асинхронной библиотеке получится).
Код назвать профессиональным не могу, но в помощь сойдет:)

Спасибо.

А что это за библиотека, вроде, у "ОВЕН" такой нет.


arhiv(i:=chiclo_ustavok , read_command:=read , user_set_array=>array_ust );
read:=0;

Это вся программа ?

Евгений Дударев
03.03.2016, 09:48
Newcomer, это не библиотека Овен, просто так сохранил. Весь код программы в файле с расширением.lib - двойной щелчок, откроется Кодесис.

Newcomer
03.03.2016, 10:59
Newcomer, это не библиотека Овен, просто так сохранил. Весь код программы в файле с расширением.lib - двойной щелчок, откроется Кодесис.

Что-то я не понимаю вас.

simply_usb.pro - это ваша программа.

syslibfile_for_ustav_wr_final.lib - это библиотека.

На картинках все видно.

В программе файл читается в массив типа INT.

Все прекрасно, только я в асинхронной библиотеке такого ФБ (ARCHIV_FROM_USB_TXT) не нашел. Или я плохо смотрел ?

Может многоуважаемый В.Филоненко прояснит ситуацию ?

Евгений Дударев
03.03.2016, 14:47
Что-то я не понимаю вас.

simply_usb.pro - это ваша программа.

syslibfile_for_ustav_wr_final.lib - это библиотека.

На картинках все видно.

В программе файл читается в массив типа INT.

Все прекрасно, только я в асинхронной библиотеке такого ФБ (ARCHIV_FROM_USB_TXT) не нашел. Или я плохо смотрел ?

Может многоуважаемый В.Филоненко прояснит ситуацию ?


Newcomer, объясняю:
1) Код сохранил в формате библиотеки (чтобы воспользоваться ею как функциональным блоком в проекте simply_usb.pro). Как я разбирал константы из текстового файла, указано именно там. Вы можете (если уж сильно лень) копипастить в свою программу.
2) Можете файл вовсе simply_usb.pro не использовать (это проект, в котором я вызываю ФБ).

Newcomer
03.03.2016, 14:57
Newcomer, объясняю:
1) Код сохранил в формате библиотеки (чтобы воспользоваться ею как функциональным блоком в проекте simply_usb.pro). Как я разбирал константы из текстового файла, указано именно там. Вы можете (если уж сильно лень) копипастить в свою программу.
2) Можете файл вовсе simply_usb.pro не использовать (это проект, в котором я вызываю ФБ).

syslibfile_for_ustav_wr_final.lib - это библиотека, которую вы создали. В состав библиотеки входит один ФБ под названием archiv_from_usb_txt.

Как я понял, прочитать файл из Flash можно только в строковую переменную, а далее выковыривать из строки эти самые циферки.

Евгений Дударев
03.03.2016, 15:23
syslibfile_for_ustav_wr_final.lib - это библиотека, которую вы создали. В состав библиотеки входит один ФБ под названием archiv_from_usb_txt.

Как я понял, прочитать файл из Flash можно только в строковую переменную, а далее выковыривать из строки эти самые циферки.

Всё верно поняли!)

Филоненко Владислав
03.03.2016, 19:37
ARCHIV_FROM_USB_TXT - это не мы делали :cool:

Newcomer
04.03.2016, 10:19
ARCHIV_FROM_USB_TXT - это не мы делали :cool:

С этим вопросом уже разобрались. Появились другие вопросы.

Программа 110_60_click_asyncfile.pro ваше творение ?

Судя по тому, что в тексте есть ошибки программу в ПЛК никто не загружал и работу не проверял.

CASE state_res OF

0:
res:=OwenFileOpenAsync('usb:test.dat','a',ADR(hand le));
IF res=ASYNC_WORKING THEN
state:=1; (* тут должно быть state_res:=1; *)
END_IF

1:

Евгений Дударев
04.03.2016, 10:37
NewComer, успел поиграться с этой библиотекой. Проекты в приложении

capzap
04.03.2016, 10:56
С этим вопросом уже разобрались. Появились другие вопросы.

Программа 110_60_click_asyncfile.pro ваше творение ?

Судя по тому, что в тексте есть ошибки программу в ПЛК никто не загружал.

CASE state_res OF

0:
res:=OwenFileOpenAsync('usb:test.dat','a',ADR(hand le));
IF res=ASYNC_WORKING THEN
state:=1; (* тут должно быть state_res:=1; *)
END_IF

1:

а не затруднит выложить последнюю строчку этого ПОУ?

Newcomer
04.03.2016, 10:58
а не затруднит выложить последнюю строчку этого ПОУ?

Да хоть все.

capzap
04.03.2016, 11:03
Да хоть все.

нет, мне именно хотелось чтоб Вы обратили внимание на эту строку, прежде чем заявлять что в проге есть ошибка, избыточность может быть, но не ошибка

Newcomer
04.03.2016, 11:07
NewComer, успел поиграться с этой библиотекой. Проекты в приложении

Большое спасибо. Вот это действительно серьезное отношение к делу. Все примеры хорошо оформлены и понятны.

Евгений, вы эти примеры на реальном железе проверяли ?

Newcomer
04.03.2016, 11:09
нет, мне именно хотелось чтоб Вы обратили внимание на эту строку, прежде чем заявлять что в проге есть ошибка, избыточность может быть, но не ошибка

В конце программы стоит state_res:=state;

Мне не понятно зачем эти ужимки и прыжки. Может вы поясните ?

capzap
04.03.2016, 11:13
В конце программы стоит state_res:=state;

Мне не понятно зачем эти ужимки и прыжки. Может вы поясните ?

например, я внутри кейса использую буферную переменную, чтоб в ней задавать числа не только входящие в обрабатываемые кейсом, а вслед или перед кейсом провожу дополнительную обработку и далее через маску возвращаю эту переменную в диапазон используемых кейсом чисел. Возможно в этом проекте при отладке что то использовалось, затем было удалено, а это присвоение осталось

Newcomer
04.03.2016, 13:59
Что передается в функцию OwenFileOpenAsync('usb:test.txt','r',ADR(handle)) через фактический параметр ADR(handle) ?

Филоненко Владислав
04.03.2016, 14:31
нет, мне именно хотелось чтоб Вы обратили внимание на эту строку, прежде чем заявлять что в проге есть ошибка, избыточность может быть, но не ошибка

state:=1; (* тут НЕ должно быть state_res:=1; *)


всё там правильно. смотрим программу до конца :cool:

Филоненко Владислав
04.03.2016, 14:32
Что передается в функцию OwenFileOpenAsync('usb:test.txt','r',ADR(handle)) через фактический параметр ADR(handle) ?
указатель на handle. Только там можно вернуть 2-е значение из функции

capzap
04.03.2016, 14:35
Что передается в функцию OwenFileOpenAsync('usb:test.txt','r',ADR(handle)) через фактический параметр ADR(handle) ?

ни чего, буферная переменная, размером двойное слово, для последущего анализа

конкретно для этой функции дескриптор файла вернет

Newcomer
04.03.2016, 14:56
Как организовать чтение не всего файла целиком а по одному символу за одну операцию чтения. Т.е. Открыли файл, прочитали 1 символ, обработали символ, читаем следующий символ, обрабатываем и т.д. до чтения последнего символа.

Или как прочитать файл в несколько приемов. Т.е. разбить условно файл на на несколько блоков и прочитать его поблочно.

capzap
04.03.2016, 15:00
Как организовать чтение не всего файла целиком а по одному символу за одну операцию чтения. Т.е. Открыли файл, прочитали 1 символ, обработали символ, читаем следующий символ, обрабатываем и т.д. до чтения последнего символа.

смотрите в сторону OwenFileSetPosAsync, ну и соответственно на OwenFileEOFAsync

Евгений Дударев
04.03.2016, 15:25
Большое спасибо. Вот это действительно серьезное отношение к делу. Все примеры хорошо оформлены и понятны.

Евгений, вы эти примеры на реальном железе проверяли ?

Да, на 110-30 М02

Newcomer
04.03.2016, 15:30
Да, на 110-30 М02

Просто замечательно.

Newcomer
04.03.2016, 15:45
VAR
handle:DWORD; (* Дескриптор файла*)
bias:DWORD; (* Смещение *)
res:ASYNC_RET_VALUE; (* То, что возвращает функция *)
END_VAR

res:=OwenFileSetPosAsync(handle, bias, ADR(result));

1) правильно ли записано обращение к функции;
2) что может вернуть функция при обращении к ней;
3) правильно ли я понимаю, что к этой функции надо обращаться перед чтением из файла очередного символа.

Филоненко Владислав
04.03.2016, 15:53
Не очередного, а произольного. Очередной и так прочитаете.
Newcomer, почитайте что-нибудь про стандартную библиотеку доступа к файлам в C. Куча вопросов сразу отпадёт.

Newcomer
04.03.2016, 16:00
Newcomer, почитайте что-нибудь про стандартную библиотеку доступа к файлам в C. Куча вопросов сразу отпадёт.

Владислав, а почему у фирмы "ОВЕН" нет описания к своей библиотеке доступа к файлам + толковые примеры с комментариями ?

Работа с файлами на С отличается от того, как это делается на ST в CoDeSys.

Scream
04.03.2016, 16:08
Не очередного, а произольного. Очередной и так прочитаете.
Newcomer, почитайте что-нибудь про стандартную библиотеку доступа к файлам в C. Куча вопросов сразу отпадёт.

я почитаю с удовольствием, ссылку пожалуйста.

Евгений Дударев
04.03.2016, 16:11
Владислав, а почему у фирмы "ОВЕН" нет описания к своей библиотеке доступа к файлам + толковые примеры с комментариями ?

Работа с файлами на С отличается от того, как это делается на ST в CoDeSys.

Руководство пользователя на данный момент дорабатывается. Пока вот описание основных функций асинхронной библиотеки

Newcomer
04.03.2016, 16:14
Руководство пользователя на данный момент дорабатывается. Пока вот описание основных функций асинхронной библиотеки

Это то, что надо. Спасибо, Евгений. Вот, Владислав, как надо работать всем сотрудникам фирмы "ОВЕН".

Евгений Дударев
04.03.2016, 16:20
Newcomer, Владислав может быть занят, и не всегда имеет время развернуто отвечать на множество вопросов в разных темах форума. Если Вы не получаете какой-либо ответ на форуме, то всегда можете обращаться в тех.поддержку по почте sales@owen.ru. Техническая поддержка старается участвовать в ответах на форуме, но ввиду сильной загруженности по другим каналам связи (телефон, почта, скайп, живое общение), так же может и не успеть оперативно отвечать здесь.
Удачи в использовании библиотеки! :)

Newcomer
05.03.2016, 15:01
Руководство пользователя на данный момент дорабатывается. Пока вот описание основных функций асинхронной библиотеки

Евгений, я почитал ваше РЭ, в нем есть ошибки, оно не полно и не закончено. Надо бы довести его до полной кондиции.

С уважением.

Вольд
06.03.2016, 14:46
В языке C при открытии файла путь к файлу прописывается так: c:\\work\\t1.txt

Как правильно прописать путь к файлу при обращении к функции OwenFileOpenAsync

Предположу, что так: OwenFileOpenAsync('usb:\\work\\t1.txt' ,'r', ADR(handle))

Правильно ли это ?

Newcomer
12.03.2016, 16:25
Добрый день.

На внешней Flash записан фай с расширением txt. В файле есть невидимые символы Перевод строки (LF) и Возврат каретки (CR). Вопрос - будут ли символы LF и CR считаны при чтении файла в ОЗУ ПЛК или эти символы будут проигнорированы ?

При работе на языке C эти символы при чтении файла игнорируются.

Newcomer
14.03.2016, 20:29
Добрый вечер.

Правильно ли я понимаю, что при каждом обращении к оператору res:=OwenFileReadAsync(handle,ADR(bufin),4,ADR(res ult)); (* Читаем очередные 4 байта *) в bufin ,будет считываться очередные 4 байта ?

Уважаемый В.Филоненко, ответьте, пожалуйста, на этот и предыдущий мой вопрос.

Также интересно получить ответ на вопрос, который задавался в посте #65.

Филоненко Владислав
15.03.2016, 08:57
1. Правила формирования строк читаем в руководстве по CoDeSys. Причём тут "С"?
2. Читает любые символы
3. Вообще не понимаю, почему асинхронная библиотека вызывает так много не связанных с асинхронностью вопросов? Интерфейс одинаков с синхронной, стандартной библиотекой SysLibFile. Там всё описано.

capzap
15.03.2016, 09:09
3. Вообще не понимаю, почему асинхронная библиотека вызывает так много не связанных с асинхронностью вопросов?.

а происходит это потому что у человека не получаются элементарные вещи и он считает что Овен что то не договаривает. Здесь вместо слов нужно просто показать видео с ответами на его вопросы, у меня просто нет такого плк я бы давно выложил, там дело в то на 10 минут

Филоненко Владислав
15.03.2016, 10:49
Так есть работоспособный пример, специально сделанный. Копи-паст религия не позволяет использовать?

Newcomer
15.03.2016, 10:54
Так есть работоспособный пример, специально сделанный. Копи-паст религия не позволяет использовать?

С работоспособным примером все в порядке.

Я спросил о трех вещах, на которые нет ответа в работоспособном примере.

В.Филоненко, пожалуйста, внимательно прочтите пост #67 и дайте квалифицированный ответ без отсылок куда-то.

Проблема в том, что у меня нет живого ПЛК110, иначе все давно было бы сделано методом проб и ошибок.

capzap
15.03.2016, 10:56
да не, именно на поставленные вопросы, ну про два слеша понятно и из готового примера, а я про вычитывание невидимых символов из файла, с какой позиции читается файл если повторно вызвать функцию чтения определенного количества байт не используя функции позиционирования. Это нам с Вами легко из непонятно чего выделить нужное и использовать у себя в конкретной задаче, но стоит признать что не все такие

Newcomer
15.03.2016, 11:09
да не, именно на поставленные вопросы, ну про два слеша понятно и из готового примера, а я про вычитывание невидимых символов из файла, с какой позиции читается файл если повторно вызвать функцию чтения определенного количества байт не используя функции позиционирования. Это нам с Вами легко из непонятно чего выделить нужное и использовать у себя в конкретной задаче, но стоит признать что не все такие

Давайте по порядку.

OwenFileOpenAsync('usb:\\work\\t1.txt' ,'r', ADR(handle)) - это правильно записано. Спрашивал изначально не я, но мне это то же нужно.

В готовом примере записано так: OwenFileOpenAsync('usb:test.dat','a',ADR(handle))

Там файл находится в корневом каталоге накопителя, а меня интересует размещение файла в подкаталоге.

Филоненко Владислав
15.03.2016, 11:45
да не, именно на поставленные вопросы, ну про два слеша понятно и из готового примера, а я про вычитывание невидимых символов из файла, с какой позиции читается файл если повторно вызвать функцию чтения определенного количества байт не используя функции позиционирования. Это нам с Вами легко из непонятно чего выделить нужное и использовать у себя в конкретной задаче, но стоит признать что не все такие
Это стандартные вещи, описанные в учебниках, в описании стандартной библиотеки того же C. Такого уровня информация в описании не будет, это описание библиотеки, а не сути вещей.
'usb:work\t1.txt' - вот как надо.
Но если у Вас на флешке будет библиотека либрусека - тормозить будет. Проще надо, это не Icore7 c 16 Гигами.

Newcomer
15.03.2016, 12:35
Это стандартные вещи, описанные в учебниках, в описании стандартной библиотеки того же C. Такого уровня информация в описании не будет, это описание библиотеки, а не сути вещей.
'usb:work\t1.txt' - вот как надо.

Уважаемый, вот вы все ссылаетесь на стандарт языка C, а там путь к файлу вот так бы был записан: "usb:\\work\\t1.txt"

Конечно абревиатуры usb там бы не было. Там бы было как-нибудь так: "h:\\work\\t1.txt"

Согласитесь, что синтаксис сильно отличается от вашей записи.

Бросьте в меня камень если я не прав. ;)

Кстати, вы проверили свою запись на реальном железе ?

capzap
15.03.2016, 12:44
Уважаемый, вот вы все ссылаетесь на язык C, а там это вот так бы было записано: "usb:\\work\\t1.txt"

это потому что в языках программирования обратным слешем обозначаются спецсимволы, и чтоб избежать этих недопониманий существуют константы типа File.separator
а путь как был так и остается с одним слешем. В плк нет таких заморочек спецсимволам предшествует знак $, а путь пишется просто

Newcomer
15.03.2016, 12:50
это потому что в языках программирования обратным слешем обозначаются спецсимволы, и чтоб избежать этих недопониманий существуют константы типа File.separator
а путь как был так и остается с одним слешем. В плк нет таких заморочек спецсимволам предшествует знак $, а путь пишется просто

Ну так и не надо ссылаться на стандарт языка C.

Newcomer
15.03.2016, 13:06
Следующий вопрос.

Возможна ли работать при помощи библиотеки с типизированными файлами ?

Newcomer
15.03.2016, 13:16
Следующий вопрос.

У меня на флешке записан большой текстовый файл. Я не могу прочитать его в ОЗУ ПЛК целиком за один прием, поэтому читаю по 4 байта за один раз таким образом:

OwenFileReadAsync(handle,ADR(bufin),4,ADR(res ult))

У меня такой вопрос – должен ли я сам позаботиться о положении позиции (смещение) в файле или положение в файле автоматически изменится на 4 единицы после прочтения предыдущего блока из четырех байт ?

Если я должен сам об этом позаботиться, то прошу пояснить как правильно в моем случае записать функцию OwenSysFileSetPosAsync

res:=OwenSysFileSetPosAsync(handle, (state)) - это будет правильно, и сколько этапов у этой функции ?

Филоненко Владислав
15.03.2016, 15:31
Уважаемый, вот вы все ссылаетесь на стандарт языка C, а там путь к файлу вот так бы был записан: "usb:\\work\\t1.txt"

Конечно абревиатуры usb там бы не было. Там бы было как-нибудь так: "h:\\work\\t1.txt"

Согласитесь, что синтаксис сильно отличается от вашей записи.

Бросьте в меня камень если я не прав. ;)

Кстати, вы проверили свою запись на реальном железе ?

Давайте не путать синтаксис языка программирования и логику работы с файлами

Филоненко Владислав
15.03.2016, 15:32
Следующий вопрос.

Возможна ли работать при помощи библиотеки с типизированными файлами ?
Э..?

При чтении/записи указатель сдвигается сам.

Newcomer
15.03.2016, 18:14
Владислав, а как с ответами на вопросы из поста #79 ?

Newcomer
16.03.2016, 09:40
Э..?

При чтении/записи указатель сдвигается сам.

Что указатель сам сдвигается это понятно. Вопрос был о том как организовать чтение типизированного файла при помощи библиотеки.

Владимир Ситников
16.03.2016, 10:04
Что указатель сам сдвигается это понятно. Вопрос был о том как организовать чтение типизированного файла при помощи библиотеки.

Вы хотели спросить "как работать с protobuf (https://developers.google.com/protocol-buffers/), kryo (https://github.com/EsotericSoftware/kryo) и thrift (https://thrift.apache.org/) на ПЛК"?

Newcomer
16.03.2016, 10:11
Вы хотели спросить "как работать с protobuf (https://developers.google.com/protocol-buffers/), kryo (https://github.com/EsotericSoftware/kryo) и thrift (https://thrift.apache.org/) на ПЛК"?

Очень хочу, может просветите.

Филоненко Владислав
16.03.2016, 10:28
Что указатель сам сдвигается это понятно.
Теперь, когда объяснили - понятно, или это был троллинг?

Филоненко Владислав
16.03.2016, 10:30
Напишите библиотеку работы с такими протоколами, выложите её тут. Все будут рады, а Вы наконец покажете класс работы, тов. Newcomer.

Newcomer
16.03.2016, 10:36
Очень хочу, может просветите.

Такое возможно в программе для обновленного ПЛК110 изобразить ?

Работа с типизированными файлами

Типизированный файл - это последовательность компонент любого заданного типа (кроме типа "файл"). Доступ к компонентам файла осуществляется по их порядковым номерам. Компоненты нумеруются, начиная с 0. После открытия файла указатель (номер текущей компоненты) стоит в его начале на нулевом компоненте. После каждого чтения или записи указатель сдвигается к следующему компоненту.

Newcomer
16.03.2016, 10:46
Владислав, правильно ли записана функция, и сколько этапов у этой функции ?

res:=OwenSysFileSetPosAsync(handle, (state));

Newcomer
16.03.2016, 10:48
Напишите библиотеку работы с такими протоколами, выложите её тут. Все будут рады, а Вы наконец покажете класс работы, тов. Newcomer.

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

Владимир Ситников
16.03.2016, 11:06
наймите ... тов. vladimirisitnikov
Спасибо за тёплые слова, но завязываться на одного конкретного человека в большинстве случаев неправильно.


И будет всем нам счастье.

Перефразируя известный анекдот:
Владислав говорит, что OwenLogicСчастьеEdition уже на горизонте. Ему - вопрос:
— А что такое горизонт?
— Это воображаемая линия, в которой небо сходится с землей и которая удаляется от нас, когда мы пытаемся к ней приблизиться.

А так, да, ждём.

Newcomer
16.03.2016, 12:04
Завязываться на одного конкретного человека в большинстве случаев неправильно.

Не важно кто платит. Деньги у всех одинаковые и они не пахнут.

Филоненко Владислав
16.03.2016, 12:07
Владислав, правильно ли записана функция, и сколько этапов у этой функции ?

res:=OwenSysFileSetPosAsync(handle, (state));
Всё также как с другими функциями

Филоненко Владислав
16.03.2016, 12:09
OwenLogicСчастьеEdition уже есть в виде беты, и полнофункционален. Пользуйтесь.
А новые ФБ, графический редактор и пр. вкусности да, на горизонте.

capzap
16.03.2016, 12:14
Типизированный файл - это последовательность компонент любого заданного типа (кроме типа "файл"). Доступ к компонентам файла осуществляется по их порядковым номерам. Компоненты нумеруются, начиная с 0. После открытия файла указатель (номер текущей компоненты) стоит в его начале на нулевом компоненте. После каждого чтения или записи указатель сдвигается к следующему компоненту.
другими словами применительно к плк это массив структур

Владимир Ситников
16.03.2016, 12:16
Не важно кто платит. Деньги у всех одинаковые и они не пахнут.

Не понимаю о чём речь.
Устраиваться на работу в ОВЕН -- не моё.
Сделать какой-нибудь подряд, конечно, можно.

Но я говорил про следующее: нехорошо будет, если "работоспособность OL станет зависеть от одного меня".

Newcomer
16.03.2016, 18:25
Уважаемый В.Филоненко, проясните, пожалуйста такой вопрос.

На внешней флешке записан большой текстовый файл. Чтение из файла осуществляется блоками по 4 байта посредством функции

res:=OwenFileReadAsync(handle,ADR(bufin),4,ADR(res ult));

Правильно ли я понимаю, что после чтения четырех байт смещение автоматически изменится на 4 и при следующем обращении к функции будут считаны следующие четыре байта ?

Филоненко Владислав
16.03.2016, 18:30
Уважаемый В.Филоненко, проясните, пожалуйста такой вопрос.

На внешней флешке записан большой текстовый файл. Чтение из файла осуществляется блоками по 4 байта посредством функции

res:=OwenFileReadAsync(handle,ADR(bufin),4,ADR(res ult));
Правильно ли я понимаю, что после чтения очередных четырех байт смещение автоматически изменится на 4 ?




Что указатель сам сдвигается это понятно. Вопрос был о том как организовать чтение типизированного файла при помощи библиотеки.


Мне кажется или тут двоится в глазах? Уважаемый Newcomer, Вы всё-же определитесь, Вам ясно, "Что указатель сам сдвигается" или нет? :confused:

Newcomer
16.03.2016, 18:34
Мне кажется или тут двоится в глазах? Уважаемый Newcomer, Вы всё-же определитесь, Вам ясно, "Что указатель сам сдвигается" или нет? :confused:

Там где речь идет о типизированном файле ясно, но я спрашиваю про чтение не типизированного файла.

Владимир Ситников
16.03.2016, 18:46
Там где речь идет о типизированном файле ясно, но я спрашиваю про чтение не типизированного файла.

Вот тут, вроде, "понятно" было:

Что указатель сам сдвигается это понятно

Вроде, Владислав недвусмысленно рассказал, что функции, подобные OwenFileReadAsync ведут себя подобно POSIX аналогам (https://en.wikipedia.org/wiki/Read_(system_call)).

Операция read сдвигает указатель, и этой операции без разницы что хранится в файле.

Newcomer
16.03.2016, 18:52
Теперь все понятно. ;)

Филоненко Владислав
17.03.2016, 15:45
Вот тут, вроде, "понятно" было:


Вроде, Владислав недвусмысленно рассказал, что функции, подобные OwenFileReadAsync ведут себя подобно POSIX аналогам (https://en.wikipedia.org/wiki/Read_(system_call)).


Операция read сдвигает указатель, и этой операции без разницы что хранится в файле.
Как стало ясно по аналогичным темам Newcomer-а, человек просто тролит. Не кормите троля.

Newcomer
17.03.2016, 18:29
В.Филоненко сегодня что-то явно не в духе. Во всех темах рвет и мечет ;)

Newcomer
10.04.2016, 16:13
А это что?
TYPE ASYNC_RET_VALUE :
(

ASYNC_PAUSED:= -1000, (*Система по своим внутренним причинам приостановила обработку асинхронных запросов*)
ASYNC_QUERY_FULL:= -1001, (*>5 запросов в очереди*)
ASYNC_BLOCK_ACCESS := -1002,(*Запрос к уже обрабатываемому объекту с другой функцией*)
ASYNC_GENERAL_ERROR:= -1003,
ASYNC_INVALID_HANDLE_ERROR:= -1004, (*Запрос к неоткрытому/открытому не через асинхронную библиотеку файлу*)
ASYNC_WORKING:= 16#7FFE,
ASYNC_DONE:=16#7FFF

);
END_TYPE


Добрый день.

Владислав, а что вернет функция OwenFileOpenAsync(NAME, 'r', ADR(handle)), если на Flash не окажется файла с указанным в функции именем файла ?

Allmax
10.04.2016, 17:11
Здравствуйте!
Еще вопрос: функция SysFileCopyAsync сама по себе не создает файлы? Т.е., для копирования при отсутствии файла приемника сначала нужно
- создать файл OwenFileOpenAsync(NAME, 'w', ADR(handle));
- закрыть файл OwenFileCloseAsync(handle, ADR(result));
- скопировать один файл в другой OwenFileCopyAsync(NAME, NAME2, result)...
или по-другому?

Филоненко Владислав
11.04.2016, 15:02
Добрый день.

Владислав, а что вернет функция OwenFileOpenAsync(NAME, 'r', ADR(handle)), если на Flash не окажется файла с указанным в функции именем файла ?
Вернет сначала ASYNC_WORKING а затем ASYNC_DONE. А handle будет равен NULL.

Филоненко Владислав
11.04.2016, 15:03
Здравствуйте!
Еще вопрос: функция SysFileCopyAsync сама по себе не создает файлы? Т.е., для копирования при отсутствии файла приемника сначала нужно
- создать файл OwenFileOpenAsync(NAME, 'w', ADR(handle));
- закрыть файл OwenFileCloseAsync(handle, ADR(result));
- скопировать один файл в другой OwenFileCopyAsync(NAME, NAME2, result)...
или по-другому?
Да, файл сначала надо создать.

Allmax
13.04.2016, 21:43
ПЛК 110-32 М(02) не пишет данные в открытый файл. Файл создается и сохраняется на внутреннюю флэш-память ПЛК. Но массив байт (размером 300...600 байт) не сохраняется в файл - размер файла 0 байт!
Проверял на библиотеках SysLibFileAsync и SysLibFile, возвращаемое значение записанных байт 0...
Проект:
Еще, как выяснилось, при попытке создать загрузочный проект кодесис выдал ошибку 80:
23869

Филоненко Владислав
14.04.2016, 09:19
ПЛК 110-32 М(02) не пишет данные в открытый файл. Файл создается и сохраняется на внутреннюю флэш-память ПЛК. Но массив байт (размером 300...600 байт) не сохраняется в файл - размер файла 0 байт!
Проверял на библиотеках SysLibFileAsync и SysLibFile, возвращаемое значение записанных байт 0...
Проект:
Еще, как выяснилось, при попытке создать загрузочный проект кодесис выдал ошибку 80:
23869

На штатном проекте-примере работы с библиотеой пишется?

Allmax
14.04.2016, 10:03
Да. На Ваших примерах. Так же в проект включен кусок кода для SysLibFile с другого (рабочего) проекта, который на данном ПЛК не работает

capzap
14.04.2016, 10:14
там где блок CASE мне кажется не хватает дефолтного условия, state может присваиваться например число 11, а такого кейса нет

Allmax
14.04.2016, 10:40
там где блок CASE мне кажется не хватает дефолтного условия, state может присваиваться например число 11, а такого кейса нет

Да. Есть там такое. Это уже когда не пошло я кейсы левые ставил, что бы понять на каком этапе косяк... Такие кейсы только при ошибках

Филоненко Владислав
14.04.2016, 12:45
Копи-паст не удался :) Ищите ошибку в программе

Allmax
14.04.2016, 13:01
Копи-паст не удался :) Ищите ошибку в программе

Я прошу прощения - Вы смотрели проект или это просто утверждение на основе уверенности в работоспособности кода в примере?
Перед тем как писать я все проверял. Со своей стороны я ошибок не нашел.
Допустим косяк в куске программы на библиотеке SysLibFileAsync. Тогда как же быть с кодом на библиотеке SysLibFile, который работает на ПЛК110-60 (старой версии).... Или библиотека SysLibFile в новой версии ПЛК 110 не поддерживается?

Еще одни момент: ошибка 80 при попытке создать загрузочный проект. Данная ошибка не дает создать проект даже с (*;*) в plc_prg. На форуме есть посты в которых решением данной проблемы была перепрошивка ПО самого микроконтроллера.
В руководстве по программированию со вкладки ПЛК110-M[02] описано, что при изменении прошивки контроллера нужно снять перемычку на плате.
На плате моего контроллера подобных перемычек нет, следовательно вопрос - как перепрошить ПО моего ПЛК?
P.S. Архив с файлами прошивок *.bin скачал.

Филоненко Владислав
14.04.2016, 15:13
Итак. Если на одном и том же ПЛК пример пишет а Ваша программа нет, то проблема, конечно же, не в Вашей программе.
Перемычку не надо снимать, это информация для других модификаций ПЛК.
Перемычку XP2 надо ставить, если прошивка через bat-файл. В большинстве случаев прошивка через UpdateCore достаточна.

AlekseyK
17.04.2016, 03:04
Из Архива, приведенного в посте №6.
Проект 110_60_click_asyncfile.pro

Почему при открытии файла используются разные пути?


0:
res:=OwenFileOpenAsync('usb:test.dat','a',ADR(hand le));
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:" для обращения к порту на корпусе ПЛК, а запись без префикса - обращение к внутренней флешке. Или я что-то путаю?

Филоненко Владислав
17.04.2016, 13:45
usb:test.dat и test.dat - это 2 разных файла

AlekseyK
17.04.2016, 17:34
Хорошо, пусть так. При запуске программы на ПЛК в браузере вижу, что файл создается. Какой из них? тот который просто test.dat?
То есть логику этих операций нужно понимать следующим образом:
Пробуем открыть файл на внешней флешке. Если ответа нет, переходим к попытке открытия файла на внутренней флешке. Далее анализируем удачная ли попытка, есть ли такой файл и т.д. Так?

Филоненко Владислав
18.04.2016, 14:52
если набираете filedir - видим внутренний диск. Если набираем filedir usb - то флешку, Если filedir ram - то RAM-диск

AlekseyK
18.04.2016, 17:00
Владислав, спасибо за ваши ответы. Это очень полезная информация, но вопрос так и остался без ответа. Почему используются разные пути. Ведь как я понимаю пример написан для работы с одним файлом. Это не придирка к вашему коду, а желание разобраться в примере и не использовать его как бездумный копи-паст.

capzap
18.04.2016, 17:02
Владислав, спасибо за ваши ответы. Это очень полезная информация, но вопрос так и остался без ответа. Почему в вашем примере для обращения к файлу используются разные пути. Это не придирка к вашему коду, а желание разобраться в примере и не использовать его как бездумный копи-паст.
опечатку, как объяснение не рассматриваете?

AlekseyK
18.04.2016, 17:04
Конечно рассматриваю. Если бы Владислав ответил, что это опечатка, то вопрос был бы сразу закрыт.

Филоненко Владислав
19.04.2016, 08:56
Да, очепятка.

приборист
11.04.2017, 20:17
Владислав, добрый день!
Подскажите по такому вопросу:
Делаю архивирование на флешку.
С записью все ОК.
Некая проблема с чтением.
При MinCycleLenght в 1 мс - выходит статус ASYNC_BLOCK_ACCESS
Опытным путем понял, что при цикле в 4 мс ошибка не вылетает, и все нормально работает.

Флешка пустая, 8 гб.
Далее от ошибки не избавиться никак, помогает лишь перезагрузка.
Пробовал при ошибке выполнять OwenFileCloseAllOpenAsync, так же не помогает.

И подскажите - SysLibDir не поддерживается?
Можно как то папки создавать?

Филоненко Владислав
12.04.2017, 08:10
Если всё и сразу делать с циклом 1 мс - конечно будет блокировка, вы сколько файлов за раз пытаетесь обрабатывать? Максимум можно 5 штук.

приборист
12.04.2017, 08:49
Если всё и сразу делать с циклом 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

Филоненко Владислав
12.04.2017, 10:14
ASYNC_BLOCK_ACCESS возвращается если есть доступ к библиотеке с др. запросом до окончания первого.

приборист
12.04.2017, 10:33
Как же тогда возможность работы с 5 файлами?
Тогда точно будет доступ к библиотеке с другим запросом, до окончания первого.

Что делать с этим ASYNC_BLOCK_ACCESS?
Только перезагружать?

energvk
14.04.2017, 18:04
Я прошу прощения - Вы смотрели проект или это просто утверждение на основе уверенности в работоспособности кода в примере?
Перед тем как писать я все проверял. Со своей стороны я ошибок не нашел.
Допустим косяк в куске программы на библиотеке SysLibFileAsync. Тогда как же быть с кодом на библиотеке SysLibFile, который работает на ПЛК110-60 (старой версии).... Или библиотека SysLibFile в новой версии ПЛК 110 не поддерживается?

Еще одни момент: ошибка 80 при попытке создать загрузочный проект. Данная ошибка не дает создать проект даже с (*;*) в plc_prg. На форуме есть посты в которых решением данной проблемы была перепрошивка ПО самого микроконтроллера.
В руководстве по программированию со вкладки ПЛК110-M[02] описано, что при изменении прошивки контроллера нужно снять перемычку на плате.
На плате моего контроллера подобных перемычек нет, следовательно вопрос - как перепрошить ПО моего ПЛК?
P.S. Архив с файлами прошивок *.bin скачал.


Итак. Если на одном и том же ПЛК пример пишет а Ваша программа нет, то проблема, конечно же, не в Вашей программе.
Перемычку не надо снимать, это информация для других модификаций ПЛК.
Перемычку XP2 надо ставить, если прошивка через bat-файл. В большинстве случаев прошивка через UpdateCore достаточна.


ПЛК 110-32 М(02) не пишет данные в открытый файл. Файл создается и сохраняется на внутреннюю флэш-память ПЛК. Но массив байт (размером 300...600 байт) не сохраняется в файл - размер файла 0 байт!
Проверял на библиотеках SysLibFileAsync и SysLibFile, возвращаемое значение записанных байт 0...
Проект:
Еще, как выяснилось, при попытке создать загрузочный проект кодесис выдал ошибку 80:
23869

Чтобы не плодить тем:
Столкнулся с аналогичной проблемой.
Использовал работающий блок на ПЛК160/ПЛК110[М01] записи в файл на библиотеке SysLibFile на ПЛК110[M02]. На выходе получал пустой файл. Перепроверил опять же на ПЛК160 - работает. Переписал блок на библиотеке OwenLibFileAsync - на выходе пустой файл. Писал на внутреннюю флэш. Подумал, что возможно дело в старой прошивке (стояла 0.52). При попытке записать файл прошивки: либо практически сразу отваливалась связь и записывался только кусок файла, либо сразу ошибка 80. Помучился с этим делом, но записать так и не получилось. А вот после этого попробовал создать загрузочный проект - и ошибка 80:. Также обнаружил, что при включении плк зуммер не пищит (но правда не помню работал ли он вообще, так что возможно этот момент не принципиален).

С чем такое поведение может быть связано и можно ли это победить не отправляя в СЦ?

Филоненко Владислав
14.04.2017, 20:56
Как же тогда возможность работы с 5 файлами?
Тогда точно будет доступ к библиотеке с другим запросом, до окончания первого.

Что делать с этим ASYNC_BLOCK_ACCESS?
Только перезагружать?
5 одновременных запросов к РАЗНЫМ файлам

Филоненко Владислав
14.04.2017, 20:59
Чтобы не плодить тем:
Столкнулся с аналогичной проблемой.
Использовал работающий блок на ПЛК160/ПЛК110[М01] записи в файл на библиотеке SysLibFile на ПЛК110[M02]. На выходе получал пустой файл. Перепроверил опять же на ПЛК160 - работает. Переписал блок на библиотеке OwenLibFileAsync - на выходе пустой файл. Писал на внутреннюю флэш. Подумал, что возможно дело в старой прошивке (стояла 0.52). При попытке записать файл прошивки: либо практически сразу отваливалась связь и записывался только кусок файла, либо сразу ошибка 80. Помучился с этим делом, но записать так и не получилось. А вот после этого попробовал создать загрузочный проект - и ошибка 80:. Также обнаружил, что при включении плк зуммер не пищит (но правда не помню работал ли он вообще, так что возможно этот момент не принципиален).

С чем такое поведение может быть связано и можно ли это победить не отправляя в СЦ?

1. Попробуйте отформатировать внутренний диск.
2. Прошивку можно обновить и через bat-файл, там "отваливания" исключены при любой прошивке.
3. Пишет ли на внешнюю USB?

energvk
15.04.2017, 00:07
1. А каким образом это сделать?
2. Попробую.
3. Не проверял. Попробую.

monteg
15.04.2017, 13:43
У меня такая проблема тоже была при использовании SysLibFile на М02, пришел на OwenLibFileAsync.
Для форматирование есть команда в ПЛК-Браузер formatFFS.

energvk
15.04.2017, 13:46
У меня такая проблема тоже была при использовании SysLibFile на М02, пришел на OwenLibFileAsync.
Для форматирование есть команда в ПЛК-Браузер formatFFS.

у меня на обеих библиотеках такая проблема. Возможно потому что изначально попробовал на SysLibFile?
Просто в списке команд такой нет, не знал. Спасибо, попробую

monteg
15.04.2017, 14:15
И не забудьте, что OwenFileOpenAsync, stMode = 'a', 'w+', 'r'

energvk
16.04.2017, 16:19
Да это вроде помню)

ovkru
24.09.2017, 13:43
Там же где РЭ на ПЛК. На нашем сайте. Но пока не выложили. Приношу свои извинения.

Ну а чтобы наши клиенты не испытывали проблем с М02 - выкладываю пакет библиотек с примерами.

Уважаемый Владислав!
Помогите разобраться с асинхронным выводом в файл с помощью библиотеки OwenAsyncLibFile. На основе Вашего примера пытаюсь организовать запись в файл непрерывного ряда значений переменной, которая получает приращение в рабочем цикле:
b:=b+1;
Запись в файл производится функцией:
res:=OwenFileWriteAsync(handle,ADR(bufout),14,ADR( result));
В примере обращает на себя внимание то, что запись происходит дважды: первый раз в цикле с CASE 2: и второй в цикле с CASE 3:. Получается, мы в разных циклах даем задание на передачу строковой переменной для записи. В программе одной переменной в циклах могут могут соответствовать разные строки. Методом проб и ошибок я добился нужного результата. Но вопросы остались:
В какую из попыток происходит действительно передача строки?
Как проконтролировать в программе какая из строк передана?
Хотелось бы получить более подробную информацию о работе функций библиотеки OwenAsyncLibFile от первоисточника. Или дайте ссылки на документацию, где описан порядок их работы.

Филоненко Владислав
25.09.2017, 09:49
в case 2 Вы задаёте библиотеке следующую команду, в Вашем случае на запись.
а в case 3 вы периодически опрашиваете библиотеку: "Не выполнила ли ты мою команду"

Собственно запись в файл происходит асинхронно в промежутке между case2 и ответом ASYNC_DONE в case3.

И подавать на вход функции записи строку надо всегда одну и ту же и не менять её значение до ASYNC_DONE! Стековые переменные для данных записи не использовать, только статические или глобальные переменные.

ovkru
25.09.2017, 12:23
Спасибо.

Стековые переменные для данных записи не использовать, только статические или глобальные переменные.
Следовать этому совету - возражений нет. Однако, хотелось бы уточнить понятия: стековые, статические переменные. В РЭ ПЛК (в.1.9) в "Руководстве пользователя по программированию ПЛК в CoDeSys 2.3" упоминаются "стек ранее введенных команд", "стек вызовов". Стековые переменные не упоминаются. Статические переменные тоже.
Прошу уточнить Ваш совет.

Филоненко Владислав
25.09.2017, 13:23
в "Руководстве пользователя по программированию ПЛК в CoDeSys 2.3" нет основ программирования, подразумевается, что они уже изучены

Если Вы получили строку/массив через входные параметры функции/ФБ - это 95% стековая переменная.
Если Вы получили переменную по указателю - её содержимое внезапно может поменяться где-то там и Вы получите трудноотлаживаемую ошибку.
Если Вы объявили переменную в блоке VAR - она статическая
Если Вы объявили переменную в блоке VAR_GLOBAL - она глобальная

АлександрSTM
26.01.2018, 14:41
Вот именно на Си я читаю и пишу нормально без каких либо проблем в качестве отладки использую плату DISCAVERI STM32F407VG там вот не возникает вопросов как прочитать левый файл , и обработать , хоть по байтно хоть как , для чего мне сначала читать строчку , далее ложить ее в буфер а потом из этой строчки еще и выковыривать нужные мне данные , нельзя как то по проще все реализовать

АлександрSTM
27.01.2018, 08:11
Видео уроки они полезные как это реализовываеться , если появился новый интерфейс , новая шина , то к ней нужна полная техническая документация , по причине того что везде пишут и говорят что можно читать левые файлы с флешки , в итоге
приобрели не можем победить звоним в тех поддержку , техподдержка задает глупый вопрос , а зачем вам читать левые файлы с флешки записанные на ПК , ЕСЛИ ИНТЕРЕСНО Я МОГУ ВЫЛОЖИТЬ НЕ ОДИН ПРИМЕР РЕАЛИЗАЦИИ ФЛЕШ на отладке STM и там все просто и понятно , и документация есть , и примеров гора , и форум у них такой что просто если человек немного не понимает то в течении какого то времени появляеться его пример работы , и это еще не все плюшки , я промолчю про реализацию виртуального COM порта , ну смысл не в этом , та документация котороя есть она не полная , и один пример с архивацией , а как прочитать файл записанный на ПК такого примера нет , и начинаються вот такие вопросы , и они будут эти вопросы

АлександрSTM
27.01.2018, 08:21
в примере как надо писать OwenFileOpenAsync('usb:work\recept.txt','r',ADR(ha ndle)) hendle - возвращает 0 , значит ошибка как я понимаю

АлександрSTM
29.01.2018, 07:59
Добрый день вопрос есть функция , Функция SysFileReadAsync есть к ней ряд входных данных , и вот что прикольно я сам должен угадать порядок установки , и где смотреть пример по работе с этой функцией Ссылаться на документацию что там все есть не надо вот что там написано Функция SysFileReadAsync
Функция чтения данных из файла, открытого с помощью SysFileOpenAsync,возвращает значение типа DWORD–количество считанных байт данных.
Входные переменные:
File–типа DWORD–дескриптор файла, число, которое возвратила функция SysFileOpenAsync;
Buffer–адрес буфера, содержащего данные, которые необходимо записать в файл, число, которое возвратила функция ADRс аргументом –именем переменной-буфера; тип–массив, например, массив байт или строка.
Size–типа DWORD–размер буфера в байтах, можно использовать функцию SIZEOFс аргументом –именем переменной-буфера.
Использование функции –аналогично SysFileWriteAsync(см. рисунок 4.9).

Филоненко Владислав
29.01.2018, 09:32
SysFileReadAsync === SysFileRead + асинхронность. Чего там угадывать то. И пример есть.

capzap
29.01.2018, 09:46
Добрый день вопрос есть функция , Функция SysFileReadAsync есть к ней ряд входных данных , и вот что прикольно я сам должен угадать порядок установки
не нра угадывать, пишите прямо hFile:=handle,pBuffer:=ADR(Buffer) и т.д.

АлександрSTM
31.01.2018, 09:52
не нра угадывать, пишите прямо hFile:=handle,pBuffer:=ADR(Buffer) и т.д.

Тогда вопрос в следующим , как мне посмотреть что приходит в буфер , точнее как мне разложить и вывести все на монитор , на Си знаю как sprintf() и гоним куда угодно хоть в COM порт хоть на дисплей , к стати дисплей есть установлен и работает ИП320 , я не силен в этом языке так что простите меня за такие вопросы

capzap
31.01.2018, 09:58
Тогда вопрос в следующим , как мне посмотреть что приходит в буфер , точнее как мне разложить и вывести все на монитор , на Си знаю как sprintf() и гоним куда угодно хоть в COM порт хоть на дисплей , к стати дисплей есть установлен и работает ИП320 , я не силен в этом языке так что простите меня за такие вопросы

в онлайн режиме в окне объявлений раскрываете массив нажатием на плюсик и смотрите какие данные в ячейках. Можно это всё перевести в строку и вывести на экран, но всё зависит от наличия опыта и знания где посотреть. В библиотеке на oscat.de много функция по работе со строками

-=Vovka=-
29.11.2018, 11:25
Добрый день!
На втором этапе появляется статус
ASYNC_QUERY_FULL:= -1001, (*>5 запросов в очереди*) - как с этим бороться?


CASE g_LogState OF
0: (*Открытие файла - этап 1*)
g_LogRes := OwenFileOpenAsync( g_LogFileLog, 'a', ADR(g_LogHandle));
IF g_LogRes = ASYNC_WORKING THEN g_LogState := 1;
END_IF

1: (*Открытие файла - этап 2*)
g_LogRes := OwenFileOpenAsync( g_LogFileLog, 'a', ADR(g_LogHandle));
IF g_LogRes = ASYNC_DONE THEN
IF g_LogHandle<>0 THEN g_LogState := 2;
ELSE g_LogState := 0;
END_IF
ELSIF g_LogRes<0 THEN
g_LogState := 0;
END_IF
.....

Евгений Пашигоров
01.10.2019, 08:28
О библиотеке OwenLibFileAsync.

Читаю только что скачанную документацию.
Какая-то путаница с возвращаемыми типами у функций:

Функция SysFileOpenAsync
Функция возвращает значение типа DWORD

Функция SysFileCloseAsync
возвращает значение типа BOOL

Функция SysFileWriteAsync
возвращает значение типа DWORD – количество записанных байт данных

А в примерах функции вызываются в виде:

res:=OwenFileXxxAsync(xxx);

переменная res имеет тип ASYNC_RET_VALUE (в документации отсутствует описание этого типа, догадайся сам)

Ну ладно, ASYNC_RET_VALUE, допустим, совместимо с DWORD (как по мне, должна быть ошибка), но DWORD и BOOL один и тот же тип?

Примеры с IF-ами и CASE-ми выглядят громоздко и запутанно.

Я бы хотел написать так:


(************************************************* **********)
VAR
f_work: T_F_WORK; (*перечислимый тип: открыть, закрыть, записать и т.д.*)
res: ASYNC_RET_VALUE;
END_VAR

(*вызываем нужную функцию*)

CASE f_work OF

F_OPEN:
res := OwenFileOpenAsync(f_name,'a',ADR(f_handle));
F_CLOSE:
res := OwenFileCloseAsync(f_handle, ADR(f_result));
F_WRITE:
res := OwenFileWriteAsync(f_handle, ADR(f_buff), SIZEOF(f_buff), ADR(f_result));
F_NONE: ;

END_CASE

(*обрабатываем результат*)

CASE res OF

ASYNC_WORKING: (*ждем...*);

ASYNC_DONE:
f_work := F_NONE;
(*проверка на ошибки*)
(*...*);
(*а еще res возвращает некоторые ошибки!*)
(*как к ним относиться, неясно*)
(*но ведь как-то надо обработать!*)
(* ASYNC_PAUSED:
ASYNC_QUERY_FULL:
ASYNC_BLOCK_ACCESS:
ASYNC_GENERAL_ERROR:
ASYNC_INVALID_HANDLE_ERROR:
*)
END_CASE
(************************************************* *******************)

Гораздо компактнее и проще.

И опять, в описании не сказано, имеется ли логическая переменная для возврата наличия ошибки для всех функций (в старом описании такая переменная имелась). А ведь это позволит написать обработку файловых ошибок в одном месте, а не размазывать по всей программе.

Документацию надо бы поправить и дополнить.

A.Simonov
04.10.2019, 12:05
Добрый день.

Все функции возвращают тип ASYNC_RET_VALUE

Описание этого типа есть в самой библиотеке

44982

Коды ошибок попадают в переменную res (типа ASYNC_RET_VALUE).
Через CASE они обрабатываются без проблем.

Евгений Пашигоров
08.10.2019, 14:48
Добрый день.
Все функции возвращают тип ASYNC_RET_VALUE
Описание этого типа есть в самой библиотеке

Путаницу с типами возвращаемого значения хорошо бы убрать:
https://ftp.owen.ru/CoDeSys23/05_Library/01_Manuals/OwenLibFileAsync.pdf
(в описании функции возвращают разные значения: и bool, и позицию, и количество записанных байтов, и результат ASYNC_RET_VALUE...)
и добавить описание входного/выходного параметра ADR(result).

И если все функции возвращают ASYNC_RET_VALUE, то как узнать, сколько байтов записала функция записи или позицию в файле? Достигнут ли конец файла?

Также хотелось бы знать, что надо делать при получении значений
ASYNC_PAUSED,
ASYNC_BLOCK_ACESS:
- снимать запрос и повторять через некоторое (какое?) время?
- ждать (сколько времени?) другого ответа, непрерывно повторяя запрос?
- или что-то еще?

Как можно определить, сколько осталось места на носителе?
Что произойдет, когда кончится место?

Филоненко Владислав
08.10.2019, 18:02
ASYNC_BLOCK_ACESS - Значит в пользовательском коде есть логическая ошибка
ASYNC_PAUSED - подождать и повторить запрос

Асинхронная библиотека это просто надстройка для асинхронного доступа над стандартной SysLibFile. И место на диске определяется аналогично как через SysLibFile
И функции возвращают 2 значения, состояние асинхронной машины и *когда возвратится DONE) - ответ соответствующей функции SysLibFile, через указатель.

Евгений Пашигоров
09.10.2019, 08:32
место на диске определяется аналогично как через SysLibFile

А как определить оставшееся место в SysLibFile? В описании такой функции нет.

Валенок
09.10.2019, 08:50
В смысле свободное место на диске/флешке ?

Евгений Пашигоров
10.10.2019, 16:36
И на флешке, и на виртуальном диске в памяти, и во флешь-памяти контроллера...

Валенок
10.10.2019, 18:47
Это не syslibfile а к syslibdir.
Но походу до неё еще не дошли руки ))

приборист
10.10.2019, 20:50
Это не syslibfile а к syslibdir.
Но походу до неё еще не дошли руки ))

И не дойдут в CDS2.3

Филоненко Владислав
11.10.2019, 06:50
РАЗМЕР СВОБОДНОГО МЕСТА=РАЗМЕР ДИСКА - СУММА(РАЗМЕРОВ ВСЕХ ФАЙЛОВ)

Евгений Пашигоров
11.10.2019, 08:24
Надо хотя бы знать размер ram-диска и диска в контроллере. Я - не знаю.

Валенок
11.10.2019, 11:00
РАЗМЕР СВОБОДНОГО МЕСТА=РАЗМЕР ДИСКА - СУММА(РАЗМЕРОВ ВСЕХ ФАЙЛОВ)
Отличный ответ.
Осталась ерунда типа получения размера диска (Евгений спросил выше) и последовательного вытаскивания элементов папки с их данными (сислибдир не поддержан)
Ну и мелочь типа некорректности формулы выше из-за "кластеризации" файлов.
"Мыши, станьте ежиками.. .."

Филоненко Владислав
11.10.2019, 11:28
Отличный ответ.
Осталась ерунда типа получения размера диска (Евгений спросил выше) и последовательного вытаскивания элементов папки с их данными (сислибдир не поддержан)
Ну и мелочь типа некорректности формулы выше из-за "кластеризации" файлов.
"Мыши, станьте ежиками.. .."

Кластеризация важна если у вас тысячи файлов, десятки, сотни тысяч.
И выжимать 100% дискового пространства - зачем?
Ну а ежели разработчик программы для ПЛК не знает какие он файлы пишет на ПЛК - то может чем попроще заняться, где думать не надо?
Апельсины сортировать или копать траншеи.
Там укажут куда и как долго копать :)

Валенок
11.10.2019, 11:34
С общий обьемом диска и списком имеющихся файлов как ?


Лично меня вопрос получения св. обьема не беспокоит, хотя интересен. Но вопрос задан. Производителю, если что. Производитель пока предложил стать ежиками.

Gilgamesh
18.10.2019, 13:23
Добрый день, подскажите, в чем преимущество библиотеки OwenAsyncLibFile перед стандартной асинхронной CAA.FILE для записи данных на USB-флешку?

Gilgamesh
18.10.2019, 13:50
в КДС2.3 для плк110 получилось использовать CAA.FILE ?

Нет, есть аналог 110 (по крайней мере они так утверждают) для кдс3.5, но прочитав несколько тем на форуме появились сомнения, почему тогда овен не адаптировал эту библиотеку, например, для своих целей, а сделал свою, причем, как я понял, на ее допилку ушло достаточное количество времени. Хотелось бы вернуть этот ширпотреб им по гарантии (как неспособный выполнять эту функцию) и работать со 110ым контроллером. Отсюда и возник вопрос, если ли преимущество овеновской библиотеки перед CAA.FILE в рамках поставленной задачи?

Gilgamesh
18.10.2019, 14:34
пока ни чего не поменялось, все доводы не убедительны. CAA.FILE не работает в КДС2.3 поэтому они не могут сравниваться по каким то ни было деталям. асинхронная библиотека писалась поверх syslibfile
Это все понятно, но тем не менее, что лучше использовать с технической точки зрения для поставленной задачи, без влияния на технологический процесс, который управляется контроллером, CAA.FILE+КДС 3.5+сторонее железо или OwenAsyncLibFile+КДС 2.3+плк110(м02)?Возможно овены учли что-то с аппаратной точки зрения если нет разницы в использовании библиотек?

Gilgamesh
18.10.2019, 15:24
на что денег хватит
И в этом вся разница?

Gilgamesh
18.10.2019, 17:25
Так сказал специалист техподдержки с которым я связывался,нагуглил этот же пост (что вы репостнули)+ написал на оф форум кодесис вопрос,а правда ли она асинхронная,т.к. в ее описалове не смог найти эту информацию

RV9WFJ
19.10.2019, 07:09
а вот проблем использовав её поимеете массу, стандартные средства ни чем не хуже, главное опыт работыПоделитесь, какие проблемы использования Async.

capzap
19.10.2019, 11:02
Поделитесь, какие проблемы использования Async.

если что, цитату которую Вы привели из поста про CAA.FILE

RV9WFJ
20.10.2019, 06:56
CAA.File тоже Async.

capzap
20.10.2019, 08:17
выложите пример, где как Вам кажется, всё предусмотрено. Я как раз давно не практиковался, поэтому у меня обязательно пойдет что нибудь не так, я в ней уверен

ЗЫ чтоб пример не был простым как дважды два, например реализовать чтение из файла в 1000 строк, строки с 555 по 560-ую

Валенок
20.10.2019, 16:16
и срываюсь по времени
Что значит срываетесь по времени ? Вы проверяете время ?!! А зачем ?


Не важно что и как я буду рассматривать
Как это не важно ? Это напоминает предложение баскетболиста боксеру - а давай мячи в корзину покидаем и сравним кто лучший спортсмен.

Филоненко Владислав
20.10.2019, 19:28
Асинхронная библиотека нами сделана как аналог аналогичной библиотеки в CDS3
Интерфейс отличается, т.к. мы не можем научить компилятор CDS2.3 создавать задачи.
Для ввода/вывода небольших файлов на внутреннюю flash/ram диск асинхронная библиотека не даст суперпреимуществ, т.к. задержки в худшем случае будкт порядка единиц/десятков мс.
Однако при использовании внешних накопителей USB, особенно в бытовом исполнении - на тестах наблюдались задержки до 4 секунд, из-за реализации обмена внутри USB-Flash.
Т.о. для больших файлов и внешних накопителей - must have
Для стабильного цикла в единицы мс- must have
Во всех остальных случаях можно по старинке.
P.S. CAA - это просто обертка SysLibFile и на 2-м кодесисе никакой асинхронности там нету.

Gilgamesh
21.10.2019, 17:12
Асинхронная библиотека нами сделана как аналог аналогичной библиотеки в CDS3
Интерфейс отличается, т.к. мы не можем научить компилятор CDS2.3 создавать задачи.
Для ввода/вывода небольших файлов на внутреннюю flash/ram диск асинхронная библиотека не даст суперпреимуществ, т.к. задержки в худшем случае будкт порядка единиц/десятков мс.
Однако при использовании внешних накопителей USB, особенно в бытовом исполнении - на тестах наблюдались задержки до 4 секунд, из-за реализации обмена внутри USB-Flash.
Т.о. для больших файлов и внешних накопителей - must have
Для стабильного цикла в единицы мс- must have
Во всех остальных случаях можно по старинке.
P.S. CAA - это просто обертка SysLibFile и на 2-м кодесисе никакой асинхронности там нету.
Благодарю за ответ!

Евгений Пашигоров
22.10.2019, 19:11
И выжимать 100% дискового пространства - зачем?

100% мне не обязательно, но сориентироваться хотя бы примерно по размеру просто необходимо.
Тем более, вы не указываете, что произойдет при превышении размера диска.
Интересует RAM-диск и диск по умолчанию в контроллере. Какие у них размеры?

Вячеслав@
10.08.2020, 11:29
Добрый день. Подскажите, правильно ли я понял, бегло просмотрев эту тему:
При подключении к контроллеру внешней USB флешки ее можно использовать для хранения архива и получения данных из него?
Например: некоторые данные (int массивы) регулярно (каждые 10 минут) записываются с контроллера на флешку, и затем, в любой момент, эти данные можно оттуда получить? В том числе из внешней СКАДА по Modbus TCP?
То есть это будет некий упрощенный аналог внешней базы данных?