Общее описание Modbus slave
Класс реализует базовые функции для протокола Modbus в slave режиме. Реализацию Modbus RTU - см. RTUExchange. Реализацию Modbus slave (TCP) - см. MBSlave. Список регистров с которыми работает процесс задаётся в конфигурационном файле в секции <sensors>. см. Конфигурирование ModbusTCP slave
В данной версии поддерживаются следующие функции:
- 0x02 - read input status
- 0x03 - read register outputs or memories or read word outputs or memories
- 0x04 - read input registers or memories or read word outputs or memories
- 0x05 - forces a single coil to either ON or OFF
- 0x06 - write register outputs or memories
- 0x08 - Diagnostics (Serial Line only)
- 0x0F - force multiple coils
- 0x10 - write register outputs or memories
- 0x14 - read file record
- 0x15 - write file record
- 0x2B - Modbus Encapsulated Interface
- 0x50 - set date and time
- 0x66 - file transfer
Конфигурирование ModbusTCP slave
Конфигурирование процесса осуществляется либо параметрами командной строки либо через настроечную секцию.
- Секция с настройками
- При своём старте, в конфигурационном файле ищётся секция с названием объекта, в которой указываются настроечные параметры по умолчанию. Пример:
<MBSlave1 name="MBSlave1" default_mbaddr="0x31"
afterSendPause="0"
reg_from_id="0"
replyTimeout="60"
askcount_id=""
respond_invert=""
respond_id=""
timeout=""
heartbeat_id=""
initPause=""
force=""
...
- default_mbaddr - адрес по умолчанию для данного устройства. Если указан адрес 255 - ответ будет на любые сообщения.
- afterSendPause - принудительная пауза после посылки ответа
- reg_from_id - номер регистра брать из ID датчика
- replyTimeout - таймаут на формирование ответа. Если ответ на запрос будет сформирован за большее время, он не будет отослан.
- askcount_id - идентификатор датчика для счётчика запросов
- respond_id - идентификатор датчика наличия связи. Выставляется в "1" когда связь есть.
- respond_invert - инвертировать логику выставления датчика связи (т.е. выставлять "1" - когда нет связи).
- heartbeat_id - идентификтор датчика "сердцебиения". См. Слежение за "живостью" объектов ("сердцебиение")
- initPause - пауза перед началом работы, после активации. По умолчанию 3000 мсек.
- force - [1,0] перезаписывать ли значения в SharedMemory каждый раз (а не по изменению).
- timeout msec - таймаут, для определения отсутствия связи
Специфичные для RTU настройки:
device="/dev/ttyS0" speed="9600" use485F="1" transmitCtl="0">
- device - устройство (порт)
- speed - скорость обмена
- use485F - [0,1] - использовать специальный класс для обмена по RS485 на контрллерах фаствел (убирает echo программным путём).
- transmitCtl - [0,1] - управлять ли приёмопередатчиков (ну программном уровне). Обычно это на аппаратном или драйвером.
Специфичные для TCP настройки:
iaddr="localhost" iport="502"
- iaddr - ip адрес данного устройства
- iport - tcp порт.
- Параметры запуска
При создании объекта в конструкторе передаётся префикс для определения параметров командной строки. По умолчанию xxx="mbs". Далее приведены основные параметры:
- --xxx-name ID - идентификатор процесса.
- --xxx-default-mbaddr addr1 - slave-адрес по умолчанию для данного устройства. Если указан адрес 255 - ответ будет на любы сообщения.
- --xxx-timeout или timeout msec - таймаут на определение отсутствия связи.
- --xxx-reply-timeout msec - таймаут на формирование ответа.
- --xxx-initPause или initPause msec - пауза перед началом работы, после активации. По умолчанию 50 мсек.
- --xxx-force или force [1|0]
- 1 - перечитывать/перезаписывать значения входов из SharedMemory на каждом цикле
- 0 - обновлять значения только по изменению
- --xxx-reg-from-id или reg_from_id [1|0]
- 1 - в качестве регистра использовать идентификатор датчика
- 0 - регистр брать из поля tcp_mbreg
- --xxx-default-mbfunc или default_mbfunc [0...255] - Функция подставляемая по умолчанию, если не указан параметр mbfunc. Действует только если включён контроль функций (check-mbfunc).
- --xxx-check-mbfunc [0|1] -
- 1 - включить контроль (обработку) свойства mbfunc. По умолчанию: отключёна. Если контроль включён то разрешено использовать один и тот же регистр но для разных функций.
- 0 - игнорировать свойство mbfunc..
- --xxx-heartbeat-id или heartbeat_id ID - идентификатор датчика "сердцебиения" (см. Слежение за "живостью" объектов ("сердцебиение"))
- --xxx-heartbeat-max или heartbeat_max val - сохраняемое значение счётчика "сердцебиения".
- --xxx-activate-timeout msec . По умолчанию 2000. - время ожидания готовности SharedMemory к работе.
- --xxx-allow-setdatetime 0,1 - Включить функцию 0x50. Выставление даты и времени.
- Настройки протокола RTU:
- --xxx-dev devname - файл устройства
- --xxx-speed- Скорость обмена (9600,19920,38400,57600,115200)
- Настройки протокола TCP:
- --xxx-inet-addr [xxx.xxx.xxx.xxx | hostname ] - this modbus server address
- --xxx-inet-port num - this modbus server port. Default: 502.
Конфигурирование списка регистров для ModbusSlave
Конфигурационные параметры задаются в секции <sensors> конфигурационного файла. Список обрабатываемых регистров задаётся при помощи двух параметров командной строки
- --xxx-filter-field - задаёт фильтрующее поле для датчиков
- --xxx-filter-value - задаёт значение фильтрующего поля. Необязательный параметр.
- Предупреждения
- Если в результате список будет пустым, процесс завершает работу.
Пример конфигурационных параметров:
<sensors name="Sensors">
...
<item name="MySensor_S" textname="my sesnsor" iotype="DI" mbs="1" mbaddr="0x02" mbreg="1"/>
<item name="MySensor2_S" textname="my sesnsor 2" iotype="DI" mbs="1" mbaddr="0x01" mbreg="1"/>
...
</sensors>
- Предупреждения
- При помощи –xxx-set-prop-prefix val можно принудительно задать префикс. Если просто указать ключ –xxx-set-prop-prefix - будет использован "пустой" префикс (свойства без префикса). Префикс должен задаваться "полным", т.е. включая _(подчёркивание), если оно используется в свойствах (например для "mbs_mbreg" должен быть задан –xxx-set-prop-prefix mbs_ ).
К основным параметрам настройки датчиков относятся следующие (префикс mbs_ - для примера):
- mbs_mbaddr- адрес к которому относиться данный регистр. Если не используется параметр default_mbaddr.
- mbs_mbreg - запрашиваемый/записываемый регистр. Если не используется параметр regFromId.
Помимо этого можно задавать следующие параметры:
- mbs_vtype - тип переменной. см VTypes::VType.
- mbs_rawdata - [0|1] - игнорировать или нет параметры калибровки (cmin,cmax,rmin,rmax,presicion,caldiagram)
- mbs_iotype- [DI,DO,AI,AO] - переназначить тип датчика. По умолчанию используется поле iotype.
- mbs_nbyte - [1|2] номер байта. Используется если mbs_vtype="byte".
- mbs_accessmode - режим доступа к регистру.
- "ro" - read only
- "wo" - write only
- "rw" - read/write. Режим по умолчанию.
- Предупреждения
- Регистр должен быть уникальным. И может повторятся только если указан параметр nbyte.
Настройка передачи файлов в ModbusSlave (0x66)
Данная реализация позволяет передавать по протоколу Modbus заранее заданные файлы. Настройка производится в конфигурационном файле.
<filelist>
<!-- Список файлов разрешённых для передачи по modbus
directory - каталог где лежит файл. Можно не задавать
'ConfDir' - берётся из настроек (см. начало этого файла)
'DataDir' - берётся из настроек (см. начало этого файла)
'xxx' - прямое указание каталога
-->
<item directory="ConfDir" id="1" name="configure.xml"/>
<item directory="ConfDir" id="2" name="VERSION"/>
<item directory="/tmp/" id="3" name="configure.xml.gz"/>
<item directory="ConfDir" id="4" name="SERIAL"/>
</filelist>
- id - задаёт идентификтор файла (собственно он и будет запрашиваться.
- name - название файла
- directory - каталог где храниться файл.
Поддержка "MODBUS Encapsulated Interface" (0x2B)[0x0E]
<MEI>
<!-- ВНИМАНИЕ: должен заполняться в соответствии со стандартом. ObjectID и DeviceID не случайны.. -->
<device id="0x01">
<object id="0" comm="VendorName">
<string value="etersoft"/>
</object>
<object id="1" comm="ProductCode">
<string value="uniset"/>
</object>
<object id="2" comm="MajorMinorRevision">
<string value="1.6"/>
</object>
</device>
<device id="0x02">
<object id="3" comm="VendorURL">
<string value="http://www.etersoft.ru"/>
</object>
<object id="4" comm="ProductName">
<string value="uniset"/>
</object>
<object id="5" comm="ModelName">
<string value="uniset:MBSlave"/>
</object>
<object id="6" comm="UserApplicationName">
<string value="MBSlave1"/>
</object>
</device>
<device id="0x03">
<object id="128" comm="private objects">
<string id="129" value="etersoft"/>
<string id="130" value="uniset"/>
<string id="131" value="1.6"/>
<string id="132" value="http://www.etersoft.ru"/>
<string id="133" value="MBSlave1"/>
</object>
</device>
</MEI>
Диагностические функции (0x08)
В процесс встроена поддержка диагностических функций. См. uniset::ModbusRTU::DiagnosticsSubFunction
Настройка TCPServer
<MBTCPPersistentSlave ....sesscount="">
<clients>
<item ip="" respond="" invert="1" askcount=""/>
<item ip="" respond="" invert="1" askcount=""/>
<item ip="" respond="" invert="1" askcount=""/>
</clients>
</MBTCPPersistentSlave>
По умолчанию если не удалось создать сокет процесс пытается повторять попытки каждые tcpRepeatCreateSocketPause и не вылетает. Но если задан параметр tcpBreakIfFailRun="1", то процессы завершает работу после первой неудачной попытки. Изменить эти параметры можно либо в конфигурационном файле:
<MBTCPPersistentSlave ... tcpBreakIfFailRun="1" tcpRepeatCreateSocket="xxx msec"/>
Либо аргументами командной строки:
- –prefix–break-if-fail-run 1
- –prefix-repeat-create-socket msec.
MBSlave HTTP API
- /help- Получение списка доступных команд
- /- получение стандартной информации
- /regs?regs=reg1,reg2,reg3,..&addr=addr1,addr2,addr3 - получение списка регистров Не обязательные параметры:
- regs - выдать информацию только по указанным регистрам
- addr - выдать информацию только по указанным адресам устройств