SCADA от Shneider, Modbus и представление вещественных чисел

На нефтебазе, использующей SCADA Schneider Vijeo Designer (версии 6.2.1), установили уровнемеры системы СТРУНА+. (а точнее, поменяли). Была задача обеспечить сбор данных с новых уровнемеров в имеющуюся SCADA.
 
Новые уровнемеры используют протокол “Modbus STRUNA+” (перепиленный Modbus). Также, изначально для проверки связи был использован устаревший, но более простой, протокол “Кедр”.
 


1 ЧАСТЬ – Создание подключения для приема-передачи данных по протоколу Modbus в Vijeo Designer

 
Создаем драйвер ввода-вывода:
IO Manager => New Driver => General Drivers => Script Driver
 
Настраиваем под Modbus:
 
Создаем скрипт для приема-передачи данных через созданный драйвер (в Vijeo Designer используются скрипты на какой-то старой Java):
Actions => New Action, указываем периодичность (у нас опрос был большим, поэтому ставили 1 мин.)
Открываем созданный Action => жмакаем New Script
 
Запись данных:

Чтение данных:

 


2 ЧАСТЬ – Проблема верной интерпретации байтов вещественных чисел

 
Беда оказалась с правильным преобразованием принятых 4 байт данных в вещественное число.
Первоначально, для проверки работы скрипта и драйвера использовался протокол Кедр. Там все просто:
* Первые 12 бит – целая часть числа
* Остальные 4 бита – дробная часть в виде целого числа (<=9)
 

 

Но с протоколом Modbus все иначе. Формат передачи данных вещественных чисел другой, уже с плавающей запятой стандарта IEEE 754.

Тут 4-х байтовое число, пришедшее по Modbus, состоит из следующих частей:
* знак (указывает на отрицательность или положительность числа),
* мантисса (выражает значение числа без учёта порядка),
* порядок (выражает степень основания числа, на которое умножается мантисса).
 
В Java есть готовый метод преобразования бит в переменную типа float – Float.intBitsToFloat(int), но т.к. в скриптах подключение библиотек не предусмотрено, то код был тупо скопирован реализован смостоятельно.
 

 

UPDATE:

На хабре вышла статья, в которой приводится история о разработчике, который запихнул вышеприведенные вычисления в виде схемы XML DDF (XML, Карл!!!).

 

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *