mbus协议.docx
- 文档编号:6249300
- 上传时间:2023-05-09
- 格式:DOCX
- 页数:8
- 大小:22.65KB
mbus协议.docx
《mbus协议.docx》由会员分享,可在线阅读,更多相关《mbus协议.docx(8页珍藏版)》请在冰点文库上搜索。
mbus协议
竭诚为您提供优质文档/双击可除
mbus,协议
篇一:
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;
停止位:
传输一个字符有几个停止位,用天判断某个字符是否传输结束,以便开始接收下一个字符。
通讯格式的作用是规范发送方与接收方的传输格式,如果双方通讯格式不一样,接收方就不可能正确判断发送方发来的东西是什么。
比如,接收方设置的波特率是10(一秒只接收十个位)位,而发送方的波特率是20(一秒发送二十个位),那么发送方一秒种发送的20个字符,接收方就不可能都收到,只能接收到10个,造成通讯出错。
校验方式:
双方校验方式不一样,就没有一个统一的标准认定传输是否有错误。
数据位,接收方设定的七位,即它接收到七个位就认为是一个字符,而实际发送方设定的是八位,那么接收方认定的字符与发送方发送的字符就不一样了。
***参预通讯的双方设定的通讯格式必须一样的!
!
二、通讯规范(这个词是我自己定义的,不能引用,会被人笑话的)
通讯格式只是保证接收方正确地接收到发送方传输过来的每一个字符(实际如上所述,检验方式并不能保证完全正确,还要靠通讯规范中的校验和计算来验证整体正确性,下面会继续说明),那么接收到的整串字符做什么用呢,就要靠通讯规范了
modbus的通讯规范很简单!
先说ascii方式:
ascii方式发送时的规范定义如下:
起始符+设备地址+功能代码+数据+校验+结束符
1\起始符:
接收到一串字符,总要知道这串字符从哪个地方开始吧,这就是起始符的作用,接收方不管以前收到多少个字符。
当接收到起始符时,以前的字符就不再理它了,从起始符开始分析以后的字符!
modbus的ascii方式起始符是一个冒号“:
”2\设备地址:
前面说过,modbus是单主站的主/从通信模式,一个主站下面可以接十多个从站。
大家都挂在一条线,如果没有一个设备地址,就不知道是发给哪个从站的,大家都回应的话,这条线上的信号就乱七八糟了,主站也不知道接收到的是什么了。
所以,设这么一个设备地址,告诉是给那个从站的。
只要这个从站回答,其他的闭嘴!
“二号,请您回答,其他人就不要吱声了。
”
广播地址(0)是命令式的,不要求从站回答的。
“都听着,晚上全体到我家喝酒去,不去者死,散会!
”
设备地址是要求两个字符,比如发给2号站,则是“02”
现在的组合是“:
02”
3\功能代码:
告诉从站应该做什么,比如读数据的命令是“3”,从站接收到这个命令,再根据下面数据要求的具体地址,把具体地址的数据返回给主站。
功能代码也是要求两个字符,比如读命令3,则是“03”
现在的组合是“:
0203“
”
4\数据:
1、告诉从站具体的元件通讯地址,写入到哪里,从哪里读。
如读变频器的设定频率的通讯地址是00a0
元件的通讯地址要求是四个字符,如果控制器的元件地址不足四个字符,则在前面补0,比如元件通讯地址是a0,则在前面补足两个0:
“00a0”
2、数据又有可能包括您要读取的字节数(有的控制器是字数),比如连续读取plc的两个十六位寄存器,其字节数为四个,则是“0004”。
您看出来了吧,读取个数也是要求四个字符,不足四个,前面补零
现在的组合是“:
020300a00004“
3、而当您要实现写入功能时,数据又可能包括写入的数据,比如写入一个十六位寄存器的值,则要包括是写入的数值,如“0d98”
现在的组合是“:
020600a00d98“06是单个寄存器的写入命令
4、当连续写入多个寄存器时,这个数据包括的内容又
不一样,它可能是:
寄存器通讯地址(四个字符)+字数(四个字符)+字节数(两个字符)+要写入的数值
您看乱了吗?
没关系的,等您拿到具体控制器时,此控制器的通讯说明上会告诉您此
数据都包括什么内容,以什么样的格式排列!
您一定为我上面四点中的可能字样而生气,您认为讲解就应该讲解的具体,而不是可能什么又可能什么!
这又要重复说明一下modbus的通讯规范,
起始符+设备地址+功能代码+数据+校验+结束符
modbus是一种标准通讯协议,这种标准定义了上面红色字符的通讯规范,除了数据项,其他的都是固定字符个数。
数据呢,因为功能代码的不同,其包含的内容也不同!
所以我只好说可能包含这个,可能包含那个。
您无须担心此数据变来变去,造成接收方不知道如何分析。
接收方在接收到功能代码时,就已经知道此数据包含多少个字符了!
5\检验和:
前面说过,通讯格式里的校验方式并不能保证每个字符都正确,所以这里就把所有字符的值加在一起,其和(检验值)传给接收方,接收再把接收到的字符的值加在一起,与发送方传送过来的检验值比较,如果相等,就算接收正确了。
"这种方式极大地提高了传输的可靠性,保证了传输的顺利进行,为传输事业做出了巨大贡献"
这样的描述让您想到了什么?
假话呗,检验只是提高了校验的可靠性。
并不能完全判断传输是否正确。
想要最大限度的提高传输的可靠性,唯有最大限度地降低干扰!
于是产生了232,485,422传输方式,他们的区别就在于传输的可靠性!
1+2+3=63+2+1=6这两个字符串的作用肯定是不一样的!
但是其校验和是一样的,如果在传输过程中,由于干扰,1变3,3变1,根据校验和的计算,接收方并不知道由于干扰而造成传输错误,此时,或是出现通讯错误,或是出现通讯混乱。
如,命令码03,由于干扰而变成了30,此时校验和是一样的,而modbus并没有30这个命令码,接收不认识,于是出现通讯错误。
再如,读变频器的设定频率通讯地址是0001,由于干扰而变成了0010,此时校验和是一样的,但是通讯地址却变了,变频器就可能返回的是其他数据,造成通讯混乱!
校验字符是要求两个字符,如果计算结果超过两个字符,则取后两位!
**参加校验计算的字符是起始符与校验符之间的字符串(不含起始符与校验符)现在的组合是“:
02030a000004Fb“(假设校验和为Fb)
02030a000004参加校验和计算
6\结束符:
接收到一串字符,总要知道在那个地方结束吧,这就是结束符的作用,接收方不管以后还会收到多少个字符。
当接收到结束符时,以后再接收的字符就算是下一轮的东西了,从起始符到结束符之间的字符就是它要分析的字符!
modbus的ascii方式结束符是---chr$(13)+chr$(10)
现在的组合是“:
02030a000004Fb“+chr$(13)+chr$(10)
至此,ascii方式的发送就完成了,控制器接收到此串字符后,根据modbus协议定义的通讯规范分析此串字符的作用,然后返回相应的字符!
注意:
发送的字符都是以十六进制数表示!
控制器返回的字符根据命令的不同而不同,此处不好讲解,在下面具体例子中会有说明!
再说Rtu方式:
Rtu方式发送时的规范定义如下:
至少3.5个字符传输时间的停顿间隔时间标定消息的开始设备地址+功能代码+数据+校验+至少3.5个字符传输时间的停顿间隔时间标定了消息的结束
其他的就不用说了,与ascii方式一样的作用,唯独这3.5个字符的时间搞晕了很多人,实际我也不敢太解释,大致说一下吧,您就当听着玩,比如通讯格式是9600,e,8,1波特率是做什么的?
一秒传输多少个位(比如一秒传送9600个位),一个字符是多少个位呢?
通讯格式已经标定了(7个位或是8个位),那3.5个字符的传送时间就好算了吧:
3.5*11(或10)=39个位(35个位),传3.5个字符需要的时间是:
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协议的控制器,说一下具体的读/写例子
1\读某控制器的十五个寄存器值,发送的字符串是:
(ascii方式)
":
01031000000Fdd"+chr$(13)+chr$(10)
起始符“:
”+站号(01)+读命令(03)+起始寄存器通讯地址(1000)+字数(15;转换成十六进制000F)+校验和(dd)+结束符
控制器返回的字符数是71个
起始符“:
”+站号(01)+读命令(03)+字数(0F)+60个数据字符(一个寄存器是4个,一共十五个)+校验和(dd)+结束符(两个)
2\分别向某控制器两个寄存器写入数值,发送的字符串是:
(ascii方式)
":
01101000000204"+写入的数值(8个字符)+校验和+chr$(13)+chr$(10)
起始符“:
”+站号(01)+写命令(10)+起始寄存器通讯地址(1000)+字数(2;转换成十六进制0002)+字节数(04)+校验和(因为写入数值是变化的,需要得经过计算得出校验和)+结束符
控制器返回的字符数是17个
起始符“:
”+站号(01)+写命令(10)+起始寄存器通讯地址(1000)+字数(02)+错误码(2个)+校验和(dd)+结束符(两个)
***错误码,当通讯正确时是什么,通讯错误时是什么,具体控制器会有说明
读其他仪表的某值时,参照上述读的规范,也就是更改一下起始寄存器通讯地址、字数、校验和(校验和是编制程序块自动计算的。
)
要读多个仪表的同一个检测值更简单,更改站号就可以了。
篇二:
modbusRtu通讯协议与modbus通讯协议有什么区别
modbusRtu常见问题汇总
20xx年04月22日10:
57
注:
本资料由网络搜索,答案仅供参考(持续更新中)
点击查看modbusRtu产品详情
1、modbusRtu通讯协议与modbus通讯协议有什么区别?
modbus协议是应用层报文传输协议(osi模型第7层),它定义了一个与通信层无关的协议数据单元(pdu),即pdu=功能码+数据域。
modbus协议能够应用在不同类型的总线或网络。
对应不同的总线或网络,modbus协议引入一些附加域映射成应用数据单元(adu),即adu=附加域+pdu。
目前,modbus有下列三种通信方式:
1.以太网,对应的通信模式是modbustcp。
2.异步串行传输(各种介质如有线Rs-232-/422/485/;光纤、无线等),对应的通信模式是mou或modbusascii。
3.高速令牌传递网络,对应的通信模式是modbusplus。
2、关于modbusRtu通讯协议的提问?
modbus主要由站地址(一个字节)+功能码(一个字节)+首地址(两个字节)+访问字数(两个字节)+校验码(cRc16或lRc两个字节)总共8个字节组成。
其实Vb中编程很简单从组建添加mscomm组建就行了,难的是校验,
3、modbus、rtu、modbusrtu分别是什么?
modbus协议是工控行业的标准协议,前身为莫迪康所写,现已被施奈德收购
而modbus分为两种协议:
即串口协议(modbusrtu)和网口协议(modbustcp)协议,一般的工控机只支持rs232或者Rs485的串口模式,这个时候工控机的协议栈里就只有协议,当他从串口接收到数据时,会直接根据报文中的数据进行控制,如果需要用modbustcp协议进行传输,则需要使用带有网口的plc
具体的帧格式如下
modbusRtu地址域功能码数据差错校验
modbustcp目的地址协议id长度单元号功能码数据
简单的说tcp是由Rtu加工而来的
而Rtu则是另外一种概念,不包含在modbus协议内
是工控行业对监控设备的简称。
4、关于modbus_Rtu协议主机发送的命令的一些问题
01读保持线圈状态(Readcoilstatus)
02读输入线圈状态(Readinputstatus)
03读保持寄存器(Readholdingregister)
04读输入寄存器(Readinputregister)
05写单个线圈(Forcesinglecoil)
06写单个寄存器(presetsingleregister)
15写多个线圈(Forcemultiplecoils)
16写多个寄存器(presetmultipleregisters)
这些都是什么意思
答:
01读取逻辑线圈组状态
02读取离散量线圈组状态
03读取一个或多个保持寄存器的二进制值
04读取一个或多个输入寄存器的二进制值
05改变逻辑线圈状态
06改变单个寄存器的二进制值
15改变多个寄存器的二进制值
16指定多个操持寄存器的二进制值
5、opc转modbusRtu方式我现在有一个opc服务器,里面很多tag,tag是ab里出来的,怎么将tag连到modbus?
profibus、Fielbus、modbus、cc-link等等是各中plc硬件支持的通讯协议,这个是各厂商的硬件属性一样.只是现在计算机组态软件都支持很多种协议的plc.你理解反了.
profibus、Fielbus、modbus、cc-link这些协议,是一种通讯协议,一般不需要你去编程,就好象你使用计算机,你不需要编写ip协议一样,只是要遵循它.
遵循的意思就是,你必须按照该厂家所支持的协议在plc或者dcs硬件组态的时候按照该通讯协议设置硬件.其实这个很简单.这里简单指的是,你学编程,重点是编写执行控制的动作的程序,硬件通讯协议不需要你自己动手写。
6、什么是modbusrtumaster?
就是选Rtu模式,因为modbus分为ascii模式和Rtu模式,maseR就是设置为主站,一般为plc端,变频器设为从站,还要注意主站和从站地址的设置。
7、modbusrtu为什么没有开始和结束标记?
由于modbusrtu帧的每个字节是16进制数,数值范围在00~FF,若像modbusascii那样用02、03表示开始和结束标记,则与数值2、3发生冲突,无法判断其是标记还是数值,无法数据解包。
8、modbustcp到rtu的转换?
请仔细查看帧格式,
modbusRtu地址域功能码数据差错校验
modbustcp目的地址协议id长度单元号功能码数据
写一个tcp转Rtu的程序放到设备里做modbus网桥即可
9、modbusRtu通讯线被烧?
用万用表量一下出来的通讯线,电压不超过5V应该没问题,一般不会烧东西,接的时候区分正和负。
很多产品b是正,量一下看看。
10、触摸屏modbusrtu怎么设置?
一般是通过宏指令自己编程实现,当然也有支持Rtu的,在通讯类型菜单
11、modbusRtu协议中浮点数是如何存储,读到浮点数寄存器的数值如何转换成所需的浮点数?
浮点数保存的字节格式如下:
地址+0+1+2+3
内容seeeeeeeemmmmmmmmmmmmmmmmmmmmmmm
这里
s代表符号位,1是负,0是正
e偏移127的幂,二进制阶码=(eeeeeeee)-127。
m24位的尾数保存在23位中,只存储23位,最高位固定为1。
此方法用最较少的位数实现了较高的有效位数,提高了精度。
零是一个特定值,幂是0尾数也是0。
浮点数-12.5作为一个十六进制数0xc1480000保存在存储区中,这个值如下:
地址+0+1+2+3
内容0xc10x480x000x00
浮点数和十六进制等效保存值之间的转换相当简单。
下面的例子说明上面的值-12.5如何转换。
浮点保存值不是一个直接的格式,要转换为一个浮点数,位必须按上面的浮点数保存格式表
所列的那样分开,例如:
地址+0+1+2+3
格式seeeeeeeemmmmmmmmmmmmmmmmmmmmmmm
二进制11000001010010000000000000000000
十六进制c1480000
从这个例子可以得到下面的信息:
符号位是1表示一个负数幂是二进制10000010或十进制130,130减去127是3,就是实际的幂。
尾数是后面的二进制数10010000000000000000000
在尾数的左边有一个省略的小数点和1,这个1在浮点数的保存中经常省略,加上一个1和小数点到尾数的开头,得到尾数值如下:
1.10010000000000000000000
接着,根据指数调整尾数.一个负的指数向左移动小数点.一个正的指数向右移动小数点.因为指数是3,尾数调整如下:
1100.10000000000000000000
结果是一个二进制浮点数,小数点左边的二进制数代表所处位置的2的幂,例如:
1100表示
(1*2^3)+(1*2^2)+(0*2^1)+(0*2^0)=12。
小数点的右边也代表所处位置的2的幂,只是幂是负的。
例如:
.100...表示(1*2^(-1))+(0*2^(-2))+(0*2^(-2))...=0.5。
这些值的和是12.5。
因为设置的符号位表示这数是负的,因此十六进制值0xc1480000表示-12.5。
12、Rs-485的设备,遵守modbus-Rtu协议。
怎样用的电脑读取信息?
用电脑的串口,接个485转换器,接到设备的485接口,再找个串口软件,根据设备资料上的寄存器地
址发送modbus报文,modbus报文通过串口软件发送啊,报文格式:
010300000001840a读寄存器命令。
13、vbmodbus给modscan32rtu发送数据应该怎么写?
确定两个软件哪个是主,哪个是从。
然后再确定通讯协议是Rtu、ascii还是tcp。
如果是tcp,就用socket控件。
Rtu\ascii就用com控件。
然后给对应的口按照协议收发数并解析就可以了。
14、modbusRtu通讯协议与modbus通讯协议有什么区别?
modbus协议包括了modbusRtu
15、modbusrtu通讯协议如何判断超时?
设置一个标志量用来表示是否超时;再用一个定时器,定时时长为发送3.5个字符的时间(当然为了保险时间可以长一些);在定时器中置超时标志;在串口中断中每收到一个字节时定时器清零;主程序中根据超时标志做相应处理。
16、如何理解modbus协议Rtu模式中的1.5和3.5字符间隔?
发送两帧数据之间要有一定的时间间隔,以保证接收方uaRt能够区分。
这个时间间隔在模式中要求是1.5和3.5字符间隔,也即是传输1.5和3.5个字符的时间,它与设置的通信参数有关,计算为:
若串口通信参数设置为(注:
开始位固定为1):
数据位8,奇偶校验位1,停止位1,波特率9600bps,则传输一个字符(即1个字节)的时间为:
(1+8+1+1)/9600=0.00114583s=1.1454583ms
1.5字符间隔=1.5x1.1454583ms=1.71818745ms
3.5字符间隔=3.5x1.1454583ms=4.00910405ms
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- mbus 协议