📄 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;
*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;
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 + -