#pragma once
|
#include "Component.h"
|
#include <string>
|
#include <functional>
|
#include <vector>
|
#include "MMSystem.h"
|
#pragma comment(lib,"winmm")
|
|
|
typedef std::function<void(void* pFrom, int)> ONPLCSTATECHANGED;
|
typedef std::function<void(void* pFrom, int)> 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<MONITOR> m_monitors;
|
HANDLE m_hMcMonitorStop;
|
HANDLE m_hMcMonitorThreadHandle;
|
unsigned m_mcMonitorThrdaddr;
|
MMRESULT m_nTimerId;
|
|
public:
|
HANDLE m_hTimeEvent;
|
};
|