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

📄 tapcon230c.cpp

📁 有载调压控制器的动态链接库
💻 CPP
字号:
// TAPCON230C.cpp : Defines the initialization routines for the DLL.
//

#include "stdafx.h"
#include <afxdllx.h>
#include "TAPCON230C.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif


static AFX_EXTENSION_MODULE TAPCON230CDLL = { NULL, NULL };

extern CMyCRC16 g_crc16(0x8005,TRUE);

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("TAPCON230C.DLL Initializing!\n");
		
		// Extension DLL one-time initialization
		if (!AfxInitExtensionModule(TAPCON230CDLL, 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(TAPCON230CDLL);
		CMyUnit::RegisterClass("MR","TAPCON230C",RUNTIME_CLASS(CMyUnitTAPCON230C));
	}
	else if (dwReason == DLL_PROCESS_DETACH)
	{
		TRACE0("TAPCON230C.DLL Terminating!\n");
		// Terminate the library before destructors are called
		AfxTermExtensionModule(TAPCON230CDLL);
	}
	return 1;   // ok
}

//---------------------------------------------- CMyUnitTAPCON230C-----------------
IMPLEMENT_SERIAL(CMyUnitTAPCON230C,CMyUnit,0)

CMyUnitTAPCON230C::CMyUnitTAPCON230C():CMyUnit()	 
{
	m_address.bValidDest = TRUE;
	m_address.dwAddressDest = 1;
	m_address.dwMinAddressDest = 1;
	m_address.dwMaxAddressDest = 32;
}

BOOL CMyUnitTAPCON230C::OnCreate(void)
{
	if(!CMyUnit::OnCreate()) return FALSE;
	AddDataFactory(RUNTIME_CLASS(CMyDataAnalog),"U",TRUE);
	AddDataFactory(RUNTIME_CLASS(CMyDataAnalog),"Tap",TRUE);
	AddDataFactory(RUNTIME_CLASS(CMyDataOperateYKYT),"YT",TRUE);
	return TRUE;
}

BOOL CMyUnitTAPCON230C::OnCreateData(CMyData* pData)
{
	if(!CMyUnit::OnCreateData(pData)) return FALSE;
	else if(pData->m_strField=="U") ((CMyDataAnalog*)pData)->Initialize("实际电压","V",1);
	else if(pData->m_strField=="Tap") ((CMyDataAnalog*)pData)->Initialize("档位","",0);
	else if(pData->m_strField=="YT")((CMyDataOperateYKYT*)pData)->Initialize("遥调","降档/升档","Tap");

	return TRUE;
}

void CMyUnitTAPCON230C::OnPortOpen(void)
{
	CMyUnit::OnPortOpen();
	m_pU = (CMyDataAnalog*)GetData("U");
	m_pTap = (CMyDataAnalog*)GetData("Tap");
	m_pYT = (CMyDataOperateYKYT*)GetData("YT");

	m_CommDispatch.AddTask(10);
}

void CMyUnitTAPCON230C::ExchangeComData(COMCONTROL* pCC)
{
	int nActiveTask = m_CommDispatch.GetActiveTask();
	switch(nActiveTask)
	{
	    case 0:RecieveData(pCC);break;
	}
	
	if(m_pYT && m_pYT->GetOperateCode())
	{
		BYTE OperateCode = m_pYT->GetOperateCode();
		
		if(OperateCode==0x55)
		{
			if(ModBusWrite(pCC,0x17,0x08)) m_pYT->EndOperate();
			else m_pYT->EndOperate(m_strComError);
			if(m_pTap)  m_pTap->RefreshData(pCCRX[13]);
			if(m_pU)  m_pU->RefreshData(MAKEDATA2(pCCRX[12],pCCRX[11])*0.1f);
			Sleep(300);
		}
		if(OperateCode==0x33)
		{
			if(ModBusWrite(pCC,0x17,0x04)) m_pYT->EndOperate();
			else m_pYT->EndOperate(m_strComError);
			if(m_pTap)  m_pTap->RefreshData(pCCRX[13]);
			if(m_pU)  m_pU->RefreshData(MAKEDATA2(pCCRX[12],pCCRX[11])*0.1f);
			Sleep(300);
		}
	}
}

void CMyUnitTAPCON230C::RecieveData(COMCONTROL* pCC)
{
	if(MODBUS_ReadFirst(pCC,0x17)==FALSE) return;
	if(m_pTap)  m_pTap->RefreshData(pCCRX[13]);
	if(m_pU)  m_pU->RefreshData(MAKEDATA2(pCCRX[12],pCCRX[11])*0.1f);
}

BOOL CMyUnitTAPCON230C::MODBUS_ReadFirst(COMCONTROL* pCC,BYTE FUN_CODE_Read)
{
    BYTE* pTX = pCCTX;
	*pTX++ = BYTE(m_address.dwAddressDest);
	*pTX++ = FUN_CODE_Read;
	*pTX++ = 0x06;
	*pTX++ = 0x0A;
	*pTX++ = 0x0A;
	*pTX++ = 0x08;
	*pTX++ = 0xFC;
	*pTX++ = 0x5A;
	*pTX++ = 0x00;
	WORD wCRC = 0xffff;
	g_crc16.CalculateCRC(pCCTX,pTX-pCCTX,wCRC);  
    *pTX++ = BYTE(wCRC/256);
	*pTX++ = BYTE(wCRC%256);	
	pCCPort->ClearCom();
	pCCPort->WriteCom(pCCTX,pTX-pCCTX);
	Sleep(10);	
	int nLength = 19;
	if(pCCPort->ReadCom(pCCRX,nLength)<nLength) {/*SetComError("通信超时!");*/ return FALSE;}
//	if(pCCRX[0]!=(BYTE)(m_address.dwAddressDest)) {/*SetComError("通信地址出错!");*/ return FALSE;}
//	if(pCCRX[1]!=FUN_CODE_Read) {/*SetComError("功能码错!");*/ return FALSE;}
	return TRUE;
}

BOOL CMyUnitTAPCON230C::ModBusWrite(COMCONTROL* pCC,BYTE FUN_CODE_Read,BYTE TAP)
{
	BYTE* pTX = pCCTX;
	*pTX++ = BYTE(m_address.dwAddressDest);
	*pTX++ = FUN_CODE_Read;
	*pTX++ = 0x06;
	*pTX++ = 0x0A;
	*pTX++ = 0x0A;
	*pTX++ = 0x08;
	*pTX++ = 0xFC;
	*pTX++ = 0x5A;
	*pTX++ = BYTE(TAP);
	WORD wCRC = 0xffff;
	g_crc16.CalculateCRC(pCCTX,pTX-pCCTX,wCRC);
	*pTX++ = BYTE(wCRC/256);
	*pTX++ = BYTE(wCRC%256);
	pCCPort->ClearCom();
	pCCPort->WriteCom(pCCTX,pTX-pCCTX);
	Sleep(10);
	if(pCCPort->ReadCom(pCCRX,19)<19){ SetComError("通信超时!"); return FALSE; }
	if(pCCRX[0]!=(BYTE)m_address.dwAddressDest){ SetComError("通信地址出错!"); return FALSE; }
	if(pCCRX[1]!=FUN_CODE_Read){ SetComError("功能码应答出错!"); return FALSE; }
/*	wCRC = 0xffff;
	g_crc16.CalculateCRC(pCCRX,8,wCRC);
	if(wCRC!=0){ SetComError("校验和出错!"); return FALSE; }
	pCCPort->ClearCom();*/
	return TRUE;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -