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

📄 huaning94.c

📁 lpc2136芯片的硬件全部功能示例程序
💻 C
字号:
//94规约处理函数
#include "main.h"
#include "sample.h"
#include "timer.h"
#include "function.h"
#include "uart.h"
static DWORD hn94_flag;	
///////////////////////////
//标志定义
#define HN94_INIT   	(1<<0)//初始化标志
#define HN94_YK_SELECT 	(1<<1)//遥控选择
#define HN94_DOWN_SET  	(1<<2)//下载定值
#define HN94_YK_TIMER   (1<<3)//遥控过标志

//超时定义
#define HN94_YK_TIMEOUT  60*Fpclk  //遥控选择(定值)状态维持60秒
#define HN94_YK_CNT  	 10*Fpclk  //遥控执行间隔10秒

/* 报文类型码 */
/*hn94规约控制方向报文中的报文类型码*/
#define WPD_Reset_Type           0x80 /*复位保护动作信号*/
#define WPD_Clock_Type           0x81 /*设置时钟*/ 
#define WPD_Polling_Type         0x83 /*巡检*/
#define WPD_PollingRepeat_Type   0x84 /*重复询问*/ 
#define WPD_GetSet_Type          0x85 /*召唤保护某CPU的定值*/ 
#define WPD_GetDi_Type           0x86 /*召唤保护某CPU现在的开关输入状态*/ 
#define WPD_GetEvent_Type        0x87 /*召唤保护某CPU记录的事件报告*/ 
#define WPD_Bulletin_Type        0x8a /*发送现有事件或告警报告*/ 
#define WPD_SetSetting_Type      0x8c /*修改定值*/
#define WPD_YKSelect_Type        0x8F /*遥控选择遥控选择反较*/ 
#define WPD_YKExc_Type           0x90 /*遥控执行*/
#define WPD_GetSoe_Type          0x0E /*召唤soe*/
#define WPD_GetPulse_Type        0x0D /*召唤脉冲电度*/
/*hn94规约监控方向报文中的报文类型码*/
#define WPD_Finish_Type          0x04 /*本报告报文结束*/
#define WPD_Measure_Type         0x06 /*确认主站传来的报文遥测报文*/ 
#define WPD_Denial_Type          0x15 /*否定主站传来的报文*/
#define WPD_Event_Type           0xB0 /*保护事件报告*/ 
#define WPD_Information_Type     0xBA /*有报告*/ 
#define WPD_Di_Type              0xBE /*保护传送开关量*/ 
#define WPD_Busy_Type            0xC0 /*本机忙*/ 
#define WPD_Setting_Type         0xBD /*保护定值*/ 
#define WPD_Soe_Type             0x1C /*soe报文*/ 
//////////////////////////

////////////////////////////
//变量定义
DWORD  hn94_di_cnt=0; 	//遥信计数器
DWORD  hn94_cnt=0; 		//超时计数器
BYTE   hn94_addr;		//地址
BYTE   hn94_Event_Tail;
///////////////////////////
static BYTE huaning_CrcMake(BYTE* pSrc, BYTE lSize )//累加CRC
{
	BYTE crc,i;
	crc=0;
	for(i=0;i<lSize;i++)
	{
		crc+=pSrc[i];
	}
	crc=~(crc-1);
	//pSrc[lSize]= (BYTE)crc;
	crc=(BYTE)crc;
	return crc;
}
void huaning94_init(void)
{
	//初始化
	hn94_flag=HN94_INIT;//标志清零
	//clear all event,alarm,soe
}
//ACK
void huaning94_ack(BYTE *pSend)
{
	pSend[0]=hn94_addr;
	pSend[1]=0x06;
	pSend[2]=0x0;
	pSend[3]=huaning_CrcMake(&pSend[0],3);
}
//NAK
void huaning94_nak(BYTE *pSend)
{
	pSend[0]=hn94_addr;
	pSend[1]=0x15;
	pSend[2]=0x0;
	pSend[3]=huaning_CrcMake(&pSend[0],3);
}
//设置时钟
void huaning94_set_clock(BYTE *pRev,BYTE *pSend)
{
	TDATE date;
	date.year=BcdHex(MAKEWORD(pRev[3],pRev[4]));
	date.month=BcdHex(pRev[5]);
	date.day=BcdHex(pRev[6]);
	date.hour=BcdHex(pRev[7]);
	date.min=BcdHex(pRev[8]);
	date.ms=BcdHex(pRev[9])*1000;
	if(Timer_Write(&date))
	{
		huaning94_ack(pSend);
	}
	else
	{
		huaning94_nak(pSend);
	}
	
}
//规约处理函数
int huaning94_process(BYTE *pRev,BYTE *pSend)
{
	BYTE crc;
	BYTE len;
	if(!pRev || !pSend)
		return ERROR;	 
	//check crc 不用检查报文内容的合法性和地址,在com.c中做
	len=pRev[2]+3;
	if(!len)
		return ERROR;
	crc=huaning_CrcMake(pRev,len);
	if(crc==pRev[len])
	{
		//分析报文
		switch(pRev[1])
		{
			case WPD_Reset_Type://复归
			//发复归开出
			//熄灭保护,告警灯
			//收复归开出
				huaning94_ack(pSend);
			break;
			case WPD_Clock_Type://设置时钟
				huaning94_set_clock(pRev,pSend);
			break;
			case WPD_Polling_Type://遥测
			  
			break;
			case WPD_GetSet_Type://召唤定值
			  
			break;
			case WPD_GetDi_Type://召唤开关量
			  
			  break;
			case WPD_Bulletin_Type://召唤保护告警事件
			  
			  break;
			case WPD_GetEvent_Type://召唤保护事件
			
			 break;
			case WPD_SetSetting_Type://修改定值
			
			  break;
			case WPD_YKSelect_Type://遥控选择
			  
			  break;
			case WPD_YKExc_Type://遥控执行
			  break;
			case WPD_GetSoe_Type://召唤SOE

			  break;
			case WPD_GetPulse_Type://召唤脉冲电度
			  break;
			default:
				break;
		}
	}
	UART_Write(pSend,pSend[2]+3);
	return OK;
	
}

⌨️ 快捷键说明

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