#pragma once #include "Component.h" #include #include #include #include "MMSystem.h" #pragma comment(lib,"winmm") typedef std::function ONPLCSTATECHANGED; typedef std::function ONPLCMONITORDATA; typedef struct _PLCListener { ONPLCSTATECHANGED onStateChanged; ONPLCMONITORDATA onMonitorData; } PLCListener; typedef struct _MONITOR { int id; int beginAddr; int readLen; MC::SOFT_COMPONENT softComponent; char* szRecvBuffer; HANDLE hEvent; ULONGLONG readCount; } MONITOR; enum class PLCSTATE { READY = 0, CONNECTING, CONNECTED, DISCONNECTED }; class CPLC : public CComponent { public: CPLC(); CPLC(const char* pszName, const char* pszIP, unsigned int nPort); virtual ~CPLC(); public: virtual std::string& getClassName(); void setListener(PLCListener& listener); static CString& dataToHexString(const char* pData, const int size, CString& strOut); void setActionInterval(unsigned int nInterval); void init(); void term(); bool isConnected(); unsigned onMonitor(); void OnTimer(UINT nTimerid); std::string& getIP(); unsigned int getPort(); int addMonitor(int id, int beginAddr, int endAddr, MC::SOFT_COMPONENT softComponent, char* pszRecvBuffer); int readWord(MC::SOFT_COMPONENT softComponent, unsigned int addr, ONREAD funOnRead); int readData(MC::SOFT_COMPONENT softComponent, unsigned int addr, unsigned int nReadLen, ONREADDATA funOnReadData); int writeWord(MC::SOFT_COMPONENT softComponent, unsigned int addr, int value, ONWRITE funOnWrite); int writeBit(MC::SOFT_COMPONENT softComponent, unsigned int addr, BOOL bValue, ONWRITE funOnWrite); int writeData(MC::SOFT_COMPONENT softComponent, unsigned int addr, const char* pszData, unsigned int length, ONWRITE funOnWrite); private: void setState(PLCSTATE state); void monitorReadData(MONITOR& monitor); private: std::string m_strName; std::string m_strIP; unsigned int m_nPort; IMcChannel* m_pChannel; PLCSTATE m_state; unsigned int m_nActionInterval; PLCListener m_listener; unsigned int m_nUnHeartBeat; private: std::vector m_monitors; HANDLE m_hMcMonitorStop; HANDLE m_hMcMonitorThreadHandle; unsigned m_mcMonitorThrdaddr; MMRESULT m_nTimerId; public: HANDLE m_hTimeEvent; };