mrDarker
2025-10-22 e8a27bb203fe2aff70390a5eca002d7438da9b0f
SourceCode/Bond/BoounionPLC/PLC.h
@@ -1,5 +1,40 @@
#pragma once
#include <string>
#include "AlarmMonitor.h"
#include "MMSystem.h"
#pragma comment(lib,"winmm")
#define ALARM_MONITOR      _T("警告信息")
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 +44,77 @@
   ~CPLC();
public:
   void setListener(PLCListener& listener);
   void setWorkDir(const char* pszDir);
   void init();
   void term();
   void sendBroadcast(CComponent* pSender, CIntent* pIntent);
   void onRecvBroadcast(CComponent* pSender, CIntent* pIntent);
   bool isConnected();
   void connect();
   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);
   void readPLCDataRegularly();
public:
   int getVelocityRatio();
   double getTackTime();
   int getDayShiftCapacity();
   int getNightShiftCapacity();
public:
   HANDLE m_hTimeEvent;
private:
   inline void Lock() { EnterCriticalSection(&m_criticalSection); }
   inline void Unlock() { LeaveCriticalSection(&m_criticalSection); }
   void setState(PLCSTATE state);
   void monitorReadData(MONITOR& monitor);
   CString& dataToHexString(const char* pData, const int size, CString& strOut);
   int onMonitorData(MONITOR& monitor);
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;
   char* m_pPlcData;
private:
   CRITICAL_SECTION m_criticalSection;
   std::vector<MONITOR> m_monitors;
   HANDLE m_hMcMonitorStop;
   HANDLE m_hMcMonitorThreadHandle;
   unsigned m_mcMonitorThrdaddr;
   MMRESULT m_nTimerId;
   bool m_bMute;
private:
   int m_nVelocityRatio;      // 速度比
   double m_dTactTime;         // 周期时间
   int m_nDayShiftCapacity;   // 白班产能
   int m_nNightShiftCapacity;   // 夜班产能
   bool m_bBlBtnsStates[7];   // PLC View按钮状态
};