📄 485.c
字号:
wLen = data_leng;
*apack++ = Makecrc(crc,wLen);
*apack++ = 0x16;
wLen = data_leng + 6;
tot_leng = wLen;
UART_Write(uart_port,sbuf,wLen);
return;
}
//检查开入量是否有变化
bDI = INF_Search_Soe(hand,dev_id);
if (bDI == 1)
{
INF_Get_Soe(hand, dev_id, &pDIC);
apack = sbuf;
*apack++ = 0x68;
*apack++ = 0x20;
*apack++ = 0x20;
*apack++ = 0x68;
crc = apack;
if(! INF_Search_Soe(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;
*apack++ = (BYTE)pDIC.e_date.msec;
*apack++ = (BYTE)(pDIC.e_date.msec >> 8);
*apack++ = pDIC.e_date.minute;
*apack++ = pDIC.e_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);
}
//检查是否有保护事件发生 asdu1
bEvent = INF_Search_Event(hand,dev_id);
if (bEvent == 1)
{
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 == 1)
{
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;
}
//回答无所响应数据报文
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_Soe(hand,dev_id);
bEvent = INF_Search_Event(hand,dev_id);
bAlarm = INF_Search_Alarm(hand,dev_id);
if (bDI||bEvent||bAlarm == 1)
{
//符合上述条件,置有一类数据标志
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);
//是否要传送遥测值 ASDU9
if(bMeasure == 1 && dev_fun == 242)
{
BYTE i;
apack = sbuf;
*apack++ = 0x68;
*apack++;
*apack++;
*apack++ = 0x68;
crc = apack;
*apack++ = 0x08;
*apack++ = byDevAddr;
*apack++ = 9;
*apack++ = 0x8a;
*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 Ack_changjia(const BYTE *rbuf,BYTE byDevAddr,BYTE uart_port)
{
BYTE *pt;
BYTE *crc;
BYTE inf;
WORD wLen;
WORD dev_id;
BYTE con,control;
pt = sbuf;
*pt++ = 0x68;
*pt++;
*pt++;
*pt++ = 0x68;
crc = pt;
if (powerflg == 0x33)
{
control = 0x28;
con = 0x04;
inf = 0x03;
}
else
{
control = 0x08;
con = 0x05;
inf = 0x04;
}
*pt++ = control;
*pt++ = byDevAddr;
*pt++ = 0x05;
*pt++ = 0x81;
*pt++ = con;
*pt++ = byDevAddr;
dev_id = Addr_to_ID(byDevAddr);
*pt++ = Get_Fun(dev_id);
*pt++ = inf;
*pt++ = 0x03;
//拷贝厂家和版本信息
*pt++ = 'S';
*pt++ = 'A';
*pt++ = 'C';
//拷贝厂家和版本信息
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 Ack_asdu1(const BYTE *rbuf,BYTE byDevAddr,BYTE uart_port)
{
BYTE *pt;
BYTE *crc;
WORD wLen;
WORD dev_id;
T_DATE tdate;
pt = sbuf;
*pt++ = 0x68;
*pt++;
*pt++;
*pt++ = 0x68;
crc = pt;
if(count == di.di_num + sfc.sfc_num - 1)
{
*pt++ = 8;
maskflg = 0x00;
}
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
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;
*pt++ =((BYTE) (di.di_val[0] >> count)&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 Lan_edit06(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 Lan_edit07(const BYTE* rbuf,BYTE byDevAddr,BYTE uart_port)
{
//总查询
BYTE *crc;
BYTE *pt;
BOOL b_DI;
BOOL b_SFC;
WORD wLen;
WORD dev_id;
//置总查询标志
maskflg = 0x33;
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;
byDevAddr = rbuf[4];
*pt++ = 0x10;
crc= pt;
if(b_DI == 1 && 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 Lan_edit10(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) == 1)
{
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://定值区
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;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -