科创梦想,节效未来
INEWS / 新闻中心

科节上位机的发展——Modbus工程师十多年的总结

来源: | 作者:何先生 | 发布时间: 1057天前 | 713 次浏览 | 分享到:

从02年开始采用VB开发上位机时,当时就考虑怎么能自行开发套ModBus的通讯方案。最初的简单应用到协议理解,从协议开发到协议解释,这个伴随了我10年的协议没有改变,只有我对它的理解和认识。我一直认为Modbus协议的存在是有其历史意义的,也就是说,即使没有Modbus,也有可能出现ABUS、dbus这样的协议,因为控制器之间的通信,一个标准的协议,会大大提高开发效率。所以现在各种国产品牌的PLC,比如台达,汇川,信捷等。,支持Modbus协议,也就是说,在学习了Modbus协议之后,我们就可以轻松实现与这些PLC的数据通信。在上位机中,广泛使用Modbus协议。文章有点长,谢谢大家的耐心,文末还有福利!Modbus协议能成为工业领域应用最广泛的协议,必须具备以下特点:1。免费:这是最大的前提,所有产品都一样。只有免费,才能在前期获得最大的使用量。2.简单性:Modbus协议帧格式简单紧凑,便于用户理解,便于厂商集成。3.接口:Modbus协议只是一个协议,属于应用层协议,所以不仅可以应用于串口(485/232/422),还可以应用于以太网、光纤、蓝牙、无线传输。

存储区分类我一般介绍Modbus协议的时候,喜欢站在Modbus协议制定者的角度,用一些东西进行比较和解释,可能很多人更容易理解。假设没有Modbus协议,我们想做一个协议。我们首先要明确协议的目的是数据传输。因此,为了更好地存储不同的数据类型,我们将布尔型和非布尔型数据分开存储。因此,我们有了线圈和寄存器的概念。从电气的角度来看,在电气控制回路中,一般通过接触器或中间继电器来实现控制。接触器或继电器最终通过线圈的通、断电来控制触点的合、开,所以用线圈来表示布尔量。寄存器在计算机中是用来存储数据的,所以非布尔数据放在寄存器中。这可以和PLC的存储面积相比。西门子的I/Q/M/S是线圈,V/C/T/DB是寄存器,三菱的X/Y是线圈,D/H/W是寄存器,欧姆龙的CIO是线圈,D/W/H是寄存器。以西门子为例。虽然I和Q代表线圈,但是分工不同。I代表输入,Q代表输出。输入是指输入存储区中的值为PLC需要采集输入触点信号,输入信号为只读的,功能码用“02”表示。输出是指将PLC处理的触点结果输出给给外部设备,外部设备是可读可写的,写功能码用“05”表示,读功能码用“01”表示。所以Modbus的线圈和寄存器也要按照只读,读写进一步细分,这样就形成了Modbus的位存储区。然而,存储区的名称是一个全名。开发和使用时用全名会比较麻烦,所以需要给它们取个别名,就像西门子的I/Q/M/SM,这些都是西门子给存储区取的代号,所以Modbus也要给这些存储区取个代号,协议的定义方式是直接采用了数字。所以,有以下的规则:存储区名称定义为,存储区代码输入线圈用“02”表示、输出线圈用“01”表示、输入寄存器用“03”表示、保持寄存器用“04”表示。这其实和我们的名字和昵称是一样的。名字用在正式场合,日常情况下我们一般可以用昵称。无论存储区域是什么,都会有一个范围限制,就像西门子的M区域可能最多8192,三菱的X区域可能最多2048。Modbus的每个存储区也应该有一个范围,不能无限使用。Modbus规定每个存储区的最大范围是65536,这是一个非常大的范围。我们以三菱的X区为例。如果最大范围是2048,这意味着我们只能访问地址X0-X2047。我们这里说的X0和X2047就是我们常说的PLC地址。那么这个地址是怎么编出来的呢?它由存储区号加上一个地址索引组成。我们把这个PLC地址理解为绝对地址,后面的地址索引理解为相对地址。所谓绝对地址,就是我们仅凭一个地址名就能知道数据在哪个存储区的个数,而这个数就是我们说的相对地址,所以绝对地址是唯一的,每个存储区都有相对地址。那么对于Modbus来说,我们的绝对地址和相对地址是什么样的呢?我们还是按照公式:绝对地址=区号+相对地址。但是会有一些不同。以保持寄存器为例。第一个绝对地址是400001,但是实际发送的时候会偏移一位字节。这是Modbus协议决定的,其他存储区也差不多。科节上位机的发展-Modbus工程师多年的总结如上所述,65535的范围是很大的。但在实际使用中,我们一般用不了这么多地址。一般一万以内就够我们用了。因此,为了方便起见,我们有一个短地址模型。我们可以这样理解。先回到我们的初衷。该协议的目的是用于数据传输。也就是说,为了读写数据,我们确定了四个存储区域来存储不同的数据类型。那么我们接下来就要对这些存储区进行读写,这可能会导致很多不同的行为,比如读取输入线圈存储区和读取输出线圈存储区。这是两种不同的行为。同样,如果使用读取输入线圈存储区和读取输出线圈存储区,也会比较麻烦,所以我们简单的给每个编队分配一个代号。我们再来探究一下,有多少种不同的行为?读和写是两种行为,有四个存储区。但是,我们知道输入线圈和输入寄存器是只读的,所以不能写入。如果去掉这两种,应该有六种不同的行为。如下图所示:行为序号,具体行为1读取输入线圈2读取输出线圈3读取输入寄存器4读取保持寄存器5写入输出线圈6写入保持寄存器然而Modbus协议进一步细分了写入输出线圈和写入保持寄存器两种行为,包括写入单个和写入多个,所以原来的六种行为变成了八种行为,每种行为都赋予了一个代号。形成下图所示的功能码列表:功能码功能描述0x01。读取输出线圈0x02读取输入线圈0x03读取保持寄存器0 X04读取输入寄存器0x05写入单个线圈0x06写入单个寄存器0x0F写入多个线圈0x10写入多个寄存器Modbus协议实际上,中的功能代码不止这八个,有些功能代码用于诊断或异常,但很少使用。这八个功能码是最重要的核心功能码。严格来说,Modbus是一个标准化的协议,而不是特定的协议。我们常说设备A和设备B通过Modbus协议进行通信,但这句话其实并不严谨。Modbus协议中有三种不同的协议,分别是ModbusRtu、ModbusAscii和ModbusTcp。同样,在串口网络中,我们也可以使用ModbusTcp协议,因为该协议只是一个规范,并不限制通信介质。消息格式我们前面说过Modbus有三种不同的协议,分别是ModbusRtu、ModbusAscii和ModbusTcp,所以这三种协议的消息格式也是不同的。

这三种协议的消息格式描述如下:1的消息格式。ModbusRtu如下:第一部分:从站地址,第二部分:功能码,第三部分:数据,第四部分:校验,CRC校验,2字节2。Modbus学习必须配合相关调试软件,才能达到事半功倍的效果。Modbus学习必备的三个神器是ModbusPoll、ModbusSlave和VSPD。ModbusPoll软件主要用于模拟Modbus主站或Modbus客户端,ModbusSlave软件主要用于模拟Modbus从站或Modbus服务器,VSPD的全称是Configure Virtual Serial Port Driver,用于为计算机创建虚拟串口。

即使要结合硬件,也有很多设备支持Modbus协议。各种品牌的PLC,各种品牌的仪表,各种温湿度传感器,流量计等。能很好的支持Modbus协议。