#ifndef _ZJD_SUB_MODBUS_TCP_PROCESS_H_ #define _ZJD_SUB_MODBUS_TCP_PROCESS_H_ #include "netproc.h" #include "modbus_def.h" #include #pragma pack(1) typedef struct { struNetWorkOption net; BYTE defaultYCType; } struSubModbusTCPOption; #pragma pack() typedef std::vector vecInt; class CSubModbusTcpProcessItem : public CNetProcessItem { public: BYTE ied_addr; WORD m_nNum; short m_CoilRegCount; short m_DiscreteRegCount; short m_HoldingRegCount; short m_InputregCount; BYTE *m_pCoilRegTable; BYTE *m_pDiscreteRegTable; WORD *m_pHoldingRegTable; WORD *m_pInputRegTable; public: CSubModbusTcpProcessItem(); virtual ~CSubModbusTcpProcessItem(); void Attach(int uid, int sock, DWORD peer_addr, WORD peer_port); void Release(void); }; class CSubModbusTcpProcess : public CNetProcess { public: CSubModbusTcpProcess(); virtual ~CSubModbusTcpProcess(); CNetProcessItem *CreateItem(int ord); void DestroyItem(int ord, BOOLEAN bDeleted = FALSE); virtual BOOLEAN OnPreCreate(int id); virtual BOOLEAN Run(void); virtual BOOLEAN OnTimer(void); private: struSubModbusTCPOption m_option; BYTE m_YC_Type; enum { M_ME_NA, M_ME_NC }; vecInt m_CoilRegTable; vecInt m_DiscreteTable; vecInt m_HoldingRegTable; vecInt m_InputRegTable; private: int OnPackageReceived(BYTE* pBuf, int count, int ord /* = -1 */); BOOLEAN OnReceiveData(CSubModbusTcpProcessItem *pItem, BYTE* pData, int count, int uid); eMBErrorCode eMBTCPSend(BYTE ucSlaveAddress, const BYTE *pucFrame, WORD usLength); eMBException prveMBError2Exception(eMBErrorCode eErrorCode); eMBException eMBFuncReadInputRegister(CSubModbusTcpProcessItem *pItem, BYTE* pucFrame, WORD* usLen); eMBException eMBFuncReadHoldingRegister(CSubModbusTcpProcessItem *pItem, BYTE* pucFrame, WORD* usLen); eMBException eMBFuncWriteHoldingRegister(CSubModbusTcpProcessItem *pItem, BYTE* pucFrame, WORD* usLen); eMBException eMBFuncWriteMultipleHoldingRegister(CSubModbusTcpProcessItem *pItem, BYTE* pucFrame, WORD* usLen); eMBException eMBFuncReadCoils(CSubModbusTcpProcessItem *pItem, BYTE* pucFrame, WORD* usLen); eMBException eMBFuncWriteCoil(CSubModbusTcpProcessItem *pItem, BYTE* pucFrame, WORD* usLen); eMBException eMBFuncWriteMultipleCoils(CSubModbusTcpProcessItem *pItem, BYTE* pucFrame, WORD* usLen); eMBException eMBFuncReadDiscreteInputs(CSubModbusTcpProcessItem *pItem, BYTE* pucFrame, WORD* usLen); eMBErrorCode eMBRegInputCB(CSubModbusTcpProcessItem *pItem, BYTE* pucRegBuffer, WORD usAddress, WORD usNRegs); eMBErrorCode eMBRegHoldingCB(CSubModbusTcpProcessItem *pItem, BYTE* pucRegBuffer, WORD usAddress, WORD usNRegs, eMBRegisterMode eMode); eMBErrorCode eMBRegCoilsCB(CSubModbusTcpProcessItem *pItem, BYTE* pucRegBuffer, WORD usAddress, WORD usNCoils, eMBRegisterMode eMode); eMBErrorCode eMBRegDiscreteCB(CSubModbusTcpProcessItem *pItem, BYTE* pucRegBuffer, WORD usAddress, WORD usNDiscrete); }; #endif //_ZJD_SUB_MODBUS_TCP_PROCESS_H_