咨询热线:

400-808-5829

行业知识

大数据分析将与物联网技术结合,实现更精确的预测和智能化决策

首页物联网百科行业知识
热门关键词: 5G网关5G千兆网关

modbus通讯协议功能码怎么看?

发布时间:2024-01-16 浏览量:4190

‌当使用Modbus作为通信协议时,有许多不同的解释、术语和标签来说明如何访问各种设备中的不同类型的数据。有时,设备手册只会提到支持的Modbus功能代码以及这些功能代码在哪个范围内可用。爱陆通帮助您了解modbus通讯协议功能码。

Modbus的功能代码(FC)是使用特定代码的Modbus请求,在告知Modbus从设备访问何种类型的内存(如保持寄存器、输入线圈等)以及对该内存执行何种操作(如读取或写入)方面起作用。下面的表格列出了TOPServerModbusSuite中包含的所有Modbus驱动程序用于通信的特殊Modbus功能代码:


modbus通讯协议功能码怎么看?

根据您在客户端应用程序中读取或写入的地址类型(保持寄存器、内部寄存器、输入线圈或输出线圈),这将决定TOP服务器Modbus驱动程序在处理您的实际协议请求时所使用的特定功能代码设备。

在TOP服务器的Modbus驱动程序中,还有一些特别的设置,可以增加设备中不同Modbus实现的灵活性。我们稍后会介绍这些设置。

此外,在本文中没有详细介绍,但TOP服务器的Modbus灵活性进一步增强,可以支持特定的非标准驱动程序中的Modbus变体,例如EnronModbus、OMNIFlow、LufkinELAM、HoneywellUDC甚至基于YaskawaMemobus的驱动程序。

如何将Modbus功能代码与寻址进行对应?

就像我们之前提到的那样,当我们讨论Modbus协议和访问特定数据位置(或内存类型)时,一般有四种不同类型的Modbus地址:

保持寄存器是一个具有读写访问权限的16位(模拟)地址,地址范围在4xxxxx。

内部寄存器是一种16位(模拟)地址寄存器,只能进行只读访问。

输入线圈是一种具有只读访问权限的地址,该地址为1位(布尔)的1xxxxx。

输出线圈是一种具有读/写访问权限的位(布尔)地址,其地址为0xxxxx。

前一次我们曾经讨论过,设备文档并不总是提供Modbus地址详细列表,按照地址类型(例如4xxxx或保持寄存器)进行分类。

所以,因为我们正在更加详细地讨论Modbus功能码,我们需要根据特定地址的内存类型以及其读写能力来讨论Modbus地址范围。

这两个因素决定了在向设备发送请求时所使用的Modbus功能代码。现在我们来讨论每个功能代码以及它们对应的地址和功能的执行。

Modbus功能码1,以十六进制表示为0x01。

当需要读取一个或多个(最多2000个)输出线圈或0xxxxx类型的离散/布尔地址时,TOP服务器将使用该功能代码。

在此列表下方,您将看到对功能代码5和15的支持,即读取和写入访问的线圈。

Modbus功能码2表示读取离散输入,用十六进制表示为0x02。

当需要读取多个(每次最多2000个)输入线圈或1xxxxx类型的离散/布尔地址中的一个时,TOP服务器使用这个功能代码。

在Modbus设备中,输入线圈是只读的,这意味着您无法使用功能代码来写入1xxxxx类型的地址。

Modbus功能代码3(十六进制0x03)

当需要读取一个或多个保持寄存器或4xxxxx类型的模拟地址时,TOP服务器会使用该功能代码。每次最多可以读取125个地址。

您可以使用功能代码3来访问保持寄存器中的不同位。只需在末尾加上一个.x的语法,其中x表示您想要读取的寄存器中的位(例如,400001.0表示访问保持寄存器偏移1的位0)。

由于保持寄存器在大多数支持Modbus的设备中是最常见的内存类型,因此Modbus功能代码3可能是最广泛使用的功能代码。

同时,寄存器保持了读/写访问的状态,因此您可以在列表底部找到对功能代码6和16的支持。

Modbus的功能代码4,也表示为十六进制的0x04。

当需要读取一个或多个(一次最多125个)内部寄存器或3xxxxx类型的模拟地址时,TOP服务器会使用这个功能代码。

