📄 demomotocon.cpp
字号:
// DemoMotocon.cpp : Defines the initialization routines for the DLL.
//
#include "stdafx.h"
#include <afxdllx.h>
#include "DemoMotocon.h"
#include "Resource.h"
#include "DlgUnitWizard.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
static AFX_EXTENSION_MODULE DemoMotoconDLL = { NULL, NULL };
extern "C" int APIENTRY
DllMain(HINSTANCE hInstance, DWORD dwReason, LPVOID lpReserved)
{
// Remove this if you use lpReserved
UNREFERENCED_PARAMETER(lpReserved);
if (dwReason == DLL_PROCESS_ATTACH)
{
TRACE0("DEMOMOTOCON.DLL Initializing!\n");
// Extension DLL one-time initialization
if (!AfxInitExtensionModule(DemoMotoconDLL, hInstance))
return 0;
// Insert this DLL into the resource chain
// NOTE: If this Extension DLL is being implicitly linked to by
// an MFC Regular DLL (such as an ActiveX Control)
// instead of an MFC application, then you will want to
// remove this line from DllMain and put it in a separate
// function exported from this Extension DLL. The Regular DLL
// that uses this Extension DLL should then explicitly call that
// function to initialize this Extension DLL. Otherwise,
// the CDynLinkLibrary object will not be attached to the
// Regular DLL's resource chain, and serious problems will
// result.
new CDynLinkLibrary(DemoMotoconDLL);
CMyUnit::RegisterClass("MOTOCON","CAN-CM",RUNTIME_CLASS(CMyUnitCanCM));
}
else if (dwReason == DLL_PROCESS_DETACH)
{
TRACE0("DEMOMOTOCON.DLL Terminating!\n");
// Terminate the library before destructors are called
AfxTermExtensionModule(DemoMotoconDLL);
}
return 1; // ok
}
//---------------------------------------------- inline ------------------------
inline BOOL IsPFofPDU1(BYTE FC_PF)
{
return ((FC_PF<FC_PDU)?TRUE:FALSE);
}
inline BOOL IsPFofPDU2(BYTE FC_PF)
{
return ((FC_PF>=FC_PDU)?TRUE:FALSE);
}
inline BOOL IsDvcAddrValid(DWORD dwRcvDvcAddr,DWORD dwMngDvcAddr)
{
return ((dwRcvDvcAddr==dwMngDvcAddr)?TRUE:FALSE);
}
inline BOOL IsFilteringOFF(WORD wClock)
{
return ((wClock<500)?TRUE:FALSE);
}
inline BOOL IsFilteringON(WORD wClock)
{
return ((wClock>=500 && wClock<1000)?TRUE:FALSE);
}
//----------------------------------------------- static -----------------------
static BYTE GetAddSum(BYTE* pData,int nLenAdd,BYTE CanDataLen)
{
BYTE AddSum = 0;
for(int i=0;i<nLenAdd;i++) AddSum += *pData++;
AddSum += CanDataLen;
return AddSum;
}
//--------------------------------------------- CMyUnitCanCM -----------------
IMPLEMENT_SERIAL(CMyUnitCanCM,CMyUnit,0);
CMyUnitCanCM::CMyUnitCanCM():CMyUnit()
{
m_address.bValidSrc = TRUE;
m_address.dwAddressSrc = FC_DA_MD;
m_address.dwMinAddressSrc = MIN_SIZE_DVC;
m_address.dwMaxAddressSrc = MAX_SIZE_DVC;
m_bDvcAddrDestOK = (BYTE)FALSE;
m_nCountMsgAllDvc = 0;
m_dwClock100ms = 0L;
m_dwClock100msDO1S = 0L;
m_bClockDO1SFlickerSynRcvOK = (BYTE)FALSE;
m_wClockDO1SFlickerSynRcv = 0;
m_wClockDO1SFlickerSynSlf = 0;
memset(&m_canMsg,0,sizeof(m_canMsg));
memset(&m_canDataDOS1,0,sizeof(m_canDataDOS1));
CreateDirectory(g_strSCADADAT+"\\msg",NULL);
OnInitDvcCfgInfo();
}
CMyUnitCanCM::~CMyUnitCanCM()
{
}
void CMyUnitCanCM::OnInitDvcCfgInfo(void)
{
m_nSizeAI = 32;
m_nSizeDI = 32;
m_nSizeDO = 24;
register WORD i,j;
for(i=0;i<MAX_COUNT_DVC;i++)
{
if(i<5)
{
m_bEnabledDvc[i] = (BYTE)TRUE;
m_DvcAddrDest[i] = (BYTE)min(i+0x81,MAX_SIZE_DVC);
}
else
{
m_bEnabledDvc[i] = (BYTE)FALSE;
m_DvcAddrDest[i] = FC_DA_MD;
}
m_bDvcRegistered[i] = (BYTE)FALSE;
m_bCanDataDOS1OK[i] = (BYTE)FALSE;
m_nCountMsg[i] = 0;
for(j=0;j<MAX_SIZE_DI;j++) m_bDvcDOS1FlickerCfg[MAX_SIZE_DI*i+j] = (BYTE)FALSE;
}
CStdioFile file;
if(file.Open(g_strSCADABIN+"\\MOTOCON\\DvcDO1SFlickerCfg.ini",CFile::modeRead|CFile::shareDenyNone))
{
char szTemp[256];
while(file.ReadString(szTemp,255)!=NULL)
{
CString strDvcName = strtok(szTemp,":");
CString strDvcNum = strDvcName.SpanExcluding("#");
WORD wDvcNum = atoi(strDvcNum);
for(j=0;j<MAX_SIZE_FLT_DO1S;j++)
{
CString strDvcDO1SNum = strtok(NULL,",\n");
if(strDvcDO1SNum=="") break;
WORD wDvcDO1SNum = atoi(strDvcDO1SNum);
ASSERT(wDvcDO1SNum<=MAX_SIZE_DI);
ASSERT(MAX_COUNT_DVC*(wDvcNum-1)+(wDvcDO1SNum-1)<MAX_SIZE_DI*MAX_COUNT_DVC);
m_bDvcDOS1FlickerCfg[MAX_SIZE_DI*(wDvcNum-1)+(wDvcDO1SNum-1)] = TRUE;
}
}
}
}
BOOL CMyUnitCanCM::OnCreate(void)
{
if(!CMyUnit::OnCreate()) return FALSE;
CDlgUnitWizard dlg;
dlg.m_bEnabledDvc01 = (BOOL)m_bEnabledDvc[ 0];
dlg.m_bEnabledDvc02 = (BOOL)m_bEnabledDvc[ 1];
dlg.m_bEnabledDvc03 = (BOOL)m_bEnabledDvc[ 2];
dlg.m_bEnabledDvc04 = (BOOL)m_bEnabledDvc[ 3];
dlg.m_bEnabledDvc05 = (BOOL)m_bEnabledDvc[ 4];
dlg.m_bEnabledDvc06 = (BOOL)m_bEnabledDvc[ 5];
dlg.m_bEnabledDvc07 = (BOOL)m_bEnabledDvc[ 6];
dlg.m_bEnabledDvc08 = (BOOL)m_bEnabledDvc[ 7];
dlg.m_bEnabledDvc09 = (BOOL)m_bEnabledDvc[ 8];
dlg.m_bEnabledDvc10 = (BOOL)m_bEnabledDvc[ 9];
dlg.m_bEnabledDvc11 = (BOOL)m_bEnabledDvc[10];
dlg.m_bEnabledDvc12 = (BOOL)m_bEnabledDvc[11];
dlg.m_bEnabledDvc13 = (BOOL)m_bEnabledDvc[12];
dlg.m_bEnabledDvc14 = (BOOL)m_bEnabledDvc[13];
dlg.m_bEnabledDvc15 = (BOOL)m_bEnabledDvc[14];
dlg.m_bEnabledDvc16 = (BOOL)m_bEnabledDvc[15];
dlg.m_nDvcAddr01 = (int)m_DvcAddrDest[ 0];
dlg.m_nDvcAddr02 = (int)m_DvcAddrDest[ 1];
dlg.m_nDvcAddr03 = (int)m_DvcAddrDest[ 2];
dlg.m_nDvcAddr04 = (int)m_DvcAddrDest[ 3];
dlg.m_nDvcAddr05 = (int)m_DvcAddrDest[ 4];
dlg.m_nDvcAddr06 = (int)m_DvcAddrDest[ 5];
dlg.m_nDvcAddr07 = (int)m_DvcAddrDest[ 6];
dlg.m_nDvcAddr08 = (int)m_DvcAddrDest[ 7];
dlg.m_nDvcAddr09 = (int)m_DvcAddrDest[ 8];
dlg.m_nDvcAddr10 = (int)m_DvcAddrDest[ 9];
dlg.m_nDvcAddr11 = (int)m_DvcAddrDest[10];
dlg.m_nDvcAddr12 = (int)m_DvcAddrDest[11];
dlg.m_nDvcAddr13 = (int)m_DvcAddrDest[12];
dlg.m_nDvcAddr14 = (int)m_DvcAddrDest[13];
dlg.m_nDvcAddr15 = (int)m_DvcAddrDest[14];
dlg.m_nDvcAddr16 = (int)m_DvcAddrDest[15];
dlg.m_nSizeDI = m_nSizeDI;
dlg.m_nSizeAI = m_nSizeAI;
dlg.m_nSizeDO = m_nSizeDO;
if(MyDoModal(&dlg,DemoMotoconDLL.hModule)==IDOK)
{
m_bEnabledDvc[ 0] = (BYTE)dlg.m_bEnabledDvc01;
m_bEnabledDvc[ 1] = (BYTE)dlg.m_bEnabledDvc02;
m_bEnabledDvc[ 2] = (BYTE)dlg.m_bEnabledDvc03;
m_bEnabledDvc[ 3] = (BYTE)dlg.m_bEnabledDvc04;
m_bEnabledDvc[ 4] = (BYTE)dlg.m_bEnabledDvc05;
m_bEnabledDvc[ 5] = (BYTE)dlg.m_bEnabledDvc06;
m_bEnabledDvc[ 6] = (BYTE)dlg.m_bEnabledDvc07;
m_bEnabledDvc[ 7] = (BYTE)dlg.m_bEnabledDvc08;
m_bEnabledDvc[ 8] = (BYTE)dlg.m_bEnabledDvc09;
m_bEnabledDvc[ 9] = (BYTE)dlg.m_bEnabledDvc10;
m_bEnabledDvc[10] = (BYTE)dlg.m_bEnabledDvc11;
m_bEnabledDvc[11] = (BYTE)dlg.m_bEnabledDvc12;
m_bEnabledDvc[12] = (BYTE)dlg.m_bEnabledDvc13;
m_bEnabledDvc[13] = (BYTE)dlg.m_bEnabledDvc14;
m_bEnabledDvc[14] = (BYTE)dlg.m_bEnabledDvc15;
m_bEnabledDvc[15] = (BYTE)dlg.m_bEnabledDvc16;
m_DvcAddrDest[ 0] = (BYTE)dlg.m_nDvcAddr01;
m_DvcAddrDest[ 1] = (BYTE)dlg.m_nDvcAddr02;
m_DvcAddrDest[ 2] = (BYTE)dlg.m_nDvcAddr03;
m_DvcAddrDest[ 3] = (BYTE)dlg.m_nDvcAddr04;
m_DvcAddrDest[ 4] = (BYTE)dlg.m_nDvcAddr05;
m_DvcAddrDest[ 5] = (BYTE)dlg.m_nDvcAddr06;
m_DvcAddrDest[ 6] = (BYTE)dlg.m_nDvcAddr07;
m_DvcAddrDest[ 7] = (BYTE)dlg.m_nDvcAddr08;
m_DvcAddrDest[ 8] = (BYTE)dlg.m_nDvcAddr09;
m_DvcAddrDest[ 9] = (BYTE)dlg.m_nDvcAddr10;
m_DvcAddrDest[10] = (BYTE)dlg.m_nDvcAddr11;
m_DvcAddrDest[11] = (BYTE)dlg.m_nDvcAddr12;
m_DvcAddrDest[12] = (BYTE)dlg.m_nDvcAddr13;
m_DvcAddrDest[13] = (BYTE)dlg.m_nDvcAddr14;
m_DvcAddrDest[14] = (BYTE)dlg.m_nDvcAddr15;
m_DvcAddrDest[15] = (BYTE)dlg.m_nDvcAddr16;
m_nSizeDI = dlg.m_nSizeDI;
m_nSizeAI = dlg.m_nSizeAI;
m_nSizeDO = dlg.m_nSizeDO;
}
register WORD i,j;
for(i=0;i<MAX_COUNT_DVC;i++)
{
CString strFieldDvcAddr;
strFieldDvcAddr.Format("DVC%02d-Addr",i+1);
AddDataFactory(RUNTIME_CLASS(CMyDataSetpoint),strFieldDvcAddr,(BOOL)m_bEnabledDvc[i]);
CString strFieldDvcInfo;
strFieldDvcInfo.Format("DVC%02d-Info",i+1);
AddDataFactory(RUNTIME_CLASS(CMyDataFloat),strFieldDvcInfo,(BOOL)m_bEnabledDvc[i]);
for(j=0;j<m_nSizeDI;j++)
{
CString strField;
strField.Format("DVC%02d-DI%02d",i+1,j+1);
AddDataFactory(RUNTIME_CLASS(CMyDataSwitch),strField,(BOOL)m_bEnabledDvc[i]);
}
for(j=0;j<m_nSizeAI;j++)
{
CString strField;
strField.Format("DVC%02d-AI%02d",i+1,j+1);
AddDataFactory(RUNTIME_CLASS(CMyDataAnalog),strField,(BOOL)m_bEnabledDvc[i]);
}
for(j=0;j<m_nSizeDO;j++)
{
CString strFieldStatus,strFieldRelay;
strFieldStatus.Format("DVC%02d-DO_1S%02d",i+1,j+1);
AddDataFactory(RUNTIME_CLASS(CMyDataSwitch),strFieldStatus,(BOOL)m_bEnabledDvc[i]);
strFieldStatus.Format("DVC%02d-DO_2S%02d",i+1,j+1);
AddDataFactory(RUNTIME_CLASS(CMyDataSwitch),strFieldStatus,(BOOL)m_bEnabledDvc[i]);
strFieldRelay.Format("DVC%02d-DO_C%02d",i+1,j+1);
AddDataFactory(RUNTIME_CLASS(CMyDataOperateYKYT),strFieldRelay,(BOOL)m_bEnabledDvc[i]);
}
}
return TRUE;
}
BOOL CMyUnitCanCM::OnCreateData(CMyData* pData)
{
if(!CMyUnit::OnCreateData(pData)) return FALSE;
register WORD i,j;
for(i=0;i<MAX_COUNT_DVC;i++)
{
CString strFieldDvcAddr,strNameDvcAddr;
strFieldDvcAddr.Format("DVC%02d-Addr",i+1);
strNameDvcAddr.Format("%02d#设备地址",i+1);
if(pData->m_strField==strFieldDvcAddr) ((CMyDataSetpoint*)pData)->Initialize(strNameDvcAddr,"",0);
CString strFieldDvcInfo,strNameDvcInfo;
strFieldDvcInfo.Format("DVC%02d-Info",i+1);
strNameDvcInfo.Format("%02d#设备信息",i+1);
if(pData->m_strField==strFieldDvcInfo) ((CMyDataFloat*)pData)->Initialize(strNameDvcInfo,"",0);
for(j=0;j<m_nSizeDI;j++)
{
CString strField;
strField.Format("DVC%02d-DI%02d",i+1,j+1);
if(pData->m_strField==strField) ((CMyDataSwitch*)pData)->m_EventMode = 2;
}
for(j=0;j<m_nSizeDO;j++)
{
CString strFieldStatus1,strFieldStatus2,strFieldRelay;
strFieldStatus1.Format("DVC%02d-DO_1S%02d",i+1,j+1);
if(pData->m_strField==strFieldStatus1) ((CMyDataSwitch*)pData)->m_EventMode = 1;
strFieldStatus2.Format("DVC%02d-DO_2S%02d",i+1,j+1);
if(pData->m_strField==strFieldStatus2) ((CMyDataSwitch*)pData)->m_EventMode = 3;
strFieldRelay.Format("DVC%02d-DO_C%02d",i+1,j+1);
if(pData->m_strField==strFieldRelay)
((CMyDataOperateYKYT*)pData)->Initialize(strFieldRelay,"断开/接通",strFieldStatus1);
}
}
return TRUE;
}
void CMyUnitCanCM::OnPortOpen(void)
{
CMyUnit::OnPortOpen();
register WORD i,j;
for(i=0;i<MAX_COUNT_DVC;i++)
{
CString strFieldDvcAddr;
strFieldDvcAddr.Format("DVC%02d-Addr",i+1);
m_pDvcAddr[i] = (CMyDataSetpoint*)GetData(strFieldDvcAddr);
CString strFieldDvcInfo;
strFieldDvcInfo.Format("DVC%02d-Info",i+1);
m_pDvcInfo[i] = (CMyDataFloat*)GetData(strFieldDvcInfo);
for(j=0;j<m_nSizeDI;j++)
{
CString strField;
strField.Format("DVC%02d-DI%02d",i+1,j+1);
m_pDI[m_nSizeDI*i+j] = (CMyDataSwitch*)GetData(strField);
}
for(j=0;j<m_nSizeAI;j++)
{
CString strField;
strField.Format("DVC%02d-AI%02d",i+1,j+1);
m_pAI[m_nSizeAI*i+j] = (CMyDataAnalog*)GetData(strField);
}
for(j=0;j<m_nSizeDO;j++)
{
CString strFieldStatus,strFieldRelay;
strFieldStatus.Format("DVC%02d-DO_1S%02d",i+1,j+1);
m_pDO1S[m_nSizeDO*i+j] = (CMyDataSwitch*)GetData(strFieldStatus);
strFieldStatus.Format("DVC%02d-DO_2S%02d",i+1,j+1);
m_pDO2S[m_nSizeDO*i+j] = (CMyDataSwitch*)GetData(strFieldStatus);
strFieldRelay.Format("DVC%02d-DO_C%02d",i+1,j+1);
m_pDO[m_nSizeDO*i+j] = (CMyDataOperateYKYT*)GetData(strFieldRelay);
}
}
}
void CMyUnitCanCM::ExchangeComData(COMCONTROL* pCC)
{
if(m_dwClock100ms+1L<=g_dwClock100ms)
{
m_dwClock100ms = g_dwClock100ms;
if(m_wClockDO1SFlickerSynSlf>=1000) m_wClockDO1SFlickerSynSlf = 0;
if(m_bClockDO1SFlickerSynRcvOK) m_wClockDO1SFlickerSynSlf += 100;
m_dwClock100msDO1S += 100L;
}
DoExchangeComDataCtrl(pCC);
DoExchangeComDataAcquest(pCC);
}
void CMyUnitCanCM::OnTimerFast(void)
{
}
void CMyUnitCanCM::DoExchangeComDataAcquest(COMCONTROL* pCC)
{
if(!m_bDvcAddrDestOK) {ReveiveDvcAddrDest(); return;}
BOOL bCANFrameOK = FALSE;
while(!bCANFrameOK)
{
if(pCCPort->ReadCom(pCCRX,1)<1) {pCCPort->ClearCom(); Sleep(0); return;}
if((pCCRX[0]&FC_CAN_F)==FC_CAN_F)
{
BYTE* pCanMsg = &m_canMsg.FC[0];
memcpy(pCanMsg,pCCRX,sizeof(m_canMsg.FC[0]));
bCANFrameOK = TRUE;
break;
}
else pCCPort->ClearCom();
}
if(pCCPort->ReadCom(pCCRX,SIZEOF_FRAME-1)==SIZEOF_FRAME-1) {if(!DoReadData(pCC)) return;}
else {pCCPort->ClearCom(); Sleep(0);}
}
void CMyUnitCanCM::DoExchangeComDataCtrl(COMCONTROL* pCC)
{
register WORD i,j;
for(i=0;i<MAX_COUNT_DVC;i++)
{
if(m_DvcAddrDest[i]==FC_DA_MD) continue;
if(m_pDvcAddr[i] && m_pDvcAddr[i]->GetOperateCode())
{
BYTE DvcAddrDest = (BYTE)(m_pDvcAddr[i]->m_fOperateSetdata);
if(DvcAddrDest>MIN_SIZE_DVC && DvcAddrDest<=MAX_SIZE_DVC)
{
m_DvcAddrDest[i] = DvcAddrDest;
m_pDvcAddr[i]->EndOperate();
m_pDvcAddr[i]->RefreshData((float)DvcAddrDest);
}
else
{
m_pDvcAddr[i]->EndOperate("地址修改错!");
return;
}
}
for(j=0;j<m_nSizeDO;j++)
{
if(!m_bCanDataDOS1OK[(MAX_OFFSET_PS+1)*i+j/SIZEOF_DATA]) continue;
if(m_pDO[m_nSizeDO*i+j] && m_pDO[m_nSizeDO*i+j]->GetOperateCode())
{
BYTE OperateCode = m_pDO[m_nSizeDO*i+j]->GetOperateCode();
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -