📄 cdt.c
字号:
/*************************************************************************/
/* */
/* 国电南思 */
/* */
/*************************************************************************/
/*************************************************************************/
/* FILE NAME VERSION */
/* */
/* cdt.c cdt.h cdtcode.c */
/* */
/* DESCRIPTION */
/* */
/* 南京力导保护管理机通讯规约(扩展CDT) */
/* */
/* HISTORY */
/* */
/* NAME DATE REMARKS */
/* */
/* TT 2006.02.21 */
/* */
/*************************************************************************/
/*************************************************************************
通信设置:1200,8,1 ,NO
软件功能:遥控,对时,上送保护信息,定值,遥测,遥信。
备注:该规约除召唤定值使用扩展CDT外,其他功能仍按标准CDT规则
**************************************************************************/
#include "cdt.h"
static WORD pro_check_packet(const BYTE *p_data, WORD data_len)
{
if (data_len <= 6)
{
if (((data_len % 2) != 0) && (p_data[data_len-1] == 0xEB))
{
return UART_PKT_CON;
}
if (((data_len % 2) == 0) && (p_data[data_len-1] == 0x90))
{
return UART_PKT_CON;
}
return UART_PKT_ERR;
}
if (data_len < 12)
{
return UART_PKT_CON;
}
if (data_len == (p_data[8]*6+12))
{
return UART_PKT_FIN;
}
return UART_PKT_CON;
}
BOOL IED_Initialize()
{
return DEV_Create_IED(g_ied_list, sizeof(g_ied_list)/sizeof(T_IED));
}
/* 协议初始化 */
static BOOL pro_initialize()
{
T_UART_CONFIG config;
STATUS status;
if (m_dev_port == UART_PORT_A)
{
config =g_sys_config.uart_a;
}
else if (m_dev_port == UART_PORT_B)
{
config =g_sys_config.uart_b;
}
else
{
return FALSE;
}
config.pcb =pro_check_packet;
if ( !UART_Open(m_dev_port, &config) )
{
return FALSE;
}
NU_Create_Semaphore(&m_com_lock, "COM_LOCK", 1, NU_FIFO);
status =NU_Create_Task(&m_232_task, "TASK_232", task_232, 0, NU_NULL,
m_232_stack, 0x2000, 10, 0, NU_PREEMPT, NU_START
);
/*status =NU_Create_Task(&m_232x_task, "TASK_232x", task_232x, 0, NU_NULL,
m_232x_stack, 0x2000, 10, 0, NU_PREEMPT, NU_START
);*/
/*status =NU_Create_Task(&m_232event_task, "TASK_232event", task_232event, 0, NU_NULL,
m_232event_stack, 0x2000, 10, 0, NU_PREEMPT, NU_START
);*/
/*status =NU_Create_Task(&m_232di_task, "TASK_232di", task_232di, 0, NU_NULL,
m_232di_stack, 0x2000, 10, 0, NU_PREEMPT, NU_START
);*/
return (status == NU_SUCCESS);
}
/* 设备初始化 */
static BOOL pro_open_ied(const T_IED *p_ied)
{
return TRUE;
}
/* 设备服务接口 */
BOOL LD_service(T_IED *p_ied, T_MESSAGE *p_msg)
{
BOOL ret_code =FALSE;
/* [初始化部分] */
switch(p_msg->m_type)
{
case MSG_T_INIT:
/* 初始化协议 */
return pro_initialize();
case MSG_T_OPEN:
/* 初始化设备 */
return pro_open_ied((T_IED *)(p_msg->m_data));
default:
break;
}
//设备操作接口部分
DEV_LOCK_COM();
switch(p_msg->m_type)
{
case MSG_T_LIST:
if(p_msg->m_flag == MSG_F_READ)
{
ret_code = c103_get_List(p_ied, (T_LIST*) p_msg->m_data);
}
break;
case MSG_T_SET:
if(p_msg->m_flag == MSG_F_READ)
{
ret_code = cdt_get_setting(p_ied, (T_SET *)p_msg->m_data);
}
break;
case MSG_T_CTRL:
if(p_msg->m_flag == MSG_F_CHECK)
{
ret_code = cdt_check_control(p_ied, (WORD) p_msg->m_data);
// NU_Sleep(100);
}
if (p_msg->m_flag == MSG_F_WRITE)
{
ret_code = cdt_remote_control(p_ied, (WORD) p_msg->m_data);
// NU_Sleep(100);
}
break;
case MSG_T_CLOCK:
/* 广播对时 */
if(p_msg->m_flag == MSG_F_WRITE)
{
time_num++;
if(time_num==50)
{
time_num=0;
ret_code = cdt_set_clock(p_ied, (T_DATE *)p_msg->m_data);
}
ret_code=true;
//NU_Sleep(200);
}
break;
default:
break;
}
//开放通讯资源
NU_Sleep(50);
DEV_UNLOCK_COM();
return ret_code;
}
static BYTE calc_crc_8(const BYTE *inf, BYTE nSize)
{
int i =0, r =0;
DWORD crc =0;
while (i < nSize)
{
if (inf[i] & (0x80 >> r))
{
crc |=0x01;
}
if (crc >= 0x100)
{
crc ^=0x107;
}
crc <<=1;
r++;
if (r == 8)
{
r=0;
i++;
}
}
for (i =0; i < 8; i++)
{
if (crc >= 0x100)
{
crc ^=0x107;
}
crc <<=1;
}
crc >>=1;
crc =~crc;
return (BYTE)crc;
}
static WORD dc_measure_value(BYTE low, BYTE hi)
{
WORD ms_val =0;
WORD v =MAKEWORD(low,hi);
ms_val =((v & 0x4000) << 1) | ((v & 0x8000) >> 1);
if ((v & 0x0800) != 0)
{
ms_val |=INF_MS_NEGATIVE;
ms_val |=0x800-(v & 0x7FF);
}
else
{
ms_val |=(v & 0x7FF);
}
return ms_val;
}
/* 重要遥测量 */
static void Frame_A_Interpret(const BYTE *body, WORD nSize)
{
int i,x;
int n;
WORD cpu,fu1,fu2;
int id;
int temp;
int temp1;
BOOL bChanged =FALSE;
for (i =0; i < nSize; i++)
{
/*if(body[0]==0x6f)
{
NU_Sleep(100);
}*/
if((body[0]&0x80)==0)
{
if (calc_crc_8(&body[0], 5) != body[5])
{
body +=6;
continue;
}
id=body[0]*2;
yc_temp[id]=MAKEWORD(body[1],body[2]);
yc_temp[id+1]=MAKEWORD(body[3],body[4]);
fu1=yc_temp[id];
fu2=yc_temp[id+1];
if((fu1&0x800)!=0)
{
yc_temp[id]=((yc_temp[id]&0x7ff)-1)^0x7ff;
yc_temp[id]=yc_temp[id]|INF_MS_NEGATIVE;
}
if((fu2&0x800)!=0)
{
yc_temp[id+1]=((yc_temp[id+1]&0x7ff)-1)^0x7ff;
yc_temp[id+1]=yc_temp[id+1]|INF_MS_NEGATIVE;
}
bChanged =TRUE;
}
else//变位遥信//1
{
if(body[0]>=0xf0)
{
if(body[0]==0xf8)
{
cpu=(body[0]-0xf0)*4;
for(n=0;n<2;n++)
{
m_di.di_val[0]=MAKEDWORD(MAKEWORD(body[1+n],0),0);
INF_Set_Di(cpu+n, &m_di);
}
}
if(body[0]==0xf7)
{
cpu=(body[0]-0xf0)*4+1;
for(n=0;n<3;n++)
{
m_di.di_val[0]=MAKEDWORD(MAKEWORD(body[1+n],0),0);
INF_Set_Di(cpu+n, &m_di);
}
}
if(body[0]<0xf7)
{
cpu=(body[0]-0xf0)*4+1;
for(n=0;n<4;n++)
{
m_di.di_val[0]=MAKEDWORD(MAKEWORD(body[1+n],0),0);
INF_Set_Di(cpu+n, &m_di);
}
}//end for if(body[0]<0xf7)
}//end for if(body[0]>=0xf0)
}//end for else //1
body +=6;
}
////////////////////////////////////////////////////////////////////////////////////////////
for(n=0;n<4;n++)
{
m_ms.ms_val[n]=yc_temp[n];
}
INF_Set_Measure(2, &m_ms);///331(电容器)
/////////////////////////////////////////////////////////////////////////////////////////
for(n=0;n<3;n++)
{
m_ms.ms_val[n]=yc_temp[n+4];
}
INF_Set_Measure(3, &m_ms);//315)
///////////////////////////////////////////////////////////////////////////////////////////
for(i=3;i<28;i++)
{
for(n=0;n<7;n++)
{
temp=(i-3)*7;
temp=temp+7;
temp=temp+n;
//temp=(n+(i-3)*7+8);
m_ms.ms_val[n]=yc_temp[temp];
}
INF_Set_Measure(i+1, &m_ms);//311(进线)
}
/////////////////////////////////////////////////////////////////////////////////////////////////
for(i=28;i<34;i++)
{
for(n=0;n<12;n++)
{
temp1=(i-28)*12;
temp1=temp1+182;
temp1=temp1+n;
//temp=(n+(i-28)*12+183);
m_ms.ms_val[n]=yc_temp[temp1];
}
INF_Set_Measure(i+1, &m_ms);//313
}
//break;
}
/* 次要遥测量 */
static void Frame_B_Interpret(const BYTE *body, WORD nSize)
{
int i;
BOOL bChanged =FALSE;
for (i =0; i < nSize; i++)
{
if (calc_crc_8(&body[0], 5) != body[5])
{
body +=6;
continue;
}
switch (body[0]) /* 功能码 */
{
case 0x01: //条目4-5
m_ms.ms_val[3] =dc_measure_value(body[1], body[2]);
m_ms.ms_val[4] =dc_measure_value(body[3], body[4]);
bChanged =TRUE;
break;
case 0x03: //条目6-7
m_ms.ms_val[5] =dc_measure_value(body[1], body[2]);
m_ms.ms_val[6] =dc_measure_value(body[3], body[4]);
bChanged =TRUE;
break;
case 0x04: //条目8
m_ms.ms_val[7] =dc_measure_value(body[1], body[2]);
bChanged =TRUE;
break;
default:
break;
}
body +=6;
}
if (bChanged )
{
INF_Set_Measure(m_dev_id, &m_ms);
}
}
/* 一般遥测量 */
static void Frame_C_Interpret(const BYTE *body, WORD nSize)
{
int i;
BOOL bChanged =FALSE;
for (i =0; i < nSize; i++)
{
if (calc_crc_8(&body[0], 5) != body[5])
{
body +=6;
continue;
}
switch (body[0])
{
case 0x01: //条目9-10
m_ms.ms_val[8] =dc_measure_value(body[1], body[2]);
m_ms.ms_val[9] =dc_measure_value(body[3], body[4]);
bChanged =TRUE;
break;
case 0x03: //条目11-12
m_ms.ms_val[10] =dc_measure_value(body[1], body[2]);
m_ms.ms_val[11] =dc_measure_value(body[3], body[4]);
bChanged =TRUE;
break;
case 0x05: //条目13-14
m_ms.ms_val[12] =dc_measure_value(body[1], body[2]);
m_ms.ms_val[13] =dc_measure_value(body[3], body[4]);
bChanged =TRUE;
break;
case 0x07: //条目15-16
m_ms.ms_val[14] =dc_measure_value(body[1], body[2]);
m_ms.ms_val[15] =dc_measure_value(body[3], body[4]);
bChanged =TRUE;
break;
case 0x09: //条目17-18
m_ms.ms_val[16] =dc_measure_value(body[1], body[2]);
m_ms.ms_val[17] =dc_measure_value(body[3], body[4]);
bChanged =TRUE;
break;
case 0x0B: //条目19-20
m_ms.ms_val[18] =dc_measure_value(body[1], body[2]);
m_ms.ms_val[19] =dc_measure_value(body[3], body[4]);
bChanged =TRUE;
break;
}
body +=6;
}
if (bChanged )
{
INF_Set_Measure(m_dev_id, &m_ms);
}
}
/* 遥信量 */
static void Frame_D_Interpret(const BYTE *body, WORD nSize)
{
static DWORD di_bitmap =0; //遥信量有效标志
int i;
int n;
WORD temp,id;
//DWORD di_val=m_di.di_val[0];
BOOL bChanged =FALSE;
T_DATE realdate;
for (i =0; i < nSize; i++)
{
WORD low,hi;
DWORD state;
if(body[0]==0xf8)
{
m_di.di_val[0]=MAKEDWORD(MAKEWORD(body[1],0),0);
INF_Set_Di(32, &m_di);
m_di.di_val[0]=MAKEDWORD(MAKEWORD(body[2],0),0);
INF_Set_Di(33, &m_di);
}
if(body[0]<0xf8)
{
for(n=0;n<4;n++)
{
m_di.di_val[0]=MAKEDWORD(MAKEWORD(body[1+n],0),0);
id=(body[0]-0xf0)*4+n+1;
if(body[0]==0xf7)
{
if(n==2)
{
n++;
}
}
if(id<34)
{
INF_Set_Di(id, &m_di);
}
}
}
body +=6;
}
//break;
}
///////////soe
static void Frame_E_Interpret(const BYTE *body_e, WORD Size)
{
int z;
int n;
int id;
WORD temp;
WORD code;
BYTE state;
T_DATE t_date;
T_EVENT t_event;
T_LIST t_list;
T_IED * p_ied;
BOOL bChanged =FALSE;
for (z =0; z < Size; z++)
{
if(body_e[0]==0x80)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -