PDA

Просмотр полной версии : Журналирование в ПЛК



drvlas
20.01.2014, 17:49
ВНИМАНИЕ: очень многое из задуманного переделал, спасибо коллегам, поєтому предлагаю смотреть резюме в сообщении № 57 (http://www.owen.ru/forum/showthread.php?t=16563&page=6).


Здравствуйте!

Впервые стала задача создать на ПЛК100 журнал событий во ФЛЕШ-памяти. В ходе работы контроллера возникают события (раз в 30 секунд и реже), по которым нужно выполнить запись в журнал: несколько переменных и штамп дата-время.
Сначала своим крестьянским умом начал реализовывать вот такую систему (ниже будут вопросы):

1) Создал тип данных LOGITEM - структуру, состоящую из всех данных, необходимых для одной записи
2) Создал массив структур такого размера, чтобы запись его в файл была не очень долгим процессом.
3) По событиям записываю новый элемент массива, пока не заполню все. Когда весь массив сформирован - пишу его в файл.
4) Когда выключается питание, по сигналу аварии питания записываю файл "досрочно". Ну, еще как-то надо научить ПЛК записывать файл, тоже досрочно, но в тот момент, когда оператор (или система) захочет списать архивы з ФЛЕШ - чтобы последний недозаполненный массив записей тоже "попал в историю"...
Примечание: имена файлов хочу сделать по дате и времени события, например, "2014-01-20-15-40-12.csv". И формат сразу CSV, чтобы просматривать офисными программами. Так хочет заказчик.
5) Из предыдущих п.3 и п.4 вытекает, что при старте я делаю следующую инициализацию:
- ставлю индекс массива на начало, чтобы всегда заполнять массив с начала
- (планирую, но еще не знаю как это сделать) проверяю заполненность памяти ФЛЕШ и удаляю старые файлы, либо просто один самый старый, либо какой-то "кусок", чтобы просто было много места. Оператору незачем старательно стирать файлы при их вычитке.

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

Спасибо!

lara197a
20.01.2014, 18:08
Выкладывали здесь примеры, поищите.
Если не найдете, то был у меня пример, но сразу оговорюсь - лошадь не моя.
Сам писал, давненько правда, архив для вывода на СП270. Там чуть по другому.
Сейчас это не актуально, есть ваентек.

drvlas
20.01.2014, 18:15
Выкладывали здесь примеры, поищитеТак... Искать влом, если нет уверенности, что надо искать. Я ж и спрашиваю: есть ли решения, которые в корне отличаются от (довольно старательно) описанного мной алгоритма? Если спец либов нет, если совершенно других (и более правильных) подходов нет, то меня и не интересуют реализации на том же базисе, что я сейчас использую. Ибо разбираться с чужим я не очень люблю.

Sergey666
20.01.2014, 18:23
Массив структур делать не надо , да и структура нэ трэба.
Вообще структура нужна для !!! Объединения в один ТИП ДАННЫХ РАЗНЫХ ТИПОВ .
Писать вы хотите .csv , значит конвертация в "String" , т.е формируете строку события и записываете в КОНЕЦ файла . В примерах вроде есть .

На панелях Вайнтек или Дельта это вообще легко делается .

drvlas
20.01.2014, 18:32
Массив структур делать не надо , да и структура нэ трэбаНу почему же? Трэба!
Начну с конца: структура мне нужна, потому что в нее пуляю вполне себе разные данные, WORD, DWORD и т.д.
А массив - чтобы ресурс ФЛЕШ беречь! Если у меня в смену до 100 событий, за 10 смен выработаю ресурс. Или я не понимаю, с какой памятью имею дело?

Sergey666
20.01.2014, 18:53
А я что с эфемерной памятью дело имею ?
Готовых библиотек нету , ручками все надо.

По 5 му пункту(удаление старых) , надо сделать "Реестр" с порядковым номером создаваемого файла и соответствие имени .

lara197a
20.01.2014, 18:55
Объявите в структуре нужное количество записей, если нужно можно сделайте "по кругу".
конечное число записей ведь должно быть?
В конце- концов это же влияет на размер буфера памяти.

drvlas
20.01.2014, 19:04
Готовых библиотек нету , ручками все надоПонял, спасибо!


надо сделать "Реестр" с порядковым номером создаваемого файла и соответствие имени .А где его хранить? Я исхожу из того, что после выключения питания может пройти сколько угодно времени до слежующего включения. Поэтому RETAIN-данным не доверяю. Записывать каждый раз при записи файла - протру дырку во ФЛЕШКЕ. Поэтому я как-то хочу изгалиться с перебором всех файлов, ранжированием их по времени создания (как вижу по описанию либы SysLibFile, это доступно в атрибутах фалов) - и затем отсекании самого старого или самых старых...

drvlas
20.01.2014, 19:08
Объявите в структуре нужное количество записейДа я по ходу уже подумал, что если для создания CSV-файла мне нужно формировать строки, то я от структуры и откажусь. Буду сразу из всех данных, которые должны пойти в журнал, лепить одну колбасину-строку и ее записывать в массив строк. Тогда, когда дойдет время для записи оперативных данных во ФЛЕШ-память (файл), я уже просто писать готовые строку за строкой.

Sergey666
20.01.2014, 19:38
Лучше сделать массив строк , т.е каждый раз по событию формировать строку и добавлять ее в массив , в конец строки добавить символ перевода строки (гугл в помощ , я не помню).
"Реестр" файлов храните в ретайне (уже тыщу раз писал аккумулятор от мобильника будет "вечным").
С перебором по дате за...шся .

drvlas
20.01.2014, 19:41
А вот не пойму в описании либы SysLibFile (и тему не хочется новую заводить): как дописывать в уже открытый файл? Есть там загадочные SysFileGetPos и SysFileSetPos - а каким чохом их присобачить к SysFileWrite? У той же нет такого параметра, который указывал бы на запись со смещением...
То есть, записал я строку в файл, длина известна. Хочу следующую дописать, не закрывая файл. Как?
Или обязательно создавать промежуточную супер-строку, состоящую из всего, что надо записать?

Sergey666
20.01.2014, 20:05
Перед записью выполнить "SetPos" на размер уже имеющегося файла - после открытия "Get_size(файл);

amn
20.01.2014, 20:13
Лучше сделать массив строк , т.е каждый раз по событию формировать строку и добавлять ее в массив , в конец строки добавить символ перевода строки (гугл в помощ , я не помню).

Символ возврата каретки '$R'

drvlas
20.01.2014, 20:26
после открытия "Get_size(файл);Я не закрываю файл по записи каждой строки.
Может так: GetPos, потом SetPos, потом Write? То есть, SetPos "подвигает" дескриптор файла?

drvlas
20.01.2014, 20:31
Фигасе... А в либе SysLibStr действительно нечем дописать строку или у меня старое описание? Ручками?

Sergey666
20.01.2014, 20:32
Я не закрываю файл по записи каждой строки.
Может так: GetPos, потом SetPos, потом Write? То есть, SetPos "подвигает" дескриптор файла?

Файл надо закрывать после записи , нефиг ему в оперативке сидеть.
Дескриптор - не подвигается , Сетпоз устанавливает позицию в файле (типа курсор) , позиция в байтах .
Писать надо в конец , открываем , смотрим размер , устанавливаем позицию , пишем , закрываем .
Усе.

Sergey666
20.01.2014, 20:38
Фигасе... А в либе SysLibStr действительно нечем дописать строку или у меня старое описание? Ручками?

Ну вы батенька ...
Concat для чего .
Чтоб мозг подзанять есть еще Oscat .

drvlas
20.01.2014, 20:51
Ну вы батенька ...Это я батенька? Это тот ..., который писал описание библиотек... Что искать-то я догадываюсь. Но ни в аглицком, ни в русском варианте нет. Потому и закралось подозрение, что у меня описания еще с глиняных табличек списаны...

Sergey666
20.01.2014, 20:58
Это я батенька? Это тот ..., который писал описание библиотек... Что искать-то я догадываюсь. Но ни в аглицком, ни в русском варианте нет. Потому и закралось подозрение, что у меня описания еще с глиняных табличек списаны...

Вообще-то авторы Германцы . Во времена глиняных табличек германцы толпой в рукопашную медведей в лесах гоняли .

На бересте поискать надо более поздние... на кириллице.

drvlas
20.01.2014, 21:22
На бересте поискать надо более поздние... на кириллице.ткнешь носом? Не могу найти ничего, где была бы конкатенация...

amn
20.01.2014, 21:24
http://www.owen.ru/forum/showthread.php?t=12487&p=81452&viewfull=1#post81452

Sergey666
20.01.2014, 21:28
На Аглицком разумиещ!?

В КДС справка HTML встроенная , там пошукай .
Standart.lib

А перцовка Немирофф уже не та....

drvlas
20.01.2014, 21:55
http://www.owen.ru/forum/showthread.php?t=12487&p=81452&viewfull=1#post81452Не в глаз, а в яблочко! :)

Ну кто ж знал, что она а Standard.lib входит...

Спасибо, коллеги!

Валенок
21.01.2014, 13:26
Еще рекомендовал бы писать через промежуточный буфер в 512 байт а не каждую строку.
И зачем сразу кучу ? Может разным переменным - разные периоды/события ? Cортинг сплошного csv по любому полю - дело 5 секунд

drvlas
21.01.2014, 17:07
Привет, уважаемый Учитель! Рад, что тебя заинтересовали мои вопросы. Ща их будет больше :)


Еще рекомендовал бы писать через промежуточный буфер в 512 байт а не каждую строкуЯ пишу события в виде готовых CSV-строк (как случится - так и сварганю строку), создавая массив событий. Хотелось бы туда накидать до 512 строк (строка где-то до 60 байт), тогда частота записей во ФЛЕШ будет приемлима (я боюсь, что каждая запись файла приводит к изменению-перезаписи инфо в каком-то реестре, расположенном тоже на ФЛЕШи, так в этом месте дырка быстро протрется).
Когда массив строк заполнен - вызывается функция записи в файл. Она приделывает файлу уникальное имя в виде "2014-01-20-15-01.csv" и лупит туда заголовок и все (512) строк.
Если выключаетс питание, то в файл пишется неполный массив строк - сколько есть на тот момент.
Сейчас это все работает, не знаю только какой размер файла можно надежно записать во время умирания блока питания...

Но вот новый вопрос. Набухиваю я файлы в ПЛК. Программой plc_io от комании ОВЕН я их считываю и потом открываю в электронной таблице. Красота! Но делать это достаточно неудобно:
1) выискивать файлы, еще не прочитанные в комп, вводить их точные имена - морока
2) почистить флеш ПЛК со стороны ПК вообще непонятно как. Ни программа plc_io, но браузер ПЛК, ни функции либы SysFileLib не поддерживают * в работе с файлами. Дать команду очистки *.csv файлов - как?

Sergey666
21.01.2014, 22:47
Надо "реестр" делать.
Не хотите в ретайн хранить храните в файле с фиксированным именем в него записывать названия файлов не сей момент.

drvlas
21.01.2014, 23:31
Надо "реестр" делатьПожалуй, так и надо. Спасибо, буду думать. Если на стороне компа - то это почти то же самое, что читать директорию ПЛК в файл и потом его парсить. Придется все же оболочку над plc_io сварганить (в чем я дуб-дубом, да...)
Но выгода от твоего предложения в том, что и в самом ПЛК можно организовать очистку. Вот это, да, плюс!

capzap
21.01.2014, 23:59
Пожалуй, так и надо. Спасибо, буду думать. Если на стороне компа - то это почти то же самое, что читать директорию ПЛК в файл и потом его парсить. Придется все же оболочку над plc_io сварганить (в чем я дуб-дубом, да...)
Но выгода от твоего предложения в том, что и в самом ПЛК можно организовать очистку. Вот это, да, плюс!

Нехотите на пк оболочку делать, приглядитесь к бибке оскатнетворк там есть клиент фтп, можно хранить файлы и не на самом плк

drvlas
22.01.2014, 00:25
Нехотите на пк оболочку делатьЯ хочу, но не умею. Уже хотелке лет 20...

