Несомненно! Похоже, что это классная штука. Но это нужно освоить.
Вид для печати
Пока пишу прогу, у меня тут сомнения появились, что большой файл получится вытянуть когда ПЛК в него периодически пишет. Вы там проверьте как-нибудь.
К счастью, в момент считывания файла можно обеспечить (администартивными мерами) отсутствие событий. То есть, в данном конкретном случае, ПЛК не будет писать, когда ПК вычитывает.
Но конечно, нужно будет проверить.
Кстати, сейчас я все же пробую готовить сразу CSV в ПЛК. Все, что нужно будет от Вашей проги - вытянуть из СИМВОЛЬНОГО файла инфо в соответствии с временными рамками, заданными оператором. Если Вы ушли уже далеко вперед для смены ТЗ, то Бог с ним, я сам переделаю. Но вообще, выглядит так, что с символьным получше будет. Ведь на худой конец, можно открыть CSV Экселем и вытянуть ручками...
Или Вам еще можно описать формат символьного файла?
Ну опишите текстовый формат тогда. Я как раз саму оболочку набросал и только взялся за отладку процедуры чтения бинарников.
Записи длиной 56 байт. Ща кину фалик
Не пойму, как файл приаттачить... Что за чЮдеса...
ладно, революция не терпит промедления. Завтра мы тут можем уже быть без Инета...
Вот снимок ровно двух строк
Вложение 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 цифр без знака, но запятая тоже может быть (одна или две десятичные цифры справ от запятой).
Потом две пустых колонки. В первой из них количество пробелов выравнивает длину строки
Самое главное - видно формат времени и даты. Он неизменен.
Версия 0.1
Хоть и графическая, но запускать надо с теми же параметрами, что и plc_io. Например, LogParser /TCP192.168.1.50 /get log.csv
Утилита plc_io запечатана в экзешник этой программы и распаковывается при каждом получении данных во временную папку, после вызова удаляется. Всё её сообщения выводятся в зелёном окошке.
Для работы требуется .NET Framework 4.
Жду багрепортов. С контроллером не проверялось, т.к. поблизости их нет.
Бегло посмотрел тему. Искал возражения против стандартного архиватора, не нашел.
так вот..
А нельзя ли просто воспользоваться готовым решением Archive?
Вам наверное бы подошел. Время и дата автоматом ставится.
Ктото скажет большой файл создать нельзя.
С вашими способностями с библиотекой SysLibFile можно будет проверять размер файла созданного Archive1 и если он достигает 32кб(насколько помню это и есть ограничение), то писать Archive2 и т.д.
События и некоторые настройки записи просты. А как только вы скачали его на комп, удалили скачанный, так архиватор автоматом создал новый и дело в шляпе.
P.S. Лично я не люблю писать в плк, а сразу пишу на ПК сервер, всё там достаточно просто.
Спасибо, коллега! Сейчас не успею проверить. Мож через несколько часов.
Да что ты! Уже работает, с первого толчка! Спасибо огромное, коллега!
Это первые эмоции. Так как возможность отключения Инета в Украине сохраняется, то пишу, не произведя еще полноценной проверки. По ходу буду сообщать.
Пока что только с вводом временнОго окна есть маленькая нескладушка, но работать можно, потому ее игнорим...
Да, и на стороне ПЛК проверена работа с сохранением указателя точки записи в файл в своем файле. Это оказалось необходимым (в противовес сохранению в РИТЕЙН), ибо у меня лично не срабатывает сохранение в РИТЕЙН-файле, если изменение РИТЕЙН-переменной происходит перед самым выключением питания. Как-то ПЛК должен пробежать еще пару циклов работы или фиг его знает... Но - не стал долго морочиться, перенес указатель в файл, который сам создаю - и пока все чики-пики.
Если мое многословие уже совсем запутало уважаемых коллег, то простите. Все так урывками. Продолжаю проверят и править по мелочам. Если хоть кто-то выскажет интерес, выкладу резюме по окончанию. В нем (резюме) я доложу о том, как же имееено у меня получилось журналировать события в ПЛК со сбросом потом в ПК и раскруткой архива программой Yegor-а
В таком случае я с удовольствием отчитаюсь. Сейчас идет отладка на объекте. Установили канал VPN, закачали новую версию программы ПЛК, запустили. Пока полет нормальный, но это только предварительно.
Так что ждите объявлений :)
Их есть у меня!
Общая организация. Во ФЛЕШ-памяти ПЛК(100) созданы 2 файла:
- ringfile.csv (кольцевой файл-журнал)
- filepos.bin (указатель текущей позиции записи в кольцевой файл-журнал)
Программа ПЛК работает себе, работает, когда вдруг бац! - событие. По нему формируется запись, то есть одна строка будущего csv-файла. Строка имеет строго фиксированную длину. Вот пример строки-события:
1 — номер события;Цитата:
100001; 24/01/14 12:14; 0,00; 10,00; 8275,79; ;;
(1) (2) (3) (4) (5) (6) (7) (8)
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, куда после всех трудов своих тяжких запихивает новое значение указателя.
Вот примерный вид этой функции (выброшены некоторые мои прихоти, типа модифицируемого имени файлов, что, в общем-то, не нужно):
Как видим, здесь открывается файл с указателем позиции, в цикле прописывается указанное число Imax строк, с наглядным наращиванием указателя, после чего в файл указателя записывается новое значение.Код: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);
Если к началу цикла записи событий окажется, что указатель больше MAX_POS (у меня 10000), то он обнуляется и кольцевой буфер начинает заполняться с начала.
Наконец, как работать потом со стороны ПК с имеющимся на борту ПЛК файлом-журналом. Да очень просто, если есть хороший парень Yegor. Взять его программу, запустить ее например, с вот такой командной строкой
и вуаля! Она сама запустит овенскую plc_io.exe с указанноми параметрами, подхватит файл, принятый из компа и любезно предоставит пользователю выбрать часовые рамки. Указал рамки, нажал "Сохранить как..." - и получил файл, в котором содержатся только те строки-события, которые в указанные рамки попадают.Код:LogParser /TCP192.168.1.111 /get "ringfile.csv"
"Ну а дальше клиент попадает ко мне в руки и..." (с) Бриллиантовая рука
</lf></cr>
Че , нормально .
Ну и кто что-то скажет против коллективного разума ???:p
Держись Украина ... борщ , сало и горилка это жизнь , а курение - медленная и мучительная смерть.
Ну, если других мнений не будет, то тему можно закрывать. Разместил об этом примечание в заглавном посте.
Еще раз всем спасибо. Действительно, получился коллективный продукт :)
Мы не просто держимся. Мы победим! И не русских, не "западэнцив", не "схидняков". Борьба идет с бандитами, если кто еще не понял.
Хотелось бы отметить, что программа придаёт значение только первым двум столбцам в файле. Число, формат и содержание остальных столбцов значения не имеют. Так что можно использовать и с другими проектами.
Вообще, мне лично, с моим небольшим опытом построения информационных систем, нужно еще осмыслить то, что мы тут с вами сварганили. Пока что мне нравится идея "для простых задач - простое решение", то есть, несложная доработка ПО ПЛК + простая утилитка уважаемомго коллеги Yegor-а (не в смысле простая, что я ее смог хотя бы понять, но все же "легковесная"). Предыдущая реализация с МастерСКАДой вызвала у меня совершеннейшее неприятие, в том числе и по причине отсутствия отдельной среды исполнения - приходится запускать всю монструозную систему разработки для реализации очень простого функционала. Буду смотреть и другие решения для мониторинга оборудования, управляемого ПЛК (OpenSCADA - первый претендент, хотя она тоже предназначена для более сложных задач).
Ну, а сегодня технолог (или мастер) будет впервые снимать показания по работе ПЛК в пятницу. Так что вопросы-нипанятки-хотелки еще будут. Кста, я даже не понял, как пересобрать этот проект, если там какие-нить буковки подправить? Это С#, наверное? В руках не держал...
Visual C# Express потребуется (бесплатная). Чисто технически можно и без неё собрать, но практически без опыта проще скачать и установить среду.
Вот и интересны были бы подходы: сложилась ли какая-то "оптимальная" технология (какая?), или все решается очень по-разному в зависимости от проекта, или выбор средств не слишком критичен, чтобы ему (выбору) уделять отдельно внимание...
Может где-то как-то и до исходников дойти. Все же с шаблона легче начинать.
...и я бы поблагодарил :)
Для всяких мелких фигнюшек и при наличии специалиста (умения писать прожки для ПК) конечно самописные программы оптимальны.
НО !!!!
Если ручками писать программу диспетчеризации сети гипермаркетов - Рученки отвалятся или команду надо такую , что оплата работы ее (команды) превысит стоимость хорошей СКАДы .
К сожалению узбекистан и таджикистан не производят программистов на "экспорт" , только операторов лопаты .
На отдельные блоки автоматизации технология одинакова.
*блоком называю участок (цех) с машинами.
Например есть блок подготовки продукта, там надо следить за этим, архивировать это.
Есть блок фасовки, там другие критерии и т.д.
Так вот у каждого блока свой набор программ.
Технология в принципе пока вот в чем. У каждого блока есть свой мастер(человек имею в виду, а не модбас))) который следит за этим через мою программу в реальном времени или по запросам из БД в графиках...
Для каждого набора программ есть свой сервер(программа раздающая по необходимости данные в локальной сети и пишущая в БД данные).
Так проще исправлять баги. Пока разрабатываешь один набор программ, не мешаешь другим работать.
Потом возможно всё в целом и выльется в один сервер, посмотрим, пока только так.
Всё это дело стоит на выделенном недорогом сервере в локальной сети.
Чуть время освободится, скину простой примерчик.
Вопчем, что-то уже есть. Какие-то странности с заданием временных рамок (то ли не понимает 24-часового формата, то ли что - абориген очень расплывчато пояснил), но это пока оставим.
А вот другое. В первый сеанс работы наплюхали около 800 событий. Программа втянула, все ОК. Прошло пару дней, событий стало дофигища. Ну, у меня закольцовано на 10_000 записей, так что по любому до конца еще не дошли, но пару тысяч могли добавить. И что получается, со слов того же паренька: дает команду "Принять файл", в окошке сообщений идет бодренький репорт, "точечки" прогресса приема файла рисуются долго - до конца строки (что косвенно говорит о размере?), потом пишет, что события отсортированы - и все. Программа вылетает без объяснений.
Что может сказать уважаемый автор?
Scream Вы что для просмотра графиков используете? Если самописное, то на каком контроле?
Файл с данными нужен для отладки. Во временной папке последняя полученная версия должна быть. Показывать никому не буду.Цитата:
Что может сказать уважаемый автор?
А правда, где искать тот файл?
Уф! Выстукал. наконец-то у клиента файл. Файлище!
Итак, что там было.
Сначала возьмем первый файл, в нем отображена моя ошибка - не установил правильно дату и время в ПЛК. Поэтому начало нашего файла данных содержит записи событий, якобы имевших место 12.02.2014 с 04:07 по 16:43. Ну, какая разница, пока другие события не "налезут" сверху (а послезавтра это произойдет...)?
Но что тут интересного замечено: программа показала временнОе окно от 04:47 до 04:43:
Вложение 11827
Однако реально события происходили от 4 утра до 5 вечера. И програма втянула в выходной файл (именно он приведен в приложении, как "OutputFile1") все. что было от 4 утра до 5 вечера. То есть. что-то с форматом 12-24 не вполне хорошо...
Теперь второй файл. Он большущий. Втянут просто с помощью стандартной plc_io. В приложении от обозначен "tokom1". При попытке прочесть данные с помощью LogParser эта программа бодренько пишет все сообщения до "Сортировка завершена" включительно. И отваливается, попукивая от пережитого напряжения :)
Вот как-то так...
Она путалась в пределах из-за перевода часов ПЛК; из-за этого же могла и вовсе упасть. Я это, конечно, исправил, но теперь, когда сильно переводите часы, пеняйте на себя. Снабдил переключателем «По номеру / по времени» для выбора порядка записей в сохраняемом файле.
Докладываю. Что-то у меня не сложилось с "штатной" овеновской 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 проверить, подсказать, что я делаю не так. Или... Или что?
Вы так то в курсе, что там есть две функции, одна хорошо читает, другая записывает, а корректно выполнять и запись и чттение не может ни одна