问题:CPU224CN与测微计MODBUS通信。探头通过232连接分集器,分集器485口连接PLC。通信协议如下图,PLC程序如下图。通过MODSACN32读仪表数据OK,通过MODSIM32仿真给PLC发送数据也OK,通讯参数一样,数据地址一样。但就是仪表对PLC数据上不来。站地址128,波特率19200,奇校验,1位停止位,数据地址40002, PLC,仪表均是这套参数,仪表参数是通过命令写进去的,也读取确认了。数据线没检测没问题。
疑问:通过MODSACN32读仪表数据时,发现19200速率下奇校验偶校验,1位停止位2位停止位均可以正常读取数据,其他参数不行。
请老师帮分析下,看看怎么搞?哪里出问题了。
另200MODBUS RTU 必须1位停止位吗?
问题补充:
问题补充:1.探头和PLC就挨着,距离很近。
2.程序图奇偶校验是1的时候也不行。3.另外看到论坛里有人说MSG指令的EN和FIRST不能用SM0.0来做,我这个做法有问题吗?4.读多个设备不同地址的时候做一个轮询什么的,单个设备一个地址的时候程序怎么编写?谢谢
图片说明:
最佳答案
1 、S7-200、S7-200 SMART指令库支持的MODBUS RTU协议必须是8位数据位、1位停止位,这两个参数是不可更改的,它是由其通讯芯片决定。
2、按你的描述,与MODSCAN32通讯正常了,说明仪表地址、通信参数、通讯线路连接没有问题。
3、主站的初始化指令MBUS_CTRL的Parity取值范围为(0、1、2), 0=无校验1=奇较验,2=偶较验),我认为是Parity应为1;
4、分配的库存储区要保证不要与程序中用到的V区有任何重叠,包括库存储区V区的位引用、字节引用、字引用及双字引用,这一点非常重要。
5、上电运行后,把PLC的模式小开关,拔到STOP位后,CPU通讯口变为了PPI口,这时退出所有占用通讯口的程序,比如MODSCAN32,将编程序软件在线,用状态表看看MBU_MSG指令的DONE位及Error,对应你的程序是M0.1、MB12的值,在程序中加一个网络,捕捉MBU_MSG指令的DONE位的上升沿,其上升沿触发记录MB12的错误代码并将DONE位为1的状态记录下来。比如将ERROR记录在你的程序没有用到的M区或V区的存储字节。
DONE:=0时,正常
Error:只有在 Done 位为1时,错误代码才有效
=0,时无错误
=1,1 = 响应校验错误
2 = 未用
3 = 接收超时(从站无响应)
4 = 请求参数错误(slave address, Modbus address, count, RW)
5 = Modbus/自由口未使能
6 = Modbus正在忙于其它请求
7 = 响应错误(响应不是请求的操作)
8 = 响应CRC校验和错误
101 = 从站不支持请求的功能
102 = 从站不支持数据地址
103 = 从站不支持此种数据类型
104 = 从站设备故障
105 = 从站接受了信息,但是响应被延迟
106 = 从站忙,拒绝了该信息
107 = 从站拒绝了信息
108 = 从站存储器奇偶错误
常见的错误:
如果多个 MBUS_MSG 指令同时使能会造成 6 号错误
从站 delay 参数设的时间过长会造成主站 3 号错误
从站掉电或不运行,网络故障都会造成主站 3 号错误
参见下面链接的Modbus RTU 主站部分
http://www.ad.siemens.com.cn/productportal/Prods/s7-200-portal/MicroPower2013/s7-200/communication/modbus/modbus%20master/Modbus%20master.htm
补充回复:
看到论坛里有人说MSG指令的EN和FIRST不能用SM0.0来做,这个说法是对的。
MSG指令一般是利用CTRL指令的DONE位来做轮询。轮询的实列在我上面发的链接中去找。
就你现有的附图程序的基础上,你就将MSG指令的EN也改在SM0.5,其它参数不动。前提是只有这一个MSG指令。
提问者对于答案的评价:
谢谢,问题解决。
原创文章,作者:ximenziask,如若转载,请注明出处:https://www.zhaoplc.com/plc368823.html