Задача: опрашивать по расписанию прибор технического учета электроэнергии при помощи GSM модема.
Железо я не выбирал, его выбрали до меня, а мне досталось слепить из этого систему удаленного опроса. Итак, источником информации о растраченной электроэнергии выступил Diris A40 производства Socomec (далее — счетчик).
Прибор много всего умеет измерять, я остановился на считывании сотни регистров, начиная с десятичного адреса 1792 до 1891. В качестве интерфейса — тоже не выбранная мною железяка: модуль связи шлюз RS485 по протоколу JBUS/MODBUS®. Протокол «Modbus-подобный» с отличием в нумерации регистров.
Модемы GSM производства Siemens – MC35i (далее просто – модемы). Вот такие:
Про них достаточно много статей, легко найти документацию. Управляется АТ-командами. Уже не выпускаются. На смену ему пришел Cinterion MC52iT Terminal. Его еще вроде бы можно купить. Блок питания и антенна в комплекте. Для преобразования RS232toRS485 была выбрана вот такая в общем то дешевая железяка. Она справляется со своей задачей.
Структурная схема задуманной системы будет выглядеть следующим образом:
Прямым кабелем я назвал кабель, где все пины соответствуют друг другу в начале и в конце. Например, пин 2 соединен с пином 2. Крос кабелем я назвал кабель, где пин 2 соединен с пином 3, а пин 3 с пином 2.
Для опроса предполагалось использовать MasterOPC Universal Modbus Server, которая живет здесь и является бесплатной, если вы хотите опрашивать не более 32 тегов (некоторые говорят «тагов», мне больше нравится «тегов»). Прелесть ее в том, что она имеет настройки, позволяющие использовать для опроса модем. Такая себе два в одном. Это единственная программа, которую я нашел с такими возможностями. Например в ibaPDA таких возможностей я не обнаружил.
С MasterOPC Universal Modbus Server ничего не получилось. Вернее, получилось на половину: при подключении к счетчику по проводам – все хорошо, при подключении через модем получаемые пакеты почему-то (для меня до сих пор загадка, кто знает — напишите) выглядят следующим образом:
Запрос: 13-05-2016 14:12:56.408 Notebook::DirisA40(adr5):(COM5) Tx: [0008] 05 03 07 0A 00 01 A4 F8
Ответ: 13-05-2016 14:12:56.401 Notebook::DirisA40(adr5):(COM5) Rx: [0013] F1 EB FF FD B7 00 05 03 02 13 86 C5 16
Как видно из ответа, нужная информация там присутствует: 05 03 02 13 86 C5 16. Также видно, что там есть еще и посторонняя: F1 EB FF FD B7 00.
Кому интересно, то для расшифровки пакетов можно применять парсер. Я, например, использую CAS_Modbus_RTU_Parser. Он бесплатен и это замечательно. Есть также онлайн парсеры. Например: http://modbus.rapidscada.net/.
Как избавиться от этого «мусора» я не знал, поэтому написал програмку на LabView (возможно, правильнее будет сказать «нарисовал»). Она отрезает ненужные биты от полученного пакета и затем дешифрует Modbus-пакет. Что такое это самое LabView можно почитать здесь. Вообще, на Хабрахабре, к моему удивлению, обнаружилось довольно много статей о LabView. Получился вот такой интерфейс:
Текст справки выглядит следующим образом. Программа предназначена для опроса счетчиков DirisA40. Перед запуском исполняемого файла необходимо установить LabVIEW Run-Time Engine (один раз). Программа может работать в двух режимах:
1) непосредственный опрос
2) опрос через модем
Режим опроса по умолчанию: опрос 100 регистров начиная с регистра 1792.
Формат данных регистров word.
Modbus-адрес по умолчанию — 5.
Непосредственный опрос запускается по нажатию кнопки START.
Опрос через модем идет по расписанию (по умолчанию 5мин.) и запускается после нажатия кнопок «START» и «Записать». Расписание опроса не должно быть меньше 1 минуты и больше 60 минут. В нажатом состояния кнопка «START» подписана как «Идет опрос». В нажатом состоянии кнопка «Записать» подписана как «Идет запись».
Чекбокс «Учитывать коэффициенты пересчета» предназначен для масштабирования считанного значения регистра по формуле X*Factor+Offset. Значения Factor и Offset записаны в одноименных столбцах таблицы настройки и выбора регистров для записи. Запись происходит в текстовый файл в ту же директорию, где находится исполняемый файл следующего формата — дата время data.txt (Например: 21.05.2016 22_12 data.txt). Если запись производилась с использованием модема, то имя файла с данными будет иметь следующий вид: 08.06.2016 9_47 data__modem.txt. При первой попытке записи файла есть возможность изменить имя файла. Запись производится в тот же файл, пока не будет отжата кнопка «Идет запись». Записываются в файл регистры с отмеченными чекбоксами в таблице настроек. Изменить состояние чекбокса в таблице настроек можно при помощи двойного клика. Полученные значения регистров отображаются в таблице настроек с столбце «Value». На вкладке «Графики» можно настроить отображение любого значения регистра из таблицы настроек. Цвет кривой графика соответствует цвету рамки вокруг выбранного тега. Теги, которые необходимо выключить из построения, нужно поставить в положение «save» или любой другой регистр со значением 0. Web-интерфейс прибора публикуется _http://computername:8000/DirisA40.html и доступен только через explorer если установлен LabVIEW Run-Time Engine.
В процессе написания/рисования были использованы следующие вспомогательные программы.
Для эмуляции работы счетчика использовалась бесплатная программа DevEmu. Узнал я про нее из блога Алексея, хорошо описавшего ее работу и применение. За что ему огромное спасибо.
Для эмуляции соединения со счетчиком использовались пробные версии разнообразных программ, которые называются Serial Port Splitter. Их довольно много разных, пробного периода двух таких сплиттеров мне хватило для написания вышеописанной программки.
P.S.: Пока я писал этот опус, видимо, коллега, написал статью на эту же тему: geektimes.ru/post/277358.
Автор: Fib0na4i