如题,使用cp341做modbus RTU的slave站时,使用FB7来接受master的发送过来的命令数据,用FB8来对此作出相应发送相应的数据给主站,如果是正常的带dongle的情况,一般就进行一些设置就可以了,不必要关心通讯的相应及CRC校验的细节等方面!
不过,我现在想自己学习通讯的知识,所以想自己处理通讯的响应等问题,如获取命令,分析数据,然后校验CRC码,然后发送数据!
我现在的问题是不知道master什么时候发送查询命令过来?请问用FB7的参数怎么知道主站发送查询数据的命令过来了?然后好对此做出响应,对要发送的数据计算CRC码,然后附在要发送的数据后面,然后启动FB8发送数据! 如附图。
问题补充:
通讯不是采用“一问一答”,或者说“一收一发”的方式吗? 自己做通讯肯定要知道对方何时“发问”,以便可以据此做出“应答”,而不至于导致通讯timeout!
另弱弱的问下,MODBUS RTU的应答帧是:
“地址+功能码+数据量(1字节)+数据1+数据2+...+数据n+CRC码”的结构吗?谢谢!
钻石用户推荐最佳答案
我现在的问题是不知道master什么时候发送查询命令过来?请问用FB7的参数怎么知道主站发送查询数据的命令过来了?然后好对此做出响应,对要发送的数据计算CRC码,然后附在要发送的数据后面,然后启动FB8发送数据!
-----------------------------------------------------------------------------
1、大部分时候FB7是一直处于接收状态,除非收到了master发来的报文,然后需要返回一条报文给master(调用FB8),发送完成后继续调用FB7等待master的下一条报文
因此,不管是自己写master程序还是slave程序,都是采用一发一收的形式,只是master是先发一条请求报文给slave然后开始等待接收,而slave则是上来就开始等待接收,收到报文以后则返回一条报文给master,如此周而复始。
2、FB7有两个输出管脚可以指示接收状态,一个是NDR(指示完成接收,但仅仅一个周期内有效,想监控的话最好用SR触发器保持一下),一个是ERROR(具体数值含义可以查软件help)
问题补充:通讯不是采用“一问一答”,或者说“一收一发”的方式吗? 自己做通讯肯定要知道对方何时“发问”,以便可以据此做出“应答”,而不至于导致通讯timeout!
另弱弱的问下,MODBUS RTU的应答帧是:
“地址+功能码+数据量(1字节)+数据1+数据2+...+数据n+CRC码”的结构吗?谢谢!
-------------------------------------------------------------------------------------------------------------------
3、串口通讯基本采用485接口,这就决定了软件是一收一发的模式,即不能同时调用发送和接收模块
4、modbus rut的应答祯其实不完全一样,你说的是读报文的基本格式,而写报文(05/06/15/16)则不一样,具体在网上搜一下modbus 协议即可,也可以安装西门子的modbus驱动包以后,会多出相关的pdf文档,里面也有关于modbus报文结构的描述
提问者对于答案的评价:
原创文章,作者:more0621,如若转载,请注明出处:https://www.zhaoplc.com/plc283466.html