📄 103.c
字号:
#include "typedef.h"
#include "nucleus.h"
#include "com_lan.h"
#include "lan_jiekou.h"
#include "103.h"
#define ASDU07_SIZE 7
#define ASDU20_SIZE 8
#define ASDU21_SIZE 11
static BYTE quhaobuf[16];
static BYTE lastcommaddbuf[8];
static BYTE read_default_counter[8] = {0,0,0,0,0,0,0,0};
//--------------------------------------103规约传送原因的定义:(子站)-----------------
//1----》自发(突发)
//2----》循环
//8----》时间同步
//9----》总查询
//10---》总查询终止
//11---》当地操作
//12---》远方操作
//20---》命令的肯定认可
//21---》命令的否定认可
//31---》扰动数据的传送
//40---》通用分类写命令的肯定认可
//41---》通用分类写命令的否定认可
//42---》通用分类读命令的有效数据响应
//43---》通用分类读命令的无效数据响应
//44---》通用分类写确认
//
//-------------------------------------103规约传送原因的定义:(主站)------------------
//8----》时间同步
//9----》总查询
//20---》一般命令
//31---》扰动数据的传输
//40---》通用分类写命令
//42---》通用分类读命令
//
//id=物理链路控制字,recvbuf=接受报文缓从区,wLen=接受报文的长度,sendbuf=发送缓冲区
//
//
extern NU_MEMORY_POOL System_Memory;
void C103_Receive(WORD id, BYTE* recvbuf, WORD wLen, BYTE* sendbuf)
{
STATUS status;
int total_len =wLen;
BYTE *buff103;
status =NU_Allocate_Memory(&System_Memory, &buff103,3072,NU_NO_SUSPEND);
if (status == NU_SUCCESS)
{
while (total_len > 0)
{
WORD data_len =Lan_ack(recvbuf, (WORD)total_len, sendbuf, id, buff103);
recvbuf +=data_len;
total_len-=data_len;
}
NU_Deallocate_Memory(buff103);
}
}
WORD Lan_ack(BYTE *rbuf, WORD wLen, BYTE *sbuf, WORD id, BYTE *buff103)
{
switch (rbuf[0])
{
case 0x06:
Lan_edit06(rbuf,wLen,sbuf,id,buff103);
return wLen;
case 0x07:
Lan_edit07(rbuf,wLen,sbuf,id,buff103);
return ASDU07_SIZE;
case 0x0a:
Lan_edit10(rbuf,wLen,sbuf,id,buff103);
return wLen;
case 0x14:
Lan_edit20(rbuf,wLen,sbuf,id,buff103);
return ASDU20_SIZE;
case 0x15:
Lan_edit21(rbuf,wLen,sbuf,id,buff103);
return ASDU21_SIZE;
case 0x18:
Lan_edit24(rbuf,wLen,sbuf,id,buff103);
return wLen;
case 0x19:
Lan_edit25(rbuf,wLen,sbuf,id,buff103);
return wLen;
default:
return wLen;
}
}
//////////////////////////////////////////////
void Lan_edit06(BYTE *rbuf,WORD wLen,BYTE *sbuf,WORD id,BYTE *buff103)
{
//时钟同步
BYTE* pt;
BYTE* s;
BYTE commaddress;
pt =rbuf+3;
commaddress =*pt;
pt =rbuf+6;
s =buff103;
*s++ =*pt++;//msl
*s++ =*pt++;//msh
*s++ =*pt++;//min
*s++ =*pt++;//hours
*s++ =((*pt)>>5)&0x07;//weeks
*s++ =(*pt++)&0x1f;//date
*s++ =(*pt++)&0x0f;//mon
*s++ =(*pt++)&0x7f;//year
Set103_clock(buff103,commaddress);
}
void Lan_edit07(BYTE *rbuf,WORD wLen,BYTE *sbuf,WORD id,BYTE *buff103)
{
//总查询
BYTE con;
BYTE commaddress;
BYTE fun;
BYTE inf;
BYTE scn;
BYTE *pt;
pt=rbuf+2;
con=*pt++; //传送原因
commaddress=*pt++;//取公共地址
fun=*pt++; //功能类型
inf=*pt++; //信息序号
scn=*pt++; //扫描序号
send0a(sbuf,id,con,commaddress,fun,scn,buff103);
return;
}
void Lan_edit10(BYTE *rbuf,WORD wLen,BYTE *sbuf,WORD id,BYTE *buff103)
{
//通用分类数据
BYTE cot;//传送原因
BYTE commaddress;//公用地址
BYTE fun;//功能类型
BYTE inf;//信息序号
BYTE rii;//返回表示
BYTE ngd;//通用分类集数目
BYTE ginh;
BYTE ginl;//通用分类标识序号
BYTE j;
BYTE quhao;
WORD i;
BYTE *pt;
BYTE *apack;
apack=sbuf;
pt =rbuf+2;
cot=*pt++;
commaddress=*pt++;
fun=*pt++;
inf=*pt++;
rii=*pt++;
ngd=*pt++;
ginh=*pt++;
ginl=*pt++;
switch(inf)
{
case 249:
//带确认的写条目
//处理该报文
//发送返回报文
if (wLen < 15)
{
cot = 41;
send_write(sbuf,rbuf,id,cot,commaddress,inf,rii);
return;
}
else
{
switch(ginh)
{
case 0x00:
switch(ginl)
{
case 0x02:
//当前定值区
apack =quhaobuf+id*2;
pt =rbuf+14;
*apack++ =0x33;
*apack =*pt;
cot =44;
send_write(sbuf,rbuf,id,cot,commaddress,inf,rii);
return;
case 0x03:
//运行定值区
apack =buff103;
pt =rbuf+14;
*apack =*pt;
if(Set103_selectarea( buff103,commaddress) == true)
{
cot =44;
}
else
{
cot =41;
}
send_write(sbuf,rbuf,id,cot,commaddress,inf,rii);
return;
case 0x07:
//脉冲预制数
apack =buff103;
pt =rbuf+9;
quhao =*pt;
pt =rbuf+11;
*apack++ =ngd;//数目
while(ngd > 0,ngd--)
{
*apack++ =quhao-1;
*apack++ =*pt++;//数据类型
j =*pt;//数据宽度
*apack++ =*pt++;//数据宽度
*apack++ =*pt++;//数目
while(j > 0,j--)
{
*apack++ =*pt++;
}
pt++;
quhao =*pt;
pt++;
pt++;
}
if(Set103_pulsedata( buff103,commaddress) == true)
{
cot =44;
}
else
{
cot =41;
}
send_write(sbuf,rbuf,id,cot,commaddress,inf,rii);
//Set103_pulsedata
return;
case 0x05:
//脉冲冻结和解冻命令
apack =buff103;
pt =rbuf+14;
*apack++ =*pt;//命令
if(Set103_pulsecom( buff103,commaddress) == true)
{
cot =44;
}
else
{
cot =41;
}
send_write(sbuf,rbuf,id,cot,commaddress,inf,rii);
return;
case 0x06:
//远方复归
apack =buff103;
pt =rbuf+11;
*apack++ =ngd;//数目
while(ngd > 0,ngd--)
{
*apack++ =*pt++;//数据类型
j =*pt;//数据宽度
*apack++ =*pt++;//数据宽度
*apack++ =*pt++;//数目
while(j > 0,j--)
{
*apack++ =*pt++;
}
pt++;
pt++;
pt++;
}
if(Set103_sfugui( buff103,commaddress) == true)
{
cot =44;
}
else
{
cot =41;
}
send_write(sbuf,rbuf,id,cot,commaddress,inf,rii);
return;
default:
break;
}
case 0x02:
case 0x03:
//修改定值
*apack++ =0x00;
quhao =*apack;
apack =buff103;
pt =rbuf+11;
*apack++ =ngd;//数目
while(ngd > 0,ngd--)
{
*apack++ =*pt++;//数据类型
j =*pt;//数据宽度
*apack++ =*pt++;//数据宽度
*apack++ =*pt++;//数目
while(j > 0,j--)
{
*apack++ =*pt++;
}
pt++;
pt++;
pt++;
}
apack =quhaobuf+id*2;
if (*apack++ == 0x33)
{
quhao=*apack;
if(Set103_setdata( buff103,commaddress,quhao) == true)
{
cot =44;
}
else
{
cot =41;
}
send_write(sbuf,rbuf,id,cot,commaddress,inf,rii);
}
return;
case 0x0b:
//遥控开关
apack =buff103;
pt =rbuf+9;
*apack++ =(*pt)-1;//条目号
//*apack++ =*pt;//条目号
pt =rbuf+14;
*apack++ =*pt;//值
if(Set103_selectdz( buff103,commaddress) == true)
{
cot =44;
}
else
{
cot =41;
}
send_write(sbuf,rbuf,id,cot,commaddress,inf,rii);
return;
case 0x0c:
//遥控分头
apack =buff103;
pt =rbuf+9;
*apack++ =(*pt)-1;//条目号
pt =rbuf+14;
*apack++ =*pt;//值
if(Set103_selectft( buff103,commaddress) == true)
{
cot =44;
}
else
{
cot =41;
}
send_write(sbuf,rbuf,id,cot,commaddress,inf,rii);
return;
case 0x0e:
//遥控压板
apack =buff103;
pt =rbuf+9;
*apack++ =(*pt)-1;//条目号
//*apack++ =*pt;//条目号
pt =rbuf+14;
*apack++ =*pt;//值
if(Set103_selectyb( buff103,commaddress) == true)
{
cot =44;
}
else
{
cot =41;
}
send_write(sbuf,rbuf,id,cot,commaddress,inf,rii);
return;
default:
break;
}
}
case 250:
//带执行的写条目
//处理该报文
//发送返回报文
if (wLen < 15)
{
cot = 41;
send_write(sbuf,rbuf,id,cot,commaddress,inf,rii);
return;
}
else
{
switch(ginh)
{
case 0x00:
switch(ginl)
{
case 0x02:
//当前定值区
apack =quhaobuf+id*2;
pt =rbuf+14;
*apack++ =0x33;
*apack =*pt;
cot =40;
send_write(sbuf,rbuf,id,cot,commaddress,inf,rii);
return;
case 0x03:
//运行定值区
apack =buff103;
pt =rbuf+14;
*apack =*pt;
if(Set103_controlarea( buff103,commaddress) == true)
{
cot =40;
}
else
{
cot =41;
}
send_write(sbuf,rbuf,id,cot,commaddress,inf,rii);
return;
case 0x07:
apack =buff103;
pt =rbuf+9;
quhao =*pt;
pt =rbuf+11;
*apack++ =ngd;//数目
while(ngd > 0,ngd--)
{
*apack++ =quhao-1;
*apack++ =*pt++;//数据类型
j =*pt;//数据宽度
*apack++ =*pt++;//数据宽度
*apack++ =*pt++;//数目
while(j > 0,j--)
{
*apack++ =*pt++;
}
pt++;
quhao =*pt;
pt++;
pt++;
}
if(Set103_pulsedata( buff103,commaddress) == true)
{
cot =40;
}
else
{
cot =41;
}
send_write(sbuf,rbuf,id,cot,commaddress,inf,rii);
//Set103_pulsedata
return;
case 0x05:
//脉冲冻结和解冻命令0
apack =buff103;
pt =rbuf+14;
*apack++ =*pt;//命令
if(Set103_pulsecom( buff103,commaddress) == true)
{
cot =40;
}
else
{
cot =41;
}
send_write(sbuf,rbuf,id,cot,commaddress,inf,rii);
return;
case 0x06:
//远方复归
apack =buff103;
pt =rbuf+11;
*apack++ =ngd;//数目
while(ngd > 0,ngd--)
{
*apack++ =*pt++;//数据类型
j =*pt;//数据宽度
*apack++ =*pt++;//数据宽度
*apack++ =*pt++;//数目
while(j > 0,j--)
{
*apack++ =*pt++;
}
pt++;
pt++;
pt++;
}
if(Set103_cfugui( buff103,commaddress) == true)
{
cot =40;
}
else
{
cot =41;
}
send_write(sbuf,rbuf,id,cot,commaddress,inf,rii);
return;
default:
break;
}
case 0x02:
case 0x03:
//修改定值
apack =buff103;
pt =rbuf+11;
*apack++ =ngd;//数目
while(ngd > 0,ngd--)
{
*apack++ =*pt++;//数据类型
j =*pt;//数据宽度
*apack++ =*pt++;//数据宽度
*apack++ =*pt++;//数目
while(j > 0,j--)
{
*apack++ =*pt++;
}
pt++;
pt++;
pt++;
}
apack =quhaobuf+id*2;
if (*apack == 0x33)
{
*apack++=0x00;
quhao =*apack;
if(Set103_setquhao( buff103,commaddress,quhao) == true)
{
cot =40;
}
else
{
cot =41;
}
send_write(sbuf,rbuf,id,cot,commaddress,inf,rii);
}
return;
case 0x0a:
//*******************
//脉冲预制数
apack =buff103;
pt =rbuf+9;
quhao =*pt;
pt =rbuf+11;
*apack++ =ngd;//数目
while(ngd > 0,ngd--)
{
*apack++ =quhao-1;
*apack++ =*pt++;//数据类型
j =*pt;//数据宽度
*apack++ =*pt++;//数据宽度
*apack++ =*pt++;//数目
while(j > 0,j--)
{
*apack++ =*pt++;
}
pt++;
quhao =*pt;
pt++;
pt++;
}
if(Set103_pulsedata( buff103,commaddress) == true)
{
cot =40;
}
else
{
cot =41;
}
send_write(sbuf,rbuf,id,cot,commaddress,inf,rii);
return;
case 0x0b:
//遥控开关
apack =buff103;
pt =rbuf+9;
*apack++ =(*pt)-1;//条目号
pt =rbuf+14;
*apack++ =*pt;//值
if(Set103_controldz( buff103,commaddress) == true)
{
cot =40;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -