UniSet
2.8.0
|
Открытые члены | |
MBTCPMaster (uniset::ObjectId objId, uniset::ObjectId shmID, const std::shared_ptr< SharedMemory > &ic=nullptr, const std::string &prefix="mbtcp") | |
virtual uniset::SimpleInfo * | getInfo (const char *userparam=0) override |
![]() | |
MBExchange (uniset::ObjectId objId, uniset::ObjectId shmID, const std::shared_ptr< SharedMemory > &ic=nullptr, const std::string &prefix="mb") | |
void | printMap (RTUDeviceMap &d) |
void | execute () |
std::shared_ptr< LogAgregator > | getLogAggregator () |
std::shared_ptr< DebugStream > | log () |
![]() | |
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 |
virtual Poco::JSON::Object::Ptr | httpHelp (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 |
![]() | |
virtual Poco::JSON::Object::Ptr | httpRequest (const std::string &req, const Poco::URI::QueryParameters &p) |
Открытые статические члены | |
static std::shared_ptr< MBTCPMaster > | init_mbmaster (int argc, const char *const *argv, uniset::ObjectId shmID, const std::shared_ptr< SharedMemory > &ic=nullptr, const std::string &prefix="mbtcp") |
static void | help_print (int argc, const char *const *argv) |
![]() | |
static void | help_print (int argc, const char *const *argv) |
static DeviceType | getDeviceType (const std::string &dtype) noexcept |
static std::ostream & | print_plist (std::ostream &os, const PList &p) |
Защищенные члены | |
virtual void | sysCommand (const uniset::SystemMessage *sm) override |
virtual std::shared_ptr< ModbusClient > | initMB (bool reopen=false) override |
virtual bool | deactivateObject () override |
Деактивация объекта (переопределяется для необходимых действий при завершении работы) Подробнее... | |
void | poll_thread () |
void | final_thread () |
![]() | |
virtual void | step () |
virtual void | sensorInfo (const uniset::SensorMessage *sm) override |
virtual void | timerInfo (const uniset::TimerMessage *tm) override |
virtual void | askSensors (UniversalIO::UIOCommand cmd) |
virtual void | initOutput () |
virtual bool | activateObject () override |
Активизация объекта (переопределяется для необходимых действий после активизации) Подробнее... | |
virtual void | initIterators () |
virtual void | initValues () |
void | firstInitRegisters () |
bool | preInitRead (InitList::iterator &p) |
bool | initSMValue (ModbusRTU::ModbusData *data, int count, RSProperty *p) |
virtual bool | poll () |
bool | pollRTU (std::shared_ptr< RTUDevice > &dev, RegMap::iterator &it) |
void | updateSM () |
void | updateRTU (RegMap::iterator &it) |
void | updateMTR (RegMap::iterator &it) |
void | updateRTU188 (RegMap::iterator &it) |
void | updateRSProperty (RSProperty *p, bool write_only=false) |
virtual void | updateRespondSensors () |
bool | isUpdateSM (bool wrFunc, long devMode) const noexcept |
bool | isPollEnabled (bool wrFunc) const noexcept |
bool | isSafeMode (std::shared_ptr< RTUDevice > &dev) const noexcept |
bool | isProcActive () const |
void | setProcActive (bool st) |
bool | waitSMReady () |
void | readConfiguration () |
bool | readItem (const std::shared_ptr< UniXML > &xml, UniXML::iterator &it, xmlNode *sec) |
bool | initItem (UniXML::iterator &it) |
void | initDeviceList () |
void | initOffsetList () |
std::shared_ptr< RTUDevice > | addDev (RTUDeviceMap &dmap, ModbusRTU::ModbusAddr a, UniXML::iterator &it) |
std::shared_ptr< RegInfo > | addReg (std::shared_ptr< RegMap > &devices, ModbusRTU::RegID id, ModbusRTU::ModbusData r, UniXML::iterator &it, std::shared_ptr< RTUDevice > dev) |
RSProperty * | addProp (PList &plist, RSProperty &&p) |
bool | initMTRitem (UniXML::iterator &it, std::shared_ptr< RegInfo > &p) |
bool | initRTU188item (UniXML::iterator &it, std::shared_ptr< RegInfo > &p) |
bool | initRSProperty (RSProperty &p, UniXML::iterator &it) |
bool | initRegInfo (std::shared_ptr< RegInfo > &r, UniXML::iterator &it, std::shared_ptr< RTUDevice > &dev) |
bool | initRTUDevice (std::shared_ptr< RTUDevice > &d, UniXML::iterator &it) |
virtual bool | initDeviceInfo (RTUDeviceMap &m, ModbusRTU::ModbusAddr a, UniXML::iterator &it) |
std::string | initPropPrefix (const std::string &def_prop_prefix="") |
void | rtuQueryOptimization (RTUDeviceMap &m) |
void | rtuQueryOptimizationForDevice (const std::shared_ptr< RTUDevice > &d) |
void | rtuQueryOptimizationForRegMap (const std::shared_ptr< RegMap > ®map) |
![]() | |
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 |
Защищенные данные | |
std::string | iaddr |
int | port |
bool | force_disconnect |
![]() | |
bool | allInitOK |
RTUDeviceMap | devices |
InitList | initRegList |
xmlNode * | cnode = { 0 } |
std::string | s_field |
std::string | s_fvalue |
std::shared_ptr< SMInterface > | shm |
timeout_t | initPause = { 3000 } |
uniset::uniset_rwmutex | mutex_start |
bool | force = { false } |
bool | force_out = { false } |
bool | mbregFromID = { false } |
timeout_t | polltime = { 100 } |
timeout_t | sleepPause_msec = { 10 } |
size_t | maxQueryCount = { ModbusRTU::MAXDATALEN } |
PassiveTimer | ptHeartBeat |
uniset::ObjectId | sidHeartBeat = { uniset::DefaultObjectId } |
long | maxHeartBeat = { 10 } |
IOController::IOStateList::iterator | itHeartBeat |
uniset::ObjectId | test_id = { uniset::DefaultObjectId } |
uniset::ObjectId | sidExchangeMode = { uniset::DefaultObjectId } |
IOController::IOStateList::iterator | itExchangeMode |
long | exchangeMode = { emNone } |
std::atomic_bool | activated = { false } |
std::atomic_bool | canceled = { false } |
timeout_t | activateTimeout = { 20000 } |
bool | noQueryOptimization = { false } |
bool | notUseExchangeTimer = { false } |
std::string | prefix |
timeout_t | stat_time = { 0 } |
size_t | poll_count = { 0 } |
PassiveTimer | ptStatistic |
std::string | statInfo = { "" } |
std::string | prop_prefix |
std::shared_ptr< ModbusClient > | mb |
timeout_t | recv_timeout = { 500 } |
timeout_t | default_timeout = { 5000 } |
timeout_t | aftersend_pause = { 0 } |
PassiveTimer | ptReopen |
Trigger | trReopen |
PassiveTimer | ptInitChannel |
ThresholdList | thrlist |
std::string | defaultMBtype |
std::string | defaultMBaddr |
bool | defaultMBinitOK = { false } |
std::shared_ptr< LogAgregator > | loga |
std::shared_ptr< DebugStream > | mblog |
std::shared_ptr< LogServer > | logserv |
std::string | logserv_host = {""} |
int | logserv_port = {0} |
const std::shared_ptr< SharedMemory > | ic |
VMonitor | vmon |
size_t | ncycle = { 0 } |
![]() | |
std::shared_ptr< UInterface > | ui |
std::string | myname |
std::weak_ptr< UniSetManager > | mymngr |
![]() | |
timeout_t | sleepTime |
Дополнительные унаследованные члены | |
![]() | |
enum | ExchangeMode { emNone = 0, emWriteOnly = 1, emReadOnly = 2, emSkipSaveToSM = 3, emSkipExchange = 4 } |
enum | SafeMode { safeNone = 0, safeResetIfNotRespond = 1, safeExternalControl = 2 } |
enum | DeviceType { dtUnknown, dtRTU, dtMTR, dtRTU188 } |
enum | Timer { tmExchange } |
typedef std::list< RSProperty > | PList |
typedef std::map< ModbusRTU::RegID, std::shared_ptr< RegInfo > > | RegMap |
typedef std::unordered_map< ModbusRTU::ModbusAddr, std::shared_ptr< RTUDevice > > | RTUDeviceMap |
![]() | |
typedef std::list< InitRegInfo > | InitList |
typedef std::list< IOBase > | ThresholdList |
![]() | |
typedef std::deque< TimerInfo > | TimersList |
\page page_ModbusTCP Реализация ModbusTCP master - \ref sec_MBTCP_Comm - \ref sec_MBTCP_Conf - \ref sec_MBTCP_ConfList - \ref sec_MBTCP_ExchangeMode \section sec_MBTCP_Comm Общее описание ModbusTCP master Класс реализует процесс обмена (опрос/запись) с RTU-устройствами, через TCP-шлюз. Список регистров с которыми работает процесс задаётся в конфигурационном файле в секции \b <sensors>. см. \ref sec_MBTCP_Conf \section sec_MBTCP_Conf Конфигурирование ModbusTCP master Конфигурирование процесса осуществляется либо параметрами командной строки либо через настроечную секцию. \par Секция с настройками При своём старте, в конфигурационном файле ищётся секция с названием объекта, в которой указываются настроечные параметры по умолчанию. Пример: \code <MBMaster1 name="MBMaster1" gateway_iaddr="127.0.0.1" gateway_port="30000" polltime="200" exchangeModeID="..."> <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> \endcode Где - \b exchangeModeID - датчик(name) определяющий режим работы (см. MBExchange::ExchangeMode). Секция <DeviceList> позволяет задать параметры обмена с конкретным RTU-устройством. - \b addr - адрес устройства для которого, задаются параметры - \b timeout msec - таймаут, для определения отсутствия связи - \b invert - инвертировать логику. По умолчанию датчик выставляется в "1" при \b наличии связи. - \b respondSensor - название(name) датчика связи. - \b respondInitTimeout - msec, время на инициализацию связи после запуска процесса. Т.е. только после этого времени будет выставлен(обновлён) датчик наличия связи. По умолчанию время равно timeout. - \b ask_every_reg - 1 - опрашивать ВСЕ регистры подряд, не обращая внимания на timeout. По умолчанию - "0" Т.е. опрос устройства (на текущем шаге цикла опроса), прерывается на первом же регистре, при опросе которого возникнет timeout. - \b safemodeXXX - см. \ref sec_MBTCP_SafeMode \par Параметры запуска При создании объекта в конструкторе передаётся префикс для определения параметров командной строки. По умолчанию \b xxx="mbtcp". Далее приведены основные параметры: \b --xxx-name ID - идентификатор(name) процесса. IP-адрес шлюза задаётся параметром в конфигурационном файле \b gateway_iaddr или параметром командной строки \b --xxx-gateway-iaddr. Порт задаётся в конфигурационном файле параметром \b gateway_port или параметром командной строки \b --xxx-gateway-port. По умолчанию используется порт \b 502. \b --xxx-recv-timeout или \b recv_timeout msec - таймаут на приём одного сообщения. По умолчанию 100 мсек. \b --xxx-timeout или \b timeout msec - таймаут на определение отсутствия связи (после этого идёт попытка реинициализировать соединение) По умолчанию 5000 мсек. \b --xxx-reinit-timeout или \b reinit_timeout msec - таймаут на реинициализацию канала связи (после потери связи) По умолчанию timeout. \b --xxx-no-query-optimization или \b no_query_optimization - [1|0] отключить оптимизацию запросов Оптимизация заключается в том, что регистры идущие подряд автоматически запрашиваются/записываются одним запросом. В связи с чем, функция указанная в качестве \b mbfunc игнорируется и подменяется на работающую с многими регистрами. \b --xxx-poll-time или \b poll_time msec - пауза между опросами. По умолчанию 100 мсек. \b --xxx-initPause или \b initPause msec - пауза перед началом работы, после активации. По умолчанию 50 мсек. \b --xxx-force или \b force [1|0] - 1 - перечитывать значения входов из SharedMemory на каждом цикле - 0 - обновлять значения только по изменению \b --xxx-persistent-connection или \b persistent_connection - НЕ закрывать соединение после каждого запроса. \b --xxx-force-out или \b force_out [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 к работе. \section sec_MBTCP_ConfList Конфигурирование списка регистров для ModbusTCP master Конфигурационные параметры задаются в секции <sensors> конфигурационного файла. Список обрабатываемых регистров задаётся при помощи двух параметров командной строки \b --xxx-filter-field - задаёт фильтрующее поле для датчиков \b --xxx-filter-value - задаёт значение фильтрующего поля. Необязательный параметр. \b --xxx-statistic-sec sec - при наличии выведет кол-во посланных запросов за этот промежуток времени. \b --xxx-set-prop-prefix [str] - Использовать 'str' в качестве префикса для свойств. Если не указать 'str' будет использован пустой префикс. Если параметры не заданы, будет произведена попытка загрузить все датчики, у которых присутствуют необходимые настроечные параметры. \warning Если в результате список будет пустым, процесс завершает работу. Пример конфигурационных параметров:
К основным параметрам относятся следующие (префикс tcp_ - для примера):
Помимо этого можно задавать следующие параметры:
Для инициализации "выходов" (регистров которые пишутся) можно использовать поля:
Если указано tcp_preinit="1", то прежде чем начать писать регистр в устройство, будет произведено его чтение.
По умолчанию все "записываемые" регистры инициализируются значением из SM. Т.е. пока не будет первый раз считано значение из SM, регистры в устройство писатся не будут. Чтобы отключить это поведение, можно указать параметр
При этом будет записывыться значение "default".
\section sec_MBTCP_ExchangeMode Управление режимом работы MBTCPMaster В MBTCPMaster заложена возможность управлять режимом работы процесса. Поддерживаются следующие режимы: - \b emNone - нормальная работа (по умолчанию) - \b emWriteOnly - "только посылка данных" (работают только write-функции) - \b emReadOnly - "только чтение" (работают только read-функции) - \b emSkipSaveToSM - "не записывать данные в SM", это особый режим, похожий на \b emWriteOnly, но отличие в том, что при этом режиме ведётся полноценый обмен (и read и write), только реально данные не записываются в SharedMemory(SM). - \b emSkipExchnage - отключить обмен (при этом данные "из SM" обновляются). Режимы переключаются при помощи датчика, который можно задать либо аргументом командной строки \b --prefix-exchange-mode-id либо в конф. файле параметром \b exchangeModeID="". Константы определяющие режимы объявлены в MBTCPMaster::ExchangeMode. \section sec_MBTCP_SafeMode Управление режимом "безопасного состояния" В MBTCPMaster заложена возможность управлять режимом выставления безопасного состояния входов и выходов. Возможны следующие режимы: - \b safeNone - режим отключён (по умолчанию) - \b safeExternalControl - управление при помощи внешнего датчика - \b safeResetIfNotRespond - выставление безопасных значение, если пропала связь с устройством. Суть этого режима, в том, что все входы и выходы у которых в настройках указан параметр safeval="" выставляются в это значение, при срабатывании внешнего датчика (режим "safeExternalControl") или при отсутсвии связи с устройством (режим "safeResetIfNotRespond"). Режим задаётся в секции <DeviceList> для каждого устройства отдельно. \code <DeviceList> <item addr="01" .. safemodeSensor="Slave1_SafemodeSensor_S" safemodeValue="42"/> <item addr="02" .. safemodeResetIfNotRespond="1"/> </DeviceList> \endcode Если указан параметр \a safemodeSensor="..", то используется режим \b safeExternalControl. При этом можно указать конкретное значение датчика \a safemodeSensorValue="..", при котором будет сделан сброс значений в безопасное состояние. Если указан параметр safemodeResetIfNotRespond="1", то будет использован режим \b safeResetIfNotRespond. Если указан и параметр \a safemodeSensor=".." и \a safemodeResetIfNotRespond="1", то будет использован режим \b safeExternalControl (как более приоритетный).
|
overrideprotectedvirtual |
Деактивация объекта (переопределяется для необходимых действий при завершении работы)
Переопределяет метод предка uniset::MBExchange.
|
static |
глобальная функция для инициализации объекта