西安艾宝物联网科技有限公司

西安艾宝物联-工业无线测控专家

艾宝物联 工业无线测控专家

以技术创新为生命,以卓越品质求生存

Modbus基础知识

文章出处:未知 浏览次数:发表时间:2018-09-24

概述:

Modbus是领先的工业开放式控制协议。该帮助页面将讨论一些基本概念并纠正一些常见的误解,但不提供协议本身的详细描述。


Modbus的类型:

Modbus有几种不同的类型,具体取决于运输的介质。

  • Modbus RTU - 这是原始Modbus。它通过RS-232和RS-485链路使用。
  • Modbus ASCII - 这与Modbus RTU类似,但数据以ASCII而不是原始二进制编码。该版本主要用于无线电链路。
  • Modbus / TCP - 此版本通过以太网使用。它类似于Modbus RTU,但使用内置于以太网中的校验和,而不是包括RTU校验和。
  • Modbus over Ethernet - 这是一些供应商使用的模糊术语,但不是官方认可的名称。它通常用于指使用特殊硬件在两点之间通过以太网隧道传输Modbus RTU。不是 Modbus标准的一部分,格式取决于供应商。
  • Modbus / UDP - 这与Modbus / TCP类似,但使用UDP以太网套接字而不是TCP套接字。这是由一些供应商提供的,但 不是 Modbus标准的一部分。
  • Modbus + - 这是一个使用Modbus名称的专有协议,但不遵循Modbus通信标准。这很少遇到。

MBLogic使用Modbus / TCP。


通讯

客户/服务器或主/从:

与大多数通信协议一样,Modbus使用客户端/服务器类型协议。这有时也称为主/从“主”与“客户”是同一个东西,而“奴隶”与“服务器”是同一个东西。主/从术语起源于工业,而客户/服务器术语起源于计算机行业。不同的术语是由于它们如何被应用的历史差异而产生的,但计算机行业术语在很大程度上取代了工业术语,因为工业界采用了更多现成的计算机技术。通常,客户端是PLC或控制器,而服务器是现场设备,例如阀组或传感器块。

“客户端”向“服务器” 发送请求服务器对该请求进行解码,并发送回一个响应与请求的数据或确认。这与其他常用协议的工作原理相同。

例如,当您使用Web浏览器在Internet上查看网页时,Web浏览器会向Web服务器发送“页面请求”。Web服务器对请求进行解码,并将网页作为“响应”发回。您的电子邮件客户端程序以相同的方式从邮件服务器提取您的电子邮件。

单位ID:

Modbus消息包括所谓的单元ID单元ID是0到255之间的数字,用于标识RS-232或RS-485网络中的服务器(或从站)地址。为每个服务器(从站)分配一个“从站ID”号,并在单元ID字段中侦听包含该号码的消息。

Modbus / TCP在其消息中也有单元ID,但以太网TCP / IP地址用于决定实际传送消息的位置。许多或大多数服务器设备将忽略设备ID。但是,有些人会使用单元ID来决定是否将消息转发出内置串行端口。此消息转发允许较旧的RS-485设备用于较新的以太网网络。但是,只有少数设备才支持此功能。

消息ID:

当Modbus消息发送请求时,它包括消息ID 号。这是0到65,535之间的数字。对于每个请求,此数字通常由客户端递增(并且当它溢出时允许再次翻转到0)。此消息ID由服务器回显。客户端可以使用此消息ID号来确定是否有任何消息在传输中丢失或延迟。

串口通讯参数:

当通过RS-232或RS-585网络使用时,必须为所有设备正确设置通常的串行通信参数,如波特率,奇偶校验,停止位等。这里不讨论这些参数的设定。请参阅供应商文档以获取详细信

以太网参数:

通过以太网使用时,Modbus / TCP不需要设置波特率或其他类似参数。但是,它确实需要使用正确的 IP地址端口号

“IP地址”是发送消息的设备的网络地址。网络上的每个设备都必须具有唯一的IP地址。可能的IP地址数量非常大(数十亿个地址)。