СКАДУ с сохранением на ПК я уже сделал (на МастерСКАДе), но мне не понравилось (для такой простой задачи очень громоздко получилось). Возможно, что использование оскатнетворк привело бы к более изящному результату - но это уже в другой теме. Ибо заказчику очень неудобно держать комп постоянно включенным для журналирования. Потому сейчас кагбэ дано: хранить на ПЛК, сгружать на ПК.
Я еще не смотрел, как через USB стянуть с ПЛК...

capzap
22.01.2014, 00:42
Почему постгянно, плк проверяет сокет, сконнектился - отправил накопившиеся файлы, а нет соединения периодически проверяет связь и копит в озу, кроме пк есть еще и nas кстати

drvlas
22.01.2014, 02:22
плк проверяет сокет, сконнектился - отправил накопившиеся файлыПЛК может выключится когда угодно. Поэтому накапливать файлы будет именно во ФЛЕШ-памяти.
Но хорошая мысль - пусть сам отправляет новое и, отправив, сразу и уничтожает. Это сводится, по сути, к созданию того же реестра, о котором говорит Sergey666.
Да, если считать, что ресурс ФЛЕШ-диска ПЛК определяется числом изменений в его FAT, то создание и поддержание реестра ничего не ухудшит. В этом направлении и буду смотреть. Спасибо!
А уж как потом скидывать - то ли по запросу от plc_io (или другой прогарммы на ПК), то ли по инициативе ПЛК, будет видно.

Yegor
22.01.2014, 11:12
Гнать всё в бинарный файл максимального размера по кругу структурами фиксированного размера с отметками времени и контрольными суммами. Парсить и сортировать по времени в CSV на компе после захвата через plc_io (помогу). Указатель позиции в основном файле записывать в дополнительный файл. Компактно, надёжно, просто. Удалять не придётся ничего вообще, имена обоих файлов известны и намертво зашиты в программу ПЛК и парсер на ПК. Чтобы на флеш скинулось, просты переоткрыть рабочий файл, и всё.

drvlas
22.01.2014, 11:52
В поезде, в совейские времена:
- Хотите, политический анекдот расскажу?
- Вы что не видите, я же миллиционер, в форме!
- А, не страшно, я буду рассказывать медленно и два раза.

Давай-ка, с учетом моего скудоумия, по кусочкам кушать твой блюдо :)


Гнать всё в бинарный файлПочему именно бинарный? CSV - текстовый же... Как его потом втягивать в таблицу?
Или ты имеешь в виду, что после plc_io мы своей утилиткой открываем бинарник и парсим, находим то, что нужно, преобразовуем в CSV и отдаем оператору?


файл максимального размераВерно ли я тебя понял: с файлом мы проделываем такие операции: открыл, ткнулся в указанное место, переписал там фрагмент (поверх старого) и закрылся, сохранив во втором файле новое значение указателя? Могу, конечно, почитать подробности об операциях записи в файлы в Инете, но важно в принципе - я верно понимаю?
Что важно: время на операции с файлами ограничено временем _надежной_ работы ПЛК после получения сигнала об отключении сетевого питания. Потому слова "максимального размера" страшат. Но если все как я описал, то время перезаписи фрагмента не должно зависеть от размера файла. Верно?


Парсить и сортировать по времени в CSV на компе после захвата через plc_io (помогу)... и парсер на ПКНу, как сделать именно парсер - именно здесь я в полном неведении. Хотя, если речь не идет о построении оконного диалога, обращении к ПЛК и прочим фокусам со средствами ОС, а просто об открытии файла и работе с записями... Это кагбэ несложная Си-программа. У меня даже компиль не стоит для разработки софта под ПК... Мож и смог бы, с пинками в нужное место и в нужном направлении :)

petera
22.01.2014, 12:38
Ну, как сделать именно парсер - именно здесь я в полном неведении. Хотя, если речь не идет о построении оконного диалога, обращении к ПЛК и прочим фокусам со средствами ОС, а просто об открытии файла и работе с записями... Это кагбэ несложная Си-программа. У меня даже компиль не стоит для разработки софта под ПК... Мож и смог бы, с пинками в нужное место и в нужном направлении :)
11503
http://www.hiasm.com/


http://www.youtube.com/watch?v=TEywOaHYv5Q

Yegor
22.01.2014, 12:44
Или ты имеешь в видуДа.
важно в принципе - я верно понимаю?Да.
время перезаписи фрагмента не должно зависеть от размера файлаОно будет зависеть от размера фрагмента. Тут я бы по накоплении определённого объёма записанных байт закрывал бы файл и вновь его открывал.
Это кагбэ несложная Си-программа.Примитивная.
У меня даже компиль не стоит для разработки софта под ПКУ кого .NET установлен, у тех и компилятор сишарпа есть. Но если хотите, я вам за спасибо программку напишу и отдам вместе с исходником — описание структуры только дайте да пример CSV-файла (бинарник тоже бы неплохо).

drvlas
22.01.2014, 13:09
2 petera Забавная штучка! Не раз думал о таком (простом?) пакете для быстренькой разработки всяких свистоперделок. Жаль только, что, судя по сайту, она уже пару лет как не развивается. Как раз 5 версия с объявленной поддержкой Линукса сгодилась бы (не сейчас, так вааще)

2 Yegor Ну конечно же хочу! Изучать от готового шаблона (тем более, если он создается уже под задачу) - милое дело! ЩА приготовлю описание!
ТОКА не уходи далеко! :)

drvlas
22.01.2014, 13:58
Ну вот, что-то в таком духе:

Структура данных

Каждая запись о событии состоит з следующих полей:

1) Номер события uint32_t
2) Метка времени: одинаковые 4 поля uint16_t: месяц, день, час, минута
3) Данные: 3 поля разной длины: int16_t, int_16t, int32_t
4) (опционально) CRC по предыдущим полям (Модбасовский) uint16_t

События возникают с неопределенной периодичностью, до 3000 в сутки (теоретический максимум, реально до 1000 в сутки). ПЛК накапливает события в ОЗУ, порядка 128...1К событий, а затем записывает это в файл. Таким образом, ресурса ФЛЕШ (я взял 5000 записей, с перестраховкой) должно хватить на 1...16 лет, что сейчас приемлимо.
В ПК они считываются оператором раз в день, но возможно и раз в несколько дней. Поэтому размер файла будет выбран таким, чтобы в нем могли разместиться не менее 10...50 тысяч записей. И среди них требуется найти (по фильтру оператора) интересующие и преобразовать в CSV-файл.

