UniSet  2.6.0
Реализация Modbus slave
  - \ref sec_MBSlave_Comm
  - \ref sec_MBSlave_Conf
  - \ref sec_MBSlave_ConfList
  - \ref sec_MBSlave_FileTransfer
  - \ref sec_MBSlave_MEIRDI
  - \ref sec_MBSlave_DIAG
  - \ref sec_MBSlave_TCP

  @section sec_MBSlave_Comm Общее описание Modbus slave
  Класс реализует базовые функции для протокола Modbus в slave режиме. Реализацию Modbus RTU - см. RTUExchange.
  Реализацию Modbus slave (TCP) - см. MBSlave. Список регистров с которыми работает процесс задаётся в конфигурационном файле
  в секции \b <sensors>. см. \ref sec_MBSlave_Conf

  В данной версии поддерживаются следующие функции:
 - 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

  @section sec_MBSlave_Conf Конфигурирование ModbusTCP slave

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

  \par Секция с настройками
  При своём старте, в конфигурационном файле ищётся секция с названием объекта,
  в которой указываются настроечные параметры по умолчанию.
  Пример:
  @code 
    <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=""
    ...
  \endcode

  - \b default_mbaddr - адрес по умолчанию для данного устройства. Если указан адрес 255 - ответ будет на любые сообщения.
  - \b afterSendPause - принудительная пауза после посылки ответа
  - \b reg_from_id - номер регистра брать из ID датчика
  - \b replyTimeout - таймаут на формирование ответа. Если ответ на запрос будет сформирован за большее время, он не будет отослан.
  - \b askcount_id - идентификатор датчика для счётчика запросов
  - \b respond_id - идентификатор датчика наличия связи. Выставляется в "1" когда связь есть.
  - \b respond_invert - инвертировать логику выставления датчика связи (т.е. выставлять "1" - когда нет связи).
  - \b heartbeat_id - идентификтор датчика "сердцебиения". См. \ref sec_SM_HeartBeat
  - \b initPause - пауза перед началом работы, после активации. По умолчанию 3000 мсек.
  - \b force - [1,0] перезаписывать ли значения в SharedMemory каждый раз (а не по изменению).
  - \b timeout msec - таймаут, для определения отсутствия связи

    Специфичные для RTU настройки:
@code 
        device="/dev/ttyS0" speed="9600" use485F="1" transmitCtl="0">
  \endcode
  - \b device -  устройство (порт)
  - \b speed - скорость обмена
  - \b use485F - [0,1] - использовать специальный класс для обмена по RS485 на контрллерах фаствел (убирает echo программным путём).
  - \b transmitCtl - [0,1] - управлять ли приёмопередатчиков (ну программном уровне). Обычно это на аппаратном или драйвером.

    Специфичные для TCP настройки:
@code 
    iaddr="localhost" iport="502"
\endcode
  - \b iaddr - ip адрес данного устройства
  - \b iport - tcp порт.

  \par Параметры запуска

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

  \b --xxx-name ID - идентификатор процесса.

  \b --xxx-default-mbaddr addr1 - slave-адрес по умолчанию для данного устройства. Если указан адрес 255 - ответ будет на любые сообщения.

  \b --xxx-timeout или \b timeout msec  - таймаут на определение отсутсвия связи.

  \b --xxx-reply-timeout msec  - таймаут на формирование ответа.

  \b --xxx-initPause или \b initPause msec - пауза перед началом работы, после активации. По умолчанию 50 мсек.

  \b --xxx-force или \b force [1|0]
   - 1 - перечитывать/перезаписывать значения входов из SharedMemory на каждом цикле
   - 0 - обновлять значения только по изменению

  \b --xxx-reg-from-id или \b reg_from_id [1|0]
   - 1 - в качестве регистра использовать идентификатор датчика
   - 0 - регистр брать из поля tcp_mbreg

  \b --xxx-default-mbfunc или \b default_mbfunc [0...255] - Функция подставляемая по умолчанию, если не указан параметр mbfunc. Действует только если включён контроль функций (check-mbfunc).
  \b --xxx-check-mbfunc [0|1] -
   - 1 - включить контроль (обработку) свойства mbfunc. По умолчанию: отключёна. Если контроль включён то разрешено
   использовать один и тот же регистр но \b для \b разных \b функций.
   - 0 - игнорировать свойство mbfunc..

  \b --xxx-heartbeat-id или \b heartbeat_id ID - идентификатор датчика "сердцебиения" (см. \ref sec_SM_HeartBeat)

  \b --xxx-heartbeat-max или \b heartbeat_max val - сохраняемое значение счётчика "сердцебиения".

  \b --xxx-activate-timeout msec . По умолчанию 2000. - время ожидания готовности SharedMemory к работе.

  \b --xxx-allow-setdatetime 0,1 - Включить функцию 0x50. Выставление даты и времени.

  \par Настройки протокола RTU:

  \b --xxx-dev devname  - файл устройства

  \b --xxx-speed        - Скорость обмена (9600,19920,38400,57600,115200)

  \par Настройки протокола TCP:

  \b --xxx-inet-addr [xxx.xxx.xxx.xxx | hostname ]  - this modbus server address

  \b --xxx-inet-port num - this modbus server port. Default: 502.

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

  \b --xxx-filter-field  - задаёт фильтрующее поле для датчиков

  \b --xxx-filter-value  - задаёт значение фильтрующего поля. Необязательный параметр.

  \warning Если в результате список будет пустым, процесс завершает работу.

  Пример конфигурационных параметров:
<sensors name="Sensors">
...
<item name="MySensor_S" textname="my sesnsor" iotype="DI"
mbs="1" mbs_mbaddr="0x02" mbs_mbreg="1"
/>
<item name="MySensor2_S" textname="my sesnsor 2" iotype="DI"
mbs="1" mbs_mbaddr="0x01" mbs_mbreg="1"
/>
...
</sensors>
Предупреждения
По умолчанию для свойств используется заданный в конструктроре префикс "mbs_".

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

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

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

Поддержка "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)

Настройка TCPServer

<MBTCPPersistentSlave ....sesscount="">
<clients>
<item ip="" respond="" invert="1" askcount=""/>
<item ip="" respond="" invert="1" askcount=""/>
<item ip="" respond="" invert="1" askcount=""/>
</clients>
</MBTCPPersistentSlave>