|
|
|
|
#include "StdAfx.h"
|
|
|
|
|
#include "PlcIOMgr.h"
|
|
|
|
|
#include "Propertie.h"
|
|
|
|
|
#include "PropertieMgr.h"
|
|
|
|
|
#include "AuthorityMgr.h"
|
|
|
|
|
#include "FileMgr.h"
|
|
|
|
|
#include "CStringFuc.h"
|
|
|
|
|
#include "CommPortMgr.h"
|
|
|
|
|
#include "LogMgr.h"
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
#define OUT_PORT_FILE_PATH _T("\\Parameter\\PlcIOMgr\\PlcIO_Out.txt")//<2F><><EFBFBD><EFBFBD><EFBFBD>˿<EFBFBD>(<28><><EFBFBD><EFBFBD>)
|
|
|
|
|
#define IN_PORT_FILE_PATH _T("\\Parameter\\PlcIOMgr\\PlcIO_In.txt")//<2F><><EFBFBD><EFBFBD><EFBFBD>˿<EFBFBD>(<28><>ѯ)
|
|
|
|
|
#define OPEN_STR "A000000" //<2F><><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8>ǰ
|
|
|
|
|
#define CLOSE_STR "B000000" //<2F>ر<EFBFBD>ָ<EFBFBD><D6B8>ǰ
|
|
|
|
|
#define OK_STR "OK" //<2F><><EFBFBD><EFBFBD>OK
|
|
|
|
|
|
|
|
|
|
#define QUERY_STR "C000000" //<2F><>ѯָ<D1AF><D6B8>ǰ
|
|
|
|
|
#define QUERY_OK_STR "C100000" //<2F><>ѯ<EFBFBD><D1AF><EFBFBD><EFBFBD>OK ǰ
|
|
|
|
|
|
|
|
|
|
CPlcIOMgr *gPlcIOMgr = new CPlcIOMgr;
|
|
|
|
|
CPlcIOMgr::CPlcIOMgr(void)
|
|
|
|
|
{
|
|
|
|
|
m_ComPort = 6;//ͨ<>Ŵ<EFBFBD><C5B4>ں<EFBFBD>
|
|
|
|
|
m_BaudRate = 115200;//ͨ<>Ų<EFBFBD><C5B2><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
m_bUse = false;//<2F>Ƿ<EFBFBD>ʹ<EFBFBD><CAB9>PLC I/O<><4F><EFBFBD><EFBFBD>
|
|
|
|
|
m_bShowLog = false;//<2F>Ƿ<EFBFBD><C7B7><EFBFBD>ʾ<EFBFBD><CABE>־
|
|
|
|
|
}
|
|
|
|
|
CPlcIOMgr::~CPlcIOMgr(void)
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
CMFCPropertyGridProperty *CPlcIOMgr::CreatGridProperty()
|
|
|
|
|
{
|
|
|
|
|
CString PropertyName;//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
CString Description;//<2F><><EFBFBD><EFBFBD>
|
|
|
|
|
CString Path = _T("PlcIOMgr");//<2F>洢·<E6B4A2><C2B7>
|
|
|
|
|
CString Name;
|
|
|
|
|
//-------------------------------------------------------------------------------//
|
|
|
|
|
PropertyName = _T("PLC I/O");
|
|
|
|
|
CMFCPropertyGridProperty* pGroup = new CMFCPropertyGridProperty(PropertyName);
|
|
|
|
|
//-------------------------------------------------------------------------------//
|
|
|
|
|
if(gAuthorityMgr->CheckAuthority(_FACTORY))
|
|
|
|
|
{
|
|
|
|
|
{
|
|
|
|
|
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ա<EFBFBD><D4B1><EFBFBD>ӳ<EFBFBD><D3B3>
|
|
|
|
|
Name = _T("m_bUse");//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
CPropertie *pPropertie = new CPropertie;
|
|
|
|
|
pPropertie->SetpVal((void*)&m_bUse);
|
|
|
|
|
pPropertie->SetType(_PROP_TYPE_BOOL);
|
|
|
|
|
pPropertie->SetpModule(this);
|
|
|
|
|
pPropertie->SetPath(Path);
|
|
|
|
|
pPropertie->SetName(Name);
|
|
|
|
|
pPropertie->WriteRead(true);//<2F><>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʾ
|
|
|
|
|
PropertyName = _T("<EFBFBD>Ƿ<EFBFBD>ʹ<EFBFBD><EFBFBD>");
|
|
|
|
|
Description = _T("<EFBFBD>Ƿ<EFBFBD>ʹ<EFBFBD><EFBFBD>PLC I/O<><4F><EFBFBD>ƹ<EFBFBD><C6B9><EFBFBD>(<28><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ч)");
|
|
|
|
|
CMFCPropertyGridProperty* p1 = new CMFCPropertyGridProperty(PropertyName, (_variant_t)m_bUse, Description);
|
|
|
|
|
pGroup->AddSubItem(p1);
|
|
|
|
|
gDevicePropertieMgr.Insert(p1, pPropertie);
|
|
|
|
|
}
|
|
|
|
|
{
|
|
|
|
|
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ա<EFBFBD><D4B1><EFBFBD>ӳ<EFBFBD><D3B3>
|
|
|
|
|
Name = _T("m_bShowLog");//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
CPropertie *pPropertie = new CPropertie;
|
|
|
|
|
pPropertie->SetpVal((void*)&m_bShowLog);
|
|
|
|
|
pPropertie->SetType(_PROP_TYPE_BOOL);
|
|
|
|
|
pPropertie->SetpModule(this);
|
|
|
|
|
pPropertie->SetPath(Path);
|
|
|
|
|
pPropertie->SetName(Name);
|
|
|
|
|
pPropertie->WriteRead(true);//<2F><>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʾ
|
|
|
|
|
PropertyName = _T("<EFBFBD><EFBFBD>ʾ<EFBFBD><EFBFBD>־");
|
|
|
|
|
Description = _T("<EFBFBD>Ƿ<EFBFBD><EFBFBD><EFBFBD>ʾ<EFBFBD><EFBFBD>־<EFBFBD><EFBFBD>Ϣ");
|
|
|
|
|
CMFCPropertyGridProperty* p1 = new CMFCPropertyGridProperty(PropertyName, (_variant_t)m_bShowLog, Description);
|
|
|
|
|
pGroup->AddSubItem(p1);
|
|
|
|
|
gDevicePropertieMgr.Insert(p1, pPropertie);
|
|
|
|
|
}
|
|
|
|
|
{
|
|
|
|
|
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ա<EFBFBD><D4B1><EFBFBD>ӳ<EFBFBD><D3B3>
|
|
|
|
|
Name = _T("m_ComPort");//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
CPropertie *pPropertie = new CPropertie;
|
|
|
|
|
pPropertie->SetpVal((void*)&m_ComPort);
|
|
|
|
|
pPropertie->SetType(_PROP_TYPE_INT);
|
|
|
|
|
pPropertie->SetpModule(this);
|
|
|
|
|
pPropertie->SetPath(Path);
|
|
|
|
|
pPropertie->SetName(Name);
|
|
|
|
|
pPropertie->WriteRead(true);//<2F><>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʾ
|
|
|
|
|
PropertyName = _T("ͨ<EFBFBD>Ŵ<EFBFBD><EFBFBD><EFBFBD>");
|
|
|
|
|
Description = _T("ͨ<EFBFBD><EFBFBD><EFBFBD>ô<EFBFBD><EFBFBD>ں<EFBFBD>");
|
|
|
|
|
CMFCPropertyGridProperty* p1 = new CMFCPropertyGridProperty(PropertyName, (_variant_t)m_ComPort, Description);
|
|
|
|
|
pGroup->AddSubItem(p1);
|
|
|
|
|
gDevicePropertieMgr.Insert(p1, pPropertie);
|
|
|
|
|
}
|
|
|
|
|
{
|
|
|
|
|
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ա<EFBFBD><D4B1><EFBFBD>ӳ<EFBFBD><D3B3>
|
|
|
|
|
Name = _T("m_BaudRate");//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
CPropertie *pPropertie = new CPropertie;
|
|
|
|
|
pPropertie->SetpVal((void*)&m_BaudRate);
|
|
|
|
|
pPropertie->SetType(_PROP_TYPE_INT);
|
|
|
|
|
pPropertie->SetpModule(this);
|
|
|
|
|
pPropertie->SetPath(Path);
|
|
|
|
|
pPropertie->SetName(Name);
|
|
|
|
|
pPropertie->WriteRead(true);//<2F><>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʾ
|
|
|
|
|
PropertyName = _T("<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>");
|
|
|
|
|
Description = _T("<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͨ<EFBFBD><EFBFBD><EFBFBD>ò<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>");
|
|
|
|
|
CMFCPropertyGridProperty* p1 = new CMFCPropertyGridProperty(PropertyName, (_variant_t)m_BaudRate, Description);
|
|
|
|
|
pGroup->AddSubItem(p1);
|
|
|
|
|
gDevicePropertieMgr.Insert(p1, pPropertie);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
return pGroup;
|
|
|
|
|
}
|
|
|
|
|
void CPlcIOMgr::Ini()
|
|
|
|
|
{
|
|
|
|
|
if(!m_bUse)
|
|
|
|
|
return;
|
|
|
|
|
|
|
|
|
|
CFileMgr FileMgr;
|
|
|
|
|
CString FilePath;
|
|
|
|
|
FileMgr.GetFullFilePath(FilePath,OUT_PORT_FILE_PATH);//<2F><>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD>·<EFBFBD><C2B7>
|
|
|
|
|
ReadCtrlContentFile(m_OutPortVec,FilePath);
|
|
|
|
|
FileMgr.GetFullFilePath(FilePath,IN_PORT_FILE_PATH);//<2F><>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD>·<EFBFBD><C2B7>
|
|
|
|
|
ReadCtrlContentFile(m_InPortVec,FilePath);
|
|
|
|
|
}
|
|
|
|
|
void CPlcIOMgr::ExportPar(ofstream *pFile)
|
|
|
|
|
{
|
|
|
|
|
(*pFile)<<"[ģ<><C4A3>] [CPlcIOMgr]------------------------------------------------"<<endl;
|
|
|
|
|
(*pFile)<<"[m_bUse] = "<<m_bUse<<endl;
|
|
|
|
|
(*pFile)<<"[m_bShowLog] = "<<m_bShowLog<<endl;
|
|
|
|
|
(*pFile)<<"[m_BaudRate] = "<<m_BaudRate<<endl;
|
|
|
|
|
(*pFile)<<"[m_ComPort] = "<<m_ComPort<<endl;
|
|
|
|
|
(*pFile)<<"[m_ExcuteTimes] = "<<m_ExcuteTimes<<endl;
|
|
|
|
|
int size = m_OutPortVec.size();
|
|
|
|
|
for(int i=0;i<size;i++)
|
|
|
|
|
{
|
|
|
|
|
(*pFile)<<"[Out CtrlContent] = "<<m_OutPortVec[i].m_CtrlContent<<"[Out CtrlPort] = "<<m_OutPortVec[i].m_Port<<endl;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
//<2F><>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݵ<EFBFBD><DDB5>ļ<EFBFBD>
|
|
|
|
|
void CPlcIOMgr::ReadCtrlContentFile(vector<CPlcIOPar> &PortVec,CString FilePath)
|
|
|
|
|
{
|
|
|
|
|
CString LogStr;
|
|
|
|
|
LogStr = (_T("Fuc---->ReadCtrlContentFile : ")+FilePath);
|
|
|
|
|
gLogMgr->WriteDebugLog(LogStr);
|
|
|
|
|
|
|
|
|
|
PortVec.clear();
|
|
|
|
|
CFileMgr FileMgr;
|
|
|
|
|
CPlcIOPar PlcIOPar;
|
|
|
|
|
vector<CString> vec;
|
|
|
|
|
FileMgr.ReadFileToStringVec(FilePath,vec);
|
|
|
|
|
int size = vec.size();
|
|
|
|
|
for(int i=0;i<size;i++)
|
|
|
|
|
{
|
|
|
|
|
if(i%2 == 0)
|
|
|
|
|
{
|
|
|
|
|
PlcIOPar.m_CtrlContent = vec[i];
|
|
|
|
|
LogStr = (_T("[CtrlContent] = ")+PlcIOPar.m_CtrlContent);
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
PlcIOPar.m_Port = vec[i];
|
|
|
|
|
PortVec.push_back(PlcIOPar);
|
|
|
|
|
LogStr.Format(_T("[port] = ")+PlcIOPar.m_Port);
|
|
|
|
|
}
|
|
|
|
|
if(m_bShowLog)
|
|
|
|
|
gLogMgr->WriteDebugLog(LogStr);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
//<2F><>ѯ<EFBFBD><D1AF><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>CtrlContent <20><>Ӧ<EFBFBD>Ķ˿ں<CBBF>
|
|
|
|
|
CString CPlcIOMgr::GetPortNum(CString CtrlContent,vector<CPlcIOPar> &PortVec)
|
|
|
|
|
{
|
|
|
|
|
if(!m_bUse)
|
|
|
|
|
return "";
|
|
|
|
|
|
|
|
|
|
int size = PortVec.size();
|
|
|
|
|
for(int i=0;i<size;i++)
|
|
|
|
|
{
|
|
|
|
|
if(PortVec[i].m_CtrlContent == CtrlContent)
|
|
|
|
|
return PortVec[i].m_Port;
|
|
|
|
|
}
|
|
|
|
|
if(m_bShowLog)
|
|
|
|
|
{
|
|
|
|
|
gLogMgr->WriteDebugLog("Err---->not find plc port num of : " + CtrlContent);
|
|
|
|
|
}
|
|
|
|
|
return "";
|
|
|
|
|
}
|
|
|
|
|
//<2F>л<EFBFBD><D0BB>˿<EFBFBD>״̬(CtrlContent <20>ǿ<EFBFBD><C7BF><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>)
|
|
|
|
|
bool CPlcIOMgr::SwitchPort(CString CtrlContent,bool bOpen)
|
|
|
|
|
{
|
|
|
|
|
//<2F><>ѯ<EFBFBD>˿ں<CBBF>
|
|
|
|
|
CString PortNum = GetPortNum(CtrlContent,m_OutPortVec);
|
|
|
|
|
if(PortNum != "")
|
|
|
|
|
{
|
|
|
|
|
CCommPortMgr com;
|
|
|
|
|
if(com.Open(m_ComPort,m_BaudRate)==false)
|
|
|
|
|
{
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
m_ExcuteTimes = 200;
|
|
|
|
|
CString str1 = (bOpen?(OPEN_STR):(CLOSE_STR));
|
|
|
|
|
str1 += PortNum;
|
|
|
|
|
CString str = str1+char(13)+char(10);
|
|
|
|
|
CString CommRev;
|
|
|
|
|
int Delay=50;
|
|
|
|
|
int Total = 50;
|
|
|
|
|
while(Total<m_ExcuteTimes)
|
|
|
|
|
{
|
|
|
|
|
com.Write(str);
|
|
|
|
|
Sleep(Delay);
|
|
|
|
|
CommRev = com.ReadStr();
|
|
|
|
|
if(CommRev == OK_STR)//<2F><><EFBFBD><EFBFBD>OK
|
|
|
|
|
{
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
Total += Delay;
|
|
|
|
|
}
|
|
|
|
|
com.Close();
|
|
|
|
|
Sleep(200);
|
|
|
|
|
return true;
|
|
|
|
|
}
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
//<2F><><EFBFBD><EFBFBD><EFBFBD>˿<EFBFBD>״̬(WaitTime <20><><EFBFBD><EFBFBD>ȴ<EFBFBD>ʱ<EFBFBD><CAB1>ms)
|
|
|
|
|
bool CPlcIOMgr::CheckPortState(CString PortNum,int WaitTime)
|
|
|
|
|
{
|
|
|
|
|
if(PortNum == "")
|
|
|
|
|
return false;
|
|
|
|
|
|
|
|
|
|
CCommPortMgr com;
|
|
|
|
|
if(com.Open(m_ComPort,m_BaudRate)==false)
|
|
|
|
|
{
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
CString str1 = QUERY_STR +PortNum;
|
|
|
|
|
CString SendStr = str1+char(13)+char(10);
|
|
|
|
|
CString OkStr = QUERY_OK_STR+PortNum;
|
|
|
|
|
CString CommRev;
|
|
|
|
|
|
|
|
|
|
int Delay=300;
|
|
|
|
|
int Total = 0;
|
|
|
|
|
while(Total<WaitTime)
|
|
|
|
|
{
|
|
|
|
|
com.Write(SendStr);
|
|
|
|
|
Sleep(Delay);
|
|
|
|
|
CommRev = com.ReadStr();
|
|
|
|
|
if(CommRev.Find(OkStr,0) != -1)
|
|
|
|
|
{
|
|
|
|
|
return true;
|
|
|
|
|
}
|
|
|
|
|
else if(CommRev.Find(SendStr,0) != -1)
|
|
|
|
|
{
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
Total += Delay;
|
|
|
|
|
}
|
|
|
|
|
com.Close();
|
|
|
|
|
Sleep(200);
|
|
|
|
|
return false;
|
|
|
|
|
}
|