|
| MBSlave (uniset::ObjectId objId, uniset::ObjectId shmID, const std::shared_ptr< SharedMemory > &ic=nullptr, const std::string &prefix="mbs") |
|
std::string | amode2str (AccessMode m) |
|
long | getConnCount () |
|
std::shared_ptr< LogAgregator > | getLogAggregator () |
|
std::shared_ptr< DebugStream > | log () |
|
virtual uniset::SimpleInfo * | getInfo (const char *userparam=0) override |
|
virtual Poco::JSON::Object::Ptr | httpHelp (const Poco::URI::QueryParameters &p) override |
|
virtual Poco::JSON::Object::Ptr | httpRequest (const std::string &req, const Poco::URI::QueryParameters &p) override |
|
| UniSetObject (const std::string &name, const std::string §ion) |
|
| UniSetObject (uniset::ObjectId id) |
|
virtual CORBA::Boolean | exist () override |
|
virtual uniset::ObjectId | getId () override |
|
const uniset::ObjectId | getId () const |
|
std::string | getName () const |
|
virtual uniset::ObjectType | getType () override |
|
const std::string | getStrType () |
|
virtual uniset::SimpleInfo * | apiRequest (const char *query) override |
|
virtual void | push (const uniset::TransportMessage &msg) override |
| поместить сообщение в очередь Подробнее...
|
|
virtual void | pushMessage (const char *msg, ::CORBA::Long mtype, const ::uniset::Timespec &tm, const ::uniset::ProducerInfo &pi, ::CORBA::Long priority, ::CORBA::Long consumer) override |
| поместить текстовое сообщение в очередь Подробнее...
|
|
virtual Poco::JSON::Object::Ptr | httpGet (const Poco::URI::QueryParameters &p) override |
|
uniset::ObjectPtr | getRef () const |
|
std::shared_ptr< UniSetObject > | get_ptr () |
|
virtual timeout_t | askTimer (uniset::TimerId timerid, timeout_t timeMS, clock_t ticks=-1, uniset::Message::Priority p=uniset::Message::High) override |
|
timeout_t | checkTimers (UniSetObject *obj) |
|
timeout_t | getTimeInterval (uniset::TimerId timerid) const |
|
timeout_t | getTimeLeft (uniset::TimerId timerid) const |
|
|
ModbusRTU::mbErrCode | readCoilStatus (ModbusRTU::ReadCoilMessage &query, ModbusRTU::ReadCoilRetMessage &reply) |
|
ModbusRTU::mbErrCode | readInputStatus (ModbusRTU::ReadInputStatusMessage &query, ModbusRTU::ReadInputStatusRetMessage &reply) |
|
ModbusRTU::mbErrCode | readOutputRegisters (ModbusRTU::ReadOutputMessage &query, ModbusRTU::ReadOutputRetMessage &reply) |
|
ModbusRTU::mbErrCode | readInputRegisters (ModbusRTU::ReadInputMessage &query, ModbusRTU::ReadInputRetMessage &reply) |
|
ModbusRTU::mbErrCode | forceSingleCoil (ModbusRTU::ForceSingleCoilMessage &query, ModbusRTU::ForceSingleCoilRetMessage &reply) |
|
ModbusRTU::mbErrCode | forceMultipleCoils (ModbusRTU::ForceCoilsMessage &query, ModbusRTU::ForceCoilsRetMessage &reply) |
|
ModbusRTU::mbErrCode | writeOutputRegisters (ModbusRTU::WriteOutputMessage &query, ModbusRTU::WriteOutputRetMessage &reply) |
|
ModbusRTU::mbErrCode | writeOutputSingleRegister (ModbusRTU::WriteSingleOutputMessage &query, ModbusRTU::WriteSingleOutputRetMessage &reply) |
|
ModbusRTU::mbErrCode | setDateTime (ModbusRTU::SetDateTimeMessage &query, ModbusRTU::SetDateTimeRetMessage &reply) |
|
ModbusRTU::mbErrCode | remoteService (ModbusRTU::RemoteServiceMessage &query, ModbusRTU::RemoteServiceRetMessage &reply) |
|
ModbusRTU::mbErrCode | fileTransfer (ModbusRTU::FileTransferMessage &query, ModbusRTU::FileTransferRetMessage &reply) |
|
ModbusRTU::mbErrCode | diagnostics (ModbusRTU::DiagnosticMessage &query, ModbusRTU::DiagnosticRetMessage &reply) |
|
ModbusRTU::mbErrCode | read4314 (ModbusRTU::MEIMessageRDI &query, ModbusRTU::MEIMessageRetRDI &reply) |
|
virtual void | sysCommand (const uniset::SystemMessage *msg) override |
|
virtual void | sensorInfo (const uniset::SensorMessage *sm) override |
|
virtual void | timerInfo (const uniset::TimerMessage *tm) override |
|
void | askSensors (UniversalIO::UIOCommand cmd) |
|
bool | waitSMReady () |
|
virtual void | execute_rtu () |
|
virtual void | execute_tcp () |
|
virtual void | updateStatistics () |
|
virtual void | updateTCPStatistics () |
|
virtual void | updateThresholds () |
|
virtual void | postReceiveEvent (ModbusRTU::mbErrCode res) |
|
void | runTCPServer () |
|
virtual bool | activateObject () override |
| Активизация объекта (переопределяется для необходимых действий после активизации) Подробнее...
|
|
virtual bool | deactivateObject () override |
| Деактивация объекта (переопределяется для необходимых действий при завершении работы) Подробнее...
|
|
virtual void | finalThread () |
|
virtual void | initIterators () |
|
bool | initItem (UniXML::iterator &it) |
|
bool | readItem (const std::shared_ptr< UniXML > &xml, UniXML::iterator &it, xmlNode *sec) |
|
void | readConfiguration () |
|
bool | check_item (UniXML::iterator &it) |
|
ModbusRTU::mbErrCode | real_write (RegMap &rmap, const ModbusRTU::ModbusData regOKOK, ModbusRTU::ModbusData val, const int fn=0) |
|
ModbusRTU::mbErrCode | real_write (RegMap &rmap, const ModbusRTU::ModbusData regOKOK, ModbusRTU::ModbusData *dat, size_t &i, size_t count, const int fn=0) |
|
ModbusRTU::mbErrCode | real_read (RegMap &rmap, const ModbusRTU::ModbusData regOKOK, ModbusRTU::ModbusData &val, const int fn=0) |
|
ModbusRTU::mbErrCode | much_real_read (RegMap &rmap, const ModbusRTU::ModbusData regOKOK, ModbusRTU::ModbusData *dat, size_t count, const int fn=0) |
|
ModbusRTU::mbErrCode | much_real_write (RegMap &rmap, const ModbusRTU::ModbusData regOKOK, ModbusRTU::ModbusData *dat, size_t count, const int fn=0) |
|
ModbusRTU::mbErrCode | real_read_it (RegMap &rmap, RegMap::iterator &it, ModbusRTU::ModbusData &val) |
|
ModbusRTU::mbErrCode | real_bitreg_read_it (std::shared_ptr< BitRegProperty > &bp, ModbusRTU::ModbusData &val) |
|
ModbusRTU::mbErrCode | real_read_prop (IOProperty *p, ModbusRTU::ModbusData &val) |
|
ModbusRTU::mbErrCode | real_write_it (RegMap &rmap, RegMap::iterator &it, ModbusRTU::ModbusData *dat, size_t &i, size_t count) |
|
ModbusRTU::mbErrCode | real_bitreg_write_it (std::shared_ptr< BitRegProperty > &bp, const ModbusRTU::ModbusData val) |
|
ModbusRTU::mbErrCode | real_write_prop (IOProperty *p, ModbusRTU::ModbusData *dat, size_t &i, size_t count) |
|
Poco::JSON::Object::Ptr | request_regs (const std::string &req, const Poco::URI::QueryParameters &p) |
|
Poco::JSON::Object::Ptr | get_regs (ModbusRTU::ModbusAddr addr, const RegMap &rmap, const std::vector< std::string > &q_regs) |
|
Poco::JSON::Object::Ptr | get_reginfo (const IOProperty &prop) |
|
int | getOptimizeWriteFunction (const int fn) |
|
void | initTCPClients (UniXML::iterator confnode) |
|
virtual void | processingMessage (const uniset::VoidMessage *msg) |
|
virtual void | onTextMessage (const uniset::TextMessage *tm) |
|
VoidMessagePtr | receiveMessage () |
|
VoidMessagePtr | waitMessage (timeout_t msec=UniSetTimer::WaitUpTime) |
|
void | termWaiting () |
|
size_t | countMessages () |
|
size_t | getCountOfLostMessages () const |
|
void | uterminate () |
|
void | thread (bool create) |
|
void | offThread () |
|
void | onThread () |
|
virtual void | callback () |
|
void | setID (uniset::ObjectId id) |
|
void | setThreadPriority (Poco::Thread::Priority p) |
|
void | setMaxSizeOfMessageQueue (size_t s) |
|
size_t | getMaxSizeOfMessageQueue () const |
|
bool | isActive () const |
|
void | setActive (bool set) |
|
virtual Poco::JSON::Object::Ptr | httpGetMyInfo (Poco::JSON::Object::Ptr root) |
|
Poco::JSON::Object::Ptr | request_conf (const std::string &req, const Poco::URI::QueryParameters &p) |
|
Poco::JSON::Object::Ptr | request_conf_name (const std::string &name, const std::string &props) |
|
virtual std::string | getTimerName (int id) const |
|
TimersList | getTimersList () const |
|
|
IOMap | iomap |
|
ThresholdList | thrlist |
|
std::shared_ptr< ModbusServerSlot > | mbslot |
|
std::unordered_set< ModbusRTU::ModbusAddr > | vaddr |
|
std::string | default_mbaddr = { "" } |
|
xmlNode * | cnode = { 0 } |
|
std::string | s_field = { "" } |
|
std::string | s_fvalue = { "" } |
|
int | default_mbfunc = {0} |
|
std::shared_ptr< SMInterface > | shm |
|
uniset::timeout_t | checkExchangeTime = { 10000 } |
|
timeout_t | initPause = { 3000 } |
|
uniset::uniset_rwmutex | mutex_start |
|
std::unique_ptr< ThreadCreator< MBSlave > > | thr |
|
std::mutex | mutexStartNotify |
|
std::condition_variable | startNotifyEvent |
|
PassiveTimer | ptHeartBeat |
|
uniset::ObjectId | sidHeartBeat = { uniset::DefaultObjectId } |
|
long | maxHeartBeat = { 10 } |
|
IOController::IOStateList::iterator | itHeartBeat |
|
uniset::ObjectId | test_id = { uniset::DefaultObjectId } |
|
IOController::IOStateList::iterator | itAskCount |
|
uniset::ObjectId | askcount_id = { uniset::DefaultObjectId } |
|
IOController::IOStateList::iterator | itRespond |
|
uniset::ObjectId | respond_id = { uniset::DefaultObjectId } |
|
bool | respond_invert = { false } |
|
PassiveTimer | ptTimeout |
|
long | connCount = { 0 } |
|
long | restartTCPServerCount = { 0 } |
|
std::atomic_bool | activated = { false } |
|
std::atomic_bool | cancelled = { false } |
|
timeout_t | activateTimeout = { 20000 } |
|
bool | smPingOK = { false } |
|
timeout_t | wait_msec = { 3000 } |
|
bool | force = { false } |
|
bool | mbregFromID = {0} |
|
bool | checkMBFunc = {0} |
|
bool | noMBFuncOptimize = {0} |
|
FileList | flist |
|
std::string | prefix = { "" } |
|
std::string | prop_prefix = { "" } |
|
ModbusRTU::ModbusData | buf [ModbusRTU::MAXLENPACKET/2+1] |
|
MEIDevIDMap | meidev |
|
std::shared_ptr< LogAgregator > | loga |
|
std::shared_ptr< DebugStream > | mblog |
|
std::shared_ptr< LogServer > | logserv |
|
std::string | logserv_host = {""} |
|
int | logserv_port = {0} |
|
VMonitor | vmon |
|
std::string | mbtype = { "" } |
|
timeout_t | sessTimeout = { 2000 } |
|
timeout_t | updateStatTime = { 4000 } |
|
ModbusTCPServer::Sessions | sess |
|
std::mutex | sessMutex |
|
size_t | sessMaxNum = { 5 } |
|
std::shared_ptr< ModbusTCPServerSlot > | tcpserver |
|
ClientsMap | cmap |
|
uniset::ObjectId | sesscount_id = { uniset::DefaultObjectId } |
|
IOController::IOStateList::iterator | sesscount_it |
|
std::atomic_bool | tcpCancelled = { true } |
|
bool | tcpBreakIfFailRun = { false } |
|
timeout_t | tcpRepeatCreateSocketPause = { 30000 } |
|
std::shared_ptr< UInterface > | ui |
|
std::string | myname |
|
std::weak_ptr< UniSetManager > | mymngr |
|
timeout_t | sleepTime |
|
\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
- \ref sec_MBSlave_TCP
- \ref sec_MBSlave_REST_API
\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_ - для примера):
- mbs_mbadrr - адрес к которому относиться данный регистр. Если не используется параметр default_mbaddr.
- mbs_mbreg - запрашиваемый/записываемый регистр. Если не используется параметр reg_from_id.
Помимо этого можно задавать следующие параметры:
- 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".
- 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>
\section sec_MBSlave_DIAG Диагностические функции (0x08)
\section sec_MBSlave_TCP Настройка TCPServer
\code
<MBTCPPersistentSlave ....sesscount="">
<clients>
<item ip="" respond="" invert="1" askcount=""/>
<item ip="" respond="" invert="1" askcount=""/>
<item ip="" respond="" invert="1" askcount=""/>
</clients>
</MBTCPPersistentSlave>
\endcode
По умолчанию если не удалось создать сокет процесс пытается повторять попытки каждые
tcpRepeatCreateSocketPause и не вылетает. Но если задан параметр tcpBreakIfFailRun="1",
то процессы завершает работу после первой неудачной попытки.
Изменить эти параметры можно либо в конфигурационном файле:
\code
<MBTCPPersistentSlave ... tcpBreakIfFailRun="1" tcpRepeatCreateSocket="xxx msec"/>
\endcode
Либо аргументами командной строки:
- --prefix--break-if-fail-run 1
- --prefix-repeat-create-socket msec.
\section sec_MBSlave_REST_API MBSlave HTTP API
/help - Получение списка доступных команд
/ - получение стандартной информации
/regs?regs=reg1,reg2,reg3,..&addr=addr1,addr2,addr3 - получение списка регистров
Не обязательные параметры:
regs - выдать информацию только по указанным регистрам
addr - выдать информацию только по указанным адресам устройств
Реализация slave-интерфейса