linux驱动-MODBUS协议
Modbus是使用主从关系实现的请求 - 响应协议。 在主从关系中,通信总是成对发生 - 一个设备必须发起请求,然后等待响应 - 并且发起设备(主设备)负责发起每次交互。 通常,主设备是人机或监控和数据采集(SCADA)系统,从设备是传感器、可编程逻辑控制器(PLC)或可编程自动化控制器(PAC)。 这些请求和响应的内容以及发送这些消息的网络层由协议的不同层来定义。
在最初的做法中,Modbus是建立在串行端口之上的单一协议,因此它不能被分成多个层。 随着时间的推移,该协议引入了不同的应用程序数据单元来更改串行通信使用的数据包格式,或允许使用TCP/IP和用户数据报协议(UDP)网络。 这实现了定义协议数据单元(PDU)的核心协议和定义应用数据单元(ADU)的网络层的分离
应用场景
Modbus协议是一项应用层报文传输协议,包括ASCII、RTU、TCP三种报文类型,
-
modbus RTU协议紧凑,采用二进制表示数据的方式,一般默认使用RTU协议,可以使用RS232/RS485/RS422、无线、等介质,用于速度要求不高的场合,如:楼宇、工业现场、管道输送、远程泵站等;
-
modbusASCII协议比较宽松,时序要求不高,可以用于条形码阅读器、打印机、仪器仪表读取等;
这两类都使用串行通信(serial communication)方式。RTU格式后续的命令/数据带有循环冗余校验的校验和,而ASCII格式采用纵向冗余校验的校验和。被配置为RTU变种的节点不会和设置为ASCII变种的节点通信,反之亦然。
-
modbusTCP速度很高,可以用于实时控制、时钟对时、全局数据、发送邮件、故障设备替换、网络管理、用户网页制定和浏览、固件更新等多种服务。
基本原理
modbus RTU协议
标准的Modbus协议物理层接口有RS232、RS422、RS485和以太网接口,采用master/slave方式通信。
帧结构
帧结构 = 地址 + 功能吗 + 数据 + 校验
地址: 占用一个字节,范围0-255,其中有效范围是1-247,其他有特殊用途,比如255是广播地址(广播地址就是应答所有地址,正常的需要两个设备的地址一样才能进行查询和回复)
功能码: 占用一个字节,功能码的意义就是,知道这个指令是干啥的,比如你可以查询从机的数据,也可以修改数据,所以不同功能码对应不同功能.
数据: 根据功能码不同,有不同结构
校验: 为了保证数据不错误,增加这个,然后再把前面的数据进行计算看数据是否一致,如果一致,就说明这帧数据是正确的,我再回复;如果不一样,说明你这个数据在传输的时候出了问题,数据不对的,所以就抛弃了
2.通讯
0x06功能码,修改从机数据:
主机发送: 01 06 00 00 00 01 48 0A
从机回复: 01 06 00 00 00 01 48 0A
*发送数据解析*/
01-主机要查的地址
06-功能码,代表修改单个寄存器功能,修改有些不同,有修改一个寄存器和修改多个寄存器;
00 00-代表修改的起始寄存器地址.说明从0x0000开始.
00 01-代表修改的值为00 01.结合前面的00 00,意思就是修改0号寄存器值为00 01;
48 0A-循环冗余校验,是modbus的校验公式,从首个字节开始到48前面为止;
/*回复解析*/
01-从机返回的地址,说明这就是主机查的从机
06-功能码,代表修改单个寄存器功能;
00 00-代表修改的起始寄存器地址.说明是0x0000.
00 01-代表修改的值为00 01.结合前面的00 00,意思就是修改0号寄存器值为00 01;
48 0A-循环冗余校验,是modbus的校验公式,从首个字节开始到48前面为止;
功能码0x10,修改连续多个寄存器
主机发送: 01 10 00 00 00 01 02 11 22 2A 19
从机回复: 01 10 00 00 00 01 01 C9
*发送数据解析*/
01-主机要查的地址
10-功能码,代表修改多个寄存器功能;
00 00-代表修改的起始寄存器地址.说明从0x0000开始.
00 01-代表修改的寄存器数量,这里开始于0x06的修改不同;
02 -表示修改的总字节数,由于只修改了1个寄存器,所以数据要有两个字节;
11 22-表示修改的值,结合上面,就是从第0000寄存器开始修改一个寄存器值为11 22,就是把0000寄存器改为11 22;
2A 19-循环冗余校验,是modbus的校验公式,从首个字节开始到22前面为止;
/*回复解析*/
01-从机返回的地址,说明这就是主机查的从机
10-功能码
00 00-代表修改的起始寄存器地址.说明是0x0000.
00 01-代表修改的寄存器数量,只需要回复这么多久足够了,从机告诉主机,你修改了哪几个寄存器就足够了;
01 C9-循环冗余校验;
归纳
modbus RTU协议只需要看懂功能码0x03,0x06,0x10这三个基本的就已经足够了;分别回想下其数据域部分:
03-主机需要发送起始地址+寄存器数量,从机回复总字节数+数据;
06-主机发送起始地址+数据内容(因为你只需要修改一个,所以起始地址就是所要修改的地址),从机返回起始地址+数据内容(发现居然一样!)
10-主机发送起始地址+寄存器个数+总字节数+数据,从机返回起始地址+寄存器数量
Modbus-ACSII协议
概述
一般只需要了解RTU协议,因为前面有说过,必须要有RTU协议的,所以只需要了解了RTU协议,就可以读出设备信息了,至于ACSII协议,做个大概了解
帧形式
对于RTU协议,比如RTU发送一个字节:0x12;
ASCII协议则需要发送2个字节:一个字节代表1,一个代表2,即31和32,才能代表0x12.
所以,acsii协议的效率比较低。
从上面的图中,看出:
1)比RTU多了起始段 :, 多个结束符CR,LF
2)地址和功能都变成了2个字节;
3)数据部分更加繁琐,但是更符合人们的查看;
归纳:
由于Modbus-RTU和modbus-ACSII都是基于232和485链路的,所以其通讯模式半双工,一般是主机和从机的模式。其差别就是其字节的格式不同,一个是16进制的数据,一个是acsii数据。
Ascii多了帧头和帧尾,也就是说可以有用这个头尾判断一帧字节来判断是否结束;而RTU没有帧头和帧尾,所以协议里明确两帧之间要大于3.5个字节时间间隔,作为一帧结束的判断依据。
操作接口
设备类型
调试方法
一般在做Mobus前期的开发的时候,一般不是针对具体的Modbus设备进行寄存器的处理,而是使用Modbus模拟工具来进行调试,一般我们需要配合Modbus Slave、Modbus Poll、Virtual Serial Port Driver这几个模拟软件来进行开发的。
Modbus Poll :Modbus主机仿真器,用于测试和调试Modbus从设备。该软件支持Modbus的RTU、ASCII、TCP/IP。用来帮助开发人员测试Modbus从设备,或者其它Modbus协议的测试和仿真。
Modbus Slave: Modbus从设备仿真器,可以仿真32个从设备/地址域。每个接口都提供了对EXCEL报表的OLE自动化支持。主要用来模拟Modbus从站设备,接收主站的命令包,回送数据包。帮助Modbus通讯设备开发人员进行Modbus通讯协议的模拟和测试,用于模拟、测试、调试Modbus通讯设备。
Virtual Serial Port Driver:虚拟串口工具,不需要串口接线,提供虚拟的串口,适合学习和调试使用。
配合这几款软件,我们就可以实现串口Modbus协议的模拟测试了,如果我们使用Modbus的TCPIP协议,那么我们不需要VSPD也可以。
工作量评估
linux驱动-USB协议
应用场景
基本原理
USB(Universal Serial Bus)全称通用串口总线,USB为解决即插即用需求而诞生,支持热插拔。
USB端点有四种类型,分别对应了四种不同的数据传输方式。它们是控制传输、中断传输、批量传输和等时传输。
- 控制传输用来控制对USB设备不同部分的访问,通常用于配置设备,获取设备信息,发送命令到设备,或者获取设备的状态报告。总之,就是用来传送控制信息的,每个USB设备都会有一个名为“端点0”的控制端点,内核中的USB Core使用它在设备插入时进行设备的配置。
- 中断传输用来以一个固定的速率传送少量的数据,USB键盘和USB鼠标使用的就是这种方式,USB的触摸屏也是使用这种方式,传输的数据包含了坐标信息。
- 批量传输用来传输大量的数据,确保没有数据丢失,但不保证在特定的时间内完成。U盘使用的就是批量传输,用它备份数据时需要确保数据不能丢,而且也不能指望它能在一个固定的比较快的时间内复制完。
- 等时传输同样用来传输大量的数据,但并不保证数据是否到达,以稳定的速率发送和接收实时的信息,对传送延迟非常敏感,显然是用于音频和视频一类的设备。这类设备期望能够有一个比较稳定的数据流,比如在用QQ视频聊天时,肯定希望每分钟传输的图像/声音速率是比较稳定的。
操作接口
设备类型
调试方法
工作量评估
linux驱动-CAN协议
应用场景
基本原理
CAN(Controller Area Network)总线,即控制器局域网总线。CAN通信协议在1986年由德国电气商博世公司所开发,主要面向汽车的通信系统。现已是ISO国际标准化的串行通信协议。根据不同的距离、不同的网络,可配置不同的速度,最高速度为1MBit/s。
CAN被细分为三个层次:
(1)CAN对象层(the object layer);
(2)CAN传输层(the transfer layer);
(3)CAN物理层(the phyical layer);
对象层的作用范围包括:
(1)查找被发送的报文。
(2)确定由实际要使用的传输层接收哪一个报文。
(3)为应用层相关硬件提供接口。
传输层的作用主要:
(1)传送规则,也就是控制帧结构、执行仲裁、错误检测、出错标定、故障界定。
(2)总线上什么时候开始发送新报文及什么时候开始接收报文,均在传输层里确定。
(3)位定时的一些普通功能也可以看作是传输层的一部分。
(4)传输层的修改是受到限制的。
物理层的作用:
在不同节点之间根据所有的电气属性进行位信息的实际传输。当然,同一网络内,物理层对于所有的节点必须是相同的。尽管如此,在选择物理层方面还是很自由的。