02ModBus协议背景知识

PLC 数据寄存器

是具有微处理机的数字电子设备,用于自动化控制的数字逻辑控制器,可以将控制指令随时加载内存内储存与执,用于控制机械的生产过程。

常见分类

1、AX累加器:作为累加器使用。是算术运算的主要寄存器。在乘、除等指令中指定用来存放操作数。以及所有的
I/O指令都使用这一寄存器与外部设备传送信息。

2、BX基址:可以作为通用寄存器使用。此外在计算机存储地址时,它经常用作基址寄存器。

3、CX计数:可以作为通用寄存器使用。常用来保存计数值,如在循环、位移和串处理指令中作隐含计数器。

4、DX数据:可以作为通用寄存器使用。一般在作双字长运算时把DX和AX组合在一起存放一个双字长数,DX用来存放高位数。对于某些I/O操作,DX可用来存放I/O的端口地址

Modbus 关于协议的基础知识

一个工业上常用的通讯协议 协议包括RTU、ASCII、TCP.其中,RTU最常用。

实际的应用过程中,为了解决某一个特殊问题,人们喜欢自己修改MODBUS规约来满足自己的需要。更为普通的用法是,修改规约,将规约格式附在软件说明书一起,或直接放在帮助中,这样就方便了用户的通讯。

一条MODBUS-RTU报文

0106000100179804
从机地址功能号数据地址数据CRC校验

把数据 0x0017(十进制23) 写入 1号从机地址 0x0001数据地址

在这里插入图片描述
ADU: 应用数据单元, PDU: 协议数据单元

主写从

假如本机地址是 1,那么单片机接收到这串数据根据数据计算CRC校验判断数据是否正确,如果判断数据无误,则结果是:

HoldDataReg[1] = 0x0017;

MODBUS主机就完成了一次对从机数据的写操作,实现了通讯。

主读从

主机进行读HoldDataReg[1] 操作,则报文是:

010300 0100 01D5 CA
从机地址功能号数据地址要读取的数据长度CRC校验

那么单片机接收到这串数据根据数据计算CRC校验判断数据是否正确,如果判断数据无误,则结果是:返回信息给主机。

返回的信息也是有格式的:

0103020017F8 4A
从机地址功能号读取的数据长度数据值CRC校验

MODBUS主机就完成了一次对从机数据的读操作,实现了通讯。

代码功能取值

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-oVpRTeeR-1628472017977)(media/e14c811547df9804062f50eaebfff7a7.emf)]
"表格"也即"终端字符设备"
由上可知,线圈和保持寄存器,可读可写*; 离散量和输入寄存器,是只读类型。此外,注意一下:

线圈又称为: 输出线圈类型:可读写
离散量又称为: 输入线圈类型: 只读

代码实现

在这里插入图片描述

上:转载整理自:Modbus通讯协议详细解释


MODBUS协议直白理解

下:转载整理于:MODBUS协议最简单又是最直白的解释

Modbus是一种单主站的主/从通信模式。Modbus网络上只能有一个主站存在,主站在Modbus网络上没有地址,从站的地址范围为 0 - 247,其中 0为广播地址,从站的实际地址范围为 1 - 247。

Modbus通信标准协议可以通过各种传输方式传播,如 RS232C、RS485、光纤、无线电等。

Modbus具有两种串行传输模式,ASCII 和RTU。它们定义了数据如何打包、解码的不同方式。支持 Modbus 协议的设备一般都支持RTU 格式。通信双方必须同时支持上述模式中的一种

modbus协议也只是通讯协议的一种,没什么神秘的,通讯协议包括两个方面:

格式(外):

波特率检验方式数据位停止位
波特率

一秒钟传送的位数,也就是通讯速率;比如波特率为9600,即,一秒种可以传送9600个位数,位的概念看下面的数据位介绍

校验方式

奇校验或偶校验或无校验,目的是判断传输过程中是否有错误!它只是用于判断一个字符(比如八个位或是七个位组成一个字符)传输是否有错误。但是它并不能完全能够判断传输是否有错。比如偶校验,在检验送八个“11111111”时,如果到达接收方,由于干扰而变成了“10111101”,“1”的个数仍然是偶数,接收方就判断不出来传送的字符已经错误!

