第3章 Modbus控制网络 Modbus是一种广泛使用的工业通信协议,自1979年由Modicon公司(现为施耐德电气的一部分)推出以来,它已经成为工业通信领域的事实标准。Modbus协议简洁,易于理解和实施,支持多种通信方式,包括串行通信(如RS232和RS485)和TCP/IP网络通信,因此在自动化和控制系统中得到了广泛应用。 本章讲述了Modbus的基本特性、通信模型、物理层标准、串行链路层标准以及基于TCP/IP的Modbus TCP。具体内容如下: (1) Modbus概述。Modbus协议以其简单性、开放性和灵活性而著称,它采用客户机/服务器(主站/从站)模型,通过定义统一的帧结构实现设备间的高效数据通信。这种通信协议能够适应包括传统串行通信和现代TCP/IP网络通信在内的多种应用场景,使其成为工业通信领域的一个重要标准。 (2) Modbus物理层。Modbus协议支持包括RS232和RS485在内的多种接口标准。RS232主要用于短距离的点对点通信,而RS485则因其支持更长距离通信和多设备连接,在工业应用中更为常见。 (3) Modbus串行链路层标准。在串行链路层面,Modbus定义了ASCII和RTU两种传输模式,分别优化了可读性和通信效率。此外,通过CRC或LRC方法进行的差错检验确保了数据传输的准确性和完整性。Modbus还定义了一系列功能码,用于指定主站请求的操作类型,如读写寄存器或线圈。编程方法部分则详细介绍了如何构建请求/响应帧及处理通信过程中的错误和异常。 (4) Modbus TCP。Modbus TCP扩展了Modbus协议,使其能够在TCP/IP网络上运行,从而允许设备在更广泛的网络环境中通信。这一部分还介绍了Modbus TCP消息的结构,包括事务标识符、协议标识符、长度和单元标识符,以及ModbusRTPS,这是一种用于实现实时数据交换和控制的实时发布订阅机制。 通过本章的学习,读者不仅能够理解Modbus协议的基本原理和关键特性,还能够掌握其在实际工业通信场景中的应用。这为深入学习和实践Modbus通信提供了坚实的基础,有助于在自动化和控制系统设计中有效利用Modbus技术。 3.1概述 Modbus是全球第一个真正用于工业现场的总线协议。为更好地普及和推动Modbus基于以太网的分布式应用,目前施耐德电气已将Modbus协议的所有权移交给分布式自动化接口(Interface for Distributed Automation,IDA)组织,并成立了ModbusIDA组织,为Modbus 今后的发展奠定了基础。在我国,Modbus 已经成为国家标准GB/T 19582—2008。据不完全统计,Modbus的节点安装数量目前已经超过了1000万个。 3.1.1Modbus的特点 Modbus具有如下特点: (1) 标准、开放。用户可以免费、放心地使用Modbus协议,不需要缴纳许可费用,也不会侵犯知识产权。目前,支持Modbus的厂家超过400家,支持Modbus的产品超过600种。 (2) Modbus支持多种电气接口,如RS232、RS485和以太网等; 还可以用各种介质传输Modbus信号,如双绞线、光纤和无线介质等。 (3) Modbus的帧格式简单、紧凑,通俗易懂,用户使用容易,厂商开发简单。 3.1.2Modbus的通信模型 Modbus是OSI参考模型第7层上的应用层报文传输协议,它在连接至不同类型总线时或网络的设备之间提供客户机/服务器通信。Modbus的通信模型如图31所示。 图31Modbus的通信模型 目前,Modbus包括标准Modbus、Modbus+和Modbus TCP共3种形式。标准Modbus指的就是在异步串行通信中传输Modbus信息。Modbus+指的就是在一种高速令牌传递网络中传输Modbus信息,采用全频通信,具有更高的通信传输速率。Modbus TCP就是采用TCP/IP和以太网协议来传输Modbus信息,属于工业控制网络范畴。本章主要介绍基于异步串行通信的标准Modbus。 3.1.3通用Modbus帧 Modbus协议定义了一个与基础通信层无关的简单协议数据单元(PDU),特定总线或网络上的Modbus协议映射能够在应用数据单元(ADU)上引入一些附加字段。通用Modbus帧的格式如图32所示。 图32通用Modbus帧的格式 Modbus PDU中功能码的主要作用是表明将执行哪种操作,功能码后面是含有请求和响应参数的数据域。Modbus ADU中的附加地址用于告知站地址,差错码是根据报文内容执行冗余校验计算的结果。 3.1.4Modbus通信原理 Modbus是一种简单的客户机/服务器型应用协议,其通信过程如图33所示。 图33Modbus协议的通信过程 首先,客户机准备请求并向服务器发送请求,即发送功能码和数据请求,此过程称为启动请求; 然后服务器分析并处理客户机的请求,此过程称为执行操作; 最后向客户机发送处理结果,即返回功能码和数据响应,此过程称为启动响应。如果在执行操作过程中出现任何差错,服务器将启动差错响应,即返回一个差错码或异常码。 Modbus串行链路协议是一个主从协议,串行总线的主站作为客户机,从站作为服务器。在同一时刻只有一个主站连接总线,一个或多个(最多为247个)从站连接于同一个串行总线。Modbus通信总是由主站发起,从站根据主站功能码进行响应。从站在没有收到来自主站的请求时,不会发送数据,所以从站之间不能互相通信。主站在同一时刻只会发起一个Modbus事务处理。主站以如下两种模式对从站发出Modbus请求。 1. 单播模式 在单播模式下,主站寻址单个从站,从站接收并处理完请求后,向主站返回一个响应。在这种模式下,一个Modbus事务处理包含两个报文: 一个是来自主站的请求; 另一个是来自从站的应答。每个从站必须有唯一的地址(1~247),这样才能区别于其他节点而被独立寻址。 2. 广播模式 在广播模式下,主站向所有从站发送请求,对于主站广播的请求,从站不返回响应。广播请求必须是写命令。所有的设备必须接收广播模式的写功能,地址0被保留用来识别广播通信。 3.2Modbus物理层 在物理层,串行链路上的Modbus系统可以使用不同的物理接口,最常用的是RS485两线制接口。作为附加选项,该物理接口也可以使用RS485四线制接口。当只需要短距离的点对点通信时,也可以使用RS232串行接口作为Modbus系统的物理接口。 3.2.1RS232接口标准 RS232C标准(协议)的全称是EIARS232C标准,定义为“数据终端设备(Data Terminal Equipment,DTE)和数通信 图34DB9插头座 设备(Digital Communication Equipment,DCE)之间串行二进制数据交换接口技术标准”。它是在1970年由美国电子工业协会(EIA)联合贝尔系统、调制解调器厂家及计算机终端生产厂家共同制定的用于串行通信的标准。其中EIA(Electronic Industry Association)代表美国电子工业协会,RS(Recommended standard)代表推荐标准,232是标识号,C代表RS232的最新一次修改。 1. RS232C端子 RS232C的连接插头用9针的EIA连接插头座,如图34所示,其主要端子分配如表31所示。 表31RS232C的主要端子 端脚方向符号功能 3输出TXD发送数据 2输入RXD接收数据 7输出RTS请求发送 8输入CTS为发送清零 6输入DSR数据设备准备好 5GND信号地 1输入DCD 4输出DTR 9输入RI数据信号检测 (1) 信号含义。 ① 从计算机到MODEM的信号。 DTR——数据终端(DTE)准备好: 告诉调制解调器计算机已接通电源,并准备好了。 RTS——请求发送: 告诉MODEM现在要发送数据。 ② 从MODEM到计算机的信号。 DSR——数据设备(DCE)准备好: 告诉计算机MODEM已接通电源,并准备好了。 CTS——为发送清零: 告诉计算机MODEM已做好了接收数据的准备。 DCD——数据信号检测: 告诉计算机MODEM已与对端的MODEM建立了连接。 RI——振铃指示器: 告诉计算机对端电话已在振铃。 ③ 数据信号。 TXD——发送数据。 RXD——接收数据。 (2) 电气特性。 RS232C的电气线路连接方式如图35所示。 图35RS232C的电气线路连接 接口为非平衡型,每个信号用一根导线,所有信号回路共用一根地线。信号速率低于20kb/s,电缆长度少于15m。由于是单线,线间干扰较大。其电性能用±12V标准脉冲。值得注意的是,RS232C采用负逻辑。 在数据线上: 传号Mark=-5~-15V,为逻辑1电平。 空号Space=+5~+15V,为逻辑0电平。 在控制线上: 通On=+5~+15V,为逻辑0电平。 断Off=-5~-15V,为逻辑1电平。 图36不使用调制解调器信号的 RS232C接口 RS232C的逻辑电平与TTL电平不兼容,为了与TTL器件相连,必须进行电平转换。 由于RS232C采用电平传输,在数据传输速率为19.2kb/s时,其通信距离只有15m。若要延长通信距离,必须以降低数据传输速率为代价。 2. 通信接口的连接 当两台计算机经RS232C口直接通信时,两台计算机之间的联络线如图36所示。虽然不接MODEM,图中仍连接着有关的MODEM信号线,这是由于INT 14H中断需要使用这些信号。如果程序中没有调用INT 14H,在自编程序中也没有用到调制解调器的有关信号,那么两台计算机直接通信时,只连接2、3、7(25针EIA)或3、2、5(9针EIA)就可以了。 3. RS232C电平转换器 为了使采用+5V供电的TTL和CMOS通信接口电路能与RS232C标准接口连接,必须进行串行口的输入/输出信号的电平转换。 目前常用的电平转换器有Motorola公司生产的MC1488驱动器、MC1489接收器,TI公司的SN75188驱动器、SN75189接收器及美国MAXIM公司生产的单一+5V电源供电、多路RS232驱动器/接收器,如MAX232A等。 MAX232A内部具有双充电泵电压变换器,把+5V变换成±10V,作为驱动器的电源,具有两路发送器及两路接收器,使用相当方便。MAX232A外形和引脚如图37所示,典型应用如图38所示。 图37MAX232A外形和引脚图 图38MAX232A典型应用 单一+5V电源供电的RS232C电平转换器还有TL232、ICL232等。 3.2.2RS485接口标准 由于RS232C通信距离较近,当传输距离较远时,可采用RS485串行通信接口。 1. RS485接口标准 RS485接口采用二线差分平衡传输,其信号定义如下。 当采用+5V电源供电时, 若差分电压信号为-2500~-200mV时,则为逻辑0; 若差分电压信号为+2500~+200mV时,则为逻辑1; 若差分电压信号为-200~+200mV时,则为高阻状态。 RS485的差分平衡电路如图39所示。其一根导线上的电压是另一根导线上的电压值取反。接收器的输入电压为这两根导线电压的差值VA-VB。 图39差分平衡电路 2. RS485收发器 RS485收发器种类较多,如MAXIM公司的MAX485,TI公司的SN75LBC184、SN65LBC184以及高速型SN65ALS1176等。它们的引脚是完全兼容的,其中,SN65ALS1176主要用于高速应用场合,如PROFIBUSDP现场总线等。下面仅介绍SN75LBC184。 SN75LBC184为具有瞬变电压抑制的差分收发器,SN75LBC184为商业级产品,其工业级产品为SN65LBC184,引脚如图310所示。 图310SN75LBC184外形和引脚图 SN75LBC184引脚介绍如下: R——接收端。 RE——接收使能,低电平有效。 DE——发送使能,高电平有效。 D——发送端。 A——差分正输入端。 B——差分负输入端。 VCC——+5V电源。 GND——地。 SN75LBC184和SN65LBC184具有如下特点。 (1) 具有瞬变电压抑制能力,能防雷电和抗静电放电冲击。 (2) 限斜率驱动器,使电磁干扰减到最小,并能减少传输线终端不匹配引起的反射。 (3) 总线上可挂接64个收发器。 (4) 接收器输入端开路故障保护。 (5) 具有热关断保护。 (6) 低禁止电源电流,最大300μA。 (7) 引脚与SN75176兼容。 3. 应用电路 RS485应用电路如图311所示。 图311RS485应用电路 在图311中,RS485收发器可为SN75LBC184、SN65LBC184、MAX485等。当P10为低电平时,接收数据; 当P10为高电平时,发送数据。 如果采用RS485组成总线拓扑结构的分布式测控系统,那么在双绞线终端应接120Ω的终端电阻。 3.3Modbus 串行链路层标准 Modbus串行链路层标准就是通常所说的标准Modbus协议,它是Modbus协议在串行链路上的实现。Modbus串行链路层协议是一个主从协议,该协议位于OSI参考模型的第2层。 Modbus串行链路层标准定义了一个控制器能够识别和使用的消息结构,而不管它们是经过何种网络进行通信的,也不需要考虑通信网络的拓扑结构。它定义了各种数据帧格式,用来描述控制器请求访问其他设备的过程、如何响应来自其他设备的请求及怎样侦测错误并记录。 3.3.1Modbus的传输模式 Modbus定义了美国信息交换标准代码(ASCII)模式和远程终端单元(RTU)模式两种串行传输模式。在Modbus串行链路上,所有设备的传输模式(及串行口参数)必须相同,默认设置必须为RTU模式,所有设备必须实现RTU模式。若要使用ASCII模式,需要按照使用指南进行设置。在Modbus串行链路设备实现等级的基本等级中只要求实现RTU模式,常规等级要求实现RTU模式和ASCII模式。 1. ASCII模式 使用ASCII模式,消息以冒号(:)字符(ASCII为3AH)开始,以回车换行符结束(ASCII为0DH、OAH)。 其他域可以使用的传输字符是十六进制的0~9、A~F的ASCII。网络上的设备不断侦测“:”字符,当接收到一个“:”时,每个设备都解码下个域(地址域)来判断消息是否是发给自己的。 消息中字符间发送的时间间隔最长不能超过1s,否则接收的设备将认为传输错误。典型ASCII消息帧结构如图312所示。 图312典型ASCII消息帧结构 2. RTU模式 使用RTU模式,消息发送至少要以3.5个字符时间的停顿间隔开始。传输的第一个域是设备地址,可以使用的传输字符是十六进制的0~9、A~F。网络设备不断侦测网络总线,包括停顿间隔时间,当第一个域(地址域)接收到消息时,每个设备都进行解码以判断消息是否是发给自己的。在最后一个传输字符之后,一个至少3.5个字符时间的停顿标志了消息的结束,一个新的消息可在此停顿后开始传输。 整个消息帧必须作为一个连续的流传输。如果在帧完成之前有超过1.5个字符时间的停顿时间,接收设备将刷新不完整的消息,并假定下一字节是一个新消息的地址域。同样地,如果一个新消息在小于3.5个字符时间内接着前一消息开始传输,那么接收设备将认为它是前一消息的延续。这将导致一个错误,因为在最后CRC域的值不可能是正确的。典型RTU消息帧结构如图313所示。 图313典型RTU消息帧结构 例如,向1号从站的2000H寄存器写入12H数据的RTU消息帧格式如表32所示。 表32Modbus RTU消息帧格式 段名例子(HEX格式)说明 设备地址011号从站 功能代码06写单个寄存器 寄存器地址 20寄存器地址(高字节) 00寄存器地址(低字节) 写入数据 00数据(高字节) 12数据(低字节) CRC校验 02CRC校验码(高字节) 01CRC校验码(低字节) 这里完整的RTU消息帧为01H 06H 20H 00H 00H 12H 02H 01H。 3. 地址域 消息帧的地址域包含两个字符(ASCII)或位(RTU),可能的从站地址是0~247(十进制)。单个设备的地址范围是1~247。主站通过将要联络的从站的地址放入消息中的地址域来选通从站,当从站发送回应消息时,它把自己的地址放入回应的地址域中,以便主站能够知道是哪一个设备做出回应。 地址0是用于广播的地址,所有的从站都能识别。当Modbus协议用于更高水准的网络时,广播可能不被允许或以其他方式代替。 4. 功能代码域 消息帧中的功能代码域包含两个字符(ASCII)或8b(RTU),可能的代码范围是十进制的1~255。其中,有些代码适用于所有控制器,有些适用于某种控制器,还有些保留以备后用。 当消息从主站发往从站时,功能代码域将告知从站需要执行哪些行为,例如,去读取输入的开关状态、读一组寄存器的数据内容、读从站的诊断状态及允许调入、记录、校验从站中的程序等。 当从站回应时,它使用功能代码域来指示是正常响应(无误)还是差错响应(有某种错误发生)。对于正常响应,从站仅回应相应的功能代码。对于差错响应,从站返回一个差错码,具体方法为: 将功能代码的最高位置1。 例如,一从站发往从站的消息要求读一组保持寄存器,产生的功能代码为00000011(十六进制为03H),对正常响应,从站仅回应同样的功能代码; 对差错响应,它返回10000011(十六进制为83H)。 除功能代码因异议错误做了修改外,从站会将一异常码放到回应消息的数据域中,这能告诉主站发生了什么错误。 主站应用程序得到差错响应后,典型的处理过程是重发消息,或者诊断发给从站的消息并报告给操作人员。 5. 数据域 数据域是由两个十六进制数集合构成的,范围为00~FFH。根据网络传输模式,这可以是由一对ASCII字符组成或一个RTU字符组成的。 从主站发给从站的消息的数据域包含附加的信息,指示从站必须用于执行由功能代码所定义的行为。例如,主站需要从站读取一组保持寄存器(功能代码为03H),数据域则指定了起始寄存器及要读的寄存器数量。如果主站写一组从站的寄存器(功能代码为10H),数据域则指明了要写的起始寄存器、要写的寄存器数量、数据域的数据字节数及要写入寄存器的数据。如果没有错误发生,由从站返回的数据域包含请求的数据; 如果有错误发生,此域包含异常码,主站应用程序可以用来判断下一步要采取什么行动。 在某种消息中,数据域可以是不存在的(0长度)。例如,主站要求从站回应通信事件记录(功能代码为OBH)时,从站不需要附加任何信息。 3.3.2Modbus的差错检验 标准的Modbus串行网络采用两种错误检测方法。奇偶校验对每个字符都可用,帧检测(LRC或CRC)应用于整个消息。它们都是在消息发送前由主设备产生的,从设备在接收过程中检测每个字符和整个消息帧。 退出传输前用户要给主设备配置一预先定义的超时时间间隔,这个时间间隔要足够长,以使任何从设备都能作为正常响应。如果从设备检测到一传输错误,那么消息将不会接收,也不会对主设备作出响应。这样超时事件将触发主设备来处理错误。发往不存在的从设备的消息也会产生超时。 1. 奇偶校验 用户可以配置控制器是奇校验还是偶校验,或无校验。这将决定每个字符中的奇偶校验位是如何设置的。 如果指定了奇校验或偶校验,那么1的位数将算到每个字符的位数中(ASCII模式为7个数据位,RTU模式为8个数据位)。例如,RTU字符帧中包含以下8个数据位: 1 1 0 0 0 1 0 1。 帧中1的总数是4个。如果使用了偶校验,那么帧的奇偶校验位将是0,使1的个数仍是偶数(4个); 如果使用了奇校验,那么帧的奇偶校验位将是1,使1的个数是奇数(5个)。 如果没有指定奇偶校验,那么传输时没有校验位,也不进行校验检测,而是将一个附加的停止位填充至要传输的字符帧中。 2. LRC检测 使用ASCII模式时,消息包括了一基于LRC方法的错误检测域。LRC域检测消息域中除开始的冒号及结束的回车换行符以外的内容。 LRC域包含一个8位二进制数的字节。LRC值由传输设备来计算并放到消息帧中,接收设备在接收消息的过程中计算LRC,并将它和接收到消息中LRC域中的值比较,如果两值不相等,则说明有错误。 LRC方法是将消息中的8b的字节连续累加,不考虑进位。 3. CRC检测 使用RTU模式时,消息包括了一基于CRC方法的错误检测域。CRC域检测整个消息的内容。 CRC域是两个字节,包含一个16位的二进制数。它由传输设备计算后加入到消息中。接收设备重新计算收到消息的CRC,并与接收到的CRC域中的值比较,如果两值不同,则有错误。 3.3.3Modbus的功能码 Modbus协议定义了公共功能码、用户定义功能码和保留功能码3种功能码。 公共功能码是指被确切定义的、唯一的功能码,由ModbusIDA组织确认,可进行一致性测试,且已归档为公开。 用户定义功能码是指用户无须得到ModbusIDA组织的任何批准就可以选择和实现的功能码,但是不能保证用户定义功能码的使用是唯一的。 保留功能码是某些公司在传统产品上现行使用的功能码,不作为公共功能码使用。Modbus功能码如表33所示。 表33Modbus功能码 功能码名称作用 01读线圈状态取得一组逻辑线圈的当前状态(ON/OFF) 02读输入状态取得一组开关输入的当前状态(ON/OFF) 03读保持寄存器在一个或多个保持寄存器中取得当前的二进制值 04读输入寄存器在一个或多个输入寄存器中取得当前的二进制值 05写单个线圈强制设置一个逻辑线圈的通断状态 06写单个寄存器把具体的二进制值装入一个保持寄存器 07读取异常状态取得8个内部线圈的通断状态,这8个线圈的地址由控制器决定,用户逻辑可以定义这些线圈,以说明从机状态,短报文适用于迅速读取状态 08回送诊断校验把诊断校验报文送从机,以对通信处理进行评鉴 09编程(只用于484)使主机模拟编程功能,修改从机逻辑 10探询(只用于484)可使主机与一台正在执行长程序任务的从机通信,探询该从机是否已完成其操作任务,仅在含有功能码09的报文发送后,本功能码才发送 11读取事件计数可使主机发出单询问,并随即判定操作是否成功,尤其是该命令或其他应答产生通信错误时 12读取通信事件记录可使主机检索每台从机的Modbus事务处理通信事件记录。如果某项事务处理完成,记录会给出有关错误 13编程(184/384 484 584)可使主机模拟编程功能,修改从机逻辑 14探询(184/384 484 584)可使主机与正在执行任务的从机通信,定期探询该从机是否已完成其程序操作,仅在含有功能码13的报文发送后,本功能码才发送 15写多个线圈强制设置一串连续逻辑线圈的通断 16写多个寄存器把具体的二进制值装入一串连续的保持寄存器 17报告从机标识可使主机判断编址从机的类型及该从机运行指示灯的状态 18884和MICRO 84可使主机模拟编程功能,修改PC状态逻辑 19重置通信链路发生非可修改错误后,使从机复位于已知状态,可重置顺序字节 20读取通用参数(584L)显示扩展存储器文件中的数据信息 21写入通用参数(584L)把通用参数写入扩展存储文件,或修改之 22~64保留作扩展功能备用— 65~72留作用户功能留作用户功能的扩展编码 73~119非法功能— 120~127保留留作内部作用 128~255保留用于异常应答 Modbus协议是为了读写PLC数据而产生的,主要支持输入离散量、输出线圈、输入寄存器和保持寄存器涉及的数据类型。Modbus功能码与对应的数据类型如表34所示。 表34Modbus功能码与数据类型对应表 代码功能数 据 类 型 01读取线圈状态位 02读取输入状态位 03读取保持寄存器整型、字符型、状态字、浮点型 04读取输入寄存器整型、状态字、浮点型 05写单个线圈位 06写单个寄存器整型、字符型、状态字、浮点型 15写多个线圈位 16写多个寄存器整型、字符型、状态字、浮点型 Modbus协议相当复杂,但常用的功能码主要是01、02、03、04、05、06、15和16。 3.3.4Modbus的编程方法 由RTU模式消息帧格式可以看出,在完整的一帧消息开始传输时,必须和上一帧消息之间至少有3.5个字符时间的间隔,这样接收方在接收时才能将该帧作为一个新的数据帧接收。另外,在本数据帧进行传输时,帧中传输的每个字符之间必须不能超过1.5个字符时间的间隔,否则,本帧将被视为无效帧,但接收方将继续等待和判断下一次3.5个字符的时间间隔之后出现的新一帧并进行相应的处理。 因此,在编程时首先要考虑1.5个字符时间和3.5个字符时间的设定和判断。 1. 字符时间的设定 在RTU模式中,1个字符时间是指按照用户设定的波特率传输一个字节所需要的时间。 例如,当传输波特率为2400b/s时,1个字符时间为 11×1/2400≈4583(μs) 同样,可得出1.5个字符时间和3.5个字符时间分别为 11×1.5/2400=6875(μs) 11×3.5/2400≈16041(μs) 为了节省定时器,在设定这两个时间段时可以使用同一个定时器,定时时间取0.5个字符时间,同时设定两个计数器变量为m和n,用户可以在需要开始启动时间判断时将m和n清零。而在定时器的中断服务程序中,只需要对m和n分别做加1运算,并判断是否累加到3和7。当m=3时,说明1.5个字符时间已到,此时可以将1.5个字符时间已到标志T15FLG置成01H,并将m重新清零; 当n=7时,说明3.5个字符时间已到,此时将3.5个字符时间已到标志T35FLG置成01H,并将n重新清零。 当波特率为1200~19200b/s时,定时器定时时间均采用此方法计算而得。 当波特率为38400b/s时,Modbus通信协议推荐此时1个字符时间为500μs,即定时器定时时间为250μs。 2. 数据帧接收的编程方法 在实现Modbus通信时,设每个字节的一帧信息需要11位,其中1位起始位、8位数据位、2位停止位、无校验位。通过串行口的中断接收数据,中断服务程序每次只接收并处理一字节数据,并启动定时器实现时序判断。 当接收新一帧数据时,在接收完第一个字节之后,置一帧标志FLAG为0AAH,表明当前存在一有效帧正在接收,在接收该帧的过程中,一旦出现时序错误,就将帧标志FLAG置成55H,表明当前存在的帧为无效帧。其后,接收到本帧的剩余字节仍然放入接收缓冲区,但标志FLAG不再改变,直至接收到3.5字符时间间隔后的新一帧数据的第一个字节,主程序即可根据FLAG标志判断当前是否有有效帧需要处理。 Modbus数据串行口接收中断服务程序结构如图314所示。 图314Modbus数据串行口接收中断服务程序结构 3.4Modbus TCP Modbus是目前应用最广泛的现场总线协议之一。1999年推出了在以太网中运行的工业以太网协议(Modbus TCP)。Modbus TCP 以一种比较简单的方式将Modbus帧嵌入TCP帧中。互联网编号分配管理机构(Internet Assigned Numbers Authority,IANA)给Modbus协议赋予TCP端口502,这是其他工业以太网协议所没有的。Modbus标准协议已被提交给互联网工程任务部(Internet Engineering Task Force,IETF)并成为以太网标准。Modbus也是使用广泛的事实标准,其普及得益于使用门槛低,无论用串口还是用以太网,硬件成本低廉,Modbus和Modbus TCP都可以免费获取,且在网上有很多免费资源,如C/C++、Java样板程序,ActiveX控件及各种测试工具等,所以用户使用起来很方便。另外,几乎可找到任何现场总线到Modbus TCP的网点,方便用户实现各种网络之间的互联。 3.4.1Modbus TCP概述 Modbus TCP的通信参考模型如图315所示。从图315中可以看到,Modbus是OSI参考模型第7层上的应用层报文传输协议,它在连接至不同类型总线或网络的设备之间提供客户机/服务器通信。 图315Modbus TCP的通信参考模型 Modbus是一个请求、应答协议,并且提供功能码规定的服务。目前,Modbus网络支持有线、无线类的多传输介质。有线介质包括EIA/TIA232、EIA422、EIA/TIA485,以太网和光纤等。如图316所示为Modbus TCP的通信体系结构,每种设备(PLC、HMI、控制面板、驱动设备和I/O设备等)都能使用Modbus协议来启动远程操作。在基于串行链路和以太网TCP/IP的Modbus上可以进行相同的通信,一些网关允许在几种使用Modbus协议的总线或网络之间进行通信。 图316Modbus TCP的通信体系结构 Modbus TCP具有以下特点。 (1) TCP/IP已成为信息行业的事实标准。 世界上超过90%的网络都使用TCP/IP,只要在应用层使用Modbus TCP,就可实现工业以太网数据交换。 (2) 易于与各种系统互联。 采用Modbus TCP的系统可灵活应用于管理网络、实时监控及现场设备通信,强化了与不同应用系统互联的能力。 (3) 网络实施价格低廉。 由于Modbus TCP在原有以太网的基础上添加了Modbus应用层,所以Modbus TCP设备可全部使用通用网络部件,大大降低了设备成本。 (4) 满足用户要求。 目前,我国已把Modbus TCP作为工业网络标准之一,用户可免费获得协议及样板程序,可在UNIX、Linux、Windows系统环境下运行,不需要专门的驱动程序。在国外,Modbus TCP被国际半导体产业协会(SEMI)定为网络标准,国际水处理、电力系统也把它作为应用的事实标准,还有越来越多行业将其作为标准来用。 (5) 高速的网络传输能力。 用户最关心的是所使用网络的传输能力,100Mb/s以太网的传输结果为每秒4000个Modbus TCP报文,而每个报文可传输125个字(16bit),故相当于4000×125=500000个模拟量数据(8000000开关量)。 (6) 厂家能提供完整的解决方案。 工业以太网的接线元件包括工业集成器、工业交换机、工业收发器、工业连接电缆。工业以太网服务器支持远程和分布式I/O扫描功能、设备地址IP的设置功能、故障设备在线更换功能、分组的信息发布与订阅功能及网络动态监视功能,还包含支持瘦客户机的Web服务。Modbus TCP还拥有其他工控设备的支持,如工业用人机接口、变频器、软启动器、电动机控制中心、以太网I/O、各种现场总线的网桥,甚至带Modbus TCP的传感器,这些都为用户使用提供了方便。 3.4.2Modbus TCP应用数据单元 图317Modbus TCP应用数据单元的结构 Modbus TCP采用TCP/IP和以太网协议来传输Modbus信息,因此与Modbus串行链路数据单元类似,Modbus TCP的应用数据单元就是将Modbus 简单协议数据单元(PDU)按照TCP/IP标准进行封装而形成的。一个TCP帧只能传送一个Modbus ADU,建议不要在同一个TCP PDU中发送多个Modbus请求或响应。Modbus TCP采用客户机与服务器之间的请求响应式通信服务模式。在TCP/IP网络和串行链路子网之间需要通过网关互联。如图317所示为Modbus TCP应用数据单元的结构,可以看到,在Modbus TCP应用数据单元中有一个被称为MBAP的报文头,即Modbus应用协议报文头,这种专用报文头的长度为7字节,该报文头所包含的字段如表35所示。 表35MBAP报文头的字段 字段长度/B描述客户机服务器 事务处理标识符2识别Modbus请求/响应事务处理由客户机设置服务器从接收的请求中重新复制 协议标识符20=Modbus协议由客户机设置服务器从接收的请求中重新复制 长度2随后的字节数量由客户机设置(请求)由服务器设置(响应) 单元标识符1识别串行链路或其他总线上连接的远程从站由客户机设置服务器从接收的请求中重新复制 事务处理标识符用于事务处理配对; 长度字段是后续字段的字节数,包括单元标识符和数据字段的字节数; 单元标识符用于系统内的路由选择。通过TCP将所有Modbus TCP ADU发送至注册的502端口。 3.4.3ModbusRTPS 2008年10月,ISA展会期间,Modbus组织与IDA宣布合并,致力于基于以太网的控制方案的推广,合并后的ModbusIDA组织横跨欧美,成为能够与PROFINET和Ethernet/IP抗衡的阵营。 ModbusRTPS是ModbusIDA组织开发的基于以太网TCP/IP和Web互联网技术的实时以太网,其中的RTPS(RealTime Publish/Subscribe)是基于以太网TCP/IP的实时扩展通信协议。RTPS协议及其应用程序接口由一个兼容各种设备的中间件来实现,它采用美国RTI(RealTime Innovations)公司的NDDS(Network Data Delivery Service)3.0实时通信系统。 RTPS协议基于发布者/预订者建立,进行扩展后增加了设置数据发送截止时间、控制数据流速率和使用多址广播等功能。它可以简化为一个数据发送者和多个数据接收者通信的工作,进而极大地减轻了网络的负荷。 习题 1. 简述Modbus的特点。 2. 简述Modbus通信模型和工作原理。 3. 简述通用Modbus帧的组成和各部分功能。 4. 简述RS485接口标准与RS232接口标准的区别。 5. 简述Modbus串行链路协议规定的差错检验方式。 6. 简述Modbus 常用的功能码。