📄 sypbprotocol.cpp
字号:
// YHPBProtocol.cpp : Defines the initialization routines for the DLL.
//
#include "stdafx.h"
#include "YHPBProtocol.h"
#include "IPReportSocket.h"
#include "Utilities.h"
#include "Math.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
BEGIN_MESSAGE_MAP(CYHPBProtocolApp, CWinApp)
END_MESSAGE_MAP()
CYHPBProtocolApp::CYHPBProtocolApp()
{
}
CYHPBProtocolApp theApp;
BOOL CYHPBProtocolApp::InitInstance()
{
// TODO: Add your specialized code here and/or call the base class
if (!AfxSocketInit())
{
AfxMessageBox(IDP_SOCKETS_INIT_FAILED);
return FALSE;
}
return TRUE;
}
struct ThreadBuf //数据缓冲区
{
unsigned char DataBuf[4000];
};
enum YHAPPCTLMAIN //银河应用功能码主站下行
{
YHAPPCTLMAIN_RESET=0x01,
YHAPPCTLMAIN_USERDATA=0x04,
YHAPPCTLMAIN_FIRSTDATA=0x0A,
YHAPPCTLMAIN_SECONDLYDATA,
};
enum YHAPPCTLRTU //银河协议应用功能码终端上行
{
YHAPPCTLRTU_AFFIRM=0x00,
YHAPPCTLRTU_USERDATA=0x08,
YHAPPCTLRTU_NOTHINGDATA,
};
enum YHAFN //银河AFN码
{
YHAFN_AFFIRM=0x00, //确认∕否认
YHAFN_RESET, //复位
YHAFN_CHECK, //链路接口检测
YHAFN_RELAY, //中继站命令
YHAFN_SETDATA, //设置参数
YHAFN_CORTROL, //控制命令
YHAFN_LOOKUP=0x0A, //查询参数
YHAFN_ASKONEDATA=0x0C, //
YHAFN_ASKTWODATA, //
YHAFN_ASKTHREEDATA, //
YHAFN_FILESEND, //
YHAFN_TRANSMITDATA=0x10, //
};
enum PBJAPPCTL //系统内部规约应用功能码
{
APPCTL_LOGINANDEXIT=0x00, /
APPCTL_SETPARA=0x01, //
APPCTL_GETPARA, //
APPCTL_READDATA, /**/
APPCTL_REERROR, /**/
APPCTL_RESET, /**/
APPCTL_IOCHECK, /**/
APPCTL_RELAYCMD, /**/
APPCTL_FILETRANSE, /**/
APPCTL_DATATRANSE, /**/
};
系统内部规约控制码
{
JCCTL_LOGIN=0x00, /* */
JCCTL_ELEENE=0x01, /**/
JCCTL_MOSTNEEDANDTIME, /**/
JCCTL_VOLTAGE=0x04, /**/
JCCTL_ELECTRICITY, /**/
JCCTL_POWER, /**/
JCCTL_NPOWER, /**/
JCCTL_POWERFACTOR, /*功*/
JCCTL_PS, /**/
JCCTL_PROGRAMIMF, /*编程信息*/
JCCTL_OPENPHASE, /**/
JCCTL_MECONDITION, /**/
JCCTL_HCTIME, /**/
JCCTL_LOSTU, /**/
JCCTL_POWERCUT, /**/
JCCTL_UTMOST, /*日统计值*/
JCCTL_CURRENT=0x11, /*实时数据*/
JCCTL_SETPARA, /**/
JCCTL_READPARA, /**/
JCCTL_AUTOMISSIONSET, /**/
JCCTL_READSUTOMISSION, /**/
JCCTL_SETALARM, /**/
JCCTL_SETMETERPARA=0x19, /**/
JCCTL_READMETERPARA, /**/
JCCTL_SETMETERNO=0x17, /* 设置表号*/
JCCTL_EXIT, /**/
};
struct DevComPro
{
public:
UINT nDialStatus; /*拨号状态*/
CString strDevIP; /*设备IP地址*/
USHORT usDevPort; /* 端口号,2字节 */
};
struct AUTOTASKINFO
{
public:
CIPReportSocket *pSocket; /* */
char chAutoTask; /**/
};
struct QUEUEELEMENT //任务队列元素结构
{
public:
UINT nTotalLength; /* 一个任务 */
BOOL bHasThread;
UINT nStatus; /* 状态 */
BOOL bGetCTData; /* 是否据 */
CString strSrcIP; /* */
USHORT usPort; /* 端口号,2字节 */
BYTE sProt[1]; /* 规,1字节 */
BYTE sComMode[1]; /* 通节*/
BYTE TerAddr[6]; /* 终端地址,6字节 */
BYTE devAddr[6]; /* 设备地址,6字节 */
BYTE telNum[6]; /*电话号码,6字节*/
BYTE cnCtl[3]; /* 控*/
USHORT nDataLenth; /* 数据长度,2字节 */
char *strData; /* 数据域 */
DevComPro devComPro; /* 设备通信属性 */
AUTOTASKINFO autoTaskInfo; /*自信息*/
CString strTaskId;
BYTE nCountRTU; /*计数器*/
BOOL bAffirm; /*是否需要确认,0-否 1-是*/
};
extern "C" _declspec(dllexport) UINT YHQueueToProtocolDll(ThreadBuf *mTreadBuf, QUEUEELEMENT *pQueueEle) //负责将要发送的内部规约转化为厂家设备协议
{
AFX_MANAGE_STATE(AfxGetStaticModuleState());
int count=0;
COleDateTime cTime;
mTreadBuf->DataBuf[count]=0x68; //起始符
count+=5;
mTreadBuf->DataBuf[count]=0x68; //区间同步字
count++;
switch(pQueueEle->cnCtl[0] & 0x0F) //系统应用功能码
{
case APPCTL_LOGINANDEXIT:
mTreadBuf->DataBuf[count] = 0x0B;
break;
case APPCTL_READDATA:
switch(pQueueEle->cnCtl[1]) //系统控制码
{
case JCCTL_ELEENE: /*日电能量*/
mTreadBuf->DataBuf[count] = 0x4B;
break;
case JCCTL_MOSTNEEDANDTIME: /*最大需量及发生时间*/
mTreadBuf->DataBuf[count] = 0x4B;
break;
case JCCTL_VOLTAGE: /*电压*/
mTreadBuf->DataBuf[count] = 0x4B;
break;
case JCCTL_ELECTRICITY: /*电流*/
mTreadBuf->DataBuf[count] = 0x4B;
break;
case JCCTL_POWER: /*有功功率*/
mTreadBuf->DataBuf[count] = 0x4B;
break;
case JCCTL_NPOWER: /*无功功率*/
mTreadBuf->DataBuf[count] = 0x4B;
break;
case JCCTL_POWERFACTOR: /*功率因素*/
mTreadBuf->DataBuf[count] = 0x4B;
break;
case JCCTL_PS: /*视在功率和频率*/
mTreadBuf->DataBuf[count] = 0x4B;
break;
case JCCTL_PROGRAMIMF: /*编程信息*/
mTreadBuf->DataBuf[count] = 0x4B;
break;
case JCCTL_OPENPHASE: /*断相数据*/
mTreadBuf->DataBuf[count] = 0x4B;
break;
case JCCTL_MECONDITION: /*表运行状态*/
mTreadBuf->DataBuf[count] = 0x4B;
break;
case JCCTL_HCTIME: /*需量周期计算方法参数即滑差参数*/
mTreadBuf->DataBuf[count] = 0x4B;
break;
case JCCTL_LOSTU: /*失压数据*/
mTreadBuf->DataBuf[count] = 0x4B;
break;
case JCCTL_POWERCUT: /*来停电数据*/
mTreadBuf->DataBuf[count] = 0x4B;
break;
case JCCTL_UTMOST: /*日统计值*/
mTreadBuf->DataBuf[count] = 0x4B;
break;
case JCCTL_CURRENT: /*实时数据*/
mTreadBuf->DataBuf[count] = 0x4B;
break;
case JCCTL_SETPARA: /*设置终端参数*/
mTreadBuf->DataBuf[count] = 0x4A;
break;
case JCCTL_READPARA: /*查询终端参数*/
mTreadBuf->DataBuf[count] = 0x4B;
break;
case JCCTL_AUTOMISSIONSET: /*自动任务设置*/
mTreadBuf->DataBuf[count] = 0x4A;
break;
case JCCTL_READSUTOMISSION: /*查询自动任务*/
mTreadBuf->DataBuf[count] = 0x4B;
break;
case JCCTL_SETALARM: /*设置告警项*/
switch(pQueueEle->cnCtl[2])
{
case 0x01: /*设置告警项*/
mTreadBuf->DataBuf[count] = 0x4A;
break;
case 0x02: /*查询告警事件*/
mTreadBuf->DataBuf[count] = 0x4B;
break;
} /*end of switch(pQueueEle->cnCtl[2])*/
break;
case JCCTL_SETMETERNO: /* 设置表号*/
switch(pQueueEle->cnCtl[2])
{
case 0x01: /*设置表号*/
mTreadBuf->DataBuf[count] = 0x4A;
break;
case 0x02: /*读取表号*/
mTreadBuf->DataBuf[count] = 0x4B;
break;
}/*end of (switch(pQueueEle->cnCtl[2]))*/
break;
case JCCTL_SETMETERPARA: //电能表参数设置
mTreadBuf->DataBuf[count] = 0x4A; /*电表设置参数*/
break;
case JCCTL_READMETERPARA:
mTreadBuf->DataBuf[count] = 0x4B; /*查询电表参数*/
break;
}/*end of (switch(pQueueEle->cnCtl[1]))*/
}/*end of (switch(pQueueEle->cnCtl[0] & 0x0F)) */
if(pQueueEle->bAffirm)
{
mTreadBuf->DataBuf[count] = 0x0B; //自动任务确认否认控制码设为0B
}/*end of (if(pQueueEle->bAffirm))*/
count++;
mTreadBuf->DataBuf[count] = pQueueEle->TerAddr[2];
count++;
mTreadBuf->DataBuf[count] = pQueueEle->TerAddr[3];
count++;
UINT nAddr=0;
nAddr=CUtilities::HexToDec(pQueueEle->TerAddr[1])*100 + CUtilities::HexToDec(pQueueEle->TerAddr[0]);
mTreadBuf->DataBuf[count] = nAddr&0x00FF;
count++;
mTreadBuf->DataBuf[count] = (nAddr&0xFF00)>>8;
count++;
mTreadBuf->DataBuf[count] = pQueueEle->TerAddr[4];
count++;
if(pQueueEle->bAffirm) //为确认帧
{
mTreadBuf->DataBuf[count++] = 0x00;
mTreadBuf->DataBuf[count++] = 0x60 + pQueueEle->nCountRTU;
mTreadBuf->DataBuf[count++] = 0x00; //DA pn为0
mTreadBuf->DataBuf[count++] = 0x00;
mTreadBuf->DataBuf[count++] = 0x01; //DT
mTreadBuf->DataBuf[count++] = 0x00;
}
else //非确认帧
{
switch(pQueueEle->cnCtl[0] & 0x0F) //系统应用功能码
{
case APPCTL_READDATA: /*读数据*/
switch(pQueueEle->cnCtl[1]) //系统控制码
{
case JCCTL_ELEENE: /*电能*/
mTreadBuf->DataBuf[count++] = 0x0D;
mTreadBuf->DataBuf[count++] = 0x60;
if(!(pQueueEle->devAddr[5]))
mTreadBuf->DataBuf[count++] = 0;
else
mTreadBuf->DataBuf[count++] = (int)pow(2,((pQueueEle->devAddr[5]+7) % 8));
mTreadBuf->DataBuf[count++] = (int)pow(2,((pQueueEle->devAddr[5]+7) / 8-1));
count++;
mTreadBuf->DataBuf[count++] = 0x0C;
memcpy( &mTreadBuf->DataBuf[count], pQueueEle->strData, 5 );
count+=5;
mTreadBuf->DataBuf[count++] = 0x03;
mTreadBuf->DataBuf[count++] = 0x18;
switch(pQueueEle->cnCtl[2])
{
case 0x01: /*正向有功总电能*/
mTreadBuf->DataBuf[count-9] = 0x10;
break;
case 0x02: /*反相有功总电能*/
mTreadBuf->DataBuf[count-9] = 0x40;
break;
case 0x03: /*正向无功总电能*/
mTreadBuf->DataBuf[count-9] = 0x20;
break;
case 0x04: /*反相无功总电能*/
mTreadBuf->DataBuf[count-9] = 0x80;
break;
}/*end of (switch(pQueueEle->cnCtl[2]))*/
break;
case JCCTL_MOSTNEEDANDTIME: /*最大需量及发生时间*/
switch(pQueueEle->cnCtl[2])
{
case 0x01: /*最大需量及发生时间*/
mTreadBuf->DataBuf[count++] = 0x0D;
mTreadBuf->DataBuf[count++] = 0x60;
if(!(pQueueEle->devAddr[5]))
{
mTreadBuf->DataBuf[count++] = 0;
}
else
{
mTreadBuf->DataBuf[count++] = (int)pow(2,((pQueueEle->devAddr[5]+7) % 8));
}
mTreadBuf->DataBuf[count++] = (int)pow(2,((pQueueEle->devAddr[5]+7) / 8-1));
mTreadBuf->DataBuf[count++] = 0x04;
mTreadBuf->DataBuf[count++] = 0x00;
memcpy( &mTreadBuf->DataBuf[count], pQueueEle->strData, 3 );
count+=3;
if(!(pQueueEle->devAddr[5]))
{
mTreadBuf->DataBuf[count++] = 0;
}
else
{
mTreadBuf->DataBuf[count++] = (int)pow(2,((pQueueEle->devAddr[5]+7) % 8));
}
mTreadBuf->DataBuf[count++] = (int)pow(2,((pQueueEle->devAddr[5]+7) / 8-1));
mTreadBuf->DataBuf[count++] = 0x08;
mTreadBuf->DataBuf[count++] = 0x00;
memcpy( &mTreadBuf->DataBuf[count], pQueueEle->strData, 3 );
count+=3;
break;
}/*end of (switch(pQueueEle->cnCtl[2]))*/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -