Modbus通信协议.docx

上传人:b****1 文档编号:13544708 上传时间:2023-06-15 格式:DOCX 页数:14 大小:24.59KB
下载 相关 举报
Modbus通信协议.docx_第1页
第1页 / 共14页
Modbus通信协议.docx_第2页
第2页 / 共14页
Modbus通信协议.docx_第3页
第3页 / 共14页
Modbus通信协议.docx_第4页
第4页 / 共14页
Modbus通信协议.docx_第5页
第5页 / 共14页
Modbus通信协议.docx_第6页
第6页 / 共14页
Modbus通信协议.docx_第7页
第7页 / 共14页
Modbus通信协议.docx_第8页
第8页 / 共14页
Modbus通信协议.docx_第9页
第9页 / 共14页
Modbus通信协议.docx_第10页
第10页 / 共14页
Modbus通信协议.docx_第11页
第11页 / 共14页
Modbus通信协议.docx_第12页
第12页 / 共14页
Modbus通信协议.docx_第13页
第13页 / 共14页
Modbus通信协议.docx_第14页
第14页 / 共14页
亲,该文档总共14页,全部预览完了,如果喜欢就下载吧!
下载资源
资源描述

Modbus通信协议.docx

《Modbus通信协议.docx》由会员分享,可在线阅读,更多相关《Modbus通信协议.docx(14页珍藏版)》请在冰点文库上搜索。

Modbus通信协议.docx

Modbus通信协议

Modbus通信协议

摘要:

工业控制已从单机控制走向集中监控、集散控制,如今已进入网络时代,工业控制器连网也为网络管理提供了方便。

Modbus就是工业控制器的网络协议中的一种。

关键词:

Modbus协议;串行通信;LRC校验;CRC校验;RS-232C

一、Modbus协议简介

Modbus协议是应用于电子控制器上的一种通用语言。

通过此协议,控制器相互之间、控制器经由网络(例如以太网)和其它设备之间可以通信。

它已经成为一通用工业标准。

有了它,不同厂商生产的控制设备可以连成工业网络,进行集中监控。

此协议定义了一个控制器能认识使用的消息结构,而不管它们是经过何种网络进行通信的。

它描述了一控制器请求访问其它设备的过程,如果回应来自其它设备的请求,以及怎样侦测错误并记录。

它制定了消息域格局和内容的公共格式。

当在一Modbus网络上通信时,此协议决定了每个控制器须要知道它们的设备地址,识别按地址发来的消息,决定要产生何种行动。

如果需要回应,控制器将生成反馈信息并用Modbus协议发出。

在其它网络上,包含了Modbus协议的消息转换为在此网络上使用的帧或包结构。

这种转换也扩展了根据具体的网络解决节地址、路由路径及错误检测的方法。

1、在Modbus网络上转输

标准的Modbus口是使用一RS-232C兼容串行接口,它定义了连接口的针脚、电缆、信号位、传输波特率、奇偶校验。

控制器能直接或经由Modem组网。

控制器通信使用主—从技术,即仅一设备(主设备)能初始化传输(查询)。

其它设备(从设备)根据主设备查询提供的数据作出相应反应。

典型的主设备:

主机和可编程仪表。

典型的从设备:

可编程控制器。

主设备可单独和从设备通信,也能以广播方式和所有从设备通信。

如果单独通信,从设备返回一消息作为回应,如果是以广播方式查询的,则不作任何回应。

Modbus协议建立了主设备查询的格式:

设备(或广播)地址、功能代码所有要发送的数据、一错误检测域。

从设备回应消息也由Modbus协议构成,包括确认要行动的域、任何要返回的数据、和一错误检测域。

如果在消息接收过程中发生一错误,或从设备不能执行其命令,从设备将建立一错误消息并把它作为回应发送出去。

2、在其它类型网络上转输

在其它网络上,控制器使用对等技术通信,故任何控制都能初始和其它控制器的通信。

这样在单独的通信过程中,控制器既可作为主设备也可作为从设备。

提供的多个内部通道可允许同时发生的传输进程。

在消息位,Modbus协议仍提供了主—从原则,尽管网络通信方法是“对等”。

如果一控制器发送一消息,它只是作为主设备,并期望从从设备得到回应。

同样,当控制器接收到一消息,它将建立一从设备回应格式并返回给发送的控制器。

3、查询—回应周期

(1)查询

查询消息中的功能代码告之被选中的从设备要执行何种功能。

数据段包含了从设备要执行功能的任何附加信息。

例如功能代码03是要求从设备读保持寄存器并返回它们的内容。

数据段必须包含要告之从设备的信息:

从何寄存器开始读及要读的寄存器数量。

错误检测域为从设备提供了一种验证消息内容是否正确的方法。

(2)回应

如果从设备产生一正常的回应,在回应消息中的功能代码是在查询消息中的功能代码的回应。

数据段包括了从设备收集的数据:

象寄存器值或状态。

如果有错误发生,功能代码将被修改以用于指出回应消息是错误的,同时数据段包含了描述此错误信息的代码。

错误检测域允许主设备确认消息内容是否可用。

二、传输方式

控制器能设置为传输模式(RTU)在标准的Modbus网络通信。

用户选择想要的模式,包括串口通信参数(波特率、校验方式等),在配置每个控制器的时候,在一个Modbus网络上的所有设备都必须选择相同的传输模式和串口参数。

RTU模式

地址功能代码数据数量数据1...数据nCRC高字节CRC低字节

RTU方式仅适用于标准的Modbus网络,它定义了在这些网络上连续传输的消息段的每一位,以及决定怎样将信息打包成消息域和如何解码。

在其它网络上(象MAP和ModbusPlus)Modbus消息被转成与串行传输无关的帧。

当控制器设为在Modbus网络上以RTU(远程终端单元)模式通信,在消息中的每个8Bit字节包含两个4Bit的十六进制字符。

代码系统

8位二进制,十六进制数0...9,A...F

消息中的每个8位域都是一个两个十六进制字符组成

每个字节的位

1个起始位

8个数据位,最小的有效位先发送

1个奇偶校验位,无校验则无

1个停止位(有校验时),2个Bit(无校验时)

错误检测域

CRC(循环冗长检测)

三、Modbus消息帧

传输设备以将Modbus消息转为有起点和终点的帧,这就允许接收的设备在消息起始处开始工作,读地址分配信息,判断哪一个设备被选中(广播方式则传给所有设备),判知何时信息已完成。

部分的消息也能侦测到并且错误能设置为返回结果。

使用RTU模式,消息发送至少要以3.5个字符时间的停顿间隔开始。

在网络波特率下多样的字符时间,这是最容易实现的(如下图的T1-T2-T3-T4所示)。

传输的第一个域是设备地址。

可以使用的传输字符是十六进制的0...9,A...F。

网络设备不断侦测网络总线,包括停顿间隔时间内。

当第一个域(地址域)接收到,每个设备都进行解码以判断是否发往自己的。

在最后一个传输字符之后,一个至少3.5个字符时间的停顿标定了消息的结束。

一个新的消息可在此停顿后开始。

整个消息帧必须作为一连续的流转输。

如果在帧完成之前有超过1.5个字符时间的停顿时间,接收设备将刷新不完整的消息并假定下一字节是一个新消息的地址域。

同样地,如果一个新消息在小于3.5个字符时间内接着前个消息开始,接收的设备将认为它是前一消息的延续。

这将导致一个错误,因为在最后的CRC域的值不可能是正确的。

一典型的消息帧如下所示:

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

T1-T2-T3-T48Bit8Bitn个8Bit16BitT1-T2-T3-T4

图3RTU消息帧

3、地址域

消息帧的地址域包含8Bit(RTU)。

可能的从设备地址是0...247(十进制)。

单个设备的地址范围是1...247。

主设备通过将要联络的从设备的地址放入消息中的地址域来选通从设备。

当从设备发送回应消息时,它把自己的地址放入回应的地址域中,以便主设备知道是哪一个设备作出回应。

地址0是用作广播地址,以使所有的从设备都能认识。

当Modbus协议用于更高水准的网络,广播可能不允许或以其它方式代替。

4、如何处理功能域

消息帧中的功能代码域包含8Bits(RTU)。

可能的代码范围是十进制的1...255。

当然,有些代码是适用于所有控制器,有此是应用于某种控制器,还有些保留以备后用。

当消息从主设备发往从设备时,功能代码域将告之从设备需要执行哪些行为。

例如去读取输入的开关状态,读一组寄存器的数据内容,读从设备的诊断状态,允许调入、记录、校验在从设备中的程序等。

当从设备回应时,它使用功能代码域来指示是正常回应(无误)还是有某种错误发生(称作异议回应)。

对正常回应,从设备仅回应相应的功能代码。

对异议回应,从设备返回一等同于正常代码的代码,但最重要的位置为逻辑1。

例如:

一从主设备发往从设备的消息要求读一组保持寄存器,将产生如下功能代码:

00000011(十六进制03H)

对正常回应,从设备仅回应同样的功能代码。

对异议回应,它返回:

10000011(十六进制83H)

除功能代码因异议错误作了修改外,从设备将一独特的代码放到回应消息的数据域中,这能告诉主设备发生了什么错误。

主设备应用程序得到异议的回应后,典型的处理过程是重发消息,或者诊断发给从设备的消息并报告给操作员。

5、数据域

数据域是由两个十六进制数集合构成的,范围00...FF。

根据网络传输模式,这可以是由一RTU字符组成。

从主设备发给从设备消息的数据域包含附加的信息:

从设备必须用于进行执行由功能代码所定义的所为。

这包括了象不连续的寄存器地址,要处理项的数目,域中实际数据字节数。

例如,如果主设备需要从设备读取一组保持寄存器(功能代码03),数据域指定了起始寄存器以及要读的寄存器数量。

如果主设备写一组从设备的寄存器(功能代码10十六进制),数据域则指明了要写的起始寄存器以及要写的寄存器数量,数据域的数据字节数,要写入寄存器的数据。

如果没有错误发生,从从设备返回的数据域包含请求的数据。

如果有错误发生,此域包含一异议代码,主设备应用程序可以用来判断采取下一步行动。

在某种消息中数据域可以是不存在的(0长度)。

例如,主设备要求从设备回应通信事件记录(功能代码0B十六进制),从设备不需任何附加的信息。

6、错误检测域

标准的Modbus网络有两种错误检测方法。

错误检测域的内容视所选的检测方法而定。

RTU

当选用RTU模式作字符帧,错误检测域包含一16Bits值(用两个8位的字符来实现)。

错误检测域的内容是通过对消息内容进行循环冗长检测方法得出的。

CRC域附加在消息的最后,添加时先是低字节然后是高字节。

故CRC的高位字节是发送消息的最后一个字节。

7、字符的连续传输

当消息在标准的Modbus系列网络传输时,每个字符或字节以如下方式发送(从左到右):

最低有效位...最高有效位

使用RTU字符帧时,位的序列是:

有奇偶校验

启始位12345678奇偶位停止位

无奇偶校验

启始位12345678停止位停止位

图4.位顺序(RTU)

四、错误检测方法

标准的Modbus串行网络采用两种错误检测方法。

奇偶校验对每个字符都可用,帧检测(CRC)应用于整个消息。

它们都是在消息发送前由主设备产生的,从设备在接收过程中检测每个字符和整个消息帧。

用户要给主设备配置一预先定义的超时时间间隔,这个时间间隔要足够长,以使任何从设备都能作为正常反应。

如果从设备测到一传输错误,消息将不会接收,也不会向主设备作出回应。

这样超时事件将触发主设备来处理错误。

发往不存在的从设备的地址也会产生超时。

1、CRC检测

  使用RTU模式,消息包括了一基于CRC方法的错误检测域。

CRC域检测了整个消息的内容。

  CRC域是两个字节,包含一16位的二进制值。

它由传输设备计算后加入到消息中。

接收设备重新计算收到消息的CRC,并与接收到的CRC域中的值比较,如果两值不同,则有误。

  CRC是先调入一值是全“1”的16位寄存器,然后调用一过程将消息中连续的8位字节各当前寄存器中的值进行处理。

仅每个字符中的8Bit数据对CRC有效,起始位和停止位以及奇偶校验位均无效。

  CRC产生过程中,每个8位字符都单独和寄存器内容相或(OR),结果向最低有效位方向移动,最高有效位以0填充。

LSB被提取出来检测,如果LSB为1,寄存器单独和预置的值或一下,如果LSB为0,则不进行。

整个过程要重复8次。

在最后一位(第8位)完成后,下一个8位字节又单独和寄存器的当前值相或。

