MODBUS是一个工业上通信常用的通讯协议,一般在PLC上面用的比较多,主要是定义了一种数据传输的规范,比如数据发给谁,数据是干嘛的,数据错没错,接收到数据的从机告诉我数据有没有接受到等.

传输的方式的话比较多的是使用RS232c形式的串口传输,当然485传输也可以,比较高端的可以使用网络的tcp传输,但是是和之前的串口传输有区别的.

在使用232传输的时候,整个系统中只有一个主机,剩下的全部是设备,也就是说,只有作为主机的那个角色才能初始化网络,并且对整个网络上的所有从机进行控制,从机和从机之间不允许直接通讯,这就相当于一台PLC对它外接的设备进行控制了.

在使用TCP传输的时候就没有主机从机的概念了,对等技术通讯,也就是说,所有的节点的地位是对等的,控制器即可以接受数据并作出响应,也可以主动查询网络上另一个控制器的状态,当然,但是协议上,依然会有主机从机的数据定义

之所以这样是因为在232的网络上没有冲突检测,要是两个主机,那数据很容易就混乱了,但是到了tcp时代,底层的数据链路层已经做了冲突检测的工作,自然就可以同时传输不担心数据撞车了.

到这里我们看看modbus数据传输的协议模型

开头是地址帧,在modbus网络中,每一个从机都有一个地址,主机在访问从机的时候依靠这个唯一的地址识别,多个从机接收到主机的数据的时候,匹配接收到的数据和自身的地址,匹配上的那个从机作出响应,其他的都忽略.

第二个是功能码,决定这一帧数据主要是干嘛的,输入数据,输出数据,读取控制量等

第三是数据,可以有也可以没有

第四是差错校验,用来对之前发送的数据校验,防止发送过程中因为电磁干扰,数据出错.

上面只是简单地协议原型,接下来这个协议原型有两种实现,分别叫做ascii实现和RTU实现,我个人比较喜欢称之为命令行实现和代码实现,为什么这么叫后面你就会知道了.首先我们要知道,modbus是按byte传输的,也就是一次传输一个字节

RTU模式

在该模式下,传输是这样的

首先,数据已帧为单位传输,如果一byte数据的传输时间为T,那么没两帧之间的间隔最小应该要大于3.5T,否则从机不能分辨这是两帧,第二,同一帧连续的两个数据之间的间隔时间不能超过1.5T,否则节点会认为这一帧数据不完整,这说明我们在modbus传输的时候要使能一个定时器的工作.

其次,地址位一个字节 功能代码一个字节,数据n字节,crc校验2字节,那么这个n的限制是多少?协议规定一帧中数据最多是252字节,最少可以是0字节

Ascii模式

在该模式下,传输的帧中的数据的每一位只能是ascii码的0-9 a-f,因为rtu模式下一字节一个数据,也就是1字节0x00-0xff,所以在ascii模式下为了传送相同的数据,必须两个字节标识一个有效数据,也就是如下

可以看到,找ascii模式下,不是依靠时间间隔判定帧起始了,而是依靠特定字符判断,结束也是按照特定字符判断,起始的判断是’:’字符,结束的判断是windows下的回车换行,数据的最大长度被扩容到了2*252,这样,两种传输模式能传输相同的数据量,但是ascii传输的更慢了,

但是并不是说时间判据在ascii模式中就没有用了,还是有用的,字符间的间隔不能大于1s,大于1s认为这一帧数据丢失.同样我们可以计算出来ascii帧的最大长度是513字节

这个时候你能理解为什么这个叫命令行模式了,因为这种模式下发送的是可视化的字符串,可以人工的输入,而之前的rtu模式,手工输入多麻烦啊,一般程序输入,而且我们可以判定,他以回车换行作为结尾,应该早期主要是在windows上调试的,因为linux只需要回车就能实现windows的回车换行,在这种模式下可以把指令写在文本中直接输入.不过这两年acsii模式用的少了,因为调试软件的出现简化了手工输入的步骤.

说到这里,两种模式之间的不同还有一个校验方式的不同,RTU使用crc校验,ASCII使用LRC校验,首先看看crc

然后是LRC

前面说了,不符合时间规则的数据将会被丢掉,那主机怎么知道被丢掉了呢?而且假如主机向100设备发数据,网络里面没有100怎么办?

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

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

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

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

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

功能码有:

异常码为

MODBUS协议详解的更多相关文章

  1. Modbus常用功能码协议详解

    Modbus常用功能码协议详解 01H-读线圈状态 1)描述:读从机线圈寄存器,位操作,可读单个或者多个: 2)发送指令: 假设从机地址位0x01,寄存器开始地址0x0023,寄存器结束抵制0x003 ...

  2. HTTP协议详解(转)

    转自:http://blog.csdn.net/gueter/archive/2007/03/08/1524447.aspx Author :Jeffrey 引言 HTTP是一个属于应用层的面向对象的 ...

  3. HTTP协议详解

    Author :Jeffrey 引言 HTTP 是一个属于应用层的面向对象的协议,由于其简捷.快速的方式,适用于分布式超媒体信息系统.它于1990年提出,经过几年的使用与发展,得到不断地完善和 扩展. ...

  4. 动态选路、RIP协议&&OSPF协议详解

    动态选路.RIP协议&&OSPF协议详解 概念 当相邻路由器之间进行通信,以告知对方每个路由器当前所连接的网络,这时就出现了动态选路.路由器之间必须采用选路协议进行通信,这样的选路协议 ...

  5. ASP.NET知识总结(3.HTTP协议详解)

    引言 HTTP是一个属于应用层的面向对象的协议,由于其简捷.快速的方式,适用于分布式超媒体信息系统.它于1990年提出,经过几年的使用与发展,得到不断地完善和扩展.目前在WWW中使用的是HTTP/1. ...

  6. 接口测试之HTTP协议详解

    引言 HTTP是一个属于应用层的面向对象的协议,由于其简捷.快速的方式,适用于分布式超媒体信息系统.它于1990年提出,经过几年的使用与发展,得到不断地完善和扩展.目前在WWW中使用的是HTTP/1. ...

  7. 计算机网络(12)-----HTTP协议详解

    HTTP协议详解 http请求 http请求由三部分组成,分别是:请求行.消息报头.请求正文 (1)请求行 请求行以一个方法符号开头,以空格分开,后面跟着请求的URI和协议的版本,格式如下:Metho ...

  8. OSPF协议详解

    CCNP OSPF协议详解 2010-02-24 20:30:22 标签:CCNP 职场 OSPF 休闲 OSPF(Open Shortest Path Fitst,ospf)开放最短路径优先协议,是 ...

  9. HTTP协议详解(真的很经典)

    HTTP 是一个属于应用层的面向对象的协议,由于其简捷.快速的方式,适用于分布式超媒体信息系统.它于1990年提出,经过几年的使用与发展,得到不断地完善和 扩展.目前在WWW中使用的是HTTP/1.0 ...

随机推荐

  1. 转 使用SQL从AWR收集数据库性能变化趋势

    使用SQL从AWR收集数据库性能变化趋势 为了对数据库一段时间的性能情况有个全面了解,显然AWR是一个非常有用的工具, 但很多人只会在数据库有性能问题时才会生成问题时段的awr报告去分析.虽然AWR ...

  2. 关于hasnextLine()方法的一些理解

    以前对于hasnextline的理解就是 :判断是否有下一个值 今天发现了个特例,它竟然是个阻塞式的方法 看下面一个案例 这是服务器 package Service; import java.io.I ...

  3. Htttp协议

    我 们在浏览器的地址栏里输入的网站地址叫做URL(UniformResourceLocator,统一资源定位符).就像每家每户都有一个门牌地址一样, 每个网页也都有一个Internet地址.当你在浏览 ...

  4. vi命令的常用操作

    G:移动到底部 进入vi的命令 vi filename :打开或新建文件,并将光标置于第一行首 vi +n filename :打开文件,并将光标置于第n行首 vi + filename :打开文件, ...

  5. JPA 系列教程5-双向一对多

    双向一对多的ddl语句 同单向多对一,单向一对多表的ddl语句一致 Product package com.jege.jpa.one2many; import javax.persistence.En ...

  6. 10款超酷实用的jQuery焦点图赏析及源码

    1.jquery整屏滚动插件Scrollify Scrollify是一个jQuery插件协助整屏滚动和顺利拍摄部分.完全可配置和优化. 在线演示 源码下载 2.jquery实现网易邮箱页面插件full ...

  7. NSAttributedString in Swift

    转载自: https://www.invasivecode.com/weblog/attributed-text-swift/   I have been talking quite a lot in ...

  8. [转]java构造方法的访问修饰符

    http://my.oschina.net/u/1464678/blog/210359 1.       类(class) 可见性修饰符: public—在所有类中可见,在其他包中可以用import导 ...

  9. pat L1-006. 连续因子

    L1-006. 连续因子 时间限制 400 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 陈越 一个正整数N的因子中可能存在若干连续的数字.例如630 ...

  10. 转:LoadRunner常用函数列表

    Web相关函数 函    数 功 能 描 述 web_custom_request 用户可以通过该函数自行创建一个HTTP请求的函数 web_image 模拟用户单击图片操作的函数 web_link ...