⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 demomotocon.cpp

📁 工业自动化CAN总线通信的应用层程序
💻 CPP
📖 第 1 页 / 共 2 页
字号:
// 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 + -