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