?? 103.c
字號:
cot = 44;
}
else
{
cot = 41;
}
}
else
{
cot = 41;
}
wLen = rbuf[1];
sbuf[0] = 0x68;
sbuf[1] = (BYTE)wLen;
sbuf[2] = (BYTE)wLen;
sbuf[3] = 0x68;
i = 4;
memcpy(&sbuf[4] ,&rbuf[4] ,wLen);
sbuf[4] = 0x00;
sbuf[8] = cot;
sbuf[sbuf[1] + 4] = Makecrc(&sbuf[4],sbuf[1]);
sbuf[sbuf[1] + 5] = 0x16;
wLen = sbuf[1] + 6;
tot_leng = wLen;
UART_Write(uart_port,sbuf,wLen);
break;
case 5://定值區(qū)
set_no = rbuf[20];
if (DEV_Check_Zone(dev_id ,set_no) == 1)
{
cot = 44;
}
else
{
cot = 41;
}
wLen = rbuf[1];
sbuf[0] = 0x68;
sbuf[1] = (BYTE)wLen;
sbuf[2] = (BYTE)wLen;
sbuf[3] = 0x68;
i= 4;
memcpy(&sbuf[4] ,&rbuf[4] ,wLen);
sbuf[4] = 0x00;
sbuf[8] = cot;
sbuf[sbuf[1] + 4] = Makecrc(&sbuf[4],sbuf[1]);
sbuf[sbuf[1] + 5] = 0x16;
wLen = sbuf[1] + 6;
tot_leng = wLen;
UART_Write(uart_port,sbuf,wLen);
break;
case 0x06://軟壓板
sfc_no = ginh;
sfc_state = rbuf[20] - 1;
if (DEV_Check_SFC(dev_id,sfc_no,sfc_state) == 1)
{
cot = 44;
}
else
{
cot = 41;
}
wLen = rbuf[1];
sbuf[0] = 0x68;
sbuf[1] = (BYTE)wLen;
sbuf[2] = (BYTE)wLen;
sbuf[3] = 0x68;
i= 4;
memcpy(&sbuf[4] ,&rbuf[4] ,wLen);
sbuf[4] = 0x00;
sbuf[8] = cot;
sbuf[sbuf[1] + 4] = Makecrc(&sbuf[4],sbuf[1]);
sbuf[sbuf[1] + 5] = 0x16;
wLen = sbuf[1] + 6;
tot_leng = wLen;
UART_Write(uart_port,sbuf,wLen);
break;
case 0x03://遙控,3——遙跳,4——遙合
ctrl_no = ginh;
if(DEV_Check_Control(dev_id, ctrl_no) ==1)
{
cot = 44;
}
else
{
cot = 41;
}
wLen = rbuf[1];
sbuf[0] = 0x68;
sbuf[1] = (BYTE)wLen;
sbuf[2] = (BYTE)wLen;
sbuf[3] = 0x68;
i= 4;
memcpy(&sbuf[4] ,&rbuf[4] ,wLen);
sbuf[4] = 0x00;
sbuf[8] = cot;
sbuf[sbuf[1] + 4] = Makecrc(&sbuf[4],sbuf[1]);
wLen = sbuf[1] + 6;
tot_leng = wLen;
UART_Write(uart_port,sbuf,wLen);
break;
}
break;
case 250://帶執(zhí)行的寫條目
switch(ginl)
{
case 4://定值
tiaomu = ginh;
b_set_no = DEV_Get_Zone(dev_id, &set_no);
b_get_set = DEV_Get_Setting(dev_id,set_no,&wsetbuf);
if( b_set_no == 1 && b_get_set == 1)
{
pt = &rbuf[17];
gdd = *pt++;
pt++;//數(shù)據(jù)寬度
pt++;//數(shù)目及后續(xù)狀態(tài)
for(i = 0;i < ngd;i ++)
{
switch(gdd)//gdd 通用分類數(shù)據(jù)描述:3——無符號整數(shù),7——短實(shí)數(shù)
{
case 3:
wsetbuf.set_val[tiaomu - 1].type = SET_T_UINT;
wsetbuf.set_val[tiaomu - 1].un_val.u_val = MAKEWORD(*pt,*(pt + 1));
pt += 3;
tiaomu = *pt;
pt += 2;
gdd = *pt++;
pt ++;
break;
case 6:
case 7:
wsetbuf.set_val[tiaomu - 1].type = SET_T_FLOAT;
gen_scan_float(pt, &wsetbuf.set_val[tiaomu - 1].un_val.f_val);
pt += 5;
tiaomu = *pt;
pt += 2;
gdd = *pt++;
pt ++;
break;
}
}
if(DEV_Set_Setting(dev_id,set_no,&wsetbuf) == 1)
{
cot = 40;
}
else
{
cot = 41;
}
}
else
{
cot = 41;
}
wLen = rbuf[1];
sbuf[0] = 0x68;
sbuf[1] = (BYTE)wLen;
sbuf[2] = (BYTE)wLen;
sbuf[3] = 0x68;
i= 4;
memcpy(&sbuf[4] ,&rbuf[4] ,wLen);
sbuf[4] = 0x00;
sbuf[8] = cot;
sbuf[sbuf[1] + 4] = Makecrc(&sbuf[4],sbuf[1]);
sbuf[sbuf[1] + 5] = 0x16;
wLen = sbuf[1] + 6;
tot_leng = wLen;
UART_Write(uart_port,sbuf,wLen);
return;
case 0x05:
set_no = rbuf[20];
b_set_no = DEV_Set_Zone(dev_id ,set_no);
if (b_set_no == 1)
{
cot = 40;
}
else
{
cot = 41;
}
wLen = rbuf[1];
sbuf[0] = 0x68;
sbuf[1] = (BYTE)wLen;
sbuf[2] = (BYTE)wLen;
sbuf[3] = 0x68;
i= 4;
memcpy(&sbuf[4] ,&rbuf[4] ,wLen);
sbuf[4] = 0x00;
sbuf[8] = cot;
sbuf[sbuf[1] + 4] = Makecrc(&sbuf[4],sbuf[1]);
sbuf[sbuf[1] + 5] = 0x16;
wLen = sbuf[1] + 6;
tot_leng = wLen;
UART_Write(uart_port,sbuf,wLen);
break;
case 0x06://軟壓板
sfc_no = ginh;
sfc_state = rbuf[20] - 1;
if(DEV_Set_SFC(dev_id,sfc_no,sfc_state) == 1)
{
cot = 40;
}
else
{
cot = 41;
}
wLen = rbuf[1];
sbuf[0] = 0x68;
sbuf[1] = (BYTE)wLen;
sbuf[2] = (BYTE)wLen;
sbuf[3] = 0x68;
i= 4;
memcpy(&sbuf[4] ,&rbuf[4] ,wLen);
sbuf[4] = 0x00;
sbuf[8] = cot;
sbuf[sbuf[1] + 4] = Makecrc(&sbuf[4],sbuf[1]);
sbuf[sbuf[1] + 5] = 0x16;
wLen = sbuf[1] + 6;
tot_leng = wLen;
UART_Write(uart_port,sbuf,wLen);
break;
case 0x03://遙控
ctrl_no = ginh;
if(DEV_Remote_Control(dev_id, ctrl_no) == 1)
{
cot = 40;
}
else
{
cot = 41;
}
wLen = rbuf[1];
sbuf[0] = 0x68;
sbuf[1] = (BYTE)wLen;
sbuf[2] = (BYTE)wLen;
sbuf[3] = 0x68;
i= 4;
memcpy(&sbuf[4] ,&rbuf[4] ,wLen);
sbuf[4] = 0x00;
sbuf[8] = cot;
sbuf[sbuf[1] + 4] = Makecrc(&sbuf[4],sbuf[1]);
sbuf[sbuf[1] + 5] = 0x16;
wLen = sbuf[1] + 6;
tot_leng = wLen;
UART_Write(uart_port,sbuf,wLen);
break;
}
break;
}
}
*/
void ASDU20(const BYTE *rbuf,BYTE byDevAddr,BYTE uart_port)
{
//復(fù)歸保護(hù)信號inf = 19 , cot = 20
BYTE cot;
BYTE inf;
BYTE i;
WORD Dev_Num;
WORD dev_id;
Dev_Num = Get_Device_Number();
byDevAddr = rbuf[5];
cot = rbuf[8];
inf = rbuf[11];
if(cot == 20 && inf == 19)
{
if(byDevAddr == 0xff)
{
for(i = 1;i <= Dev_Num;i ++)
{
DEV_Reset_Signal(i);
}
return;
}
dev_id = Addr_to_ID(byDevAddr);
DEV_Reset_Signal(dev_id);
}
}
//遙脈量上送
void ASDU88(const BYTE *rbuf,BYTE byDevAddr,BYTE uart_port)
{
BYTE *crc;
BYTE *apack;
WORD wLen;
WORD tot_leng;
apack = sbuf;
*apack++ = 0x10;
crc = apack;
*apack++ = 0x09;
*apack++ = byDevAddr;
*apack++ = Makecrc(crc,2);
*apack++ = 0x16;
wLen = apack - sbuf;
tot_leng = wLen;
UART_Write(uart_port,sbuf,wLen);
return;
}
void ASDU21(const BYTE* rbuf,BYTE byDevAddr,BYTE uart_port)
{
BYTE inf;
BYTE ginl;
BYTE ginh;
BYTE ngd;
BYTE kod;
WORD wLen;
WORD dev_id;
T_SET *p_set;
WORD set_no;
inf = rbuf[11];//信息序號
ngd = rbuf[13];
ginl = rbuf[14];//組號
ginh = rbuf[15];//條目號
kod = rbuf[16];//類型描述
switch(inf)
{
case 241://讀一個組的全部條目的值和屬性
switch(kod)
{
case 1://實(shí)際值
switch(ginl)
{
case 4://定值
p_set = &rsetbuf;
dev_id =Addr_to_ID(byDevAddr);
DEV_Get_Zone(dev_id, &set_no);
if(DEV_Get_Setting(dev_id,set_no,p_set) == 1)
{
flag = FLAG_READ_SET;
dznumber = 0;
sbuf[0] = 0x10;
sbuf[1] = 0x20;
sbuf[2] = byDevAddr;
sbuf[3] = Makecrc(&sbuf[1],2);
sbuf[4] = 0x16;
wLen = 5;
tot_leng = wLen;
NU_Sleep(20);
UART_Write(uart_port,sbuf,wLen);
return;
}
else
{
flag = 0x00;
sbuf[0] = 0x10;
sbuf[1] = 0x09;
sbuf[2] = byDevAddr;
sbuf[3] = Makecrc(&sbuf[1],2);
sbuf[4] = 0x16;
wLen = 5;
tot_leng = wLen;
UART_Write(uart_port,sbuf,wLen);
return;
}
case 1://遙測
dev_id = Addr_to_ID(byDevAddr);
if(INF_Get_Measure(dev_id, &measure) == 1)
{
flag = FLAG_READ_MEASURE;
sbuf[0] = 0x10;
sbuf[1] = 0x20;
sbuf[2] = byDevAddr;
sbuf[3] = Makecrc(&sbuf[1],2);
sbuf[4] = 0x16;
wLen = 5;
tot_leng = wLen;
UART_Write(uart_port,sbuf,wLen);
return;
}
else
{
flag = 0x00;
sbuf[0] = 0x10;
sbuf[1] = 0x09;
sbuf[2] = byDevAddr;
sbuf[3] = Makecrc(&sbuf[1],2);
sbuf[4] = 0x16;
wLen = 5;
tot_leng = wLen;
UART_Write(uart_port,sbuf,wLen);
return;
}
case 0x06://軟壓板信息
dev_id = Addr_to_ID(byDevAddr);
if(INF_Get_SFC(dev_id,&sfc) == 1)
{
flag = FLAG_READ_SFC;
sbuf[0] = 0x10;
sbuf[1] = 0x20;
sbuf[2] = byDevAddr;
sbuf[3] = Makecrc(&sbuf[1],2);
sbuf[4] = 0x16;
wLen = 5;
tot_leng = wLen;
UART_Write(uart_port,sbuf,wLen);
return;
}
else
{
flag = 0x00;
sbuf[0] = 0x10;
sbuf[1] = 0x09;
sbuf[2] = byDevAddr;
sbuf[3] = Makecrc(&sbuf[1],2);
sbuf[4] = 0x16;
wLen = 5;
tot_leng = wLen;
UART_Write(uart_port,sbuf,wLen);
return;
}
case 0x07://遙信量信息
dev_id = Addr_to_ID(byDevAddr);
if(INF_Get_Di(dev_id,&di) == 1)
{
flag = FLAG_READ_DI;
sbuf[0] = 0x10;
sbuf[1] = 0x20;
sbuf[2] = byDevAddr;
sbuf[3] = Makecrc(&sbuf[1],2);
sbuf[4] = 0x16;
wLen = 5;
tot_leng = wLen;
UART_Write(uart_port,sbuf,wLen);
return;
}
else
{
flag = 0x00;
sbuf[0] = 0x10;
sbuf[1] = 0x09;
sbuf[2] = byDevAddr;
sbuf[3] = Makecrc(&sbuf[1],2);
sbuf[4] = 0x16;
wLen = 5;
tot_leng = wLen;
UART_Write(uart_port,sbuf,wLen);
return;
}
}
break;
case 10://描述表
switch(ginl)
{
case 1://遙測組
dev_id = Addr_to_ID(byDevAddr);
if(DEV_Get_List(dev_id, LIST_T_ANALOG, &list) == 1)
{
flag = FLAG_READ_LIST;
p_analog_list = (T_ANALOG_ENTRY *) list.l_ptr;
list_num = 0;
sbuf[0] = 0x10;
sbuf[1] = 0x20;
sbuf[2] = byDevAddr;
sbuf[3] = Makecrc(&sbuf[1],2);
sbuf[4] = 0x16;
wLen = 5;
tot_leng = wLen;
UART_Write(uart_port,sbuf,wLen);
return;
}
else
{
flag = 0x00;
sbuf[0] = 0x10;
sbuf[1] = 0x09;
sbuf[2] = byDevAddr;
sbuf[3] = Makecrc(&sbuf[1],2);
sbuf[4] = 0x16;
wLen = 5;
tot_leng = wLen;
UART_Write(uart_port,sbuf,wLen);
return;
}
case 4://定值組
dev_id = Addr_to_ID(byDevAddr);
if(DEV_Get_List(dev_id, LIST_T_SET, &list) == 1)
{
flag = FLAG_READ_LIST;
p_set_list = (T_SET_ENTRY *) list.l_ptr;
list_num = 0;
sbuf[0] = 0x10;
sbuf[1] = 0x20;
sbuf[2] = byDevAddr;
sbuf[3] = Makecrc(&sbuf[1],2);
sbuf[4] = 0x16;
wLen = 5;
tot_leng = wLen;
UART_Write(uart_port,sbuf,wLen);
return;
}
else
{
flag = 0x00;
sbuf[0] = 0x10;
sbuf[1] = 0x09;
sbuf[2] = byDevAddr;
sbuf[3] = Makecrc(&sbuf[1],2);
sbuf[4] = 0x16;
wLen = 5;
tot_leng = wLen;
UART_Write(uart_port,sbuf,wLen);
return;
}
case 6://軟壓板
dev_id = Addr_to_ID(byDevAddr);
if(DEV_Get_List(dev_id, LIST_T_SFC, &list) == 1)
{
flag = FLAG_READ_LIST;
p_sfc_list = (T_SFC_ENTRY *) list.l_ptr;
list_num = 0;
sbuf[0] = 0x10;
sbuf[1] = 0x20;
sbuf[2] = byDevAddr;
sbuf[3] = Makecrc(&sbuf[1],2);
sbuf[4] = 0x16;
wLen = 5;
tot_leng = wLen;
UART_Write(uart_port,sbuf,wLen);
return;
}
else
{
flag = 0x00;
sbuf[0] = 0x10;
sbuf[1] = 0x09;
sbuf[2] = byDevAddr;
sbuf[3] = Makecrc(&sbuf[1],2);
sbuf[4] = 0x16;
wLen = 5;
tot_leng = wLen;
UART_Write(uart_port,sbuf,wLen);
return;
}
}
break;
}
}
}
/*******************************主站側(cè)初始化***********************************/
/* 主站側(cè)初始化 */
BOOL MST_Initialize()
{
STATUS status;
T_UART_CONFIG config;
if (uart_port == UART_PORT_A)
{
config = g_sys_config.uart_a;
}
else
{
config = g_sys_config.uart_b;
}
config.pcb = 0;//check_packet 回調(diào)函數(shù)入口地址 如果為0表示自動判斷每一幀是否結(jié)束
if ( !UART_Open(uart_port, &config) )
{
return FALSE;
}
status=NU_Create_Task(&nuTask_Serial,"TASK_Serial",Task_Serial,0,NU_NULL,
STACK_SERIAL,0x2000,10,0,NU_PREEMPT,NU_START);
return (status == true);
}
/* 串口任務(wù) */
VOID Task_Serial(UNSIGNED argc, VOID *argv)
{
BYTE recv_buf[256];
hand = INF_Open_Database();
// sys_init_telnet();
LoopTask:
if (UART_Read(uart_port, recv_buf, UART_WAIT_INF) != 0)
{
Serial_Interpret(recv_buf,uart_port);
}
goto LoopTask;
}
/*****************************輔助處理函數(shù)************************************/
/* 裝置地址轉(zhuǎn)換為設(shè)備編號 */
WORD Addr_to_ID(BYTE byDevAddr)
{
BYTE i;
for(i = 0;i <= g_ied_num - 1 ; i++)
{
if(g_ied_list[i].dev_data[5] == byDevAddr)
{
return g_ied_list[i].dev_id;
}
}
return -1;
}
/* 設(shè)備地址轉(zhuǎn)換為裝置地址 */
BYTE ID_to_Addr(BYTE dev_id)
{
BYTE i;
for(i = 0;i <= g_ied_num - 1 ; i++)
{
if(g_ied_list[i].dev_id == dev_id)
{
return (BYTE) g_ied_list[i].dev_data[5];
}
}
return -1;
}
/* 由裝置地址獲得功能類型 */
BYTE Get_Fun(WORD dev_id)
{
BYTE i;
for(i = 0;i <= g_ied_num - 1 ; i++)
{
if(g_ied_list[i].dev_id == dev_id)
{
return (BYTE) g_ied_list[i].dev_type;
}
}
return -1;
}
/* 獲得裝置數(shù)目 */
WORD Get_Device_Number()
{
return g_ied_num;
}
/* 計(jì)算校驗(yàn)和 */
BYTE Makecrc(BYTE *str,WORD nSize)
{
WORD i;
BYTE J;
J=0;
for(i=0;i < nSize;i++)
{
J+=str[i];
}
return J;
}
/* 串口接受回調(diào)函數(shù) */
WORD check_packet(const BYTE *p_data, WORD data_len)
{
if(p_data[0] == 0x10)
{
if(data_len == 5 && p_data[4] == 0x16)
{
return UART_PKT_FIN;
}
return UART_PKT_CON;
}
if(p_data[0] == 0x68)
{
if(data_len == p_data[1] + 6)
{
return UART_PKT_FIN;
}
return UART_PKT_CON;
}
return UART_PKT_ERR;
}
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -