Задача: опрашивать по расписанию прибор технического учета электроэнергии при помощи GSM модема.

Железо я не выбирал, его выбрали до меня, а мне досталось слепить из этого систему удаленного опроса. Итак, источником информации о растраченной электроэнергии выступил Diris A40 производства Socomec (далее — счетчик).

image

Прибор много всего умеет измерять, я остановился на считывании сотни регистров, начиная с десятичного адреса 1792 до 1891. В качестве интерфейса — тоже не выбранная мною железяка: модуль связи шлюз RS485 по протоколу JBUS/MODBUS®. Протокол «Modbus-подобный» с отличием в нумерации регистров.

Модемы GSM производства Siemens – MC35i (далее просто – модемы). Вот такие:

image

Про них достаточно много статей, легко найти документацию. Управляется АТ-командами. Уже не выпускаются. На смену ему пришел Cinterion MC52iT Terminal. Его еще вроде бы можно купить. Блок питания и антенна в комплекте. Для преобразования RS232toRS485 была выбрана вот такая в общем то дешевая железяка. Она справляется со своей задачей.

image

Структурная схема задуманной системы будет выглядеть следующим образом:

image

Прямым кабелем я назвал кабель, где все пины соответствуют друг другу в начале и в конце. Например, пин 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. Получился вот такой интерфейс:

image

image

Текст справки выглядит следующим образом. Программа предназначена для опроса счетчиков 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.
Поделиться с друзьями
-->

Комментарии (11)


  1. Trikon
    20.06.2016 16:19

    ___
    Запрос: 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.
    ____

    У вас похоже эхо на модеме включено, команда ATE0 вас спасёт.


    1. Fib0na4i
      20.06.2016 16:25

      Пробовал различные комбинации настройки модема, в том числе и выключение эха. Не помогло.


      1. Trikon
        20.06.2016 16:45

        А если минуя MasterOPC Universal Modbus Server напрямую из терминала кинуть запрос?

        Кстати рекомендую терминал от этих ребят http://www.radiofid.ru/tehpodderzhka/soft_client/
        для извращений с модемами очень удобен.


        1. Fib0na4i
          20.06.2016 16:53

          Согласен, терминал не плохой, пробовал. Привык просто к hyperterminal. Напрямую запрос, как вы рекомендуете, кидает самопал на labview. Результат тот же — лишние биты.


  1. tormozedison
    20.06.2016 22:34

    «Модемы GSM производства Siemens – MC35i».

    Тёплый ламповый CSD? А действие безлимитной передачи голоса на современных тарифах на него распространяется?

    «Уже не выпускаются. На смену ему пришел Cinterion MC52iT Terminal».

    Тоже CSD?


    1. silver47
      21.06.2016 11:55

      Тарификация точно такая же, как и на голосе, разве что подключать услугу передачи данных отдельно нужно. Многие путают при этом CSD и GPRS.
      Для постоянного опроса счетчика, в некоторых условиях CSD остается выгоден, т.к. вся куча показаний вполне себе вмещается в байт 500, а все остальное оператор округляет кто до 16кб, кто до мегабайта.


  1. Fib0na4i
    21.06.2016 01:53

    Второй вопрос — да. Пока замечен съем ежемесячной абонплаты. Дополнительных денег за CSD не замечено.


  1. jackkum
    21.06.2016 11:55

    У нас около 800 тепло/электросчетчиков, бывали проблемы с энфорами, могут по-умолчанию фильтровать байты: 0x08 (backspace), 0x09(tab), есть проблема с IRZ-тами, слишком быстро переподключаются, сигналы подключения/отключения иногда приходят не в том порядке.
    Как реализован обмен через модем?

    У нас схема такая:
    Сервер для модемов, принимает подключение от модема и по идентификатору (IMEI) выделяет для каждого модема свой порт во внутренней сети, работает на Node.js. Все, что падает на внутренний порт прокидывается в модем и наоборот если порт открыт из модема в порт.
    Сервер опроса уже контролирует архивы данных и опрашивает приборы по необходимости (раз в час).
    И сервер с веб интерфейсом выдает графики, справки и прочее.


    1. Fib0na4i
      21.06.2016 22:40

      Если я правильно понял вопрос, то обмен реализован следующим образом.
      На модем посылается строка atd+1111111111; ждем ответ connect rlp/9600, посылаем модбас запрос.
      Известен адрес и функция устройства которое опрашивается. В моем случае это одно устройство с адресом 5 и функцией чтения регистра 3. То есть, признаком ответа будет строка которая начинается с 05 03… Вот ее я ищу в ответе. Все что до нее «отрезаю» и не обрабатываю. Все что 05 03… считаю ответом модбас устройства, декодирую и записываю параллельно вывожу на графики или просто смотрю в таблице в зависимости от надобности.


      1. jackkum
        22.06.2016 03:17

        Т.е. делается исходящий звонок с модема. Много у Вас подключенных приборов? Мне кажется такой подход не совсем удобен при большом количестве приборов. Тот модем через который осуществляется соединение будет узким местом. Хотя в этом подходе свои плюсы, не нужен сервер для поддержания постоянного соединения. Есть в нашем городе фирма, которая использует энфоры настроенные как «сервер», и сервер с доступом к этим модемам за NAT-ом. Модем поднимается до GPRS и по UDP на все сервера прописанные в настройках шлет свой IP.


        1. Fib0na4i
          22.06.2016 17:00

          Предшествующий пост, я написал:
          «В моем случае это одно устройство с адресом 5 и функцией чтения регистра 3. „

          Статья не претендует на массовый опрос, большого количества счетчиков.