数据位

传输一个字符由几个位组成,计算机的基本单位就是“位”,其值非“0”即“1”,又如传送A,定义通讯格式时,是定义的八位,其传送的数据可能就是:00001010;

停止位

传输一个字符有几个停止位,用天判断某个字符是否传输结束,以便开始接收下一个字符。

规范

先说ASCII方式:

ASCII方式发送时的规范定义如下:

起始符设备地址功能代码数据校验结束符
起始符:

接收到一串字符,总要知道这串字符从哪个地方开始吧,这就是起始符的作用,接收方不管以前收到多少个字符。当接收到起始符时,以前的字符就不再理它了,从起始符开始分析以后的字符!
MODBUS的ASCII方式起始符是一个冒号 “:”

设备地址:

前面说过,MODBUS是单主站的主/从通信模式,一个主站下面可以接十多个从站。大家都挂在一条线,如果没有一个设备地址,就不知道是发给哪个从站的,大家都回应的话,这条线上的信号就乱七八糟了,主站也不知道接收到的是什么了。所以,设这么一个设备地址,告诉是给那个从站的。只要这个从站回答,其他的闭嘴!“二号,请您回答,其他人就不要吱声了。”

广播地址(0)是命令式的,不要求从站回答的。“都听着,晚上全体到我家喝酒去,不去者死,散会!”

设备地址是要求两个字符,比如发给2号站,则是“02”

现在的组合是“:02”

功能代码

告诉从站应该做什么,比如读数据的命令是“3”,从站接收到这个命令,再根据下面数据要求的具体地址,把具体地址的数据返回给主站。

功能代码也是要求两个字符,比如读命令3,则是“03”

现在的组合是:0203

数据(重要):

1、告诉从站具体的,写入到哪里,从哪里读,这叫通讯地址。如读变频器的设定频率的通讯地址是00A0。

元件的通讯地址要求是四个字符,如果控制器的元件地址不足四个字符,则在前面补0,比如元件通讯地址是A0,则在前面补足两个0:“00A0”。

2、数据又有可能包括您要读取的字节数(有的控制器是字数),比如连续读取PLC的两个十六位寄存器,其字节数为四个,则是“0004”。您看出来了吧,读取个数也是要求四个字符,不足四个,前面补零*
现在的组合是:020300A00004

3、而当您要实现写入功能时,数据又可能包括写入的数据,比如写入一个十六位寄存器的值,则要包括是写入的数值,如“0D98”。

那么,组合就是:020600A00D98
06是单个寄存器的写入命令。

4、当连续写入多个寄存器时,这个数据包括的内容又不一样,它可能是:

寄存器通讯地址(四个字符) +字数(四个字符)+字节数(两个字符)+
要写入的数值。

起始符设备地址功能代码数据校验结束符

上面除了数据项,其他的都是固定字符个数。

检验和:

检验只是提高了校验的可靠性,并不能完全判断传输是否正确。想要最大限度的提高传输的可靠性,唯有最大限度地降低干扰!于是产生了232,485,422传输方式,他们的区别就在于传输的可靠性!

命令码03,由于干扰而变成了30,此时校验和是一样的,而MODBUS并没有30这个命令码,接收不认识,于是出现通讯错误。

Attention :
 
校验字符是要求两个字符,如果计算结果超过两个字符,则取后两位!
 
参加校验计算的字符是起始符与校验符之间的字符串(不含起始符与校验符)

现在的组合是:02030A000004FB (假设校验和为FB)

02030A000004参加校验和计算

结束符:

接收到一串字符,总要知道在那个地方结束吧,这就是结束符的作用,接收方不管以后还会收到多少个字符。当接收到结束符时,以后再接收的字符就算是下一轮的东西了,从起始符到结束符之间的字符就是它要分析的字符!

MODBUS的ASCII方式结束符是: Chr(13)+Chr(10)。

现在的组合是:02030A000004FB+ Chr(13)+Chr(10)

至此,ASCII方式的发送就完成了,控制器接收到此串字符后,根据MODBUS协议定义的通讯规范分析此串字符的作用,然后返回相应的字符!

注意:发送的字符都是以十六进制数表示!

