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

📄 sypbprotocol.cpp

📁 配电变压器负荷监测与控制系统数据监测传输
💻 CPP
📖 第 1 页 / 共 5 页
字号:
// 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 + -