Исследование формата истории скада-системы IFix
Приветствую пользователей Хабры
Вступление
Вот решил написать свой первый пост. Работаю я на крупнейшем в регионе энергетическом предприятии.
В сферу моей трудовой деятельности входит сопровождение скада системы IFix. Ну там скриптики подправить, картинку отредактировать и т.п.
Заострять внимание на особенностях Ifix я не буду — в интернете море информации по данной теме. Ссылка на русскоязычный сайт посвященный ifix www.ge-ip.com/ru/ifix_features
В один прекрасный момент у нас на предприятии проводили тесты котельного оборудования — от нас требовалось предоставить графики по основным параметрам.
Остановимся на системе сбора данных скада-системы поподробнее:
Для сбора информации у нас используются тренды истории. Не буду грузить Вас техническими подробностями, в двух словах:
выбираются нужные точки, интервал опроса, зона нечувствительности и на выходе получаем файл — за 4, 8 или 24 часа.
После проведения испытаний выяснилась неприятная вещь связанная с масштабирование графиков — проблема решили с помощью ms exсel, но как говорится осадок остался.
Начало
Было принято решение разбирать формат хранения истории. На тот момент опыта исследования форматов я не имел, но немного занимался реверс-инжинерингом ПО.
Первым делом я соорудил небольшой проект — он состоял из таймера, который последовательно записывал значения в 3 точки:
1, 2, 3…
10, 20, 30…
50, 100, 150…
Точки были добавлены в назначение истории и сконфигурирован просмотр трендов истории.
Необходимо так же отметить структуру хранения трендов — можно создать до 255 узлов, можно выбрать интервал сбора данный 4, 8 и 24 часа.
Группа может содержать до 255 точек. Можно выбрать период сбора данных — от 1 секунды до 30 минут.
Инструменты
Утилиту я решил писать на Delphi — использовал Delphi 7, так же необходим hex-редактор — выбор пал на WinHex.
Напомню, что у меня в проекте был один узел, содержащий три тега.
Запустил скаду, подождал некоторое время и получил файл 12070400.h24.
Загрузил файл h24 в WinHex и начал искать что-либо вразумительное. В первую очередь в глаза бросается имя группы и тегов.
Смещение имя группы — 40, смещение первого тега 160, промежуток между именами тегов — 74 байта.
Разбираемся далее — получаю с рабочего места машиниста «боевой» файл истории — и получаем следующее — смещение 1-го узла 40, смещение 2-го узла — 6100,
смещение 3-го узла — 12160, 4-го — 18220. Ладно пока берем за константу — 6060.
Особо останавливаться на именах узлов и тегах я не хочу — лучше возьмемся собственно за сам формат хранения данных.
В формате хранения меня интересовало значение, время и привязка к тегу. Возвращаемся к hex-редактору:
Для начала переводим отображение в двоичный вид (alt+F7 — в winhex)
Время
Первым делом я обратил внимание на повторяющиеся строчки
Пошел на обум — взял число C6EA — перевел в десятичный вид (незабываем перевернуть число перед этим) — получилось 60102, поделил его на 3600 — получил 16,695.
Время запуска скады — 16:40, ну ладно будем считать что время мы получили.
Значение
Вот со значением было немного посложнее — под подозрение попали следующие строчки
Если честно долго не мог вкурить что-же это за формат — меняю байтик — число улетает в миллионы(
В общем на одном форуме мне подсказали — это четырехбайтное значение с плавающей точкой.
Вообщем все составляющие есть — началось самое приятное — пишем код.
Грабли
Ну вот код написан, и вроде работает
1. Перво-наперво я напоролся на долгую работу утилиты — вывод параметра за сутки занимало порядка часа (я просто считывал с файла нужные байты)
Было принято решение переделать все через MemoryStream — и ура разбор показаний занимает теперь минуты и секунды!
2. Время отображалось до 18 часов — изначально я считал за время двухбайтовое значение, а оказалось нужно брать 3 байта.
3. У нас на предприятии в историю пишется порядка 200 тегов — взяв с рабочей машина файл я выяснил что периодически вылазят какие-то левые значения…
Хотя тестовый файл обрабатывается корректно.
Ну что ж возвращаемся к редактору…
В процессе мозгового штурма выяснилось следующее
То есть при изменение какого либо тега, программа пишет время, номер группы, количество измененных тегов в группе и собственно измененные значения.
Саму программу Вы можете найти по адресу — www.dimassoft2000.narod.ru/h24.htm
Заключение
Вообще к чему была написана данная статья? Когда я только начал разбор формата у меня не было точной уверенности что я смогу разобрать его до конца — но
к счастью я не бросил это дело и довел все-таки до конца. Конечно в программе имеются недоработки, вбито несколько костылей.
Но этот разбор принес мне много експириенса и показал на моем примере что реально не имея опыта разобрать формат довольно таки серьезной программы.
Так что я думаю не стоит опускать руки раньше времени и все у Вас получится!
Сразу извиняюсь за стиль написания — в голове все у меня крутится красиво, но как доходит до воплощения в текст то получается сами видите что ;-)
За картинки тоже просьба не бить — художник из меня никакой.
Спасибо за интерес, надеюсь до новых встреч!