除IP地址外,还需要“端口号”。以太网“端口号”不是指物理连接器。端口号是在设备中的操作系统或固件使用的以太网报头中发送的号码,用于确定应将消息发送到哪个程序。这允许多个程序共享同一个以太网适配器而不会发生冲突。当客户端发送消息时,它发送它指定一个特定的端口号。当服务器收到消息时,操作系统或固件将查看端口号并将消息路由到正确的程序。

当服务器程序启动时,它将“绑定到端口”。这只是意味着它会要求为操作系统分配一个特定的端口号。任何时候只有一个服务器可以绑定到同一个端口号。如果端口号已被其他程序使用,则不允许新服务器程序使用它,并且将遇到错误。当服务器程序关闭时,它释放了端口的使用。然后,在允许再次使用该端口号之前,操作系统将等待一定的超时时间(标准为70秒)。

Modbus / TCP的“标准”端口号是端口502.就协议本身而言,它使用的端口号是完全透明的。Modbus协议消息本身不发送端口号。但是,端口502按惯例被识别为要使用的标准端口号,因此大多数现场设备将在端口502上进行侦听。但是,可以在备用端口号上运行Modbus / TCP,前提是所有参与通信可以配置为使用备用端口。


Modbus数据表示:

数据表

Modbus使用数据表的概念来引用数据。使用PLC的任何人都应该熟悉数据表。数据表是用于存储数据的数组或内存块。使用数据表地址引用数据。Modbus数据表地址有四种类型。

  • 离散输入 - 这些是只读布尔值。它们通常用于表示传感器输入和其他布尔值,这些布尔值是由用户读取但不写入的。
  • 线圈 - 这些是读写布尔值。它们通常用于表示输出(例如阀电磁阀)或内部位,它们都由用户读取和写入。
  • 输入寄存器 - 这些是只读16位整数。它们通常用于表示模拟输入值和其他整数值,这些值由用户读取但不写入。
  • 保持寄存器 - 这些是读写16位整数。它们通常用于表示模拟输出或内部数字,它们由用户读取和写入。

除了布尔和整数的本机数据类型之外,还可以通过在多个寄存器上分割数据来在Modbus数据表中存储大整数,浮点数和字符串。但是,Modbus不提供任何直接支持,因此用户负责将值拆分并将它们存储在不同的位置。

数据表地址

Modbus数据表地址只是整数。每种地址类型(离散输入,线圈,输入寄存器,保持寄存器)都有自己编号的地址集。例如,离散输入42和线圈42是两个单独的地址。

Modbus区分协议地址和 数据模型地址。协议中使用的地址编号为0到65,535。但是,供应商文档的编号可能为1到65,536。本文档将引用协议地址(即第一个地址为0)。

虽然每种类型的地址可能有65,536个,但在特定设备(传感器块,阀组,PLC等)中实际实现的地址数量通常要少得多。每个设备设计人员负责决定对其应用程序有意义的内容。然后,他们通常会为其设备提供“存储器映射”或地址列表,列出实施的地址以及每个地址的功能。

也可以“覆盖”地址类型。也就是说,可以设计一种设备,使得几种不同的地址类型都指向相同的物理存储器位置。例如,可以使保持寄存器10和输入寄存器10都是相同的存储位置。在这种情况下,如果您要写入保持寄存器10,该值也将出现在输入寄存器10中。这同样适用于线圈和离散输入。

以同样的方式,可以在寄存器中包装线圈和离散输入。例如,线圈0至15可以被包装在保持寄存器0中,线圈16至31被包装在保持寄存器1中,等等。这将允许多个线圈被读取(或写入)作为字。

尽管可以叠加数据类型并将线圈封装到寄存器中,但实际上并不常见。

关于Modbus地址的一些常见误解

根据Modbus标准,地址只是从0到65,535的整数,不同的地址范围被称为线圈,保持寄存器等。但是,一些供应商将使用数字前缀来记录其硬件,这些前缀实际上不是Modbus地址的一部分。 。这源于一些使用Modbus通信协议的PLC模型,并且在其内部数据表中也使用了数字前缀。这类似于使用“I”,“Q”,“V”等作为IEC类型PLC中的地址前缀。

但是,重要的是要记住这些数字前缀是文档方法,并不是 Modbus协议本身作为消息的一部分发送的部分。文档方法的不同不会影响协议本身的兼容性。

这些前缀是在Modbus标准中的任何地方提到的,但以下显示了它们如何在基于这个较旧的约定的文档中使用:

  • 0xxxx - 线圈。
  • 1xxxx - 离散输入。
  • 3xxxx - 输入寄存器。
  • 4xxxx - 保持寄存器。

请注意,没有2xxxx地址前缀。

除了数字前缀之外,一些文档将引用协议地址(地址从0开始),而其他文档将引用数据模型地址(地址从1开始)。也就是说,第一个保持寄存器可以是0或1(或40000对40001使用前缀)。但是,这与作为Modbus消息通过线路发送的内容无关。对于Modbus协议消息,最低地址始终为“0”,而不是“1”。

本文档在使用Modbus协议寻址时使用标准Modbus术语和地址,没有前缀或偏移。但是,如果您正在阅读传感器块,阀门和其他设备的文档,则必须记住某些供应商可能以不同方式记录其硬件。


Modbus命令或“功能”:

功能:

Modbus命令称为功能函数只是读取或写入数据表地址的命令。功能是诸如1,2,3,4等的数字。例如,功能“1”将读取一个或多个线圈。功能“15”将写入一个或多个线圈。所有功能代码都被定义为Modbus标准的一部分,但实际在任何特定设备中实现的功能取决于设备设计者。例如,阀组可以仅实现用于写入线圈的功能,因为这是该设备所必需的。

最常见的功能如下所示。Modbus标准中定义了许多其他功能,但这些功能是最常遇到的功能。

  • 1 - 读取多个线圈。
  • 2 - 读取多个离散输入。
  • 3 - 读取多个保持寄存器。
  • 4 - 读取多个输入寄存器。
  • 5 - 写单线圈。
  • 6 - 写单保持寄存器。
  • 15 - 写多个线圈。
  • 16 - 写入多个保持寄存器。

数量:

读取或写入多个地址的Modbus功能也需要数量参数。“quantity”参数指定要读取或写入的连续地址的数量。

一次可以读取或写入的最大地址数:

modbus协议指定一次可以读取或写入的最大地址数。这将在单个命令中必须传输的数据量限制为不超过255个字节。对于读取命令,限制是2000个线圈或离散输入或125个寄存器。对于写命令,限制是1968个线圈或123个寄存器。


Modbus错误:

Modbus故障:

当服务器收到Modbus消息时,将对其进行分析以查看所有参数是否正确。如果一切正常,服务器将发送响应。此响应可能包含数据,也可能只是确认收到了消息。

但是,如果有任何错误,服务器可能会执行以下两种操作之一。如果消息根本无法解码(例如,存在错误的校验和),则简单地丢弃该消息。如果消息可以被解码但是一个或多个参数不正确(例如,尝试读取不存在的地址),则服务器将发送包含故障代码的响应故障代码只是请求中添加了128的功能代码。

例如,如果客户端发送包含错误的功能3(读取保持寄存器)的请求,则服务器将以131(3 + 128 = 131)的故障代码进行响应。

Modbus例外:

除了故障代码之外,服务器还将返回一个异常代码,该代码提供有关错误的更多详细信息。为每个函数单独定义异常代码,但对于大多数常见函数,以下内容将适用:

  • 1 =不支持所请求的功能代码(命令)。
  • 2 =地址不正确(不存在)。对于在多个地址上运行的功能,此检查包括受请求影响的所有地址。
  • 3 =地址数量不正确。对于所请求的功能,数量参数太大(或为零)。
  • 4 =服务器中发生了一些未指定的错误,导致请求无法执行。

回顶部