除了保持寄存器,我们还可以使用功能码4访问内部寄存器中的各个位。例如,我们可以使用4*u,e,300004.2来获取基于1与0的位寻址的信息寄存器中的内容。

在Modbus设备中,与输入线圈类似,内部寄存器也是只读的。因此,您不会找到专门用于写入3xxxxxx类型地址的功能代码。

备注:是的,如果您留意到,FC3是用于访问4xxxxx地址的,而FC4是用于访问3xxxxx地址的,就好像FC1用于访问0xxxxx地址,而FC2用于访问1xxxxx地址一样——这些并非打印错误。

Modbus的功能代码5为十六进制0x05。

在写入单个输出线圈(0xxxxx)时,TOP服务器使用的是此功能代码,也被称为“强制”线圈。

Modbus功能码6(十六进制0x06)

当TOP服务器写入单个保持寄存器(4xxxxx)时,会使用此功能代码,该寄存器也被称为“预置”寄存器。

modbus通讯协议功能码怎么看?

Modbus通信协议的功能码是Modbus功能代码15(十六进制0x0F)。

当在TOP服务器写入多个输出线圈(0xxxxx)时,通常会使用此功能代码。不过,现在很多设备仅支持FC15对输出线圈进行单次和多次写入的情况,并且这种情况并不少见。

为了应对这种情况,TOP服务器的Modbus驱动程序增加了一个特殊设置项,可以禁用"Modbus功能05"。当此设置被禁用时,驱动程序将仅使用FC15指令来对输出线圈进行写入操作。

modbus通讯协议功能码怎么看?

十六进制代码为0x10的功能代码16

此功能代码用于TOP服务器在写入(预设)多个保持寄存器(4xxxxx)时的操作。与FC15相似,设备制造商通常只支持FC16,可用于单次和多次写入保持寄存器的情况,这是一种更经济的实现方式,只需要添加对一个与两个功能代码的支持。

为了解决这个问题,TOP服务器Modbus驱动程序还有一个设置选项,可以让您禁用“Modbus功能06”。这样一来,当您禁用该选项时,驱动程序将只使用FC16来进行对保持寄存器的所有写入操作。

Modbus功能码22(十六进制0x16)

这个功能是专为保持寄存器(4xxxxx)中的位写入而设计的,它仅适用于单个事务。默认情况下,在TOP服务器的Modbus驱动程序设备属性中是禁用的,因为许多Modbus设备不支持FC22,可以选择支持其他方法。

另一种方法是默认且常用的方式,即对于保持在寄存器中的位进行读取、修改和写入操作。

当客户端应用程序向保持寄存器写入位时,会出现以下情况:

正如您所料,这种常用的方法存在一些风险,尤其是当您的Modbus设备中的寄存器值经常发生变化时。进行读取/修改/写入操作可能会导致位被更改为不正确的状态,因为之前的更改操作可能还没有完成所需的时间。

举个例子,假设我们正在对400001的第1位进行读取/修改/写入操作。如果在操作开始时第2位是“打开”的状态,但在写入之前已切换为“关闭”,那么它将再次错误地被“打开”。

FC22的设计目标是通过直接修改保持寄存器中的特定位来规避潜在风险,同时保持其余位不受影响。然而,使用FC22需要确保实际的Modbus从设备支持该功能,而这种情况并非普遍存在。

所以,请确保您的设备是否真的支持FC22。如果支持,在TOP服务器的Modbus驱动程序的设备属性中,您可以启用“HoldingRegisterBitWrites”选项。

modbus通讯协议功能码怎么看?

TOP服务器将会执行一个FC3读取,读取整个寄存器。

接着,驱动程序仅修改出问题的位(这将改变保持寄存器16位值的整体值)。

然后根据设备的支持以及特殊设置的描述,将经过修改的16位值写回Modbus从设备,可以使用FC6或16功能码。

因此,该函数的作用是确定正在访问的内存类型以及其读写操作。然而,该功能代码与Modbus请求中的其他信息一起使用,这些信息包括所谓的偏移量。

如何将偏移寻址与Modbus功能码结合使用?

TOPServerModbusSuite驱动程序可以支持多种不同类型的内存地址范围:

注册账号为:400001-465536

内部存储器的地址段为300001到365536。

请提供一个从100001到165536的输入线圈编号范围。

输出线圈的编号从000001到065536。

我们支持的是1到65,536范围内所有内存类型的偏移值。但是,关于偏移值的定义是什么呢?

通常情况下,解释偏移量的方法是根据地址的首位数字(4、3、1或0)来确定驱动程序访问的是哪种类型的内存。首位数字后面的所有内容构成了偏移量,表示你所关注的特定内存地址在该内存类型中的位置。

在Modbus文件中记录了保持寄存器的偏移量。TOP服务器声称它能够支持以下偏移量:400140000140001400001。

在Modbus请求中,Modbus功能代码和偏移量一起运作,它们用于指示设备返回或修改特定信息。

寻址Modbus可以采用两种方式,分别是从零开始和从一开始。

零寻址是指设备的寄存器地址从0开始递增,第一个寄存器的地址为0,第二个为1,以此类推。

一寻址是指设备的寄存器地址从1开始编号,第一个寄存器的地址为1,第二个为2,依次递增。

对于Modbus通信协议,可以使用两种不同的寻址方式,具体选择哪一种方式取决于设备的要求和用户的使用习惯。

当讨论基于偏移的Modbus寻址时,还有一个关键的细节是设备是否支持零或一作为起始地址。最初,零作为起始地址是Modbus的预期实现方式。然而,随着时间的推移和Modbus作为一种广泛采用的开放协议,一些设备制造商引入了一种名为one-based寻址的概念。

从零开始进行寻址是指在访问内存类型时,第一个偏移量为零。例如,如果您想要访问寄存器400001,那么在Modbus协议中的请求将是FC3,并且其偏移量为0。类似地,当访问寄存器400002时,请求将是偏移量为1的FC3,以此类推。

因此,一些制造商采用了一种名为基于一的寻址的实现方式。在这种方式下,从1开始进行寻址,偏移量与实际地址请求保持对齐。举个例子,如果您要求使用寄存器1,那么请求仍然使用FC3,但偏移量为1。同样地,400002将请求FC3,但偏移量为2,以此类推。这种方法更加“友好”于用户。

modbus通讯协议功能码怎么看?

然而,了解这一点非常重要,因为有些设备支持从0开始寻址,而其他设备支持从1开始寻址。TOP服务器的Modbus驱动程序有一个可配置的设置,可以指定您的Modbus从设备所支持的实现方式。

modbus通讯协议功能码怎么看?

Modbus规范的默认设置是启用“基于零的寻址”。如果禁用此设置,驱动程序将使用基于1的寻址。请确保始终使用正确的设置,以免显示的值为设备中的错误地址。

举一个例子,假设您读取到了值400001,与您预期的值相比,它被认为是一个“错误”的值。在这种情况下,请检查一下与400001相邻的寄存器的值。如果确实相邻,您需要将寄存器的寻址方式从1换为从零开始(反之亦然)。

另外,还有一种基于1或基于0的位寻址方式可供选择。默认情况下,TOPServerModbus驱动程序支持从零开始的位寻址,因为这是Modbus规范的默认设置。这就意味着位的寻址范围是从0到15。

使用1位寻址,可以从1到16位进行寻址,这对于处理16位数据更加直观自然。此外,根据您的设备支持情况,TOPServerModbus驱动程序具有可配置的设置。

modbus通讯协议功能码怎么看?

为了确保准确访问位值,您在TOPServer中选择的位寻址方法必须与设备支持的寻址方式相一致。如果设置错误,可能会导致访问到错误的位值。该设置允许您启用0-15位的访问或禁用1-16位的访问。

为确认制造商所支持的方法,请持续查阅制造商的文件或与其进行交流。若发现某选项因错误设置为“开启”而实际所需为“关闭”,或相反情况,则可能需切换该设置。

Modbus具有许多独特的特点,这是由于它是一个非常成熟和广泛使用的开放协议。一个灵活的Modbus主站,例如TOP服务器,提供了一系列可配置的选项,以与各种制造商的Modbus从站配合使用,以实现最大的兼容性。

(以上所有图均源于网络,如有侵权联系删除)

爱陆通——物联网产品与行业解决方案提供商。
All Rights Reserved 厦门爱陆通通信科技有限公司 版权所有 © 2008-2024 Inc.   闽ICP备15018514号-2 网站地图 城市分站