📄 c103_485.c
字号:
p_asdu->data[12] = *p_buf103++;
//拷贝厂家和版本信息
data_len = 19;
send_var_packet(byDevAddr, control, data_len);
}
//时钟同步
void Reply_Asdu06(BYTE *m_rx_buf, BYTE byDevAddr)
{
BYTE *pt;
BYTE *p_buf103 = buf103;
pt = m_rx_buf + 12;
*p_buf103++ = *pt++;//msl
*p_buf103++ = *pt++;//msh
*p_buf103++ = (*pt++)&0x3f;//min
*p_buf103++ = (*pt++)&0x1f;//hours
*p_buf103++ = ((*pt)>>5)&0x07;//weeks
*p_buf103++ = (*pt++)&0x1f;//date
*p_buf103++ = (*pt++)&0x0f;//mon
*p_buf103++ = ((*pt++)&0x7f);//year
Set103_clock(p_buf103, byDevAddr);
return;
}
//总查询
void Reply_Asdu07(BYTE *m_rx_buf,BYTE byDevAddr)
{
BYTE f_ctrl;
//置总查询标志
flag = FLAG_POLLING;
scn = m_rx_buf[12];
Get103_Din_Data(buf103, byDevAddr);
CLC_Get_Current_Time(&polling_time);
f_ctrl = 0x20;
send_fix_packet(byDevAddr, f_ctrl);
return;
}
//总查询的终止
void Reply_Asdu08(BYTE * m_rx_buf, BYTE byDevAddr)
{
BYTE wLen;
T_103_ASDU *p_asdu = (T_103_ASDU *)&m_tx_buf[6];
p_asdu->type = 8;
p_asdu->vsq = 0x81;
p_asdu->cot = 10;
p_asdu->addr = byDevAddr;
p_asdu->fun = 0xff;
p_asdu->inf = 0;
p_asdu->data[0] = scn;
wLen = 7;
send_var_packet(byDevAddr, 0, wLen);
return;
}
//通用分类数据
void Reply_Asdu10(BYTE* m_rx_buf,BYTE byDevAddr)
{
BYTE inf;
BYTE ginl;
BYTE ginh;
BYTE set_zone;
BYTE *pt;
T_103_ASDU *p_asdu = (T_103_ASDU *) &m_tx_buf[6];
T_103_DATA *p_rec = (T_103_DATA *) &p_asdu->data[2];
inf = m_rx_buf[11];//信息序号
ngd = m_rx_buf[13];//通用分类数据集
ginl = m_rx_buf[14];//组号
ginh = m_rx_buf[15];//条目号
switch(inf)
{
case 249://带确认的写条目
switch(ginl)
{
case 0x03://遥控
buf103[0] = p_rec->ginh; //条目
buf103[1] = p_rec->data[0]; //值
if(Set103_Select_Dout(buf103, byDevAddr))
{
Send_Confirm(m_rx_buf, byDevAddr, 0x2c, inf, 0x08);
}
else
{
Send_Confirm(m_rx_buf, byDevAddr, 0x29, inf, 0x08);
}
return;
case 0x04://定值
Get103_Set_Setting(buf103, byDevAddr, &m_rx_buf[6]);
pt = setzone_buf + (byDevAddr - SYC_MMI_Config.sy_add) * 2;
if (*pt++ == VALID)
{
set_zone = *pt;
if (Set103_Preset_Setting(buf103, byDevAddr, set_zone))
{
Send_Confirm(m_rx_buf, byDevAddr, 0x2c, inf, 0x08);
}
else
{
Send_Confirm(m_rx_buf, byDevAddr, 0x29, inf, 0x08);
}
}
else
{
Send_Confirm(m_rx_buf, byDevAddr, 0x29, inf, 0x08);
}
return;
case 0x05://定值区
switch (ginh)
{
case 0x01://当前定值区
set_zone = p_rec->data[0];//读取当前定值区
if(SYC_CPU_Status[byDevAddr - SYC_MMI_Config.sy_add].sy_valid_section[set_zone]!=0)
{
Send_Confirm(m_rx_buf, byDevAddr, 0x2c, inf, 0x08);
}
else
{
Send_Confirm(m_rx_buf, byDevAddr, 0x29, inf, 0x08);
}
return;
case 0x02://运行定值区
set_zone = p_rec->data[0];//读取当前定值区
buf103[0] = set_zone;
if(Set103_Premodify_Setzone(buf103, byDevAddr))
{
Send_Confirm(m_rx_buf, byDevAddr, 0x2c, inf, 0x08);
}
else
{
Send_Confirm(m_rx_buf, byDevAddr, 0x29, inf, 0x08);
}
return;
}
case 0x06://软压板
buf103[0] = p_rec->ginh;
buf103[1] = p_rec->data[0];
if(Set103_Select_Softsw(buf103, byDevAddr))
{
Send_Confirm(m_rx_buf, byDevAddr, 0x2c, inf, 0x08);
}
else
{
Send_Confirm(m_rx_buf, byDevAddr, 0x29, inf, 0x08);
}
return;
default:
break;
}
break;
case 250://带执行的写条目
switch(ginl)
{
case 0x03://遥控
buf103[0] = p_rec->ginh; //条目
buf103[1] = p_rec->data[0]; //值
if(Set103_Control_Dout(buf103, byDevAddr))
{
Send_Confirm(m_rx_buf, byDevAddr, 0x28, inf, 0x08);
}
else
{
Send_Confirm(m_rx_buf, byDevAddr, 0x29, inf, 0x08);
}
return;
case 0x04://定值
Get103_Set_Setting(buf103, byDevAddr, &m_rx_buf[6]);
pt = setzone_buf + (byDevAddr - SYC_MMI_Config.sy_add) * 2;
if (*pt == VALID)
{
*pt++ = INVALID; //将此区域置为无效
set_zone = *pt;
if (Set103_Set_Setting(buf103, byDevAddr, set_zone))
{
Send_Confirm(m_rx_buf, byDevAddr, 0x28, inf, 0x08);
}
else
{
Send_Confirm(m_rx_buf, byDevAddr, 0x29, inf, 0x08);
}
}
else
{
Send_Confirm(m_rx_buf, byDevAddr, 0x29, inf, 0x08);
}
return;
case 0x05://定值区
switch (ginh)
{
case 0x01://当前定值区
set_zone = p_rec->data[0];//读取当前定值区
if(SYC_CPU_Status[byDevAddr - SYC_MMI_Config.sy_add].sy_valid_section[set_zone]!=0)
{
pt = setzone_buf + (byDevAddr - SYC_MMI_Config.sy_add) * 2;
*pt++ = VALID;
*pt = m_tx_buf[19];
Send_Confirm(m_rx_buf, byDevAddr, 0x28, inf, 0x08);
}
else
{
Send_Confirm(m_rx_buf, byDevAddr, 0x29, inf, 0x08);
}
return;
case 0x02://运行定值区
set_zone = p_rec->data[0];//读取当前定值区
buf103[0] = set_zone;
if(Set103_Modity_Setzone(buf103, byDevAddr))
{
Send_Confirm(m_rx_buf, byDevAddr, 0x28, inf, 0x08);
}
else
{
Send_Confirm(m_rx_buf, byDevAddr, 0x29, inf, 0x08);
}
return;
}
case 0x06://软压板
buf103[0] = p_rec->ginh;
buf103[1] = p_rec->data[0];
if(Set103_Control_Softsw(buf103, byDevAddr))
{
Send_Confirm(m_rx_buf, byDevAddr, 0x2c, inf, 0x08);
}
else
{
Send_Confirm(m_rx_buf, byDevAddr, 0x29, inf, 0x08);
}
return;
}
break;
case 251://写条目停止
break;
}
}
//复归保护信号inf = 19 , cot = 20
void Reply_Asdu20(BYTE *m_rx_buf,BYTE byDevAddr)
{
BYTE cot;
BYTE inf;
cot = m_rx_buf[8];
inf = m_rx_buf[11];
if(cot == 20 && inf == 19)
{
KEC_Send_Reset_Signal();
NU_Release_Semaphore(&KEC_SEMA_Reset_Key);
}
return;
}
void Reply_Asdu21(BYTE *m_rx_buf,BYTE byDevAddr)
{
BYTE inf;
BYTE ginl;
BYTE ginh;
BYTE kod;
BYTE f_ctrl;
BYTE set_zone;
inf = m_rx_buf[11]; //信息序号
ngd = m_rx_buf[13]; //通用分类数据集
ginl = m_rx_buf[14]; //组号
ginh = m_rx_buf[15]; //条目号
kod = m_rx_buf[16]; //类型描述
rii = m_rx_buf[12]; //返回标志
switch(inf)
{
case 241://读一个组的全部条目的值和属性
switch(kod)
{
case 1://实际值
switch(ginl)
{
case 4://定值
if(Get_Runing_Setzone(buf103, byDevAddr))
{
set_zone = buf103[7];//定值区号
Get103_Set_Fact_Data(buf103, byDevAddr, set_zone);
flag = FLAG_GENERAL_READ;
byte_send = 0;
number_send = 0;
f_ctrl = 0x20;
send_fix_packet(byDevAddr, f_ctrl);
return;
}
else
{
flag = 0x00;
f_ctrl = 0x09;
send_fix_packet(byDevAddr, f_ctrl);
return;
}
case 0x01://遥测
Get103_Mea_Data(buf103, byDevAddr); //读取保护测量值
flag = FLAG_GENERAL_READ;
byte_send = 0;
number_send = 0;
f_ctrl = 0x20;
send_fix_packet(byDevAddr, f_ctrl);
return;
case 0x05://定值区号
Get_Runing_Setzone(buf103, byDevAddr);
flag = FLAG_GENERAL_READ;
byte_send = 0;
number_send = 0;
f_ctrl = 0x20;
send_fix_packet(byDevAddr, f_ctrl);
return;
case 0x06://软压板
Get103_Softsw_Data(buf103, byDevAddr);//读取软压板
flag = FLAG_GENERAL_READ;
byte_send = 0;
number_send = 0;
f_ctrl = 0x20;
send_fix_packet(byDevAddr, f_ctrl);
return;
case 0x07://遥信量
Get103_Din_Data(buf103, byDevAddr); //读取开入量
flag = FLAG_GENERAL_READ;
byte_send = 0;
number_send = 0;
f_ctrl = 0x20;
send_fix_packet(byDevAddr, f_ctrl);
return;
}
case 2://缺省值
switch (ginl)
{
case 1:
case 2:
case 3:
case 5:
case 6:
case 7:
return;
case 4://定值
Get103_Set_Default_Data(buf103, byDevAddr);
flag = FLAG_GENERAL_READ;
byte_send = 0;
number_send = 0;
f_ctrl = 0x20;
send_fix_packet(byDevAddr, f_ctrl);
return;
default:
return;
}
case 3://量程
switch (ginl)
{
case 1:
Get103_Mea_Range_Desc(buf103, byDevAddr);
flag = FLAG_GENERAL_READ;
byte_send = 0;
number_send = 0;
f_ctrl = 0x20;
send_fix_packet(byDevAddr, f_ctrl);
return;
case 4:
Get103_Set_Range_Desc(buf103, byDevAddr);
flag = FLAG_GENERAL_READ;
byte_send = 0;
number_send = 0;
f_ctrl = 0x20;
send_fix_packet(byDevAddr, f_ctrl);
return;
case 2:
case 3:
case 5:
case 6:
case 7:
return;
default:
return;
}
case 5://精度
switch (ginl)
{
case 1:
Get103_Mea_Precision_Desc(buf103, byDevAddr);
flag = FLAG_GENERAL_READ;
byte_send = 0;
number_send = 0;
f_ctrl = 0x20;
send_fix_packet(byDevAddr, f_ctrl);
return;
case 4:
Get103_Mea_Precision_Desc(buf103, byDevAddr);
flag = FLAG_GENERAL_READ;
byte_send = 0;
number_send = 0;
f_ctrl = 0x20;
send_fix_packet(byDevAddr, f_ctrl);
return;
case 2:
case 3:
case 5:
case 6:
case 7:
return;
default:
return;
}
break;
case 9://量纲
switch (ginl)
{
case 1://遥测
Get103_Mea_Dim_Desc(buf103, byDevAddr);
flag = FLAG_GENERAL_READ;
byte_send = 0;
number_send = 0;
f_ctrl = 0x20;
send_fix_packet(byDevAddr, f_ctrl);
return;
case 4://定值
Get103_Set_Dim_Desc(buf103, byDevAddr);
flag = FLAG_GENERAL_READ;
byte_send = 0;
number_send = 0;
f_ctrl = 0x20;
send_fix_packet(byDevAddr, f_ctrl);
return;
case 2:
case 3:
case 5:
case 6:
case 7:
return;
default:
return;
}
break;
case 10://描述表
switch(ginl)
{
case 1://遥测组
Get103_Mea_Desc(buf103, byDevAddr);
flag = FLAG_GENERAL_READ;
byte_send = 0;
number_send = 0;
f_ctrl = 0x20;
send_fix_packet(byDevAddr, f_ctrl);
return;
case 3://遥控组
Get103_Dout_Desc(buf103, byDevAddr);
flag = FLAG_GENERAL_READ;
byte_send = 0;
number_send = 0;
f_ctrl = 0x20;
send_fix_packet(byDevAddr, f_ctrl);
return;
case 4://定值组
Get103_Set_Desc(buf103, byDevAddr);
flag = FLAG_GENERAL_READ;
byte_send = 0;
number_send = 0;
f_ctrl = 0x20;
send_fix_packet(byDevAddr, f_ctrl);
return;
case 6://软压板
Get103_Softsw_Desc(buf103, byDevAddr);
flag = FLAG_GENERAL_READ;
byte_send = 0;
number_send = 0;
f_ctrl = 0x20;
send_fix_packet(byDevAddr, f_ctrl);
return;
case 7://遥信组
Get103_Din_Desc(buf103, byDevAddr);
flag = FLAG_GENERAL_READ;
byte_send = 0;
number_send = 0;
f_ctrl = 0x20;
send_fix_packet(byDevAddr, f_ctrl);
return;
}
break;
}
case 244://读单个条目的值或属性
return;
default:
return;
}
}
//请求扰动数据
void Reply_Asdu24(BYTE *m_rx_buf,BYTE byDevAddr)
{
BYTE too;
acc = m_rx_buf[16];
too = m_rx_buf[12];
fan0 = m_rx_buf[14];
fan1 = m_rx_buf[15];
switch(too)
{
case 1:
//故障的选择
wave_flag = FLAG_SEND_DATA_READY;
send_fix_packet(byDevAddr, 0x20);
return;
case 2:
//请求扰动数据
wave_flag = FLAG_SEND_STATE_READY;
send_fix_packet(byDevAddr, 0x20);
return;
case 3:
//终止扰动数据
wave_flag = 0;
send_fix_packet(byDevAddr, 0x08);
return;
case 8:
//通道的请求
wave_flag = FLAG_SEND_CHANEL_DATA;
send_fix_packet(byDevAddr, 0x20);
return;
case 9:
//通道的终止
wave_flag = 0;
send_fix_packet(byDevAddr, 0x08);
return;
case 16:
//请求带标志的状态变位
return;
case 17:
//终止带标志的状态变位
return;
case 24:
//请求被记录的扰动表
return;
default:
return;
}
}
//扰动数据的认可
void Reply_Asdu25(BYTE *m_rx_buf,BYTE byDevAddr)
{
BYTE too;
too = m_rx_buf[12];
switch(too)
{
case 64:/*扰动数据传输成功*/
wave_flag = FLAG_SEND_CHANEL_DATA;
send_fix_packet(byDevAddr, 0x20);
return;
case 65:
return;
case 66:
return;
case 67:
return;
case 68:/*带标志的状态变位传输成功*/
wave_flag = FLAG_SEND_CHANEL_READY;
send_fix_packet(byDevAddr, 0x20);
return;
case 69:/*带标志的状态变位传输不成功*/
wave_flag = 0;
send_fix_packet(byDevAddr, 0x08);
return;
default:
return;
}
}
void send_channel(BYTE *m_rx_buf, BYTE byDevAddr, BYTE channels_count)
{
Get103_channel_data(buf103, byDevAddr, fan0, fan1, acc, counter);
}
void Send_Confirm(BYTE *m_rx_buf, BYTE byDevAddr, BYTE cot, BYTE inf, BYTE f_ctrl)
{
BYTE *pr;
BYTE *pt;
BYTE num;
BYTE len;
BYTE count = 0;
pr = m_rx_buf + 13;
pt = &m_tx_buf[6];
*pt++ = 10; /*类型标识TYP*/
*pt++ = 0x81; /*可变结构限定词VSQ*/
*pt++ = cot; /*传送原因COT=42对通用数据分类读命令有效数据相应*/
*pt++ = byDevAddr; /*应用服务单元公用地址*/
*pt++ = 0xfe; /*功能类型FUN=GEN*/
*pt++ = inf; /*信息序号INF*/
*pt++ = m_rx_buf[12]; /*与主站命令中的返回信息标识符RII一致*/
count += 7;
if ((cot == 0x2a)||(cot == 0x28)||(cot == 0x2c))
{
num = *pr;
*pt++ = *pr++; //条目数目
count++;
}
else
{
num = 0;
*pt++ = 1; //?!
*pt++ = m_rx_buf[14];
*pt++ = 0; //ginl;
count += 3;
}
while (num>0, num--)
{
*pt++ = *pr++; //ginh;
*pt++ = *pr++; //ginl++;
*pt++ = *pr++; //KOD=描述
*pt++ = *pr++; //数据类型
len = *pr;
*pt++ = *pr++; //数据宽度
len *= *pr;
*pt++ = *pr++; //数目及后续状态
count += 6;
while (len>0,len--)
{
*pt++ = *pr++;
count++;
}
}
send_var_packet(byDevAddr, f_ctrl, count);
}
/*****************************辅助处理函数************************************/
/* 计算校验和 */
BYTE Makecrc(BYTE *str, WORD nSize)
{
WORD i;
BYTE J = 0;
for (i = 0; i < nSize; i++)
{
J += str[i];
}
return J;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -