📄 cdt_zlp.c
字号:
/* */
/*************************************************************************/
/*************************************************************************/
/* FILE NAME VERSION */
/* */
/* cdt_rtu.c 1.0 */
/* */
/* DESCRIPTION */
/* */
/* 无锡斯达直流屏RTU通讯规约(CDT) */
/* */
/* HISTORY */
/* */
/* NAME DATE REMARKS */
/* */
/*************************************************************************/
/*************************************************************************/
#include "cdt_rtu.h"
#define UART_PKT_ERR 0
#define UART_PKT_CON 1
#define UART_PKT_FIN 2
#define FRAME_A 0x61
#define FRAME_B 0xC2
#define FRAME_C 0xB3
#define FRAME_D 0xF4
#define FRAME_E 0x26
static const BYTE CDT_BCH[]=
{
0x00, 0x07, 0x0E, 0x09, 0x1C, 0x1B, 0x12, 0x15,
0x38, 0x3F, 0x36, 0x31, 0x24, 0x23, 0x2A, 0x2D,
0x70, 0x77, 0x7E, 0x79, 0x6C, 0x6B, 0x62, 0x65,
0x48, 0x4F, 0x46, 0x41, 0x54, 0x53, 0x5A, 0x5D,
0xE0, 0xE7, 0xEE, 0xE9, 0xFC, 0xFB, 0xF2, 0xF5,
0xD8, 0xDF, 0xD6, 0xD1, 0xC4, 0xC3, 0xCA, 0xCD,
0x90, 0x97, 0x9E, 0x99, 0x8C, 0x8B, 0x82, 0x85,
0xA8, 0xAF, 0xA6, 0xA1, 0xB4, 0xB3, 0xBA, 0xBD,
0xC7, 0xC0, 0xC9, 0xCE, 0xDB, 0xDC, 0xD5, 0xD2,
0xFF, 0xF8, 0xF1, 0xF6, 0xE3, 0xE4, 0xED, 0xEA,
0xB7, 0xB0, 0xB9, 0xBE, 0xAB, 0xAC, 0xA5, 0xA2,
0x8F, 0x88, 0x81, 0x86, 0x93, 0x94, 0x9D, 0x9A,
0x27, 0x20, 0x29, 0x2E, 0x3B, 0x3C, 0x35, 0x32,
0x1F, 0x18, 0x11, 0x16, 0x03, 0x04, 0x0D, 0x0A,
0x57, 0x50, 0x59, 0x5E, 0x4B, 0x4C, 0x45, 0x42,
0x6F, 0x68, 0x61, 0x66, 0x73, 0x74, 0x7D, 0x7A,
0x89, 0x8E, 0x87, 0x80, 0x95, 0x92, 0x9B, 0x9C,
0xB1, 0xB6, 0xBF, 0xB8, 0xAD, 0xAA, 0xA3, 0xA4,
0xF9, 0xFE, 0xF7, 0xF0, 0xE5, 0xE2, 0xEB, 0xEC,
0xC1, 0xC6, 0xCF, 0xC8, 0xDD, 0xDA, 0xD3, 0xD4,
0x69, 0x6E, 0x67, 0x60, 0x75, 0x72, 0x7B, 0x7C,
0x51, 0x56, 0x5F, 0x58, 0x4D, 0x4A, 0x43, 0x44,
0x19, 0x1E, 0x17, 0x10, 0x05, 0x02, 0x0B, 0x0C,
0x21, 0x26, 0x2F, 0x28, 0x3D, 0x3A, 0x33, 0x34,
0x4E, 0x49, 0x40, 0x47, 0x52, 0x55, 0x5C, 0x5B,
0x76, 0x71, 0x78, 0x7F, 0x6A, 0x6D, 0x64, 0x63,
0x3E, 0x39, 0x30, 0x37, 0x22, 0x25, 0x2C, 0x2B,
0x06, 0x01, 0x08, 0x0F, 0x1A, 0x1D, 0x14, 0x13,
0xAE, 0xA9, 0xA0, 0xA7, 0xB2, 0xB5, 0xBC, 0xBB,
0x96, 0x91, 0x98, 0x9F, 0x8A, 0x8D, 0x84, 0x83,
0xDE, 0xD9, 0xD0, 0xD7, 0xC2, 0xC5, 0xCC, 0xCB,
0xE6, 0xE1, 0xE8, 0xEF, 0xFA, 0xFD, 0xF4, 0xF3
};
/* 接收中断回调函数,用以判断数据帧的结束。*/
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;
}
/* CRC校验 */
static BYTE calc_crc_8(const BYTE *ptr, BYTE nSize)
{
BYTE cdt,i;
cdt = 0;
for (i = 0; i < nSize; i++)
{
cdt = CDT_BCH[cdt ^ *(ptr+i)];
}
return (~cdt);
}
static WORD dc_measure_value(BYTE low, BYTE hi)
{
WORD ms_val =0;
WORD v =MAKEWORD(low,hi);
if ((v & 0x8000) != 0)//如果第12位不为0
{
//遥测值为负数
ms_val = ((0 -(v & 0x7FF))) |INF_MS_NEGATIVE;
}
else
{
ms_val = (v & 0x7FF);
}
return ms_val;
}
/* 重要遥测量 */
static void Frame_A_Interpret(const BYTE *body, WORD nSize)//A帧数据
{
int i;
BOOL bChanged =FALSE;
m_ms1.ms_num=32;
for (i =0; i < nSize; i++)
{
if (calc_crc_8(&body[0], 5) != body[5])
{
body +=6;
continue;
}
if(body[0] == 0xE1 || body[0] == 0xE3)
{
body += 6;
continue;
}
switch (body[0]) // 功能码
{
case 0x00:
m_ms1.ms_val[0] =dc_measure_value(body[1], body[2]);
m_ms1.ms_val[1] =dc_measure_value(body[3], body[4]);
bChanged =TRUE;
break;
case 0x01:
m_ms1.ms_val[2] =dc_measure_value(body[1], body[2]);
m_ms1.ms_val[3] =dc_measure_value(body[3], body[4]);
bChanged =TRUE;
break;
case 0x02:
m_ms1.ms_val[4] =dc_measure_value(body[1], body[2]);
m_ms1.ms_val[5] =dc_measure_value(body[3], body[4]);
bChanged =TRUE;
break;
default:
break;
}
body +=6;
}
if (bChanged)
{
INF_Set_Measure(1, &m_ms1);
}
}
/* 遥信量 */
static void Frame_D_Interpret(const BYTE *body, WORD nSize)//D帧遥信数据
{
int i,n;
BOOL bChanged =FALSE;
for (i =0; i < nSize; i++)
{
WORD low,hi;
DWORD state;
if (calc_crc_8(&body[0], 5) != body[5])
{
body +=6;
continue;
}
if(body[0] == 0xE1 || body[0] == 0xE3)
{
body += 6;
continue;
}
low =MAKEWORD(body[1], body[2]);
hi =MAKEWORD(body[3], body[4]);
state=MAKEDWORD(low, hi);
n=body[0]-0xf0;
switch ( n ) /* 功能码 */
{
case 0: //条目1-32
//di_bitmap1 |=0xFFFFFFFF;
m_di1.di_val[0] =state & 0xFFFFFFFF;
bChanged=TRUE;
break;
case 1: //条目33-64
//di_bitmap2 |=0xFFFFFFFF;
m_di1.di_val[1] =state & 0xFFFFFFFF;
bChanged=TRUE;
break;
case 2: //条目33-64
//di_bitmap2 |=0xFFFFFFFF;
m_di1.di_val[2] =state & 0xFFFFFFFF;
bChanged=TRUE;
break;
default:
break;
}
body +=6;
}
if (bChanged)
{
m_di1.di_num = 64;
INF_Set_Di(1, &m_di1);
}
}
static void DC_Interpret(const BYTE *pFrame)
{
//check control word here
if (calc_crc_8(&pFrame[6], 5) != pFrame[11])
{
return;
}
switch( pFrame[7] ) /* 帧类型 */
{
case FRAME_A:
Frame_A_Interpret(&pFrame[12], pFrame[8]);
break;
case FRAME_D:
Frame_D_Interpret(&pFrame[12], pFrame[8]);
break;
default:
break;
}
}
void CDTTask()
{
int bResult;
unsigned int checkresult;
while (1)
{
bResult = mmBRecv();
if (bResult>=0)
{
BRxbuffer[BRxBufferLen++] = LO(bResult);
checkresult = pro_check_packet(BRxbuffer, BRxBufferLen);
switch(checkresult)
{
case UART_PKT_ERR:
BRxBufferLen = 0;
break;
case UART_PKT_CON:
break;
case UART_PKT_FIN:
DC_Interpret(m_rx_buf);
break;
default:
break;
}
}
}
}
/* module's task */
static VOID task_232(UNSIGNED argc, VOID *argv)
{
T_IED *p_ied;
p_ied =DEV_First_IED();
m_dev_id = p_ied->dev_id;
Loop232:
if (UART_Read(m_dev_port, m_rx_buf, 60000uL) != 0)
{
DC_Interpret(m_rx_buf);
p_ied->dev_flag |=DEV_F_ONLINE;
}
else
{
p_ied->dev_flag &=~DEV_F_ONLINE;
}
goto Loop232;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -