#ifndef _ZJD_HOST_MODBUS_RTU_PROCESS_H_ #define _ZJD_HOST_MODBUS_RTU_PROCESS_H_ #include "portproc.h" #include "modbus_def.h" class CHostModbusRtuProcessItem : public CPortProcessItem { public: DWORD m_nFramePoll; int m_nPollCount; private: int m_nCurFrame; struModbusExtFrame m_nModbusFrames[MODBUS_RTU_AUTOMATIC_FRAME_MAX]; public: CHostModbusRtuProcessItem(); virtual ~CHostModbusRtuProcessItem(); void Attach(int uid, int physicsAddress = 0, int commonAddress = 0, int originatorAddress = 0); void Release(void); struModbusExtFrame* GetNextFrame(void); void AddFrames(struModbusExtFrame*, struModbusExtFrame*, struModbusExtFrame*); BOOLEAN insertFrames(struModbusExtFrame* frames, int msgSize) { int i = 0; int pos = 0; for (pos = 0; pos < MODBUS_RTU_AUTOMATIC_FRAME_MAX; pos++) { if (m_nModbusFrames[pos].FrameType == 0x00) break; } for (i = 0; i < msgSize; i++) { if (pos >= MODBUS_RTU_AUTOMATIC_FRAME_MAX) return FALSE; if (frames[i].FrameType == 0 || frames[i].FuncCode == 0 || frames[i].RegCount == 0) continue; memcpy(&m_nModbusFrames[pos], &frames[i], sizeof(struModbusExtFrame)); pos++; } return TRUE; } }; class CHostModbusRtuProcess : public CPortProcess { public: int m_nNeedCount; int m_nState; BYTE m_nFrameType; DWORD m_nCount; //loops passed DWORD m_nFrameCount; WORD m_nCurBeginReg; WORD m_nCurRegCount; BYTE m_nCurFuncCode; BOOLEAN m_nNeedSend; DWORD m_nCurFrame; DWORD m_nSendPoint; //send out loop short m_nTimeout; int m_nYKOrder; BYTE m_bYKValue; BYTE m_nYKState; int m_nYTOrder; DWORD m_dwYTValue; BYTE m_nYTState; DWORD m_nFramePoll; public: CHostModbusRtuProcess(); virtual ~CHostModbusRtuProcess(); CPortProcessItem *CreateItem(int ord); void DestroyItem(int ord, BOOLEAN bDeleted = FALSE); void calc1(void); void sort1(STRUCT_PARAM*, int); //功能码排序 void sort2(STRUCT_PARAM*, int); //寄存地址排序 virtual BOOLEAN OnPreCreate(int id); virtual BOOLEAN Run(void); virtual BOOLEAN OnTimer(void); virtual BOOLEAN GetReadDataFrame(CHostModbusRtuProcessItem *pItem, BYTE* pData, int& count); virtual BOOLEAN GetYKFrame(CHostModbusRtuProcessItem *pItem, BYTE* pBuf, int& count, DWORD& frame); virtual BOOLEAN GetYTFrame(CHostModbusRtuProcessItem *pItem, BYTE* pBuf, int& count, DWORD& frame); virtual BOOLEAN GetSetTimeFrame(CHostModbusRtuProcessItem *pItem, BYTE* pData, int& count); BOOLEAN OnReceiveData(BYTE* pData, int count); virtual BOOLEAN OnReceiveYXData(CHostModbusRtuProcessItem *pItem, BYTE* pData, int count); virtual BOOLEAN OnReceiveYCData(CHostModbusRtuProcessItem *pItem, BYTE* pData, int count); virtual BOOLEAN OnReceiveYMData(CHostModbusRtuProcessItem *pItem, BYTE* pData, int count); }; #endif //_ZJD_HOST_MODBUS_RTU_PROCESS_H_