Итак, возможности программы-декодера на стороне ПК таковы:

1) Чтение файла из ПЛК (судя по всему, скорость чтения программой plc_io.exe довольно низка, но это придется терпеть)
2) Выбор временнОго окна (день-месяц-час-минута)
3) Получение файла с именем, в котором отражены параметры временнОго окна. Это задумано для того, чтобы в ПК можно было автоматически получать архив файлов, не уничтожая никакие предыдущие — ведь каждый файл уникален по названию.
Например, название может быть таким
20140121-2200_20140122-0700. CSV — файл с данными по ночной смене с 21 на 22 января
4) При получении ошибки следует сообщить ее код и смысл. В описании plc_io.exe есть данные по ее кодам, а в данных неплохо бы предусмотреть сообщение о битой CRC с указанием временного штампа.

Конечно же, к интерфейсу программы не предъявляються никакие требования. Можно даже просто командной строкой

yegor 01 21 22 00 01 22 07 00

(год можно не задавать, программа пишет файлы с учетом текущего года, 31 декабря пусть побеспокоятся о вычитке всех файлов за декабрь, а уж потом идут бухать)
Ну, а если будет окошко со стандартым выбором даты-времени — то вааще жесть!

Yegor
22.01.2014, 14:49
Окей, завтра сделаю, т.к. сейчас уже домой поеду. Не теряйте.

drvlas
22.01.2014, 15:11
В любом случае - спасибо за идею одного кольцевого файла! Мож и я чего соображу, хотя у нас тут собітия...

petera
22.01.2014, 15:42
Пока Yegor будет делать программу, посмотрите библиотеку OSCAT "codesys_network_121_hf1.lib" может что-то полезное в ней найдете.
11504

11505

11506

drvlas
22.01.2014, 18:07
может что-то полезное в ней найдетеНесомненно! Похоже, что это классная штука. Но это нужно освоить.

Yegor
23.01.2014, 08:27
Пока пишу прогу, у меня тут сомнения появились, что большой файл получится вытянуть когда ПЛК в него периодически пишет. Вы там проверьте как-нибудь.

drvlas
23.01.2014, 09:38
К счастью, в момент считывания файла можно обеспечить (администартивными мерами) отсутствие событий. То есть, в данном конкретном случае, ПЛК не будет писать, когда ПК вычитывает.
Но конечно, нужно будет проверить.
Кстати, сейчас я все же пробую готовить сразу CSV в ПЛК. Все, что нужно будет от Вашей проги - вытянуть из СИМВОЛЬНОГО файла инфо в соответствии с временными рамками, заданными оператором. Если Вы ушли уже далеко вперед для смены ТЗ, то Бог с ним, я сам переделаю. Но вообще, выглядит так, что с символьным получше будет. Ведь на худой конец, можно открыть CSV Экселем и вытянуть ручками...
Или Вам еще можно описать формат символьного файла?

Yegor
23.01.2014, 09:46
Ну опишите текстовый формат тогда. Я как раз саму оболочку набросал (http://imgur.com/m74Q4SW) и только взялся за отладку процедуры чтения бинарников.

drvlas
23.01.2014, 09:51
Записи длиной 56 байт. Ща кину фалик

drvlas
23.01.2014, 10:05
Ща кину фаликНе пойму, как файл приаттачить... Что за чЮдеса...

ладно, революция не терпит промедления. Завтра мы тут можем уже быть без Инета...

Вот снимок ровно двух строк
11518
Вот их потрошка
11519
А вот они уже в электронной таблице
100001 23/01/14 00:24 0 9,99 7776,27
100002 23/01/14 00:24 0 9,99 7786,26

Длина записей всегда одинакова. Длина отдельных поелй меняется: в первой колонке может быть от 1 до 6 цифр, вторая колонка железобетонная, в третьей и четвертой может быть до 5 цифр, может быть или не быть знак, может быть или не быть десятичная запятая (не более 2 цифр справа от нее). В следующей колонке может быть от 1 до 9 цифр без знака, но запятая тоже может быть (одна или две десятичные цифры справ от запятой).
Потом две пустых колонки. В первой из них количество пробелов выравнивает длину строки
Самое главное - видно формат времени и даты. Он неизменен.

Yegor
23.01.2014, 13:00
Версия 0.1

Хоть и графическая, но запускать надо с теми же параметрами, что и plc_io. Например, LogParser /TCP192.168.1.50 /get log.csv
Утилита plc_io запечатана в экзешник этой программы и распаковывается при каждом получении данных во временную папку, после вызова удаляется. Всё её сообщения выводятся в зелёном окошке.
Для работы требуется .NET Framework 4.

Жду багрепортов. С контроллером не проверялось, т.к. поблизости их нет.

Scream
23.01.2014, 13:05
Бегло посмотрел тему. Искал возражения против стандартного архиватора, не нашел.
так вот..
А нельзя ли просто воспользоваться готовым решением Archive?
Вам наверное бы подошел. Время и дата автоматом ставится.
Ктото скажет большой файл создать нельзя.
С вашими способностями с библиотекой SysLibFile можно будет проверять размер файла созданного Archive1 и если он достигает 32кб(насколько помню это и есть ограничение), то писать Archive2 и т.д.
События и некоторые настройки записи просты. А как только вы скачали его на комп, удалили скачанный, так архиватор автоматом создал новый и дело в шляпе.

P.S. Лично я не люблю писать в плк, а сразу пишу на ПК сервер, всё там достаточно просто.

drvlas
23.01.2014, 13:44
Спасибо, коллега! Сейчас не успею проверить. Мож через несколько часов.

drvlas
23.01.2014, 13:46
Бегло посмотрел тему. Искал возражения против стандартного архиватора, не нашел.
Я ж спрашивал! Где ты был... Но сейчас уже есть смысл доработать текущую идею

Scream
23.01.2014, 14:08
Я ж спрашивал! Где ты был... Но сейчас уже есть смысл доработать текущую идею

Да, интересно что в итоге получится. Можно сюда и повыкладывать в помощь тем кто столкнется и описать принцип, если религия конечно не запрещает.

Sergey666
23.01.2014, 16:33
Бегло посмотрел тему. Искал возражения против стандартного архиватора, не нашел.
так вот..
А нельзя ли просто воспользоваться готовым решением Archive?
Вам наверное бы подошел. Время и дата автоматом ставится.
Ктото скажет большой файл создать нельзя.
С вашими способностями с библиотекой SysLibFile можно будет проверять размер файла созданного Archive1 и если он достигает 32кб(насколько помню это и есть ограничение), то писать Archive2 и т.д.
События и некоторые настройки записи просты. А как только вы скачали его на комп, удалили скачанный, так архиватор автоматом создал новый и дело в шляпе.

P.S. Лично я не люблю писать в плк, а сразу пишу на ПК сервер, всё там достаточно просто.

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

Scream
23.01.2014, 19:50
Ну да , тут наверное извращенцы програмерные .(Хотя есть,есть такое дело ;)).
Кабы работал нормально архивер этот , чего-бы заморачиваться с библиотеками , файлами и др .

Уверяю Вас, у кого руки прямые и из плеч, у того работает.

P.s. Не рекомендовал, еслиб не пробывал.

drvlas
24.01.2014, 12:39
Версия 0.1
Жду багрепортовДа что ты! Уже работает, с первого толчка! Спасибо огромное, коллега!

Это первые эмоции. Так как возможность отключения Инета в Украине сохраняется, то пишу, не произведя еще полноценной проверки. По ходу буду сообщать.
Пока что только с вводом временнОго окна есть маленькая нескладушка, но работать можно, потому ее игнорим...

Да, и на стороне ПЛК проверена работа с сохранением указателя точки записи в файл в своем файле. Это оказалось необходимым (в противовес сохранению в РИТЕЙН), ибо у меня лично не срабатывает сохранение в РИТЕЙН-файле, если изменение РИТЕЙН-переменной происходит перед самым выключением питания. Как-то ПЛК должен пробежать еще пару циклов работы или фиг его знает... Но - не стал долго морочиться, перенес указатель в файл, который сам создаю - и пока все чики-пики.

Если мое многословие уже совсем запутало уважаемых коллег, то простите. Все так урывками. Продолжаю проверят и править по мелочам. Если хоть кто-то выскажет интерес, выкладу резюме по окончанию. В нем (резюме) я доложу о том, как же имееено у меня получилось журналировать события в ПЛК со сбросом потом в ПК и раскруткой архива программой Yegor-а

Scream
24.01.2014, 14:38
Да что ты! Уже работает, с первого толчка! Спасибо огромное, коллега!

Это первые эмоции. Так как возможность отключения Инета в Украине сохраняется, то пишу, не произведя еще полноценной проверки. По ходу буду сообщать.
Пока что только с вводом временнОго окна есть маленькая нескладушка, но работать можно, потому ее игнорим...

Да, и на стороне ПЛК проверена работа с сохранением указателя точки записи в файл в своем файле. Это оказалось необходимым (в противовес сохранению в РИТЕЙН), ибо у меня лично не срабатывает сохранение в РИТЕЙН-файле, если изменение РИТЕЙН-переменной происходит перед самым выключением питания. Как-то ПЛК должен пробежать еще пару циклов работы или фиг его знает... Но - не стал долго морочиться, перенес указатель в файл, который сам создаю - и пока все чики-пики.

Если мое многословие уже совсем запутало уважаемых коллег, то простите. Все так урывками. Продолжаю проверят и править по мелочам. Если хоть кто-то выскажет интерес, выкладу резюме по окончанию. В нем (резюме) я доложу о том, как же имееено у меня получилось журналировать события в ПЛК со сбросом потом в ПК и раскруткой архива программой Yegor-а

Мне было б очень интересно посмотреть на все это из нутри.

drvlas
24.01.2014, 16:56
В таком случае я с удовольствием отчитаюсь. Сейчас идет отладка на объекте. Установили канал VPN, закачали новую версию программы ПЛК, запустили. Пока полет нормальный, но это только предварительно.
Так что ждите объявлений :)

drvlas
24.01.2014, 23:19
Так что ждите объявлений :)Их есть у меня!

Общая организация. Во ФЛЕШ-памяти ПЛК(100) созданы 2 файла:
- ringfile.csv (кольцевой файл-журнал)
- filepos.bin (указатель текущей позиции записи в кольцевой файл-журнал)

Программа ПЛК работает себе, работает, когда вдруг бац! - событие. По нему формируется запись, то есть одна строка будущего csv-файла. Строка имеет строго фиксированную длину. Вот пример строки-события:


100001; 24/01/14 12:14; 0,00; 10,00; 8275,79; ;;
(1) (2) (3) (4) (5) (6) (7) (8)

1 — номер события;
2 — дата та 3 — время события;
4, 5, 6 — те или иные данные, которые нужно журналировать;
7 та 8 — пустые поля, которые можно и не делать. Первое из них изменяет длину, компенсируя разную длину предыдущих полей. Но на 55-й и 56-й позиции всегда стоит <cr><lf>
Чтобы не слишком расточительно тратить ресурс ФЛЕШ-памяти ПЛК, события накапливаются в массиве строк, размер взят 200 строк. Возможное увеличение до 500-1000 строк не проверялось, мне хватит, если 200 строк будут надежно записываться в кольцевой файл-журнал.
Как только весь массив заполнится, вызывается функция bSaveLog записи массива строк в кольцевой файл-журнал. После этого массив событий начинает заполняться снова.

При выключении питания модуль статистики ПЛК гасит флаг bPower_OK (я так назвал), по этому сигналу немедленно вызывается та же bSaveLog с указанием реального количества событий в массиве (он же не полный). Она и записывает сколько нужно строк в буфер.

Осталось рассмотреть функцию bSaveLog, а также работу с ПЛК со стороны ПК.

Итак, bSaveLog. Ее задача: вставить в кольцо информации (записей длиной 56 байт) фрагмент от 1 до 200 записей. При этом начальное положение эта функция берет из вспомогательного файла filepos.bin, куда после всех трудов своих тяжких запихивает новое значение указателя.
Вот примерный вид этой функции (выброшены некоторые мои прихоти, типа модифицируемого имени файлов, что, в общем-то, не нужно):


FileHandle := SysFileOpen( 'posfile.bin', 'r');
IF FileHandle = 0 THEN
dwFilePos := 0; (* Первый раз так и будет... *)
ELSE
SysFileRead(FileHandle, ADR(dwFilePos), SIZEOF(dwFilePos));
SysFileClose( FileHandle); (* Побоялся оставить файл открытым *)
END_IF (* ..хотя скоро будет нужен *)

FileHandle := SysFileOpen( 'ringfile.csv', 'w');

IF dwFilePos > MAX_POS THEN dwFilePos := 0; END_IF (* Заворачивание *)
SysFileSetPos( FileHandle, dwFilePos);
FOR wi := 0 TO Imax DO
SysFileWrite( FileHandle, ADR(aProtocol[wi]), LEN(aProtocol[wi]));
dwFilePos := dwFilePos + LEN(aProtocol[wi]);
END_FOR
SysFileClose( FileHandle);

FileHandle := SysFileOpen( 'posfile.bin', 'w');
SysFileWrite( FileHandle, ADR(dwFilePos), SIZEOF(dwFilePos));
SysFileClose( FileHandle);

Как видим, здесь открывается файл с указателем позиции, в цикле прописывается указанное число Imax строк, с наглядным наращиванием указателя, после чего в файл указателя записывается новое значение.
Если к началу цикла записи событий окажется, что указатель больше MAX_POS (у меня 10000), то он обнуляется и кольцевой буфер начинает заполняться с начала.

Наконец, как работать потом со стороны ПК с имеющимся на борту ПЛК файлом-журналом. Да очень просто, если есть хороший парень Yegor. Взять его программу, запустить ее например, с вот такой командной строкой


LogParser /TCP192.168.1.111 /get "ringfile.csv"

и вуаля! Она сама запустит овенскую plc_io.exe с указанноми параметрами, подхватит файл, принятый из компа и любезно предоставит пользователю выбрать часовые рамки. Указал рамки, нажал "Сохранить как..." - и получил файл, в котором содержатся только те строки-события, которые в указанные рамки попадают.
"Ну а дальше клиент попадает ко мне в руки и..." (с) Бриллиантовая рука
</lf></cr>

Sergey666
24.01.2014, 23:37
Че , нормально .
Ну и кто что-то скажет против коллективного разума ???:p
Держись Украина ... борщ , сало и горилка это жизнь , а курение - медленная и мучительная смерть.

drvlas
25.01.2014, 00:49
Че , нормальноНу, если других мнений не будет, то тему можно закрывать. Разместил об этом примечание в заглавном посте.
Еще раз всем спасибо. Действительно, получился коллективный продукт :)


Держись УкраинаМы не просто держимся. Мы победим! И не русских, не "западэнцив", не "схидняков". Борьба идет с бандитами, если кто еще не понял.

Евгений_Томск
25.01.2014, 15:37
Мы не просто держимся. Мы победим! И не русских, не "западэнцив", не "схидняков". Борьба идет с бандитами, если кто еще не понял.

Держитесь !!! Не давайте бить ваших детей и родителей. Боритесь за хорошее будущее. Много прямых трансляций с Майдана идёт в Ютубе. Молодцы.

Yegor
27.01.2014, 09:45
Хотелось бы отметить, что программа придаёт значение только первым двум столбцам в файле. Число, формат и содержание остальных столбцов значения не имеют. Так что можно использовать и с другими проектами.

drvlas
27.01.2014, 10:26
Так что можно использовать и с другими проектами.Вообще, мне лично, с моим небольшим опытом построения информационных систем, нужно еще осмыслить то, что мы тут с вами сварганили. Пока что мне нравится идея "для простых задач - простое решение", то есть, несложная доработка ПО ПЛК + простая утилитка уважаемомго коллеги Yegor-а (не в смысле простая, что я ее смог хотя бы понять, но все же "легковесная"). Предыдущая реализация с МастерСКАДой вызвала у меня совершеннейшее неприятие, в том числе и по причине отсутствия отдельной среды исполнения - приходится запускать всю монструозную систему разработки для реализации очень простого функционала. Буду смотреть и другие решения для мониторинга оборудования, управляемого ПЛК (OpenSCADA - первый претендент, хотя она тоже предназначена для более сложных задач).
Ну, а сегодня технолог (или мастер) будет впервые снимать показания по работе ПЛК в пятницу. Так что вопросы-нипанятки-хотелки еще будут. Кста, я даже не понял, как пересобрать этот проект, если там какие-нить буковки подправить? Это С#, наверное? В руках не держал...

Yegor
27.01.2014, 10:54
Visual C# Express потребуется (бесплатная). Чисто технически можно и без неё собрать, но практически без опыта проще скачать и установить среду.

Scream
27.01.2014, 13:05
Вообще, мне лично, с моим небольшим опытом построения информационных систем, нужно еще осмыслить то, что мы тут с вами сварганили. Пока что мне нравится идея "для простых задач - простое решение", то есть, несложная доработка ПО ПЛК + простая утилитка уважаемомго коллеги Yegor-а (не в смысле простая, что я ее смог хотя бы понять, но все же "легковесная"). Предыдущая реализация с МастерСКАДой вызвала у меня совершеннейшее неприятие, в том числе и по причине отсутствия отдельной среды исполнения - приходится запускать всю монструозную систему разработки для реализации очень простого функционала. Буду смотреть и другие решения для мониторинга оборудования, управляемого ПЛК (OpenSCADA - первый претендент, хотя она тоже предназначена для более сложных задач).
Ну, а сегодня технолог (или мастер) будет впервые снимать показания по работе ПЛК в пятницу. Так что вопросы-нипанятки-хотелки еще будут. Кста, я даже не понял, как пересобрать этот проект, если там какие-нить буковки подправить? Это С#, наверное? В руках не держал...

Не использую Scada вообще, всё пишу ручками.
Так и получаются гибкие и легковесные программки.
За исходнички и объяснение отдельное спасибо.

drvlas
27.01.2014, 13:19
Не использую Scada вообще, всё пишу ручками.Вот и интересны были бы подходы: сложилась ли какая-то "оптимальная" технология (какая?), или все решается очень по-разному в зависимости от проекта, или выбор средств не слишком критичен, чтобы ему (выбору) уделять отдельно внимание...
Может где-то как-то и до исходников дойти. Все же с шаблона легче начинать.

За исходнички и объяснение отдельное спасибо....и я бы поблагодарил :)

Sergey666
27.01.2014, 14:24
Для всяких мелких фигнюшек и при наличии специалиста (умения писать прожки для ПК) конечно самописные программы оптимальны.
НО !!!!
Если ручками писать программу диспетчеризации сети гипермаркетов - Рученки отвалятся или команду надо такую , что оплата работы ее (команды) превысит стоимость хорошей СКАДы .
К сожалению узбекистан и таджикистан не производят программистов на "экспорт" , только операторов лопаты .

Scream
27.01.2014, 21:14
Для всяких мелких фигнюшек и при наличии специалиста (умения писать прожки для ПК) конечно самописные программы оптимальны.
НО !!!!
Если ручками писать программу диспетчеризации сети гипермаркетов - Рученки отвалятся или команду надо такую , что оплата работы ее (команды) превысит стоимость хорошей СКАДы .
К сожалению узбекистан и таджикистан не производят программистов на "экспорт" , только операторов лопаты .

Конечно, с этим согласен.
Конкретно на своем предприятии самописцы в разы выгоднее и очень гибкие при наличии программиста на постоянной работе.

Scream
28.01.2014, 10:03
Вот и интересны были бы подходы: сложилась ли какая-то "оптимальная" технология (какая?), или все решается очень по-разному в зависимости от проекта, или выбор средств не слишком критичен, чтобы ему (выбору) уделять отдельно внимание...
Может где-то как-то и до исходников дойти. Все же с шаблона легче начинать.
...и я бы поблагодарил :)

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

Технология в принципе пока вот в чем. У каждого блока есть свой мастер(человек имею в виду, а не модбас))) который следит за этим через мою программу в реальном времени или по запросам из БД в графиках...
Для каждого набора программ есть свой сервер(программа раздающая по необходимости данные в локальной сети и пишущая в БД данные).
Так проще исправлять баги. Пока разрабатываешь один набор программ, не мешаешь другим работать.
Потом возможно всё в целом и выльется в один сервер, посмотрим, пока только так.
Всё это дело стоит на выделенном недорогом сервере в локальной сети.

Чуть время освободится, скину простой примерчик.

drvlas
30.01.2014, 16:05
Версия 0.1
... Жду багрепортов
Вопчем, что-то уже есть. Какие-то странности с заданием временных рамок (то ли не понимает 24-часового формата, то ли что - абориген очень расплывчато пояснил), но это пока оставим.

А вот другое. В первый сеанс работы наплюхали около 800 событий. Программа втянула, все ОК. Прошло пару дней, событий стало дофигища. Ну, у меня закольцовано на 10_000 записей, так что по любому до конца еще не дошли, но пару тысяч могли добавить. И что получается, со слов того же паренька: дает команду "Принять файл", в окошке сообщений идет бодренький репорт, "точечки" прогресса приема файла рисуются долго - до конца строки (что косвенно говорит о размере?), потом пишет, что события отсортированы - и все. Программа вылетает без объяснений.

Что может сказать уважаемый автор?

BETEP
30.01.2014, 16:25
Scream Вы что для просмотра графиков используете? Если самописное, то на каком контроле?

drvlas
30.01.2014, 16:51
Scream Вы что для просмотра графиков используете?Та не, ведется контроль фасовки какого-то продукта в мешки на маслосырзаводе. Для России, наверное, потому что жуткие строгости :)

Scream
31.01.2014, 19:30
Scream Вы что для просмотра графиков используете? Если самописное, то на каком контроле?

В одном проекте например 2 архивирования и просмотра графиков.
1) на панели weintek
2)в мускул. Во вложении картинка с сегодняшними показаниями из моей программы(в архиве потому что чат не грузит>2мб)

Yegor
02.02.2014, 19:45
Что может сказать уважаемый автор?Файл с данными нужен для отладки. Во временной папке последняя полученная версия должна быть. Показывать никому не буду.

drvlas
02.02.2014, 20:02
Запрошу у аборигенов. Если он действительно остается. Я что-то не видел...


Показывать никому не буду.Та ШО там секретного :)

drvlas
02.02.2014, 20:14
А правда, где искать тот файл?

drvlas
10.02.2014, 16:10
А правда, где искать тот файл?
Уф! Выстукал. наконец-то у клиента файл. Файлище!

Итак, что там было.
Сначала возьмем первый файл, в нем отображена моя ошибка - не установил правильно дату и время в ПЛК. Поэтому начало нашего файла данных содержит записи событий, якобы имевших место 12.02.2014 с 04:07 по 16:43. Ну, какая разница, пока другие события не "налезут" сверху (а послезавтра это произойдет...)?
Но что тут интересного замечено: программа показала временнОе окно от 04:47 до 04:43:
11827
Однако реально события происходили от 4 утра до 5 вечера. И програма втянула в выходной файл (именно он приведен в приложении, как "OutputFile1") все. что было от 4 утра до 5 вечера. То есть. что-то с форматом 12-24 не вполне хорошо...

Теперь второй файл. Он большущий. Втянут просто с помощью стандартной plc_io. В приложении от обозначен "tokom1". При попытке прочесть данные с помощью LogParser эта программа бодренько пишет все сообщения до "Сортировка завершена" включительно. И отваливается, попукивая от пережитого напряжения :)

Вот как-то так...

Yegor
13.02.2014, 09:16
Она путалась в пределах из-за перевода часов ПЛК; из-за этого же могла и вовсе упасть. Я это, конечно, исправил, но теперь, когда сильно переводите часы, пеняйте на себя. Снабдил переключателем «По номеру / по времени» для выбора порядка записей в сохраняемом файле.

drvlas
13.02.2014, 09:49
когда сильно переводите часыЯ больше не буду...
Спасибо, мил человек! Бум испытывать! По результату доложусь.

