📄 tapcon230c.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 + -