UniSet 2.32.1
Реализация ModbusTCP master

Общее описание ModbusTCP master

Класс реализует процесс обмена (опрос/запись) с RTU-устройствами, через TCP-шлюз. Список регистров с которыми работает процесс задаётся в конфигурационном файле в секции <sensors>. см. Конфигурирование ModbusTCP master

Конфигурирование ModbusTCP master

Конфигурирование процесса осуществляется либо параметрами командной строки либо через настроечную секцию.

Секция с настройками
При своём старте, в конфигурационном файле ищётся секция с названием объекта, в которой указываются настроечные параметры по умолчанию. Пример:
<MBMaster1 name="MBMaster1" gateway_iaddr="127.0.0.1" gateway_port="30000" polltime="200" exchangeModeID="...">
<DeviceList>
<item addr="0x01" respondSensor="RTU1_Not_Respond_FS" timeout="2000" invert="1"/>
<item addr="0x02" respondSensor="RTU2_Respond_FS" timeout="2000" invert="0"/>
</DeviceList>
</MBMaster1>
Где
  • exchangeModeID - датчик(name) определяющий режим работы (см. MBExchange::ExchangeMode).

Секция <DeviceList> позволяет задать параметры обмена с конкретным RTU-устройством.

  • addr - адрес устройства для которого, задаются параметры
  • timeout msec - таймаут, для определения отсутствия связи
  • invert - инвертировать логику. По умолчанию датчик выставляется в "1" при наличии связи.
  • respondSensor - название(name) датчика связи.
  • respondInitTimeout - msec, время на инициализацию связи после запуска процесса. Т.е. только после этого времени будет выставлен(обновлён) датчик наличия связи. По умолчанию время равно timeout.
  • ask_every_reg - 1 - опрашивать ВСЕ регистры подряд, не обращая внимания на timeout. По умолчанию - "0" Т.е. опрос устройства (на текущем шаге цикла опроса), прерывается на первом же регистре, при опросе которого возникнет timeout.
  • safemodeXXX - см. Управление режимом "безопасного состояния"
Параметры запуска

При создании объекта в конструкторе передаётся префикс для определения параметров командной строки. По умолчанию xxx="mbtcp". Далее приведены основные параметры:

  • --xxx-name ID - идентификатор(name) процесса. IP-адрес шлюза задаётся параметром в конфигурационном файле gateway_iaddr или параметром командной строки --xxx-gateway-iaddr. Порт задаётся в конфигурационном файле параметром gateway_port или параметром командной строки --xxx-gateway-port. По умолчанию используется порт 502.
  • --xxx-recv-timeout или recv_timeout msec - таймаут на приём одного сообщения. По умолчанию 100 мсек.
  • --xxx-timeout или timeout msec - таймаут на определение отсутствия связи (после этого идёт попытка реинициализировать соединение). По умолчанию 5000 мсек.
  • --xxx-reinit-timeout или reinit_timeout msec - таймаут на реинициализацию канала связи (после потери связи). По умолчанию timeout.
  • --xxx-no-query-optimization или no_query_optimization- [1|0] отключить оптимизацию запросов Оптимизация заключается в том, что регистры идущие подряд автоматически запрашиваются/записываются одним запросом. В связи с чем, функция указанная в качестве mbfunc игнорируется и подменяется на работающую с многими регистрами.
  • --xxx-poll-time или poll_time msec - пауза между опросами. По умолчанию 100 мсек.
  • --xxx-initPause или initPause msec - пауза перед началом работы, после активации. По умолчанию 50 мсек.
  • --xxx-force или force [1|0]
    • 1 - перечитывать значения входов из SharedMemory на каждом цикле
    • 0 - обновлять значения только по изменению
  • --xxx-persistent-connection или persistent_connection - НЕ закрывать соединение после каждого запроса.
  • --xxx-force-out или force_out [1|0]
    • 1 - перечитывать значения выходов из SharedMemory на каждом цикле
    • 0 - обновлять значения только по изменению
  • --xxx-reg-from-id или reg_from_id [1|0]
    • 1 - в качестве регистра использовать идентификатор датчика
    • 0 - регистр брать из поля tcp_mbreg
  • --xxx-heartbeat-id или heartbeat_id ID - название для датчика "сердцебиения" (см. Слежение за "живостью" объектов ("сердцебиение"))
  • --xxx-heartbeat-max или heartbeat_max val - сохраняемое значение счётчика "сердцебиения".
  • --xxx-activate-timeout msec . По умолчанию 2000. - время ожидания готовности SharedMemory к работе.
  • --xxx-init-mbval-changed [0|1] или init_mbval_changed [0|1] - Глобальный параметр для инициализации флага изменения значения датчика регистра. Значения по умолчанию для всех регистров в которых не задан тег init_mbval_changed. Только для регистров на запись с посылкой по изменению.

Конфигурирование списка регистров для ModbusTCP master

Конфигурационные параметры задаются в секции <sensors> конфигурационного файла. Список обрабатываемых регистров задаётся при помощи двух параметров командной строки

  • --xxx-filter-field - задаёт фильтрующее поле для датчиков
  • --xxx-filter-value - задаёт значение фильтрующего поля. Необязательный параметр.
  • --xxx-statistic-sec sec - при наличии выведет кол-во посланных запросов за этот промежуток времени.
  • --xxx-set-prop-prefix [str] - Использовать 'str' в качестве префикса для свойств. Если не указать 'str' будет использован пустой префикс.

Если параметры не заданы, будет произведена попытка загрузить все датчики, у которых присутствуют необходимые настроечные параметры.

Предупреждения
Если в результате список будет пустым, процесс завершает работу.

Пример конфигурационных параметров:

<sensors name="Sensors">
...
<item name="MySensor_S" textname="my sesnsor" iotype="DI" tcp_mbtype="rtu" tcp_mbaddr="0x01" tcp_mbfunc="0x04" tcp_mbreg="0x02" my_tcp="1"/>
...
</sensors>
Предупреждения
При помощи –xxx-set-prop-prefix val можно принудительно задать префикс. Если просто указать ключ –xxx-set-prop-prefix - будет использован "пустой" префикс (свойства без префикса). Префикс должен задаваться "полным", т.е. включая _(подчёркивание), если оно используется в свойствах (например для "tcp_mbreg" должен быть задан –xxx-set-prop-prefix tcp_ ).

К основным параметрам относятся следующие (префикс tcp_ - для примера):

  • tcp_mbtype - [rtu] - пока едиственный разрешённый тип.
  • tcp_mbaddr - адрес RTU-устройства.
  • tcp_mbreg - запрашиваемый/записываемый регистр.
  • tcp_mbfunc - [0x1,0x2,0x3,...] функция опроса/записи. Разрешённые см. ModbusRTU::SlaveFunctionCode.

Помимо этого можно задавать следующие параметры:

  • tcp_vtype - тип переменной. см VTypes::VType.
  • tcp_rawdata- [0|1] - игнорировать или нет параметры калибровки (cmin,cmax,rmin,rmax,presicion,caldiagram)
  • tcp_iotype - [DI,DO,AI,AO] - переназначить тип датчика. По умолчанию используется поле iotype.
  • tcp_nbit- номер бита в слове. Используется для DI,DO в случае когда для опроса используется функция читающая слова (03,04)
  • tcp_nbyte - [1|2] номер байта. Используется если tcp_vtype="byte".
  • tcp_mboffset - "сдвиг"(может быть отрицательным) при опросе/записи. Т.е. фактически будет опрошен/записан регистр "mbreg+mboffset".
  • tcp_pollfactor - [0...n] Частота опроса. n задаёт "частоту" опроса. т.е. опрос каждые 1...n циклов Значение параметра равное 65535 означает, что регистры на запись пишутся только по изменению значения соответствующего датчика(значение mbval для регистра).
  • tcp_mbmask - "битовая маска"(uint16_t). Позволяет задать маску для значения. Действует как на значения читаемые из регистров, так и записываемые. При этом разрешается привязывать разные датчики к одному и тому же modbus-регистру указывая разные маски. Применяется для ресгитров читаемых словами (функции 03, 04).

Для инициализации "выходов" (регистров которые пишутся) можно использовать поля:

  • tcp_preinit- [0|1] считать регистр перед использованием (при запуске процесса)
  • tcp_init_mbfunc - Номер функции для инициализации. Если не указана, будет определена автоматически исходя из tcp_mbfunc.
  • tcp_init_mbreg- Номер регистра откуда считывать значение для инициализации. Если это поле не указано используется tcp_mbreg.

Если указано tcp_preinit="1", то прежде чем начать писать регистр в устройство, будет произведено его чтение.

По умолчанию все "записываемые" регистры инициализируются значением из SM. Т.е. пока не будет первый раз считано значение из SM, регистры в устройство писатся не будут. Чтобы отключить это поведение, можно указать параметр

  • tcp_sm_initOK - [0|1] Игнорировать начальную инициализацию из SM (сразу писать в устройство)

При этом будет записывыться значение "default".

Предупреждения
Регистр должен быть уникальным. И может повторятся только если указан параметр nbit или mbmask. Для регистров с параметром nbyte в данной реализации отключена возможность привязывать несколько датчиков к одному регистру т.е. на данный момент nbyte соответствует только одному регистру.
  • tcp_init_mbval_changed [0|1] - Инициализации флага изменения значения для регистров на запись с отправкой по изменению. Параметр только для регистров на запись. Можно выставить значение как для конкретного датчика, так и значение по умолчанию глобальной настройкой в секции обмена или параметром командной строки.

Управление режимом работы MBTCPMaster

В MBTCPMaster заложена возможность управлять режимом работы процесса. Поддерживаются следующие режимы:

  • emNone - нормальная работа (по умолчанию)
  • emWriteOnly - "только посылка данных" (работают только write-функции)
  • emReadOnly - "только чтение" (работают только read-функции)
  • emSkipSaveToSM - "не записывать данные в SM", это особый режим, похожий на emWriteOnly, но отличие в том, что при этом режиме ведётся полноценый обмен (и read и write), только реально данные не записываются в SharedMemory(SM).
  • emSkipExchnage - отключить обмен (при этом данные "из SM" обновляются).

Режимы переключаются при помощи датчика, который можно задать либо аргументом командной строки

  • --prefix-exchange-mode-id либо в конф. файле параметром exchangeModeID="". Константы определяющие режимы объявлены в MBTCPMaster::ExchangeMode.

Управление режимом "безопасного состояния"

В MBTCPMaster заложена возможность управлять режимом выставления безопасного состояния входов и выходов. Возможны следующие режимы:

  • safeNone - режим отключён (по умолчанию)
  • safeExternalControl - управление при помощи внешнего датчика
  • safeResetIfNotRespond - выставление безопасных значение, если пропала связь с устройством.

Суть этого режима, в том, что все входы и выходы у которых в настройках указан параметр safeval="" выставляются в это значение, при срабатывании внешнего датчика (режим "safeExternalControl") или при отсутсвии связи с устройством (режим "safeResetIfNotRespond").

Режим задаётся в секции <DeviceList> для каждого устройства отдельно.

<DeviceList>
<item addr="01" .. safemodeSensor="Slave1_SafemodeSensor_S" safemodeValue="42"/>
<item addr="02" .. safemodeResetIfNotRespond="1"/>
</DeviceList>

Если указан параметр safemodeSensor="..", то используется режим safeExternalControl. При этом можно указать конкретное значение датчика safemodeSensorValue="..", при котором будет сделан сброс значений в безопасное состояние.

Если указан параметр safemodeResetIfNotRespond="1", то будет использован режим safeResetIfNotRespond. Если указан и параметр safemodeSensor=".." и safemodeResetIfNotRespond="1", то будет использован режим safeExternalControl (как более приоритетный).

Переконфигурирование "на ходу"

В процессе реализована возможность перечитать конфигурацию "на ходу". Для этого достаточно процессу послать команду SystemMessage::Reconfigure или воспользоваться HTTP API, где можно указать файл из которого произвести загрузку (см. ModbusMaster HTTP API).

Послать команду можно при помощи утилиты uniset2-admin

uniset2-admin --configure ObjectID

При этом процесс приостанавливает обмен и перезагружает конфигурационный файл с которым был запущен. Переконфигурировать можно регистры, список устройств, адреса и любые свойства. В том числе возможно добавление новых регистров в список или уменьшение списка существующих.

Предупреждения
Если во время загрузки новой конфигурации будет найдена какая-то ошибка, то конфигурация не будет применена. Ошибку можно будет увидеть в логах процесса.
Важно понимать, что это перезагрузка только настроек касающихся ModbusMaster, поэтому список датчиков и другие базовые настройки должны совпадать с исходным файлом. Т.е. возможно только переопределение параметров касающихся обмена, а не всего конфига в целом.

ModbusMaster HTTP API

/help - Получение списка доступных команд
/ - получение стандартной информации
/reload?confile=/path/to/confile - Перезагрузить конфигурацию
confile - абсолютный путь до файла с конфигурацией. Не обязательный параметр.
Предупреждения
Важно иметь ввиду, что если указывается confile, то он должен совпадать с базовым configure.xml в идентификаторах датчиков. И как минимум должен содержать соответствующую секцию настроек для процесса и те датчики, которые участвуют в обмене. Т.к. реальный config (глобальный) не подменяется, из указанного файла только загружаются необходимые для инициализации обмена параметры.