控制器返回的字符根据命令的不同而不同,此处不好讲解,在下面具体例子中会有说明!

再说RTU方式


规范:

至少3.5个字符传输时间的停顿间隔时间标定消息的开始设备地址功能代码数据校验至少3.5个字符传输时间的停顿间隔时间标定了消息的结束

其他的就不用说了,与ASCII方式一样的作用,唯独这3.5个字符的时间搞晕了很多人,实际我也不敢太解释,大致说一下吧,您就当听着玩,比如通讯格式是

9600E81

波特率是做什么的?一秒传输多少个位(比如一秒传送9600个位),一个字符是多少个位呢?通讯格式已经标定了(7个位,8个位),那3.5个字符的传送时间就好算了吧:

7个位3.5 * 10=35个位
8个位3.5 * 11 =39个位39/9600=4毫秒

不是说八位嘛,怎么乘11,记住了,还有一个起始位,奇或偶的校验位(无奇偶校验,则没有此位),停止位(两个停止位就是2了。)

例如:

9600,N,8,2为11个位,
9600,N,7,1.为9个位

就是说,您得保证发送字符串的连续性,中间停顿时间超过4毫秒,接收方就认为您已经发送完了这组消息,开始处理了。这就是至少3.5个字符传输时间的停顿间隔时间标定了消息的结束的含义。

如果您发送的下一组消息与上一组消息之间的间隔时间没超过4毫秒,接收方就认为这些字符是一组消息,按一组消息去处理。所以,您发送结束一组命令后,必须间隔4毫秒才能发送下一组命令。
这就是至少3.5个字符传输时间的停顿间隔时间标定消息的开始的含义。

协议:格式+规范

实际也就是这回事,任何一个协议都大同小异。通讯格式,通讯规范两种而已。

您如果愿意,也可以自己定义一个通讯规范,用PLC或是VB语言按照您自己定义的这个规范处理,如果可靠性超过modbus,那您的通讯规范就是最流行的了!

我经常问某些产品推广人员,“您设备的通讯协议是什么”,他回答:“232”或是“485”。今天您看了上面这些大白话,请您就不要再这样回答了。

Modbus通信标准协议可以通过各种传输方式传播,如 RS232C、RS485、光纤、无线电等。

“232”或是“485”只是一种线路传输方式,与协议是无关的!232传输抗干扰性差,485传输抗干扰相对强。

MODBUS作为一种标准的协议,应用于各种PLC,控制器,仪表。这些仪表或是控制器应用中,元件的通讯地址肯定是不一样了;各个命令码的各部分组成的意义也许也会不同;

但是,它一定会遵守MODBUS的协议规范。即,每个命令码的组成一定符合MODBUS的规范!一样不多,一样不少!

读写例子:

下面针对某种支持MODBUS协议的控制器,说一下具体的读/写例子。

读十五个寄存器值

发送的字符串是(ASCII方式) : :01031000000FDD

起始符 :站号 (01)读命令 (03)起始寄存器通讯地址 (1000)字数 (15;转换成十六进制000F校验和 (DD结束符 Chr(13)+Chr(10)

控制器返回的字符数是71个

注意:下面的01,03,0F,DD都是2个 (16位) 字符

起始符 :站号(01)读命令(03)字数(0F)60个数据字符(一个寄存器是4个,一共十五个)校验和(DD)结束符(两个)
写两个寄存器

发送的字符串是:(ASCII方式)

“: 01101000000204”+ 写入的数值(8个字符)+ 校验和 + Chr(13)+Chr(10)

起始符“:”站号(01)写命令(10)起始寄存器通讯地址(1000)字数(2;转换成十六进制0002)字节数(04)校验和(因为写入数值是变化的,需要得经过计算得出校验和)结束符

控制器返回的字符数是17个

起始符“:”站号(01)写命令(10)起始寄存器通讯地址(1000)字数(02)错误码(2个)校验和(DD)结束符(两个)

错误码,当通讯正确时是什么,通讯错误时是什么,具体控制器会有说明。

读其他仪表的某值时,参照上述读的规范,也就是更改一下起始寄存器通讯地址、字数、校验和(校验和是编制程序块自动计算的。)

要读多个仪表的同一个检测值更简单,更改站号就可以了。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值