?? 103.c
字號:
*apack++ = 10;
*apack++ = 1;
*apack++ = 1;
*apack++ =((BYTE) (sfc.sfc_val[0] >> i)&0x00000001) + 1;
if(i == 31)
{
sfc.sfc_val[0] = sfc.sfc_val[1];
}
}
wLen = apack - crc;
*apack++ = Makecrc(crc,wLen);
*apack++ = 0x16;
wLen = apack - sbuf;
tot_leng = wLen;
UART_Write(uart_port,sbuf,wLen);
return;
}
//檢查是否要傳送保護定值 asdu10
if (flag == FLAG_READ_SET)
{
BYTE data_leng,i;
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 = 9;
ngd = rsetbuf.set_num;
if(ngd > 20)
{
ngd = ngd | 0x80;
}
*apack++ = (BYTE) ngd;
data_leng++;
i = 0;
while (i < 20)
{
if (dznumber < rsetbuf.set_num)
{
*apack++ = 0x04;//定值組號
data_leng++;
*apack++ = dznumber + 1;//條目號
data_leng++;
*apack++ = 0x01;//描述類別
data_leng++;
switch (rsetbuf.set_val[dznumber].type)
{
case SET_T_UINT:
*apack++ = 0x24;//ASCII碼 四方
*apack++ = 0x02;
*apack++ = 0x01;
*apack++ = (BYTE) rsetbuf.set_val[dznumber].un_val.u_val;
*apack++ = (BYTE) (rsetbuf.set_val[dznumber].un_val.u_val >> 8);
dznumber++;
data_leng += 5;
break;
case SET_T_FLOAT:
*apack++ = 0x07;//float
*apack++ = 0x04;
*apack++ = 0x01;
*apack++ = *((BYTE *)&rsetbuf.set_val[dznumber].un_val.f_val + 3);
*apack++ = *((BYTE *)&rsetbuf.set_val[dznumber].un_val.f_val + 2);
*apack++ = *((BYTE *)&rsetbuf.set_val[dznumber].un_val.f_val + 1);
*apack++ = *(BYTE *)&rsetbuf.set_val[dznumber].un_val.f_val;
dznumber++;
data_leng += 7;
break;
}
i++;
}
else
{
break;
}
}
//超過20項定值分幀發
sbuf[1] = data_leng;
sbuf[2] = data_leng;
if (dznumber != rsetbuf.set_num)
{
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;
}
//檢查壓板是否有變位信息
bSFCC = INF_Search_SFCC(hand,dev_id);
if (bSFCC == 1)
{
//INF_Record_SFCC(&p_sfcc);
INF_Get_SFCC(hand,dev_id,&p_sfcc);
apack = sbuf;
*apack++ = 0x68;
*apack++;
*apack++;
*apack++ = 0x68;
crc = apack;
bSFCC = INF_Search_SFCC(hand,dev_id);
if (bSFCC == 1)
{
*apack++ = 0x28;
}
else
{
*apack++ = 0x08;
}
*apack++ = byDevAddr;
*apack++ = 0x01;
*apack++ = 0x81;
*apack++ = 1;
*apack++ = byDevAddr;
*apack++ = Get_Fun(dev_id);//Fun
*apack++ = (BYTE)p_sfcc.e_code + SFC_BEGIN ;//條目號
*apack++ = (BYTE)p_sfcc.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;
}
//回答無所響應數據報文
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);
break;
case 0x0b:
//檢查開入量是否有變化&&檢查是否要傳送保護定植&&檢查是否有保護事件發生
bDI = INF_Search_Dic(hand,dev_id);
bEvent = INF_Search_Event(hand,dev_id);
bAlarm = INF_Search_Alarm(hand,dev_id);
bSFCC = INF_Search_SFCC(hand,dev_id);
if (bDI||bEvent||bAlarm||bSFCC)
{
//符合上述條件,置有一類數據標志
BYTE *crc;
apack = sbuf;
*apack++ = 0x10;
crc = apack;
*apack++ = 0x29;
*apack++ = byDevAddr;
*apack++ = Makecrc(crc,2);
*apack++ = 0x16;
wLen = apack - sbuf;
tot_leng = wLen;
UART_Write(uart_port,sbuf,wLen);
return;
}
bMeasure = INF_Search_Overline(hand,dev_id);
dev_fun = Get_Fun(dev_id);
//是否要傳送遙測值 ASDU50
if(bMeasure == 1)
{
BYTE i;
apack = sbuf;
*apack++ = 0x68;
*apack++;
*apack++;
*apack++ = 0x68;
crc = apack;
*apack++ = 0x08;
*apack++ = byDevAddr;
*apack++ = 0x32; //9;
INF_Get_Measure(dev_id,&measure);
*apack++ = measure.ms_num; //0x0a;
*apack++ = 2;
*apack++ = byDevAddr;
*apack++ = Get_Fun(dev_id);//FUN
*apack++ = MEA_BEGIN;//inf
//INF_Get_Measure(dev_id,&measure);
for(i = 0;i < measure.ms_num;i++)
{
*apack++ = (BYTE)(measure.ms_val[i]);
*apack++ = (BYTE)(measure.ms_val[i] >> 8);
}
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;
}
else
{
//回答無二類數據報文
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);
break;
}
}
}
void ASDU05(const BYTE *rbuf,BYTE byDevAddr,BYTE uart_port)
{
BYTE *pt;
BYTE *crc;
BYTE inf;
WORD wLen;
WORD dev_id;
BYTE cot,control;
pt = sbuf;
*pt++ = 0x68;
*pt++;
*pt++;
*pt++ = 0x68;
crc = pt;
switch(flag)
{
case FLAG_RESET_CU:
control = 0x28;
cot = 0x04;
inf = 0x03;
break;
case FLAG_RESET_FCB:
control = 0x28;
cot = 0x03;
inf = 0x02;
break;
default:
control = 0x08;
cot = 0x05;
inf = 0x04;
break;
}
*pt++ = control;
*pt++ = byDevAddr;
*pt++ = 0x05;
*pt++ = 0x81;
*pt++ = cot;
*pt++ = byDevAddr;
dev_id = Addr_to_ID(byDevAddr);
*pt++ = Get_Fun(dev_id);
*pt++ = inf;
*pt++ = 0x03;
//拷貝廠家和版本信息
*pt++ = 'S';
*pt++ = 'A';
*pt++ = 'C';
*pt++ = '1';
*pt++ = '0';
*pt++ = '3';
*pt++ = '.';
*pt++ = 'V';
*pt++ = '2';
*pt++ = '.';
*pt++ = '0';
*pt++ = '1';
//拷貝廠家和版本信息
wLen = pt - crc;
sbuf[1] = (BYTE)wLen;
sbuf[2] = (BYTE)wLen;
*pt++ =Makecrc(crc,wLen);
*pt++ = 0x16;
wLen = pt - sbuf;
tot_leng = wLen;
UART_Write(uart_port,sbuf,wLen);
}
/*
//回答總查詢 送全遙信 單點信息0——OFF,1——ON //ASDU40
void ASDU40(const BYTE *rbuf,BYTE byDevAddr,BYTE uart_port)
{
BYTE *pt;
BYTE *crc;
BYTE count,i;
WORD wLen;
WORD dev_id;
count = di.di_num + sfc.sfc_num;
dev_id = Addr_to_ID(byDevAddr);
flag = 0x00;
pt = sbuf;
*pt++ = 0x68;
*pt++;
*pt++;
*pt++ = 0x68;
crc = pt;
*pt++ = 0x28;
*pt++ = byDevAddr;
*pt++ = 0x28;
*pt++ = count;
*pt++ = 0x09;//傳送原因
*pt++ = byDevAddr;
*pt++ = Get_Fun(dev_id);//FUN
for(i = 0;i < di.di_num ;i++)
{
*pt++ = (BYTE) ((di.di_val[0] >> i) & 0x01);
if(i == 31) di.di_val[0] = di.di_val[1];
}
for(i = 0;i < sfc.sfc_num ;i++)
{
*pt++ = (BYTE) ((sfc.sfc_val[0] >> i) & 0x01);
if(i == 31) sfc.sfc_val[0] = sfc.sfc_val[1];
}
wLen = pt - crc;
sbuf[1] = (BYTE)wLen;
sbuf[2] = (BYTE)wLen;
*pt++ = Makecrc(crc,wLen);
*pt++ = 0x16;
wLen = pt - sbuf;
tot_leng = wLen;
UART_Write(uart_port,sbuf,wLen);
}
*/
//回答總查詢
void ASDU44(const BYTE *rbuf,BYTE byDevAddr,BYTE uart_port)
{
BYTE *pt;
BYTE *crc;
BYTE i;
WORD wLen;
WORD dev_id;
dev_id = Addr_to_ID(byDevAddr);
flag = FLAG_POLLING_END;
pt = sbuf;
*pt++ = 0x68;
*pt++;
*pt++;
*pt++ = 0x68;
crc = pt;
*pt++ = 0x28;
*pt++ = byDevAddr;
*pt++ = 0x2c;
*pt++ = 0x02; //信息組數
*pt++ = 0x09; //傳送原因
*pt++ = byDevAddr;
*pt++ = Get_Fun(dev_id); //FUN
*pt++ = 0xb0; //起始inf
*pt++ = 0x00;
*pt++ = 0x00;
*pt++ = ((di.di_val[0]) & 0xff);
*pt++ = ((di.di_val[0] >>8) & 0xff);
*pt++ = 0x00;
*pt++ = 0x00;
*pt++ = 0x00; //QDS
*pt++ = ((di.di_val[0] >>16) & 0xff);
*pt++ = ((di.di_val[0] >>24) & 0xff);
*pt++ = 0x00;
*pt++ = scn;
wLen = pt - crc;
sbuf[1] = (BYTE)wLen;
sbuf[2] = (BYTE)wLen;
*pt++ = Makecrc(crc,wLen);
*pt++ = 0x16;
wLen = pt - sbuf;
tot_leng = wLen;
UART_Write(uart_port,sbuf,wLen);
return;
}
void ASDU01(const BYTE *rbuf,BYTE byDevAddr,BYTE uart_port)
{
BYTE *pt;
BYTE *crc;
WORD wLen;
WORD dev_id;
T_DATE tdate;
BYTE temp;
pt = sbuf;
*pt++ = 0x68;
*pt++;
*pt++;
*pt++ = 0x68;
crc = pt;
if(count == di.di_num + sfc.sfc_num - 1)
{
*pt++ = 8;
flag = FLAG_POLLING_END;
}
else
{
*pt++ =0x28;
}
*pt++ = byDevAddr;
dev_id = Addr_to_ID(byDevAddr);
*pt++ = 0x01;
*pt++ = 0x81;
*pt++ = 0x09;//傳送原因
*pt++ = byDevAddr;
*pt++ = Get_Fun(dev_id);//FUN
temp = sfc.sfc_num;
if(count <= sfc.sfc_num + di.di_num)
{
if(count < sfc.sfc_num)
{
*pt++ = SFC_BEGIN + count;//inf
*pt++ =((BYTE) (sfc.sfc_val[0] >> count)&0x00000001) + 1;
}
if(count >= sfc.sfc_num)
{
*pt++ = DIC_BEGIN + count - sfc.sfc_num + 1;
*pt++ =((BYTE) (di.di_val[0] >> (count-temp))&0x00000001) + 1;
}
if(count == 47)
{
di.di_val[0] = di.di_val[1];
}
}
count ++;
DEV_Get_Clock(dev_id, &tdate);
*pt++ = (BYTE)tdate.msec;
*pt++ = (BYTE)(tdate.msec >> 8);
*pt++ = tdate.minute;
*pt++ = tdate.hour;
wLen = pt - crc;
sbuf[1] = (BYTE)wLen;
sbuf[2] = (BYTE)wLen;
*pt++ = Makecrc(crc,wLen);
*pt++ = 0x16;
wLen = pt - sbuf;
tot_leng = wLen;
UART_Write(uart_port,sbuf,wLen);
}
//時鐘同步
void ASDU06(const BYTE *rbuf,BYTE byDevAddr,BYTE uart_port)
{
const BYTE* pt;
BYTE Msl,Msh;
T_DATE tdate;
pt = rbuf + 12;
Msl = *pt++;//msl
Msh = *pt++;//msh
tdate.msec = MAKEWORD(Msl,Msh);
tdate.minute = (*pt++)&0x3f;//min
tdate.hour = (*pt++)&0x1f;//hours
tdate.week = ((*pt)>>5)&0x07;//weeks
tdate.day = (*pt++)&0x1f;//date
tdate.month = (*pt++)&0x0f;//mon
tdate.year = ((*pt++)&0x7f) + 2000;//year
DEV_Set_Clock(SYS_IED_ANY,&tdate);
SYS_Set_Clock(&tdate);
return;
}
//總查詢
void ASDU07(const BYTE* rbuf,BYTE byDevAddr,BYTE uart_port)
{
BYTE *crc;
BYTE *pt;
BOOL b_DI, b_SFC;
WORD wLen;
WORD dev_id;
//置總查詢標志
flag = FLAG_POLLING;
scn = rbuf[12];
count = 0;
dev_id = Addr_to_ID(byDevAddr);
b_DI = INF_Get_Di(dev_id, &di);
b_SFC = INF_Get_SFC(dev_id, &sfc);
pt = sbuf;
*pt++ = 0x10;
crc= pt;
if((b_DI | b_SFC))
{
*pt++ = 0x20;
}
else
{
*pt++ = 0x00;
}
*pt++ = rbuf[5];
wLen = pt - crc;
wLen++;
*pt++ = 0x16;
wLen++;
wLen++;
tot_leng = wLen;
NU_Sleep(20);
UART_Write(uart_port,sbuf,wLen);
return;
}
//總查詢的終止
void ASDU08(const BYTE *rbuf,BYTE byDevAddr,BYTE uart_port)
{
BYTE *pt;
BYTE *crc;
WORD wLen;
pt = sbuf;
flag = 0x00;
*pt++ = 0x68;
*pt++ = 0x09;
*pt++ = 0x09;
*pt++ = 0x68;
crc = pt;
*pt++ = 8;
*pt++ = byDevAddr;
*pt++ = 8;
*pt++ = 0x81;
*pt++ = 10;
*pt++ = byDevAddr;
*pt++ = 0xff;
*pt++ = 0;
*pt++ = scn;
wLen = pt - crc;
*pt++ = Makecrc(crc,wLen);
*pt++ = 0x16;
wLen = pt - sbuf;
tot_leng = wLen;
UART_Write(uart_port,sbuf,wLen);
return;
}
//遙控過程
void ASDU64(const BYTE* rbuf,BYTE byDevAddr,BYTE uart_port)
{
BYTE dcc;
BYTE *crc;
WORD wLen;
BYTE *apack;
// dcc = rbuf[12];
c = rbuf[12];
a = rbuf[10]; //fun
b = rbuf[11]; //inf
ctrl_no1 = rbuf[11];
d = c&0x80;
e = c&0x40;
if( (d == 0x80)&&(e == 0x00)) //遙控選擇
{
flag = FLAG_YK_CHK;
}
if( (d == 0x00)&&(e == 0x00)) //遙控執行
{
flag = FLAG_YK_DO;
}
if( (d == 0x80)&&(e == 0x40)) //遙控撤消
{
flag = FLAG_YK_UNDO;
}
apack = sbuf;
*apack++ = 0x10;
crc = apack;
*apack++ = 0x20;
*apack++ = byDevAddr;
*apack++ = Makecrc(crc,2);
*apack++ = 0x16;
wLen = apack - sbuf;
tot_leng = wLen;
UART_Write(uart_port,sbuf,wLen);
return;
}
/*
//
void ASDU10(const BYTE* rbuf,BYTE byDevAddr,BYTE uart_port)
{
//通用分類數據
BYTE inf;
BYTE ginl;
BYTE cot;
BYTE ginh;
BYTE ngd;
const BYTE *pt;
BYTE gdd;
BYTE i;
BYTE ctrl_no;
BYTE sfc_no;
BYTE tiaomu;
WORD sfc_state;
WORD wLen;
WORD set_no;
WORD dev_id;
BOOL b_set_no;
BOOL b_get_set;
dev_id =Addr_to_ID(byDevAddr);
inf = rbuf[11];//信息序號
ngd = rbuf[13];
ginl = rbuf[14];//組號
ginh = rbuf[15];//條目號
switch(inf)
{
case 249://帶確認的寫條目、處理該報文、返回該報文
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++;//數據寬度
pt++;//數目及后續狀態
for(i = 0;i < ngd;i ++)
{
switch(gdd)//gdd 通用分類數據描述:3——無符號整數,7——短實數
{
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 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_Check_Setting(dev_id,set_no,&wsetbuf))
{
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -