Commit 4956d41e authored by Pavel Vainerman's avatar Pavel Vainerman

(ModbusSlave): накидал скелет документации.

parent e344b531
......@@ -18,6 +18,240 @@
#include "VTypes.h"
#include "ThreadCreator.h"
// -----------------------------------------------------------------------------
/*!
\page page_ModbusSlave Реализация 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
\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" addr="0x31"
afterSendPause="0"
reg_from_id="0"
replyTimeout="60"
askcount_id=""
respond_invert=""
respond_id=""
timeout=""
heartbeat_id=""
initPause=""
force=""
...
\endcode
- \b addr - адрес данного устройства
- \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-my-addr addr - slave-адрес для данного устройства.
\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-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 Если в результате список будет пустым, процесс завершает работу.
Пример конфигурационных параметров:
\code
<sensors name="Sensors">
...
<item name="MySensor_S" textname="my sesnsor" iotype="DI"
mbs="1" mbreg="1"
/>
...
</sensors>
\endcode
\warning По умолчанию для свойств используется заданный в конструктроре префикс "mbs_".
К основным параметрам настройки датчиков относятся следующие (префикс \b mbs_ - для примера):
- \b mbs_mbreg - запрашиваемый/записываемый регистр. Если не используется параметр \b reg_from_id.
Помимо этого можно задавать следующие параметры:
- \b mbs_vtype - тип переменной. см VTypes::VType.
- \b mbs_rawdata - [0|1] - игнорировать или нет параметры калибровки (cmin,cmax,rmin,rmax,presicion,caldiagram)
- \b mbs_iotype - [DI,DO,AI,AO] - переназначить тип датчика. По умолчанию используется поле iotype.
- \b mbs_nbyte - [1|2] номер байта. Используется если mbs_vtype="byte".
- \b accessmode - режим доступа к регистру.
"ro" - read only
"wo" - write only
"rw" - read/write. Режим по умолчанию.
\warning Регистр должен быть уникальным. И может повторятся только если указан параметр \a nbyte.
\section sec_MBSlave_FileTransfer Настройка передачи файлов в ModbusSlave (0x66)
Данная реализация позволяет передавать по протоколу Modbus заранее заданные файлы.
Настройка происходвится в конфигурационном файле.
\code
<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>
\endcode
- \b id - задаёт идентификтор файла (собственно он и будет запрашиваться.
- \b name - название файла
- \b directory - каталог где храниться файл.
\section sec_MBSlave_MEIRDI Поддержка "MODBUS Encapsulated Interface" (0x2B)[0x0E]
\code
<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>
\endcode
\section sec_MBSlave_DIAG Диагностические функции (0x08)
*/
// -----------------------------------------------------------------------------
/*! Реализация slave-интерфейса */
class MBSlave:
public UniSetObject_LT
......
......@@ -33,7 +33,7 @@
</History>
</SharedMemory>
<MBSlave1 addr="0x31" aftersend-pause="0" dev="/dev/ttyS0" levels="info,warn,crit" name="MBSlave1" poll_time="200" reply_timeout="60" speed="9600">
<MBSlave1 addr="0x31" aftersend-pause="0" device="/dev/ttyS0" name="MBSlave1" poll_time="200" reply_timeout="60" speed="9600">
<filelist>
<!-- Список файлов разрешённых для передачи по modbus
directory - каталог где лежит файл. Можно не задавать
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment