📄 user.c
字号:
REN=1; /*---- 允许接收 ---------*/
re_er=0; /*---- re_er偶校验错标志 ---------*/
for (j=0;j<49;j++)
{ /*---- 接受回答报文共49个字节 ---------*/
nw=0;
while ((RI==0)&&(S_RTS==1)) {}; /*---- SE正在发送、实验板正在接收一个字符 ---------*/
if (RI==1)
{/*---- RI==1:实验板接收到一个字符 ---------*/
ACC=SBUF;
if (P!=RB8){ re_er=1;}; /*---- 偶校验错,置偶校验错标志 ---------*/
rebox[j]=SBUF; /*---- 接收一个字符送串口输入缓冲区 ---------*/
RI=0;
}
else
{/*---- (RI==0)&&(S_RTS==0):SE报文全部发送完毕而实验板还没有接收到预期的长度 ---------*/
j=100; /*---- 退出等待接收 ---------*/
}
};
//WQY DEBUG:调试通过
//pb_out[0]=rebox[0];
//pb_out[1]=rebox[48];
//steout0_7(pb_out[0]);
//steout8_15(pb_out[1]);
//for(;;) {};
/*--------------- 接收回答报文结束 -------------------------------------------*/
/*--------------- 以下分析接口板SE的回答报文 -----------------------------------------*/
if (j==49)
{ /*---- (j==49):实验板接收回答报文长度正确 ---------*/
if (re_er==0) /*---- 没有字符偶校验错? ---------*/
{
x=0;
for (i=0;i<48;i++) /*---- 求校验和 ---------*/
{
x=x+rebox[i];
};
if (x==rebox[48])
{ /*---- 校验和正确? ----------*/
if (rebox[0]==br_num) /*---- 返回的波特率号是5? ----------*/
{
if (rebox[1]==0) /*---- 初始化报文错误号N=0? ----------*/
{
x=0;
for (i=2;i<48;i++) /*---- byte2~byte47都是0xaa? ----------*/
{
if (rebox[i]!=0xaa)
{
x=1;
};
};
if (x==0)
{
y=1; /*---- byte2~byte47都是0xaa,初始化成功,y=1,准备退出while (y==0) ----*/
}
else
{x=0x11;}; /*---- byte2~byte47不都是0xaa!错误标记=0x11; ----*/
}
else
{x=rebox[1];}; /*---- 初始化报文错误号N<>0,错误标记=返回错误号 ----*/
}
else
{x=0x77;}; /*---- 返回的波特率号不是5, 错误标记=0x77; ----*/
}
else
{x=0xff;}; /*---- 校验和不正确正确, 错误标记=0xff; ----*/
}
else
{x=0xee;}; /*---- 发生了字符偶校验错 错误标记=0xee; ----*/
}
else
{
x=0xcc; /*---- j!=49发生了接收报文长度错 错误标记=0xee; ----*/
};
if (y==0)
{ /*---- 初始化失败 ----*/
for (nw=0;nw<10000;nw++)
{
steout0_7(br_num); /*---- 显示返回波特率号 ----*/
steout8_15(x); /*---- 显示返回错误号 ----*/
};
};
}; /*---- 如果y==0,返回while (y==0) ----*/
//WQY DEBUG:运行正确时y=1,x=0。该段程序调试正确。
//steout0_7(y);
//steout8_15(x);
//for(;;) {};
/*==================================================================================================*/
/* 实验板对PROFIBUS接口板初始化成功,进数据交换状态的无限循环中 */
/* trbox[]/rebox[]是串口发送/接收数组,发送/接收格式见《SE手册》 */
/*--------------------------------------------------------------------------------------------------*/
dil=data_in_len-1; /*---- data_in_len=50, dil=49 ----*/
dol=data_out_len-1; /*---- data_out_len==50, dol==49 ----*/
for (i=0;i<data_in_len;i++)
{
trbox[i]=0; /*---- 清发送、接收缓冲区 ----*/
};
for (i=0;i<data_out_len;i++)
{
rebox[i]=0; /*---- 清发送、接收缓冲区 ----*/
};
/*=============================== 进数据交换状态的无限循环中 =======================================*/
while (REQ_IT==0)
{ /*---- (REQ_IT==0):SE处在数据交换状态 ------*/
trbox[0]=req_com=0; /*---- 没有用户参数,请求数据命令永远是req_com=0,只请求A型报文 ------*/
trbox[1]=di0_7; /*---- di0_7是输入键输入I0~I7当前值,作为PROFIBUS输入的第1字节 ------*/
trbox[2]=di8_15; /*---- di8_15是输入键输入I8~I15当前值,作为PROFIBUS输入的第2字节 ------*/
//WQY DEBUG
trbox[1]=0x11;
trbox[2]=0xff;
for (i=3;i<dil;i++)
{
trbox[i]=0x5a; /*---- 其它PROFIBUS输入数据(3~48)本例定为0x5a ------*/
};
x=0;
for (i=0;i<dil;i++) /*---- 求校验和 ------*/
{
x=x+trbox[i];
};
trbox[dil]=x; /*---- 置校验和 ------*/
REN=0;
while (S_RTS==1) {}; /*---- S_RTS==1:接口板没有准备好接收数据 ------*/
for (i=0;i<data_in_len;i++) /*---- 发送数据交换报文共50字节 ------*/
{
TI=0;
ACC=trbox[i];
TB8=P; /*---- 形成偶校验位 ------*/
SBUF=trbox[i];
while (TI==0) {};
};
while (S_RTS==0) {}; /*---- SE 没有接收完毕 ------*/
/*=============================发送数据交换报文结束,等待接收接口板SE的回答。=========================*/
re_er=0; /*------ re_er偶校验错标志 ------*/
RI=0;
REN=1; /*------ 允许接收 ------*/
for (j=0;j<data_out_len;j++ ) /*------ 等待接收接口板的回答数据交换报文共50字节 ------*/
{
while ((RI==0)&&(S_RTS==1)) {}; /*---- SE正在发送、实验板正在接收一个字符 ------*/
if (RI==1)
{/*---- RI==1:实验板接收到一个字符 ---------*/
ACC=SBUF;
if (P!=RB8) {re_er=1;}; /*------ 偶校验错,置偶校验错标志 ------*/
rebox[j]=SBUF; /*------ 接收一个字符送串口输入缓冲区 ------*/
RI=0;
}
else
{/*---- (RI==0)&&(S_RTS==0):SE报文全部发送完毕而实验板还没有接收到预期的长度 ---------*/
j=data_out_len+1; /*---- 退出等待接收 ---------*/
};
};
//WQY DEBUG: 一次数据通信
//trbox[]中数据发送给接口板,从接口板接收数据至rebox[]
//pb_out[0]=rebox[1];
//pb_out[1]=rebox[2];
//steout0_7(pb_out[0]);
//steout8_15(pb_out[1]);
//for(;;) {};
/*=============================接收完毕===============================================================*/
if (j==data_out_len)
{/*---- (j==data_out_len):实验板接收回答报文长度正确 ---------*/
if (re_er==0)
{ /*------ 无偶校验错 ------*/
x=0;
for (i=0;i<dol;i++)
{
x=x+rebox[i]; /*------ 求校验和 ------*/
};
if (x==rebox[dol])
{
y=dol-1; /*------ y=49-1=48,PROFIBUS输出数据长度 ------*/
for (i=1;i<dol;i++)
{
pb_out[i-1]=rebox[i]; /*------ 接收到的48个PROFIBUS输出数据送数据区pb_out[0~47] ------*/
};
}
else
{
error=0x81; /*------ 校验和错 ------*/
};
}
else
{
error=0x83; /*------ 偶校验错 ------*/
};
}
else
{
error=0x84; /*------ 接收字符数不够 ------*/
};
/*====================================================================================================*/
/*-----------------------------显示部分---------------------------------------------------------------*/
/*----------------------------------------------------------------------------------------------------*/
scanin(); /*------ 输入键扫描 ------*/
steout0_7(pb_out[0]); /*------ PROFIBUS输出数据第一个字节送Q0-Q7显示 ------*/
steout8_15(pb_out[1]); /*------ PROFIBUS输出数据第一个字节送Q0-Q7显示 ------*/
};/*---- while (REQ_IT==0):SE处在数据交换状态,返回数据交换状态的无限循环中 ------*/
};/*---- (REQ_IT==1):SE退出数据交换状态,返回初始化 ------*/
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -