Класс реализует процесс обмена (опрос/запись) с RTU-устройствами, через TCP-шлюз. Список регистров с которыми работает процесс задаётся в конфигурационном файле в секции
<sensors>. см.
Конфигурирование ModbusTCP master
Конфигурирование процесса осуществляется либо параметрами командной строки либо через настроечную секцию.
- Секция с настройками
- При своём старте, в конфигурационном файле ищётся секция с названием объекта, в которой указываются настроечные параметры по умолчанию. Пример:
<MBMaster1 name="MBMaster1" gateway_iaddr="127.0.0.1" gateway_port="30000" polltime="200">
<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>
Секция <DeviceList> позволяет задать параметры обмена с конкретным RTU-устройством.
- addr - адрес устройства для которого, задаются параметры
- timeout msec - таймаут, для определения отсутствия связи
- invert - инвертировать логику. По умолчанию датчик выставляется в "1" при наличии связи.
- respondSensor - идентификатор датчика связи.
- ask_every_reg - 1 - опрашивать ВСЕ регистры подряд, не обращая внимания на timeout. По умолчанию - "0" Т.е. опрос устройства (на текущем шаге цикла опроса), прерывается на первом же регистре, при опросе которого возникнет timeout.
- Параметры запуска
При создании объекта в конструкторе передаётся префикс для определения параметров командной строки. По умолчанию
xxx="mbtcp". Далее приведены основные параметры:
--xxx-name ID - идентификатор процесса.
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-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 к работе.
Конфигурационные параметры задаются в секции <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>
- Предупреждения:
- По умолчанию для свойств используется префикс "tcp_". Но если задано поле filter-field, то для свойств будет использован префикс "filter-fileld"_. При этом при помощи --xxx-set-prop-prefix val можно принудительно задать префикс. Если просто указать ключ --xxx-set-prop-prefix - будет использован "пустой" префикс (свойства без префикса).
К основным параметрам относятся следующие (префикс
tcp_ - для примера):
- tcp_mbtype - [rtu] - пока едиственный разрешённый тип.
- tcp_mbaddr - адрес RTU-устройства.
- tcp_mbreg - запрашиваемый/записываемый регистр.
- tcp_mbfunc - [0x1,0x2,0x3,...] функция опроса/записи. Разрешённые см. ModbusRTU::SlaveFunctionCode.
Помимо этого можно задавать следующие параметры:
- tcp_vtype - тип переменной. см VTypes::VType.
- tcp_rawdata - [0|1] - игнорировать или нет параметры калибровки
- tcp_iotype - [DI,DO,AI,AO] - переназначить тип датчика. По умолчанию используется поле iotype.
- tcp_nbit - номер бита в слове. Используется для DI,DO в случае когда для опроса используется функция читающая слова (03
- tcp_nbyte - [1|2] номер байта. Используется если tcp_vtype="byte".
- tcp_mboffset - "сдвиг"(может быть отрицательным) при опросе/записи. Т.е. фактически будет опрошен/записан регистр "mbreg+mboffset".
Для инициализации "выходов" (регистров которые пишутся) можно использовать поля:
- 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 или nbyte.
В
MBTCPMaster заложена возможность управлять режимом работы процесса. Поддерживаются следующие режимы:
- emNone - нормальная работа (по умолчанию)
- emWriteOnly - "только посылка данных" (работают только write-функции)
- emReadOnly - "только чтение" (работают только read-функции)
- emSkipSaveToSM - "не записывать данные в SM", это особый режим, похожий на emWriteOnly, но отличие в том, что при этом режиме ведётся полноценый обмен (и read и write), только реально данные не записываются в SharedMemory(SM).
Режимы переключаются при помощи датчика, который можно задать либо аргументом командной строки --prefix-exchange-mode-id либо в конф. файле параметром echangeModeID="". Константы определяющие режимы объявлены в MBTCPMaster::ExchangeMode.