首页天道酬勤三菱modbus通讯实例,fx3umodbus通讯实例

三菱modbus通讯实例,fx3umodbus通讯实例

张世龙 05-12 13:54 59次浏览

MODBUS是工业上常用于通信的通信协议,一般多用于PLC上。 主要定义为数据传输的规范。 例如,数据发送给谁,数据做什么,数据没有错,收到数据的从机告诉我们是否收到了数据等。

作为传输方式,大多使用RS232c形式的串行传输。 当然485转发也可以。 较高端的可以使用网络的tcp传输,但与之前的串行传输不同。

使用232传输时,整个系统只有一个主机,其馀的都是设备。 也就是说,只有作为主机的那个角色才能初始化网络控制整个网络的所有从站。从机和从机之间不允许直接通讯,这相当于一台PLC控制其外部设备。

使用TCP传输时,没有主从的概念。 对等技术通信,也就是说所有节点的地位都是对等的。 控制器可以接收数据并作出响应,也可以主动检查网络上其他控制器的状态。 当然,在协议上仍然有主从的数据定义。

这是因为232个网络没有冲突检测。 有了两个主机,数据很容易就会变得混乱。 但是,到了tcp时代,底层数据链路层已经做好了冲突检测的工作,自然就可以同时传输数据,而不用担心数据冲突。

现在让我们来看看modbus数据传输的协议模型

开头是地址帧,在modbus网络中为每一个从机都有一个地址,主站在访问从站时依赖于该唯一的地址识别。 多个从站接收主站的数据时,使接收到的数据和自身的地址一致,一致的从站响应,其他的则忽略。

第二个是功能代码,决定该帧数据主要做什么、数据的输入、数据的输出、控制量的读取等。

第三个是数据。 有也可以没有。

第四种是错误检查,用于检查以前发送的数据,防止发送过程中因电磁干扰导致数据错误。

以上是一种简单的协议类型,但接下来该协议类型有两种实现: 3358www.Sina.com/实现和ascii实现。 我个人喜欢叫命令行实现和代码实现。 我以后就知道你为什么这么叫我了。 首先,3358www.Sina

RTU在此模式下,传输如下

首先,如果字节数据的传输时间为t,则modbus是按byte传输的每两个帧的间隔最小必须大于3.5T。 否则,从机不能识别出这是两帧。 第二,同一帧的连续两个数据之间的间隔时间不能超过1.5T。 否则,节点将认为这一帧的数据不完整。 这是因为,在modbus传输时

接下来,假设地址位为1字节,功能代码为1字节,数据为n字节,crc检查为2字节,那么这个n的限制是多少? 协议规定,一帧的数据最多可以是252字节,最低可以是0字节。

Ascii模式在此模式下,发送的帧中的数据的每一位只能是Ascii代码的0-9、a-f。 在RTU模式下,每字节一个数据(1字节0x00-0xff ),因此在Ascii模式下,必须在2字节中标识一个有效数据,才能发送相同的数据。 即,如下所示

3RTU模式,结束也由特定字符判断,http://www.Sina.com/,数据的最大长度扩展到2*252,可以在两种传输模式下传输相同的数据量,但ascii传输更慢

但是,时间判断标准在ascii模式下并不是没有用,还是有用的。 字符之间的间隔不应大于1秒,即使大于1秒也认为丢失了该帧的数据。 同样,ascii帧的最大长度可以计算为513字节。

此时,你能理解为什么这被称为命令行模式吗? 在此模式下发送的是可视化字符串,可以人工输入,但在之前的RTU模式下,手动输入很麻烦呢。 一般的程序输入,而且他以换行结尾,初期应该主要在windows上调试。 因为linux只需要换行就可以实现windows的换行。 在此模式下,可以将命令写入文本中并直接输入。 但是,这两年很少使用acsii模式。 调试软件的出现简化了手动输入的步骤。

这里,两种模式的不同还有另一种检查方式的不同。 是数据以帧为单位传输在Ascii模式下,不是依靠时间间隔判定帧起始了,而是依靠特定字符判断

我们先看看CRC

然后是LRC

如前所述,不符合时间规则的数据可以被扔掉,主机怎么知道是被扔掉了? 如果主机向100个设备发送数据,而网络中没有100个?

是的,起始的判断是’:’字符,结束的判断是windows下的回车换行,地

址从0x01-0xff,而0x00是广播地址,也就是说,0x00发送的数据所有的设备都要接收,但是不能响应,而其他的节点的设备在收到数据之后,必须在有限的时间里面进行响应,或者说是应答,主机端会有一个超时管理,超过一定时间没有反应就会认为数据丢失,该时间可以自由设置,设计者在设计的时候应当保证尽量使得超时时间大于任何一个外设的响应时间.

  其实,当设备接收到了数据应该怎么应答,这个时候又分为正确应答和错误应答,正确应答很好说,还是这个格式的数据帧

  地址是从机自己的地址,功能码和主机发送来的功能码保持一致,数据看需求(功能码的需求)

         错误的请求的回应,还是在功能码上下功夫,之前忘了说,功能码是从0x00-0x7f,也就是最高位都是0,当请求出错的时候,将主机发送过来的功能码加上一个0x80,让最高位为1就OK了,数据部分可以定义一个异常码,比如请求获取温度,发现温度传感器离线了,定义一个异常码0x01,数据域放0x01,主机就知道出错的具体原因是什么了.

  到这里基本上写一部分就说完了,最后附录上modbus预定义的功能码和异常码,具体可以参考modbus协议文档.

功能码有:

 

异常码为

 

dflog,blkid命令