最终寄存器中的值,是消息中所有的字节都执行之后的CRC值。

  CRC添加到消息中时,低字节先加入,然后高字节。

  CRC简单函数如下:

  unsignedshortCRC16(puchMsg,usDataLen)

  unsignedchar*puchMsg;/*要进行CRC校验的消息*/

  unsignedshortusDataLen;/*消息中字节数*/

  {

  unsignedcharuchCRCHi=0xFF;/*高CRC字节初始化*/

  unsignedcharuchCRCLo=0xFF;/*低CRC字节初始化*/

  unsigneduIndex;/*CRC循环中的索引*/

  while(usDataLen--)/*传输消息缓冲区*/

  {

  uIndex=uchCRCHi^*puchMsgg++;/*计算CRC*/

  uchCRCHi=uchCRCLo^auchCRCHi[uIndex];

  uchCRCLo=auchCRCLo[uIndex];

  }

  return(uchCRCHi<<8|uchCRCLo);

  }

  /*CRC高位字节值表*/

  staticunsignedcharauchCRCHi[]={

  0x00,0xC1,0x81,0x40,0x01,0xC0,0x80,0x41,0x01,0xC0,

  0x80,0x41,0x00,0xC1,0x81,0x40,0x01,0xC0,0x80,0x41,

  0x00,0xC1,0x81,0x40,0x00,0xC1,0x81,0x40,0x01,0xC0,

  0x80,0x41,0x01,0xC0,0x80,0x41,0x00,0xC1,0x81,0x40,

  0x00,0xC1,0x81,0x40,0x01,0xC0,0x80,0x41,0x00,0xC1,

  0x81,0x40,0x01,0xC0,0x80,0x41,0x01,0xC0,0x80,0x41,

  0x00,0xC1,0x81,0x40,0x01,0xC0,0x80,0x41,0x00,0xC1,

  0x81,0x40,0x00,0xC1,0x81,0x40,0x01,0xC0,0x80,0x41,

  0x00,0xC1,0x81,0x40,0x01,0xC0,0x80,0x41,0x01,0xC0,

  0x80,0x41,0x00,0xC1,0x81,0x40,0x00,0xC1,0x81,0x40,

  0x01,0xC0,0x80,0x41,0x01,0xC0,0x80,0x41,0x00,0xC1,

  0x81,0x40,0x01,0xC0,0x80,0x41,0x00,0xC1,0x81,0x40,

  0x00,0xC1,0x81,0x40,0x01,0xC0,0x80,0x41,0x01,0xC0,

  0x80,0x41,0x00,0xC1,0x81,0x40,0x00,0xC1,0x81,0x40,

  0x01,0xC0,0x80,0x41,0x00,0xC1,0x81,0x40,0x01,0xC0,

  0x80,0x41,0x01,0xC0,0x80,0x41,0x00,0xC1,0x81,0x40,

  0x00,0xC1,0x81,0x40,0x01,0xC0,0x80,0x41,0x01,0xC0,

  0x80,0x41,0x00,0xC1,0x81,0x40,0x01,0xC0,0x80,0x41,

  0x00,0xC1,0x81,0x40,0x00,0xC1,0x81,0x40,0x01,0xC0,

  0x80,0x41,0x00,0xC1,0x81,0x40,0x01,0xC0,0x80,0x41,

  0x01,0xC0,0x80,0x41,0x00,0xC1,0x81,0x40,0x01,0xC0,

  0x80,0x41,0x00,0xC1,0x81,0x40,0x00,0xC1,0x81,0x40,

  0x01,0xC0,0x80,0x41,0x01,0xC0,0x80,0x41,0x00,0xC1,

  0x81,0x40,0x00,0xC1,0x81,0x40,0x01,0xC0,0x80,0x41,

  0x00,0xC1,0x81,0x40,0x01,0xC0,0x80,0x41,0x01,0xC0,

  0x80,0x41,0x00,0xC1,0x81,0x40

  };

  /*CRC低位字节值表*/

  staticcharauchCRCLo[]={

  0x00,0xC0,0xC1,0x01,0xC3,0x03,0x02,0xC2,0xC6,0x06,

  0x07,0xC7,0x05,0xC5,0xC4,0x04,0xCC,0x0C,0x0D,0xCD,

  0x0F,0xCF,0xCE,0x0E,0x0A,0xCA,0xCB,0x0B,0xC9,0x09,

  0x08,0xC8,0xD8,0x18,0x19,0xD9,0x1B,0xDB,0xDA,0x1A,

  0x1E,0xDE,0xDF,0x1F,0xDD,0x1D,0x1C,0xDC,0x14,0xD4,

  0xD5,0x15,0xD7,0x17,0x16,0xD6,0xD2,0x12,0x13,0xD3,

  0x11,0xD1,0xD0,0x10,0xF0,0x30,0x31,0xF1,0x33,0xF3,

  0xF2,0x32,0x36,0xF6,0xF7,0x37,0xF5,0x35,0x34,0xF4,

  0x3C,0xFC,0xFD,0x3D,0xFF,0x3F,0x3E,0xFE,0xFA,0x3A,

  0x3B,0xFB,0x39,0xF9,0xF8,0x38,0x28,0xE8,0xE9,0x29,

  0xEB,0x2B,0x2A,0xEA,0xEE,0x2E,0x2F,0xEF,0x2D,0xED,

  0xEC,0x2C,0xE4,0x24,0x25,0xE5,0x27,0xE7,0xE6,0x26,

  0x22,0xE2,0xE3,0x23,0xE1,0x21,0x20,0xE0,0xA0,0x60,

  0x61,0xA1,0x63,0xA3,0xA2,0x62,0x66,0xA6,0xA7,0x67,

  0xA5,0x65,0x64,0xA4,0x6C,0xAC,0xAD,0x6D,0xAF,0x6F,

  0x6E,0xAE,0xAA,0x6A,0x6B,0xAB,0x69,0xA9,0xA8,0x68,

  0x78,0xB8,0xB9,0x79,0xBB,0x7B,0x7A,0xBA,0xBE,0x7E,

  0x7F,0xBF,0x7D,0xBD,0xBC,0x7C,0xB4,0x74,0x75,0xB5,

  0x77,0xB7,0xB6,0x76,0x72,0xB2,0xB3,0x73,0xB1,0x71,

  0x70,0xB0,0x50,0x90,0x91,0x51,0x93,0x53,0x52,0x92,

  0x96,0x56,0x57,0x97,0x55,0x95,0x94,0x54,0x9C,0x5C,

  0x5D,0x9D,0x5F,0x9F,0x9E,0x5E,0x5A,0x9A,0x9B,0x5B,

  0x99,0x59,0x58,0x98,0x88,0x48,0x49,0x89,0x4B,0x8B,

  0x8A,0x4A,0x4E,0x8E,0x8F,0x4F,0x8D,0x4D,0x4C,0x8C,

  0x44,0x84,0x85,0x45,0x87,0x47,0x46,0x86,0x82,0x42,

  0x43,0x83,0x41,0x81,0x80,0x40

  }; 

  ModBus网络是一个工业通信系统,由带智能终端的可编程序控制器和计算机通过公用线路或局部专用线路连接而成。

其系统结构既包括硬件、亦包括软件。

它可应用于各种数据采集和过程监控。

下表1是ModBus的功能码定义。

  表1ModBus功能码

  功能码名称作用

  01读取线圈状态取得一组逻辑线圈的当前状态(ON/OFF)

  03读取保持寄存器在一个或多个保持寄存器中取得当前的二进制值

  

ModBus网络只是一个主机,所有通信都由他发出。

网络可支持247个之多的远程从属控制器,但实际所支持的从机数要由所用通信设备决定。

采用这个系统,各PC可以和中心主机交换信息而不影响各PC执行本身的控制任务。

表2是ModBus各功能码对应的数据类型。

  表2ModBus功能码与数据类型对应表

  代码功能数据类型

  01读位

  02读位

  03读整型、字符型、状态字、浮点型

  04读整型、状态字、浮点型

  05写位

  06写整型、字符型、状态字、浮点型

  08N/A重复“回路反馈”信息

  15写位

  16写整型、字符型、状态字、浮点型

  17读字符型

  

(1)ModBus的传输方式

  在ModBus系统中有2种传输模式可选择。

这2种传输模式与从机PC通信的能力是同等的。

选择时应视所用ModBus主机而定,每个ModBus系统只能使用一种模式,不允许2种模式混用。

另一种模式是RTU(远程终端设备)这两种模式的定义见表3

  表3ASCII和RTU传输模式的特性

  RTU(8位)

  编码系统十六进制二进制

  每一个字符的位数开始位1位1位

  数据位(最低有效位第一位)7位8位

  奇偶校验(任选)1位(此位用于奇偶校验,无校应则无该位)1位(此位用于奇偶校验,无校应则无该位)

  停止位1或2位1或2位

  CRC(即循环冗余校验)

  RTU则适用于机器语言编程的计算机和PC主机。

  用RTU模式传输的数据是8位二进制字符。

用RTU模式时报文字符必须以连续数据流的形式传送.

表4给出了以RTU方式读取整数据的例子

  以RTU方式读取整数据的例子

  主机请求

  地址功能码第一个寄存器的高位地址第一个寄存器的低位地址寄存器的数量的高位寄存器的数量的底位错误校验

  010300380001XX

  从机应答

  地址功能码字节数数据高字节数据低字节错误校验

  010324124XX

  十六进制数4124表示的十进制整数为16676,错误校验值要根据传输方式而定。

  

(2)ModBus的数据校验方式

  CRC-16(循环冗余错误校验)

  CRC-16错误校验程序如下:

报文(此处只涉及数据位,不指起始位、停止位和任选的奇偶校验位)被看作是一个连续的二进制,其最高有效位(MSB)首选发送。

报文先与X↑16

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 临时分类 > 批量上传

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2