学习廖常初老师的《PLC编程及应用》中的两个例子,7-4和7-5,一直调试不成功,在廖老师编写的串口调试软件中,报接收超时故障。特此求助,还盼亲自做过的老师指点迷津。
例7-4用接收完成中断接收数据
ORGANIZATION_BLOCK 主:OB1
TITLE=
// 主程序,使用RCV指令和接收完成中断接收数据
//
//
BEGIN
Network 1
LD SM0.7 // 若转换到RUN模式
EU
O SM0.1 // 或首次扫描
CALL SBR0 // 调用初始化子程序,进入自由端口模式
Network 2
LDN SM0.7 // 若转换到TERM模式
EU
R SM30.0, 1 // 设置为PPI协议(SM30.0 = 0)
DTCH 23 // 禁止各中断
DTCH 9
DTCH 10
END_ORGANIZATION_BLOCK
SUBROUTINE_BLOCK SBR_0:SBR0
TITLE=
// 初始化子程序
//
//
BEGIN
Network 1
LD SM0.0 // 该位始终为1
MOVB 9, SMB30 // 9600 bit/s,8位数据,无校验,1位停止位
MOVB 16#EC, SMB87 // 允许接收,检测起始字符和结束字符,超时检测
MOVB 0, SMB88 // 送报文起始字符0
MOVB 16#FF, SMB89 // 送报文结束字符十六进制数16#FF
MOVW +1000, SMW92 // 接收超时时间为1s
MOVB 100, SMB94 // 接收的最大字符数为100
ATCH INT0, 23 // 接收完成事件连接到中断程序0
ATCH INT1, 9 // 发送完成事件连接到中断程序1
ENI // 允许用户中断
RCV VB100, 0 // 端口0的接收缓冲区指针指向VB100
END_SUBROUTINE_BLOCK
SUBROUTINE_BLOCK FCS:SBR1
TITLE=
// 求异或校验码的子程序FCS
//
//
VAR_INPUT
PNT:DWORD;
NUMB:BYTE;
END_VAR
VAR_OUTPUT
XORC:BYTE;
END_VAR
VAR
NUMI:INT;
TEMP1:INT;
END_VAR
BEGIN
Network 1
LD SM0.0
MOVB 0, LB5 // 异或值清0
BTI LB4, LW6 // 输入的字节数转换为整数
FOR LW8, +1, LW6
Network 2
LD SM0.0
XORB *LD0, LB5 // 异或运算
INCD LD0 // 指针值加1
Network 3
NEXT
//
END_SUBROUTINE_BLOCK
INTERRUPT_BLOCK INT_0:INT0
TITLE=
// 接收完成中断程序
//
//
BEGIN
Network 1
LDB<> SMB86, 16#20 // 若是非正常接收结束
JMP 1 // 跳转到LBL 1处
NOT // 若接收到结束字符
MOVB VB102, VB99 // 将接收到的数据字节数存放在VD96的最低字节
R V96.0, 24 // VD96高位3字节清零
MOVD &VB103, VD92 // 接收报文数据区首地址送给指针VD92
+D VD96, VD92 // 求校验码地址,VD96中为报文数据区字节数
MOVB *VD92, VB91 // 接收到的校验码送VB91
INCB VB99 // 得到需要异或的字节数
CALL SBR1, &VB102, VB99, VB90 // 调用子程序FCS, 计算校验码,结果送VB90
Network 2
LDB= VB90, VB91 // 如果校验正确
R Q1.0, 1 // 复位校验错误指示位
MOVB 5, SMB34 // 定时5ms以提供PPI电缆接收/发送模式切换时间
ATCH INT2, 10 // 起动定时中断
CRETI // 中断返回
NOT // 如果有校验错误
S Q1.0, 1 // 将校验错误指示位置1
Network 3
LBL 1 // 非正常接收结束时跳转到此处
Network 4
LD SM0.0
RCV VB100, 0 // 起动新的接收
END_INTERRUPT_BLOCK
INTERRUPT_BLOCK INT_1:INT1
TITLE=
// 发送完成中断程序INT_1
//
//
BEGIN
Network 1
LD SM0.0
RCV VB100, 0 // 起动新的接收
//
END_INTERRUPT_BLOCK
INTERRUPT_BLOCK INT_2:INT2
TITLE=
// 定时中断程序INT_2
//
//
BEGIN
Network 1
LD SM0.0
DTCH 10 // 断开定时器中断
XMT VB100, 0 // 在端口0向计算机回送接收到的报文
//
END_INTERRUPT_BLOCK
在调试软件中发送数据时,一直提示“接收超时,请检查相关参数设置。”。
后来将SMW92超时时间的值逐渐改大后,直到30秒,还是没有起色。
在此想请做过的老师指点一下,
在串口调试软件中的发送应该如何组织?
消息帧发送的频率有什么要求?
出现故障时如何查找原因?
由于用的是 笔记本电脑+国产PC/PPI电缆+232/USB转换线的配置,不知产生故障的结果是不是和这样的配置有关?
程序中关于PC/PPI电缆的发送/接收切换时间的部分是否要做一些必需的修改?
另在使用VB6.0调试书中例7-6时,在通信界面中的接收显示框中出现的数据有时是只有起始字符”0"和结束字符“255”,有时除了起始字符和结束字符以外只有一个发送的数据,根本原因不知道出在哪里。
哪位老师用台式机的串口做过?或者用过类似的配置做过,请赐教。
给您作揖了。