📄 modbustcp.h
字号:
#ifndef _MODBUS_TCP_H#define _MODBUS_TCP_H#include "msystem.h"#include "tinycxx/etc.h"#include "tinycxx/exception.h"#include "tinycxx/socket.h"#include "tinycxx/socksvr.h"struct fragMsg{ int fragLen; // length of request assembled so far unsigned char fragBuf[261]; // request so far assembled};class CModbusTCPSlave : public CNBTcpSvr{public: CModbusTCPSlave(CAllMgr* pAllMgr,const CInetAddress stInetAddr=CInetAddress("*"), tcport_t tPort=502) : CNBTcpSvr(stInetAddr, tPort) { m_pAllMgr = pAllMgr; m_hThread = 0; pthread_attr_init(&attr); pthread_attr_setdetachstate(&attr,PTHREAD_CREATE_DETACHED); m_dwLast = 0; m_dwPrev = 1; } ~CModbusTCPSlave() { Shutdown(); pthread_attr_destroy(&attr); /* if (m_hThread > 0) { cout << "ModbusTCPSlave:" << m_hThread << endl; pthread_cancel(m_hThread); }*/ } bool Init();public: bool IsRun() { bool bRet = true; CTimeVal tv; CTimeValSpan tvs = tv - m_tv; if ((tvs.GetASecs() > 10) && (m_dwLast == m_dwPrev)) bRet = false; if (m_dwLast != m_dwPrev) { m_dwLast = m_dwPrev; m_tv = tv; } return bRet; }protected: DWORD m_dwLast,m_dwPrev; CTimeVal m_tv; void RunSlave(); virtual bool OnRead(CTcpStream& stTcpStream); CAllMgr* m_pAllMgr; int processMsg(unsigned char b[],unsigned len); map<struReg,struLocal> m_mapReg; pthread_t m_hThread; pthread_attr_t attr; map<int,fragMsg> m_msgs; fragMsg* GetFragMsg(int nSocket) { fragMsg* pfragMsg = NULL;find: map<int,fragMsg>::iterator it = m_msgs.find(nSocket); if (it != m_msgs.end()) { pfragMsg = &(it->second); } else { fragMsg fm; fm.fragLen = 0; pair<int,fragMsg> p(nSocket,fm); m_msgs.insert(p); goto find; } return pfragMsg; } friend void* thrdModbusTCPSlave(void *pVoid);};#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -