我现在通过串口助手与s7-200进行自由口通讯 设置了起始位 数据位 结束位。
plc中初始化时已经设定了:如下
LD SM0.0 // 该位始终为1
MOVB 9, SMB30 // 9600 bit/s,8位数据,无校验,1位停止位
MOVB 16#15, SMB88 // 允许接收,检测起始字符和结束字符,超时检测
MOVB 16#EC, SMB87 // 送报文起始字符0
MOVB 16#FF, SMB89 // 送报文结束字符十六进制数16#FF
MOVW +1000, SMW92 // 接收超时时间为1s
MOVB 100, SMB94 // 接收的最大字符数为100
ATCH INT_0:INT0, 23 // 接收完成事件连接到中断程序0
ATCH INT_1:INT1, 9 // 发送完成事件连接到中断程序1
ENI // 允许用户中断
RCV VB100, 0 // 端口0的接收缓冲区指针指向VB100
,通过接收中断,来控制输出点:程序如下
Network 1
LD SM0.0
MOVB VB102, MB6
Network 2
LD M6.0
= Q0.0
Network 3
LD M6.1
= Q0.1
Network 4
LD M6.2
= Q0.2
Network 5
LD M6.3
= Q0.3
Network 6
LD M6.4
= Q0.4
Network 7
LD M6.5
= Q0.5
Network 8
LD M6.6
= Q0.6
Network 9
LD M6.7
= Q0.7
Network 10
LD M6.0 // 如果校验正确
MOVB 5, SMB34 // 复位校验错误指示位
ATCH INT2, 10 // 定时5ms以提供PPI电缆接收/发送模式切换时间
CRETI // 起动定时中断
// 中断返回
// 如果有校验错误
// 将校验错误指示位置1
得到结果:
VB100接收的字节数3个 VB101起始字符16#15 VB102(数据这边有问题)VB103结束字符 16#FF
,问题 为什么单单VB102中的数据有问题,测试的结果与输出的Q0.x对应不上,很混乱
比如我数据发1500FF就出现VB102中的输出全为1,输入其他数据也是。这是为什么,我想要达到的效果是 00 全部不得电,01 Q0.1得电 ,输入02 Q0.2得电 等等 。求帮忙,是不是我哪边考虑错误了 ,新手 还多多帮助,谢谢。
最佳答案
如果你想通过电脑中的串口调试助手来控制PLC200的I/O口,不需要写通信程序,只需在串口调试助手中设置参数,如波特率、奇偶校验位、停止位、数据位等等就可以与PLC通信,通信电缆必须用RS232转RS485.
如果你有外设想同PLC200通信,这就要写通信程序,一般地来说,1.外设与PLC通信时外设都有发送字符的条件,你的程序看不到; 你的接受字符码是NAK,16#FF转换为字符码是什么呢?怎查不到?
2.字符接受完成后还需要发送字符,这样才能循环地发送接受字符,你程序中少了这部分。
提问者对于答案的评价:
1
专家置评
已阅,最佳答案正确。
原创文章,作者:more0621,如若转载,请注明出处:https://www.zhaoplc.com/plc190834.html