我手头上有一个西门子200以及一个使用modbus-rtu通讯协议的温湿度的传感器。然后我用485转USB把传感器接在电脑上,然后用串口助手发送询问桢,串口助手自动自动接收到应答桢,并且数据无误,然后把传感器与西门子串口连接起来,写程序进行读取,怎么也读不出来。总体疑问有以下几点:
1.经过初始化后,西门子的mbus_MSG程序有两个功能,一个是读一个是写,先说读功能,我如果直接读温湿度所在的寄存器,那么会一直显示错误3,即接受超时。
2.再来说写功能,我如果用写功能,那么我有三个疑惑的地方,我的询问桢是不是先得放在寄存器里,然后发送过去?
第二个疑惑的地方,我写的地址是不是文档里面给出的40001,如果不是,应该往哪里写?
第三个疑惑的地方,我的技术文件里面写着说,这是只读寄存器,那我怎么写进去?
第四个疑惑的地方,如果上面的全对,那我写进去了,他的应答桢放在哪里给我,我放询问桢的地方吗?
第五个疑惑的地方,我每次用写程序后,我原来放询问桢的寄存器的数据都会被改变,但是这些数据是固定的,就是不管我有没有连接传感器,只要执行了写程序,里面的都会被改变成固定值。
图片说明:
最佳答案
从你的提问,以及你所附程序来看,你根本没有理解PLC的MBUS_MSG指令。使用这条指令实际上已经指明:地址码(slave),功能码(WR和Addr共同决定),起始地址Addr,字节数(2xcount个)。换句话说,就是PLC系统会自动把这些打包生成一个数据帧。而你编程时还去定义VB100=1(地址码),VB101=3(功能码)(你所附程序网络5/6)这是错误的。你真正要定义的是,你把什么数据发出去(以&VB**开始的2xcount个字节),或把接收到数据存储在哪里(以&VB**开始的2xcount个字节)。
接下来回答你的疑惑:
1、你的程序网络14中:写40001开始的4个字空间,这是错误的。40001只可读,无法写,可能你的传感器无法响应你的写请求。因此出现错误代码3也不奇怪。
2、根据你的附图:寄存器地址。你可写有40100(Modbus站地址),40101(通信速率).
疑惑一:询问帧(读)是不是先得放在寄存器里,然后发送过去?
回答:不需要。指令自动生成询问帧。参见我的最上面一段话的描述。
疑惑二:我写的地址是不是文档里面给出的40001,如果不是,应该往哪里写?
第三个:我的技术文件里面写着说,这是只读寄存器,那我怎么写进去?
第四个:如果上面的全对,那我写进去了,他的应答桢放在哪里给我,我放询问桢的地方吗?
回答:对40001进行写操作,这是错误的。
疑惑五:我每次用写程序后,我原来放询问桢的寄存器的数据都会被改变,但是这些数据是固定的,就是不管我有没有连接传感器,只要执行了写程序,里面的都会被改变成固定值。
回答:你的附图程序中,对40001进行了读操作,你定义的所谓“询问帧”的首地址给了真正的应答帧指明了存储的首地址。当然PLC会把接受的数据存在这个位置。数据改变是理所当然。
提问者对于答案的评价:
原创文章,作者:ximenziask,如若转载,请注明出处:https://www.zhaoplc.com/plc367289.html