?? 103.c
字號:
/****************************************************************************/
/* */
/* 版權 (c) 2000-2010 國電南京自動化股份有限公司 */
/* */
/****************************************************************************/
/****************************************************************************/
/* 文件名 版本 */
/* */
/* 103.c 1.02 */
/* */
/* 概述: */
/* */
/* 南瑞繼保串口103主站側規約 */
/* */
/* 歷史紀錄: */
/* */
/* 名字 日期 注釋 */
/* */
/* 鄭小軍 2001-10-15 創建初始化版本1.00 */
/* 鄭小軍 2002-04-02 修改遙測(DWORD->WORD) */
/* 2002-10-15 更新版本1.1 */
/****************************************************************************/
#include "typedef.h"
#include "generic.h"
#include "inforec.h"
#include "dev_mng.h"
#include "103.h"
//#include "telnet.h"
#define UART_RCV_SIZE 250
static WORD flag;
static BYTE scn;
BYTE sbuf[UART_PACKET_SIZE];
BYTE last_cmd;
WORD last_id;
WORD tot_leng;
BYTE dznumber;
BYTE list_num;
BYTE a; //fun
BYTE b; //inf
BYTE c; //dcc
BYTE ctrl_no1; //b
BYTE d;
BYTE e;
BYTE count;
T_SET rsetbuf;
T_SET wsetbuf;
T_LIST list;
T_MEASURE measure;
T_SFC sfc;
T_DI di;
T_ANALOG_ENTRY *p_analog_list;
T_SET_ENTRY *p_set_list;
T_SFC_ENTRY *p_sfc_list;
extern T_IED g_ied_list[];
extern WORD g_ied_num;
/* 串口設置 */
extern BYTE uart_port;
/* 數據庫句柄 */
static HANDLE hand;
/* 串口任務 */
static BYTE STACK_SERIAL[0x2000];
static NU_TASK nuTask_Serial;
/* 數據接受處理函數 */
void Serial_Interpret(const BYTE* rbuf,BYTE uart_port)
{
BYTE byDevAddr;
BYTE i;
WORD Dev_Num;
Dev_Num = Get_Device_Number();
for (i = 1;i <= Dev_Num;i++)
{
byDevAddr = ID_to_Addr(i);
switch (rbuf[0])
{
case FRAME_T_CON:
if (rbuf[2] == byDevAddr)
{
Ack_Staid(rbuf,byDevAddr,uart_port);
return;
}
break;
case FRAME_T_VOL:
if (rbuf[5] == byDevAddr || rbuf[5] == 0xff)
{
Ack_Changeable(rbuf,byDevAddr,uart_port);
return;
}
break;
default:
return;
}
}
}
//可變幀長報文的處理
void Ack_Changeable(const BYTE* rbuf,BYTE byDevAddr,BYTE uart_port)
{
switch(rbuf[6])
{
case 0x06:
ASDU06(rbuf,byDevAddr,uart_port);//對時
return ;
case 0x07:
ASDU07(rbuf,byDevAddr,uart_port);//總查詢
return ;
case 0x0a:
// ASDU10(rbuf,byDevAddr,uart_port);//通用分類數據
return ;
case 0x14:
ASDU20(rbuf,byDevAddr,uart_port);//一般命令(復歸保護信號)
return;
case 0x15:
ASDU21(rbuf,byDevAddr,uart_port);//通用分類命令
return ;
case 0x40:
ASDU64(rbuf,byDevAddr,uart_port);//遙控
return;
case 0x58:
ASDU88(rbuf,byDevAddr,uart_port);//遙脈量上送
return;
default:
return ;
}
}
//固定幀長報文的處理
void Ack_Staid(const BYTE* rbuf,BYTE byDevAddr,BYTE uart_port)
{
BYTE *crc;
BYTE *apack;
BYTE dev_fun;
T_EVENT pEvent;
T_DIC pDIC;
T_DATE t_date;
T_SFCC p_sfcc;
BOOL bDI,bEvent,bMeasure,bAlarm,bSFCC;
WORD wLen;
WORD ngd;
WORD dev_id;
dev_id = Addr_to_ID(byDevAddr);
if (rbuf[1] == last_cmd && dev_id == last_id)
{
//將上次報文重發
wLen = tot_leng;
UART_Write(uart_port,sbuf,wLen);
return;
}
last_cmd = rbuf[1];
last_id = dev_id;
switch(rbuf[1]&0x0f)
{
case 0x00:
//復位通信單元
memset(sbuf, 0, UART_RCV_SIZE);
flag = FLAG_RESET_CU;
sbuf[0] = 0x10;
sbuf[1] = 0x20;
sbuf[2] = byDevAddr;
wLen = 2;
sbuf[3] = Makecrc(&sbuf[1],wLen);
sbuf[4] = 0x16;
wLen = 5;
tot_leng = wLen;
UART_Write(uart_port,sbuf,wLen);
break;
case 0x07:
//復位幀計數位
flag = FLAG_RESET_FCB;
sbuf[0] = 0x10;
sbuf[1] = 0x20;
sbuf[2] = byDevAddr;
wLen = 2;
sbuf[3] = Makecrc(&sbuf[1],wLen);
sbuf[4] = 0x16;
wLen = 5;
tot_leng = wLen;
UART_Write(uart_port,sbuf,wLen);
break;
case 0x0a:
if (flag == FLAG_RESET_CU)
{
//回答復位通信單元報文
ASDU05(rbuf,byDevAddr,uart_port);
flag = FLAG_POWER_ON;
return;
}
if (flag == FLAG_RESET_FCB)
{
//回答復位幀計數報文
ASDU05(rbuf,byDevAddr,uart_port);
flag = FLAG_POWER_ON;
return;
}
if (flag == FLAG_POWER_ON)
{
ASDU05(rbuf,byDevAddr,uart_port);
flag = 0x00;
return;
}
//檢查是否遙控選擇發生
if (flag == FLAG_YK_CHK)
{
flag = 0x00;
apack = sbuf;
if(DEV_Check_Control(dev_id, ctrl_no1) ==1)
{
*apack++ = 0x68;
*apack++ = 0x0a;
*apack++ = 0x0a;
*apack++ = 0x68;
crc = apack;
*apack++ = 0x08;
*apack++ = byDevAddr;
*apack++ = 0x40;
*apack++ = 0x01; //VSQ
*apack++ = 0x0c; //cot
*apack++ = byDevAddr;
*apack++ = a; //fun
*apack++ = b; //inf
*apack++ = c; //dcc
*apack++ = 0x00; //RII
wLen = apack - crc;
*apack++ = Makecrc(crc,wLen);
*apack++ = 0x16;
wLen = apack - sbuf;
tot_leng = wLen;
UART_Write(uart_port,sbuf,wLen);
return;
}
}
//檢查是否遙控執行發生
if (flag == FLAG_YK_DO)
{
flag = 0x00;
apack = sbuf;
if(DEV_Remote_Control(dev_id, ctrl_no1) == 1)
{
*apack++ = 0x68;
*apack++ = 0x0a;
*apack++ = 0x0a;
*apack++ = 0x68;
crc = apack;
*apack++ = 0x08;
*apack++ = byDevAddr;
*apack++ = 0x40;
*apack++ = 0x01; //VSQ
*apack++ = 0x0c; //cot
*apack++ = byDevAddr;
*apack++ = a; //fun
*apack++ = b; //inf
*apack++ = c; //dcc
*apack++ = 0x00; //RII
wLen = apack - crc;
*apack++ = Makecrc(crc,wLen);
*apack++ = 0x16;
wLen = apack - sbuf;
tot_leng = wLen;
UART_Write(uart_port,sbuf,wLen);
return;
}
}
//檢查是否遙控撤消發生
if (flag == FLAG_YK_UNDO)
{
flag = 0x00;
apack = sbuf;
*apack++ = 0x68;
*apack++ = 0x0a;
*apack++ = 0x0a;
*apack++ = 0x68;
crc = apack;
*apack++ = 0x08;
*apack++ = byDevAddr;
*apack++ = 0x40;
*apack++ = 0x01; //VSQ
*apack++ = 0x0c; //cot
*apack++ = byDevAddr;
*apack++ = a; //fun
*apack++ = b; //inf
*apack++ = c; //dcc
*apack++ = 0x00; //RII
wLen = apack - crc;
*apack++ = Makecrc(crc,wLen);
*apack++ = 0x16;
wLen = apack - sbuf;
tot_leng = wLen;
UART_Write(uart_port,sbuf,wLen);
return;
}
//檢查是否總查詢發生
if (flag == FLAG_POLLING)
{
//asdu01回答全遙信
ASDU44(rbuf,byDevAddr,uart_port);
//flag = FLAG_POLLING_END;
return;
}
//總查詢的終止
if (flag == FLAG_POLLING_END)
{
ASDU08(rbuf,byDevAddr,uart_port);
return;
}
//檢查遙信變位
bDI = INF_Search_Dic(hand,dev_id);
if (bDI)
{
INF_Get_Dic(hand, dev_id, &pDIC);
apack = sbuf;
*apack++ = 0x68;
*apack++ = 0x20;
*apack++ = 0x20;
*apack++ = 0x68;
crc = apack;
if(! INF_Search_Dic(hand,dev_id))
{
*apack++ = 0x08;
}
else
{
*apack++ = 0x28;
}
*apack++ = byDevAddr;
*apack++ = 0x01;
*apack++ = 0x81;
*apack++ = 1;
*apack++ = byDevAddr;
*apack++ = Get_Fun(dev_id);
*apack++ = (BYTE)pDIC.e_code + DIC_BEGIN;
*apack++ = (BYTE)pDIC.e_state + 1;
SYS_Get_Clock(&t_date);
*apack++ = (BYTE)t_date.msec;
*apack++ = (BYTE)(t_date.msec >> 8);
*apack++ = t_date.minute;
*apack++ = t_date.hour;
*apack++ = 1;
wLen = apack - crc;
sbuf[1] = (BYTE)wLen;
sbuf[2] = (BYTE)wLen;
*apack++ = Makecrc(crc,wLen);
*apack++ = 0x16;
wLen = apack - sbuf;
tot_leng = wLen;
UART_Write(uart_port,sbuf,wLen);
return;
}
//檢查是否有保護事件發生
bEvent = INF_Search_Event(hand,dev_id);
if (bEvent)
{
INF_Get_Event(hand,dev_id,&pEvent);
apack = sbuf;
*apack++ = 0x68;
*apack++;
*apack++;
*apack++ = 0x68;
crc = apack;
bEvent = INF_Search_Event(hand,dev_id);
if (bEvent == 1)
{
*apack++ = 0x28;
}
else
{
*apack++ = 0x08;
}
*apack++ = byDevAddr;
*apack++ = 0x01;
*apack++ = 0x81;
*apack++ = 1;
*apack++ = byDevAddr;
*apack++ = Get_Fun(dev_id);
*apack++ = (BYTE)pEvent.e_code + EVT_BEGIN;//條目號
*apack++ = (BYTE)pEvent.e_state + 1;
*apack++ = (BYTE) pEvent.e_date.msec;
*apack++ = (BYTE) (pEvent.e_date.msec >> 8);
*apack++ = pEvent.e_date.minute;
*apack++ = pEvent.e_date.hour;
*apack++ = 0;
wLen = apack - crc;
sbuf[1] = (BYTE)wLen;
sbuf[2] = (BYTE)wLen;
*apack++ = Makecrc(crc,wLen);
*apack++ = 0x16;
wLen = apack - sbuf;
tot_leng = wLen;
UART_Write(uart_port,sbuf,wLen);
return;
}
//檢查是否有保護告警事件發生
bAlarm = INF_Search_Alarm(hand,dev_id);
if (bAlarm)
{
INF_Get_Alarm(hand,dev_id,&pEvent);
apack = sbuf;
*apack++ = 0x68;
*apack++;
*apack++;
*apack++ = 0x68;
crc = apack;
bEvent = INF_Search_Alarm(hand,dev_id);
if (bEvent == 1)
{
*apack++ = 0x28;
}
else
{
*apack++ = 0x08;
}
*apack++ = byDevAddr;
*apack++ = 0x01;
*apack++ = 0x81;
*apack++ = 1;
*apack++ = byDevAddr;
*apack++ = Get_Fun(dev_id);//Fun
*apack++ = (BYTE)pEvent.e_code + ALA_BEGIN;//條目號
*apack++ = (BYTE)pEvent.e_state + 1;
*apack++ = (BYTE) pEvent.e_date.msec;
*apack++ = (BYTE) (pEvent.e_date.msec >> 8);
*apack++ = pEvent.e_date.minute;
*apack++ = pEvent.e_date.hour;
*apack++ = 0;
wLen = apack - crc;
sbuf[1] = (BYTE)wLen;
sbuf[2] = (BYTE)wLen;
*apack++ = Makecrc(crc,wLen);
*apack++ = 0x16;
wLen = apack - sbuf;
tot_leng = wLen;
UART_Write(uart_port,sbuf,wLen);
return;
}
//傳送描述表
if (flag == FLAG_READ_LIST)
{
BYTE i;
BYTE ginl;
BYTE data_leng;
apack = sbuf;
*apack++ = 0x68;
apack++;
apack++;
*apack++ = 0x68;
crc = apack;
*apack++ = 0x28;
*apack++ = byDevAddr;
*apack++ = 0x0a;
*apack++ = 0x81;
*apack++ = 0x2a;
*apack++ = byDevAddr;
*apack++ = 0xfe;
*apack++ = 0xf1;
*apack++ = 0x00;
data_leng = 0x0a;
*apack++ = (BYTE)list.l_size;
switch(list.l_type)
{
case LIST_T_ANALOG:
// p_analog_list = (T_ANALOG_ENTRY *) list.l_ptr;
ginl = 0x01;
break;
case LIST_T_SET:
// p_set_list = (T_SET_ENTRY *) list.l_ptr;
ginl = 0x04;
break;
case LIST_T_SFC:
// p_sfc_list = (T_SFC_ENTRY *) list.l_ptr;
ginl = 0x06;
break;
}
i = 0;
while(i < 10)
{
if(list_num < list.l_size)
{
*apack++ = ginl;
*apack++ = list_num + 1;
*apack++ = 10;
*apack++ = 1;
*apack++ = 16;
*apack++ = 1;
data_leng += 6;
if(list.l_type == LIST_T_ANALOG)
{
memcpy(apack, p_analog_list->name,16);
apack += 16;
data_leng += 16;
list_num ++;
p_analog_list++;
}
if(list.l_type == LIST_T_SET)
{
memcpy(apack, p_set_list->name,16);
apack += 16;
data_leng += 16;
list_num ++;
p_set_list++;
}
if(list.l_type == LIST_T_SFC)
{
memcpy(apack, p_sfc_list->name,16);
apack += 16;
data_leng += 16;
list_num ++;
p_sfc_list++;
}
i++;
}
else
break;
}
//超過10項分幀發送
sbuf[1] = data_leng;
sbuf[2] = data_leng;
if (list_num != list.l_size)
{
sbuf[13] = (i | 0x80);
sbuf[4] = 0x28;
}
else
{
sbuf[13] = (i | 0x00);
sbuf[4] = 0x08;
flag = 0;
}
wLen = data_leng;
*apack++ = Makecrc(crc,wLen);
*apack++ = 0x16;
wLen = data_leng + 6;
tot_leng = wLen;
UART_Write(uart_port,sbuf,wLen);
return;
}
//是否傳送遙信量
if(flag == FLAG_READ_DI)
{
BYTE i;
flag = 0x00;
apack = sbuf;
*apack++ = 0x68;
apack++;
apack++;
*apack++ = 0x68;
crc = apack;
*apack++ = 0x08;
*apack++ = byDevAddr;
*apack++ = 0x0a;
*apack++ = 0x81;
*apack++ = 0x2a;
*apack++ = byDevAddr;
*apack++ = 0xFE;
*apack++ = 0xf1;
*apack++ = 0x00;
*apack++ = (BYTE) di.di_num;
for(i = 0;i< (di.di_num + 31)/32;i++)
{
*apack++ = 0x07;//遙信組
*apack++ = i + 1;
*apack++ = 1;
*apack++ = 7;
*apack++ = 4;
*apack++ = 1;
*apack++ = *((BYTE *)&di.di_val[i] + 3);
*apack++ = *((BYTE *)&di.di_val[i] + 2);
*apack++ = *((BYTE *)&di.di_val[i] + 1);
*apack++ = *((BYTE *)&di.di_val[i]);
}
wLen = apack - crc;
sbuf[1] = wLen + 2;
sbuf[2] = wLen + 2;
*apack++ = Makecrc(crc,wLen);
*apack++ = 0x16;
wLen = apack - sbuf;
tot_leng = wLen;
UART_Write(uart_port,sbuf,wLen);
return;
}
//是否要傳送遙測值
if(flag == FLAG_READ_MEASURE)
{
BYTE i;
flag = 0x00;
apack = sbuf;
*apack++ = 0x68;
apack++;
apack++;
*apack++ = 0x68;
crc = apack;
*apack++ = 0x08;
*apack++ = byDevAddr;
*apack++ = 0x0a;
*apack++ = 0x81;
*apack++ = 0x2a;
*apack++ = byDevAddr;
*apack++ = 0xFE;
*apack++ = 0xf1;
*apack++ = 0x00;
*apack++ = (BYTE) measure.ms_num;
for(i = 0;i< measure.ms_num;i++)
{
*apack++ = 0x01;//遙測組
*apack++ = i + 1;
*apack++ = 1;
*apack++ = 7;
*apack++ = 2;
*apack++ = 1;
*apack++ = (BYTE)(measure.ms_val[i]);
*apack++ = (BYTE)(measure.ms_val[i] >> 8);
}
wLen = apack - crc;
sbuf[1] = wLen + 2;
sbuf[2] = wLen + 2;
*apack++ = Makecrc(crc,wLen);
*apack++ = 0x16;
wLen = apack - sbuf;
tot_leng = wLen;
UART_Write(uart_port,sbuf,wLen);
return;
}
//檢查是否要傳送軟壓板
if(flag == FLAG_READ_SFC)
{
BYTE i;
flag = 0x00;
apack = sbuf;
*apack++ = 0x68;
apack++;
apack++;
*apack++ = 0x68;
crc = apack;
*apack++ = 0x08;
*apack++ = byDevAddr;
*apack++ = 0x0a;
*apack++ = 0x81;
*apack++ = 0x2a;
*apack++ = byDevAddr;
*apack++ = 0xFE;
*apack++ = 0xf1;
*apack++ = 0x00;
*apack++ = (BYTE) sfc.sfc_num;
for(i = 0;i< sfc.sfc_num;i++)
{
*apack++ = 0x06;//壓板組
*apack++ = i + 1;
*apack++ = 1;
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -