LAPTOP-SNT8I5JK\Boounion
2025-01-08 3970068b82a21617443fd99a152723e54289ecf2
SourceCode/Bond/BoounionPLC/PLC.h
@@ -1,5 +1,38 @@
#pragma once
#include <string>
#include "AlarmMonitor.h"
#include "MMSystem.h"
#pragma comment(lib,"winmm")
typedef std::function<void(void* pFrom, int)> ONPLCSTATECHANGED;
typedef std::function<void(void* pFrom, int)> ONPLCMONITORDATA;
typedef std::function<void(void* pFrom, CAlarm*, int)> ONALARM;
typedef struct _PLCListener
{
   ONPLCSTATECHANGED      onStateChanged;
   ONPLCMONITORDATA      onMonitorData;
   ONALARM               onAlarm;
} 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
{
@@ -9,13 +42,57 @@
   ~CPLC();
public:
   void setWorkDir(const char* pszDir);
   void init();
   void term();
   void sendBroadcast(CComponent* pSender, CIntent* pIntent);
   void onRecvBroadcast(CComponent* pSender, CIntent* pIntent);
   bool isConnected();
   void setActionInterval(unsigned int nInterval);
   std::string& getName();
   std::string& getIp();
   unsigned int getPort();
   bool isMute();
   void addComponent(CComponent* pComponent);
   CComponent* getComponent(const char* pszName);
   CAlarmMonitor* getAlarmMonitor();
   unsigned onMonitor();
   void OnTimer(UINT nTimerid);
   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 writeDWord(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);
public:
   HANDLE m_hTimeEvent;
private:
   void setState(PLCSTATE state);
   void monitorReadData(MONITOR& monitor);
   CString& dataToHexString(const char* pData, const int size, CString& strOut);
private:
   std::string m_strWorkDir;
   std::string m_strName;
   std::string m_strIp;
   unsigned int m_nPort;
   IMcChannel* m_pChannel;
   PLCSTATE m_state;
   PLCListener m_listener;
   unsigned int m_nActionInterval;
   unsigned int m_nUnHeartBeat;
   std::vector<CComponent*> m_components;
private:
   std::vector<MONITOR> m_monitors;
   HANDLE m_hMcMonitorStop;
   HANDLE m_hMcMonitorThreadHandle;
   unsigned m_mcMonitorThrdaddr;
   MMRESULT m_nTimerId;
   bool m_bMute;
};