?? df_103.c
字號:
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項定值分幀發(fā)
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[dev_id-1]= 0;
}
wLen = data_leng;
*apack++ = Makecrc(crc,wLen);
*apack++ = 0x16;
wLen = data_leng + 6;
tot_leng = wLen;
UART_Write(uart_port,sbuf,wLen);
return;
}
//回答無所響應(yīng)數(shù)據(jù)報文
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:
ACD=0;
bDI = INF_Search_Dic(hand,dev_id);
bEvent = INF_Search_Event(hand,dev_id);
bAlarm = INF_Search_Alarm(hand,dev_id);
// ZJH ADD [11/7/2002]
bSFCC = INF_Search_SFCC(hand,dev_id);
// ZJH END [11/7/2002]
if (bDI||bSFCC||bEvent||bAlarm)
{
ACD=0x20; //符合上述條件,置有一類數(shù)據(jù)標(biāo)志
flag[dev_id-1] = FLAG_POLLING_OK;
}
else ACD=0x00;
//檢查開入量是否有變化&&檢查是否要傳送保護定植&&檢查是否有保護事件發(fā)生
//檢查遙信變位
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;
*apack++ = 0x08|ACD;
*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;
}
// [11/7/2002]ZJH ADD
bSFCC = INF_Search_SFCC(hand,dev_id);
if (bSFCC == 1)
{
INF_Get_SFCC(hand,dev_id,&pSFCC);
apack = sbuf;
*apack++ = 0x68;
*apack++;
*apack++;
*apack++ = 0x68;
crc = apack;
*apack++ = 0x08|ACD;
*apack++ = byDevAddr;
*apack++ = 0x01;
*apack++ = 0x81;
*apack++ = 1;
*apack++ = byDevAddr;
*apack++ = Get_Fun(dev_id);//Fun
*apack++ = (BYTE)pSFCC.e_code + SFC_BEGIN-1;//條目號
*apack++ = (BYTE)pSFCC.e_state + 1;
*apack++ = (BYTE)pSFCC.e_date.msec;
*apack++ = (BYTE)(pSFCC.e_date.msec >> 8);
*apack++ = pSFCC.e_date.minute;
*apack++ = pSFCC.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;
}
//bMeasure = INF_Search_Overline(hand,dev_id);
//是否要傳送遙測值 ASDU9
//if((bMeasure||INF_Get_Measure(dev_id,&measure) && dev_fun == 242))
{
BYTE i;
INF_Get_Measure(dev_id,&measure);
dev_fun = Get_Fun(dev_id);
apack = sbuf;
*apack++ = 0x68;
*apack++;
*apack++;
*apack++ = 0x68;
crc = apack;
*apack++ = 0x08|ACD;
*apack++ = byDevAddr;
*apack++ = 9;
*apack++ = (BYTE)measure.ms_num;//0x0a;
*apack++ = 2;
*apack++ = byDevAddr;
*apack++ = Get_Fun(dev_id);//FUN
*apack++ = MEA_BEGIN;//inf
INF_Get_Measure(dev_id,&measure);
NU_Sleep(20);
for(i = 0;i < measure.ms_num;i++)
{
// val =((measure.ms_val[i]&0x1FFF)>>1 | (measure.ms_val[i]&0xE000));
// *apack++ = LOBYTE(val);
// *apack++ = HIBYTE(val);
*apack++ = LOBYTE(measure.ms_val[i]<<3); //高13位
*apack++ = HIBYTE(measure.ms_val[i] <<3);
}
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
{
//回答無二類數(shù)據(jù)報文
apack = sbuf;
*apack++ = 0x10;
crc = apack;
*apack++ = 0x09|ACD;
*apack++ = byDevAddr;
*apack++ = Makecrc(crc,2);
*apack++ = 0x16;
wLen = apack - sbuf;
tot_leng = wLen;
UART_Write(uart_port,sbuf,wLen);
break;
}
*/
}
}
// Ask manufacturer information
void ASDU05(const BYTE *rbuf,BYTE byDevAddr,BYTE uart_port)
{
BYTE *pt;
BYTE *crc;
BYTE inf;
WORD wLen;
WORD dev_id;
BYTE cot,control;
// [11/7/2002]ZJH ADD
dev_id = Addr_to_ID(byDevAddr);
// [11/7/2002]ZJH END
pt = sbuf;
*pt++ = 0x68;
*pt++;
*pt++;
*pt++ = 0x68;
crc = pt;
switch(flag[dev_id-1])
{
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++ = 'P';
*pt++ = 'S';
*pt++ = 'X';
*pt++ = '6';
*pt++ = '4';
*pt++ = '3';
*pt++ = '.';
*pt++ = 'V';
*pt++ = '1';
*pt++ = '.';
*pt++ = '0';
*pt++ = '0';
//拷貝廠家和版本信息
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);
}
// [11/7/2002]ZJH REM fluctuate choice
//回答總查詢 送全遙信 單點信息0——OFF,1——ON
void ASDU40(const BYTE *rbuf,BYTE byDevAddr,BYTE uart_port)
{
BYTE *pt;
BYTE *crc;
BYTE count,i;
WORD wLen;
WORD dev_id;
WORD flag[DEV_TYPE];
count = di[dev_id-1].di_num + sfc[dev_id - 1].sfc_num;
dev_id = Addr_to_ID(byDevAddr);
flag[dev_id-1] = 0x00;
pt = sbuf;
*pt++ = 0x68;
*pt++;
*pt++;
*pt++ = 0x68;
crc = pt;
*pt++ = 0x08;
*pt++ = byDevAddr;
*pt++ = 0x28;
*pt++ = count;
*pt++ = 0x09;//傳送原因
*pt++ = byDevAddr;
*pt++ = Get_Fun(dev_id);//FUN
*pt++ = DIC_BEGIN+1;
INF_Get_Di(dev_id, &di[dev_id-1]);
INF_Get_SFC(dev_id, &sfc[dev_id-1]);
NU_Sleep(20);
for(i = 0;i <di[dev_id-1].di_num ;i++)
{
*pt++ = (BYTE) ((di[dev_id-1].di_val[0] >> i) & 0x01);
if(i == 31) di[dev_id-1].di_val[0] = di[dev_id-1].di_val[1];
}
for(i = 0;i < sfc[dev_id - 1].sfc_num ;i++)
{
*pt++ = (BYTE) ((sfc[dev_id - 1].sfc_val[0] >> i) & 0x01);
if(i == 31) sfc[dev_id - 1].sfc_val[0] = sfc[dev_id - 1].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);
return;
}
//回答總查詢 雙點信息1——OFF,2——ON
void ASDU01(const BYTE *rbuf,BYTE byDevAddr,BYTE uart_port)
{
BYTE *pt;
BYTE *crc;
WORD wLen;
WORD dev_id;
T_DATE tdate;
pt = sbuf;
dev_id = Addr_to_ID(byDevAddr);
*pt++ = 0x68;
*pt++;//長度
*pt++;
*pt++ = 0x68;
crc = pt;
if(count ==sfc[dev_id - 1].sfc_num+di[dev_id-1].di_num-1 )
{
*pt++ = 8;
flag[dev_id - 1] = 0x00;//總查詢標(biāo)志清0
}
else
{
*pt++ =0x28;
}
*pt++ = byDevAddr;
*pt++ = 0x01;
*pt++ = 0x81;
*pt++ = 0x09;//傳送原因
*pt++ = byDevAddr;
*pt++ = Get_Fun(dev_id);//FUN
if(count < sfc[dev_id - 1].sfc_num)
{
*pt++ = SFC_BEGIN + count;//inf
*pt++ =((BYTE) (sfc[dev_id - 1].sfc_val[0] >> count)&0x01)+1;//DPI雙點信息
if(count == 31)
{
sfc[dev_id-1].sfc_val[0] = sfc[dev_id-1].sfc_val[1];
}
}
else if(count >= sfc[dev_id-1].sfc_num)
{
*pt++ = DIC_BEGIN + (count - sfc[dev_id-1].sfc_num+1);
*pt++ = ((BYTE)(di[dev_id - 1].di_val[0] >> (count-(BYTE)sfc[dev_id-1].sfc_num))&0x01)+1;
if((count-sfc[dev_id-1].sfc_num) == 47)
{
di[dev_id-1].di_val[0] = di[dev_id-1].di_val[1];
}
}
count ++;
if(count == sfc[dev_id - 1].sfc_num+di[dev_id-1].di_num)
{
count = 0;
}
SYS_Get_Clock(&tdate);
DEV_Get_Clock(dev_id, &tdate);
*pt++ = (BYTE)tdate.msec;
*pt++ = (BYTE)(tdate.msec >> 8);
*pt++ = tdate.minute;
*pt++ = tdate.hour;
*pt++ = 0;//附加信息位
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;
}
// [11/7/2002]ZJH END
//時鐘同步
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_SFC;
BOOL b_DI;
WORD wLen;
WORD dev_id;
dev_id = Addr_to_ID(byDevAddr);
//置總查詢標(biāo)志
flag[dev_id-1] = FLAG_POLLING;
count = 0;
scn = rbuf[12];
// [11/7/2002]ZJH REM
b_DI = INF_Get_Di(dev_id, &di[dev_id-1]);
b_SFC = INF_Get_SFC(dev_id, &sfc[dev_id-1]);
NU_Sleep(20);
pt = sbuf;
*pt++ = 0x10;
crc= pt;
// [11/7/2002]ZJH REM
if((b_DI | b_SFC))
// if (b_SFC == 1)
{
*pt++ = 0x20;
}
else
{
*pt++ = 0x00;
}
*pt++ = rbuf[5];
wLen = pt - crc;
*pt++ = Makecrc(crc,wLen);
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;
*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 - crc;
tot_leng = wLen;
UART_Write(uart_port,sbuf,wLen);
return;
}
//通用分類數(shù)據(jù)
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://帶確認(rèn)的寫條目、處理該報文、返回該報文
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ù)
{
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))
{
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;
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -