|
|
typedef sigc::slot< void, const ModbusTCPSession * > | FinalSlot |
| |
|
typedef sigc::slot< ModbusRTU::mbErrCode, ModbusRTU::ReadCoilMessage &, ModbusRTU::ReadCoilRetMessage & > | ReadCoilSlot |
| |
|
typedef sigc::slot< ModbusRTU::mbErrCode, ModbusRTU::ReadInputStatusMessage &, ModbusRTU::ReadInputStatusRetMessage & > | ReadInputStatusSlot |
| |
|
typedef sigc::slot< ModbusRTU::mbErrCode, ModbusRTU::ReadOutputMessage &, ModbusRTU::ReadOutputRetMessage & > | ReadOutputSlot |
| |
|
typedef sigc::slot< ModbusRTU::mbErrCode, ModbusRTU::ReadInputMessage &, ModbusRTU::ReadInputRetMessage & > | ReadInputSlot |
| |
|
typedef sigc::slot< ModbusRTU::mbErrCode, ModbusRTU::ForceSingleCoilMessage &, ModbusRTU::ForceSingleCoilRetMessage & > | ForceSingleCoilSlot |
| |
|
typedef sigc::slot< ModbusRTU::mbErrCode, ModbusRTU::WriteSingleOutputMessage &, ModbusRTU::WriteSingleOutputRetMessage & > | WriteSingleOutputSlot |
| |
|
typedef sigc::slot< ModbusRTU::mbErrCode, ModbusRTU::ForceCoilsMessage &, ModbusRTU::ForceCoilsRetMessage & > | ForceCoilsSlot |
| |
|
typedef sigc::slot< ModbusRTU::mbErrCode, ModbusRTU::WriteOutputMessage &, ModbusRTU::WriteOutputRetMessage & > | WriteOutputSlot |
| |
|
typedef sigc::slot< ModbusRTU::mbErrCode, ModbusRTU::DiagnosticMessage &, ModbusRTU::DiagnosticRetMessage & > | DiagnosticsSlot |
| |
|
typedef sigc::slot< ModbusRTU::mbErrCode, ModbusRTU::MEIMessageRDI &, ModbusRTU::MEIMessageRetRDI & > | MEIRDISlot |
| |
|
typedef sigc::slot< ModbusRTU::mbErrCode, ModbusRTU::JournalCommandMessage &, ModbusRTU::JournalCommandRetMessage & > | JournalCommandSlot |
| |
|
typedef sigc::slot< ModbusRTU::mbErrCode, ModbusRTU::SetDateTimeMessage &, ModbusRTU::SetDateTimeRetMessage & > | SetDateTimeSlot |
| |
|
typedef sigc::slot< ModbusRTU::mbErrCode, ModbusRTU::RemoteServiceMessage &, ModbusRTU::RemoteServiceRetMessage & > | RemoteServiceSlot |
| |
|
typedef sigc::slot< ModbusRTU::mbErrCode, ModbusRTU::FileTransferMessage &, ModbusRTU::FileTransferRetMessage & > | FileTransferSlot |
| |
|
typedef sigc::signal< ModbusRTU::mbErrCode, const std::unordered_set< ModbusRTU::ModbusAddr >, timeout_t > | PreReceiveSignal |
| |
|
typedef sigc::signal< void, ModbusRTU::mbErrCode > | PostReceiveSignal |
| |
|
typedef std::unordered_map< ModbusRTU::mbErrCode, size_t > | ExchangeErrorMap |
| |
|
|
| ModbusTCPSession (const Poco::Net::StreamSocket &s, const std::unordered_set< ModbusRTU::ModbusAddr > &vmbaddr, timeout_t timeout) |
| |
|
void | cleanInputStream () |
| |
| virtual void | cleanupChannel () override |
| |
| virtual void | terminate () override |
| |
|
void | connectFinalSession (FinalSlot sl) |
| |
|
std::string | getClientAddress () const |
| |
|
void | setSessionTimeout (double t) |
| |
|
void | run (ev::loop_ref &loop) |
| |
| virtual bool | isActive () const override |
| |
| void | connectReadCoil (ReadCoilSlot sl) |
| |
| void | connectReadInputStatus (ReadInputStatusSlot sl) |
| |
| void | connectReadOutput (ReadOutputSlot sl) |
| |
| void | connectReadInput (ReadInputSlot sl) |
| |
| void | connectForceSingleCoil (ForceSingleCoilSlot sl) |
| |
| void | connectWriteSingleOutput (WriteSingleOutputSlot sl) |
| |
| void | connectDiagnostics (DiagnosticsSlot sl) |
| |
| void | connectMEIRDI (MEIRDISlot sl) |
| |
| void | connectForceCoils (ForceCoilsSlot sl) |
| |
| void | connectWriteOutput (WriteOutputSlot sl) |
| |
| void | connectJournalCommand (JournalCommandSlot sl) |
| |
| void | connectSetDateTime (SetDateTimeSlot sl) |
| |
| void | connectRemoteService (RemoteServiceSlot sl) |
| |
| void | connectFileTransfer (FileTransferSlot sl) |
| |
|
void | initLog (uniset::Configuration *conf, const std::string &name, const std::string &logfile="") |
| |
|
void | setLog (std::shared_ptr< DebugStream > dlog) |
| |
|
std::shared_ptr< DebugStream > | log () |
| |
| ModbusRTU::mbErrCode | receive (const std::unordered_set< ModbusRTU::ModbusAddr > &vaddr, timeout_t msecTimeout) |
| |
|
virtual ModbusRTU::mbErrCode | receive_one (const ModbusRTU::ModbusAddr addr, timeout_t msec) |
| |
|
PreReceiveSignal | signal_pre_receive () |
| |
|
PostReceiveSignal | signal_post_receive () |
| |
| timeout_t | setAfterSendPause (timeout_t msec) |
| |
| timeout_t | setReplyTimeout (timeout_t msec) |
| |
| void | setRecvTimeout (timeout_t msec) |
| |
| void | setSleepPause (timeout_t msec) |
| |
|
void | setCRCNoCheckit (bool set) |
| |
|
bool | isCRCNoCheckit () const |
| |
|
void | setBroadcastMode (bool set) |
| |
|
bool | getBroadcastMode () const |
| |
|
void | setCleanBeforeSend (bool set) |
| |
|
bool | getCleanBeforeSend () const |
| |
|
ExchangeErrorMap | getErrorMap () |
| |
|
size_t | getErrCount (ModbusRTU::mbErrCode e) const |
| |
|
size_t | resetErrCount (ModbusRTU::mbErrCode e, size_t set=0) |
| |
|
size_t | getAskCount () const noexcept |
| |
|
void | resetAskCounter () |
| |
|
| virtual void | iowait (timeout_t msec) override |
| |
| virtual ModbusRTU::mbErrCode | realReceive (const std::unordered_set< ModbusRTU::ModbusAddr > &vmbaddr, timeout_t msecTimeout) override |
| |
|
void | callback (ev::io &watcher, int revents) |
| |
|
void | onTimeout (ev::timer &watcher, int revents) |
| |
|
virtual void | readEvent (ev::io &watcher) |
| |
|
virtual void | writeEvent (ev::io &watcher) |
| |
|
virtual void | final () |
| |
| virtual size_t | getNextData (unsigned char *buf, int len) override |
| |
| virtual void | setChannelTimeout (timeout_t msec) override |
| |
| virtual ModbusRTU::mbErrCode | sendData (unsigned char *buf, int len) override |
| |
|
virtual ModbusRTU::mbErrCode | tcp_processing (ModbusRTU::MBAPHeader &mhead) |
| |
| virtual ModbusRTU::mbErrCode | make_adu_header (ModbusRTU::ModbusMessage &request) override |
| |
| virtual ModbusRTU::mbErrCode | post_send_request (ModbusRTU::ModbusMessage &request) override |
| |
| virtual ModbusRTU::mbErrCode | readCoilStatus (ModbusRTU::ReadCoilMessage &query, ModbusRTU::ReadCoilRetMessage &reply) override |
| |
| virtual ModbusRTU::mbErrCode | readInputStatus (ModbusRTU::ReadInputStatusMessage &query, ModbusRTU::ReadInputStatusRetMessage &reply) override |
| |
| virtual ModbusRTU::mbErrCode | readOutputRegisters (ModbusRTU::ReadOutputMessage &query, ModbusRTU::ReadOutputRetMessage &reply) override |
| |
| virtual ModbusRTU::mbErrCode | readInputRegisters (ModbusRTU::ReadInputMessage &query, ModbusRTU::ReadInputRetMessage &reply) override |
| |
| virtual ModbusRTU::mbErrCode | forceSingleCoil (ModbusRTU::ForceSingleCoilMessage &query, ModbusRTU::ForceSingleCoilRetMessage &reply) override |
| |
| virtual ModbusRTU::mbErrCode | writeOutputSingleRegister (ModbusRTU::WriteSingleOutputMessage &query, ModbusRTU::WriteSingleOutputRetMessage &reply) override |
| |
| virtual ModbusRTU::mbErrCode | forceMultipleCoils (ModbusRTU::ForceCoilsMessage &query, ModbusRTU::ForceCoilsRetMessage &reply) override |
| |
| virtual ModbusRTU::mbErrCode | writeOutputRegisters (ModbusRTU::WriteOutputMessage &query, ModbusRTU::WriteOutputRetMessage &reply) override |
| |
| virtual ModbusRTU::mbErrCode | diagnostics (ModbusRTU::DiagnosticMessage &query, ModbusRTU::DiagnosticRetMessage &reply) override |
| |
| virtual ModbusRTU::mbErrCode | read4314 (ModbusRTU::MEIMessageRDI &query, ModbusRTU::MEIMessageRetRDI &reply) override |
| |
| virtual ModbusRTU::mbErrCode | journalCommand (ModbusRTU::JournalCommandMessage &query, ModbusRTU::JournalCommandRetMessage &reply) override |
| |
| virtual ModbusRTU::mbErrCode | setDateTime (ModbusRTU::SetDateTimeMessage &query, ModbusRTU::SetDateTimeRetMessage &reply) override |
| |
| virtual ModbusRTU::mbErrCode | remoteService (ModbusRTU::RemoteServiceMessage &query, ModbusRTU::RemoteServiceRetMessage &reply) override |
| |
| virtual ModbusRTU::mbErrCode | fileTransfer (ModbusRTU::FileTransferMessage &query, ModbusRTU::FileTransferRetMessage &reply) override |
| |
| virtual ModbusRTU::mbErrCode | send (ModbusRTU::ModbusMessage &buf) |
| |
|
virtual ModbusRTU::mbErrCode | processing (ModbusRTU::ModbusMessage &buf) |
| |
| ModbusRTU::mbErrCode | recv (const std::unordered_set< ModbusRTU::ModbusAddr > &vaddr, ModbusRTU::ModbusMessage &buf, timeout_t timeout) |
| |
|
ModbusRTU::mbErrCode | recv_pdu (ModbusRTU::ModbusMessage &rbuf, timeout_t timeout) |
| |
|
void | printProcessingTime () |
| |
|
|
static std::unordered_set< ModbusRTU::ModbusAddr > | addr2vaddr (ModbusRTU::ModbusAddr &mbaddr) |
| |
| static bool | checkAddr (const std::unordered_set< ModbusRTU::ModbusAddr > &vaddr, const ModbusRTU::ModbusAddr addr) |
| |
|
static std::string | vaddr2str (const std::unordered_set< ModbusRTU::ModbusAddr > &vaddr) |
| |
| static ModbusRTU::mbErrCode | replySetDateTime (ModbusRTU::SetDateTimeMessage &query, ModbusRTU::SetDateTimeRetMessage &reply, std::shared_ptr< DebugStream > dlog=nullptr) |
| |
| static ModbusRTU::mbErrCode | replyFileTransfer (const std::string &fname, ModbusRTU::FileTransferMessage &query, ModbusRTU::FileTransferRetMessage &reply, std::shared_ptr< DebugStream > dlog=nullptr) |
| |
|
ReadCoilSlot | slReadCoil |
| |
|
ReadInputStatusSlot | slReadInputStatus |
| |
|
ReadOutputSlot | slReadOutputs |
| |
|
ReadInputSlot | slReadInputs |
| |
|
ForceCoilsSlot | slForceCoils |
| |
|
WriteOutputSlot | slWriteOutputs |
| |
|
ForceSingleCoilSlot | slForceSingleCoil |
| |
|
WriteSingleOutputSlot | slWriteSingleOutputs |
| |
|
DiagnosticsSlot | slDiagnostics |
| |
|
MEIRDISlot | slMEIRDI |
| |
|
JournalCommandSlot | slJournalCommand |
| |
|
SetDateTimeSlot | slSetDateTime |
| |
|
RemoteServiceSlot | slRemoteService |
| |
|
FileTransferSlot | slFileTransfer |
| |
|
std::timed_mutex | recvMutex |
| |
| timeout_t | recvTimeOut_ms = { 50 } |
| |
| timeout_t | replyTimeout_ms = { 2000 } |
| |
| timeout_t | aftersend_msec = { 0 } |
| |
| timeout_t | sleepPause_msec = { 10 } |
| |
| bool | onBroadcast = { false } |
| |
|
bool | crcNoCheckit = { false } |
| |
|
bool | cleanBeforeSend = { false } |
| |
|
PassiveTimer | tmProcessing |
| |
|
std::shared_ptr< DebugStream > | dlog |
| |
|
size_t | askCount = { 0 } |
| |
| ExchangeErrorMap | errmap |
| |
|
PreReceiveSignal | m_pre_signal |
| |
|
PostReceiveSignal | m_post_signal |
| |
The ModbusTCPSession class Класс рассчитан на совместную работу с ModbusTCPServer, т.к. построен на основе libev, и главный цикл (default_loop) находиться там.
Текущая реализация не доведена до совершенства использования "событий". И рассчитывает, что данные от клиента приходят все сразу, а так как сокеты не блокирующие, то попыток чтения делается несколько с небольшой паузой, что нехорошо, т.к. отнимает время у других "клиентов", ведь сервер по сути однопоточный (!) Альтернативной реализацией могло быть быть.. чтение по событиям и складывание в отдельную очередь, а обработку делать по мере достаточного накопления данных во входной очереди, но это требует асинхронный парсинг данных протокола modbus (т.е. мы анализируем очередной байт и решаем сколько нам нужно ещё "подождать" данных.. чтобы пойти на следующий шаг), это в результате будет слишком сложная реализация. В конце-концов пока нет расчёта на >1000 подключений (хотя libev позволяет держать >10k).