drvlas
19.02.2014, 16:29
По результату доложусь.Докладываю. Что-то у меня не сложилось с "штатной" овеновской plc_io.exe
Такое впечателние, что команды записи в ПЛК и считывания из него искажают файл.

Тестовый пример:

1) Есть файл (текстовый, что упрощает визуальную проверку его целостности): file1.csv
Размер файла 23072 байта

2) отсылаем файл в ПЛК100, в котором не предусмотрена никакая работа с этим файлом. Используем для пересылки plc_io.exe

plc_io /TCP192.168.1.111 /put "file1.csv"

3) Смотрю браузером ПЛК. Я не знаю способа проверить размер файла, поэтому делаю копирование в ПЛК:

filecopy file1.csv tmp.csv

Браузер отвечает

File copied size 30532

Сравниваем размер с размером по п.1. Уже интересно, да?

4) Вытягиваю оба файла из ПЛК снова в ПК (предварительно переименовав в рабочей папке file1.csv в file1sent.csv):

plc_io /TCP192.168.1.111 /get "file1.csv"
plc_io /TCP192.168.1.111 /get "tmp.csv"

По времени работы уже чую, что как-то не одинаково с загрузкой в ПЛК (п.2)

5) Смотрю размеры полученных файлов: 96068 "Съели, наверное, чего-нибудь" :)

В самих файлах вижу вставки, явно возникшие в ПЛК - там, в частности, название проекта...

Все файлы прилагаю (file1 имеет 2 версии - sent и got). Очень прошу авторов утилитки plc_io.exe проверить, подсказать, что я делаю не так. Или... Или что?

capzap
19.02.2014, 18:32
Вы так то в курсе, что там есть две функции, одна хорошо читает, другая записывает, а корректно выполнять и запись и чттение не может ни одна

drvlas
19.02.2014, 18:49
Вы так то в курсеНе понял. Мы говорим о ключах программы PLC_IO (put и get)? Так что с ними? Или о чем?

А вообще, что известно о реальном использовании PLC_IO? Можно делать ставку на нее для "слизывания" накопленных данных с ПЛК? Или есть какая-то еще программа, которой можно стукнуть по Этернету в ПЛК и вытащить файл?

capzap
19.02.2014, 19:07
http://www.owen.ru/forum/showthread.php?t=15452&p=114998&viewfull=1#post114998

drvlas
19.02.2014, 19:24
Вот видишь, а ты говоришь, никому не нужно :)

Спасибо, ща постараюсь заюзать две версии. Ну, это капец, вообще-то...

capzap
19.02.2014, 19:29
так то я ни разу не пользовался этими прогами, так как они только под винду, у меня получилось через сокет вытянуть файл браузером, теоретически и записать можно,это тоже не делал :)

drvlas
19.02.2014, 23:19
Она путалась в пределах из-за перевода часов ПЛК; из-за этого же могла и вовсе упасть. Я это, конечно, исправил, но ...не до конца. Время событий понимается программой правильно, но отображается в окне диалога по-прежнему в 12-часовом формате. То есть, если я попадаю в поле ввода часов и набираю "13", то это значение и будет (верно) использоваться программой, что отражено, кстати, и в имени файла, куда запишется именно "13". Но! Но в поле диалога с оператором мой набор "13" нарисует "01".
Альтернативный способ ввода - стрелками вверх и вниз, приводит к совсем непонятной вертушке: 01, ..., 11, 12, 01, 02, ... 11, 12, 01, 02, ... - как узнать, на чем остановился, на "13" или на "01"?
Очень хотелось бы видеть то, что вводишь. И вертушка чтобы после 11 показывала 12, потом 13 и т.д...

И еще одно пожелание (наглеть, так нагло!): хорошо бы, если бы программа оставляла в рабочей директории и втянутый файл. Мало ли, зачем он может понадобиться. Все равно он в памяти есть - ну, закинуть его на диск не проблема же?

И один вопрос (для общего развития): не очень понял, откуда, собсно, программа берет plc_io.exe? Она что, прямо в теле программы? У меня в PATH такого нет, в рабочей директории тоже, но ведь работает!

А тему двух версий plc_io.exe пришлось перетереть из-за того, что для целей отладки я записывал в ПЛК готовые файлы. Ну, и попал: у меня была та версия plc_io.exe, которая хорошо читает. А записывала чушь.
Вообще, стыд и позор уважаемой фирме ОВЕН за то, что на официальном сайте лежит утилита от 2008 года, содержащая уже ОБЩЕИЗВЕСТНЫЙ баг!

Sergey666
20.02.2014, 09:52
Если по форуму поискать хорошо , товарищ один даже оболочку какую-то сделал делфушную для работы с plc_io.exe 2х версий .

drvlas
20.02.2014, 10:26
То есть, вопли к ОВЕНу бесполезны. Кино...

Yegor
21.02.2014, 12:16
не очень понял, откуда, собсно, программа берет plc_io.exe?Из параллельной вселенной при помощи очень хитрого деления на ноль (щютк). В .exe, .dll и прочие Portable Executable что угодно можно затолкать целиком включая другие экзешники — штатная фишка формата. А специальными редакторами ресурсов можно даже из чужой программы чего-нибудь понавытаскивать или наоборот вставить.

Прогу погляжу чуть позже.

drvlas
21.02.2014, 12:31
Прогу погляжу чуть позже.Хорошо. Пока вести с полей подтверждают, что во всем остальном программа работает прекрасно.
Поэтому еще раз уточняю:

1) просьба организовать в диалоговом окне вывод времени в 24-формате
2) пожелание оставлять после работы файл в рабочей директории (перезаписывая тот, что был к началу работы)

Yegor
27.02.2014, 07:16
1) просьба организовать в диалоговом окне вывод времени в 24-форматеДа, сделал.
2) пожелание оставлять после работы файл в рабочей директории (перезаписывая тот, что был к началу работы)И так вроде оставляет. Добавил кнопку «Показать файл».

Прошу прощения за «чуть позже».

drvlas
27.02.2014, 10:05
Прошу прощения за «чуть позже».Тоже был отвлечен революционными событиями? :)
От пользователей тишина. Но они работают. Я просил собирать все замечания. Похоже, что новых нет.

Спасибо огромнейшее!