400-808-5829
当使用Modbus作为通信协议时,有许多不同的解释、术语和标签来说明如何访问各种设备中的不同类型的数据。有时,设备手册只会提到支持的Modbus功能代码以及这些功能代码在哪个范围内可用。爱陆通帮助您了解modbus通讯协议功能码。
Modbus的功能代码(FC)是使用特定代码的Modbus请求,在告知Modbus从设备访问何种类型的内存(如保持寄存器、输入线圈等)以及对该内存执行何种操作(如读取或写入)方面起作用。下面的表格列出了TOPServerModbusSuite中包含的所有Modbus驱动程序用于通信的特殊Modbus功能代码:
根据您在客户端应用程序中读取或写入的地址类型(保持寄存器、内部寄存器、输入线圈或输出线圈),这将决定TOP服务器Modbus驱动程序在处理您的实际协议请求时所使用的特定功能代码设备。
在TOP服务器的Modbus驱动程序中,还有一些特别的设置,可以增加设备中不同Modbus实现的灵活性。我们稍后会介绍这些设置。
此外,在本文中没有详细介绍,但TOP服务器的Modbus灵活性进一步增强,可以支持特定的非标准驱动程序中的Modbus变体,例如EnronModbus、OMNIFlow、LufkinELAM、HoneywellUDC甚至基于YaskawaMemobus的驱动程序。
就像我们之前提到的那样,当我们讨论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功能代码15(十六进制0x0F)。
当在TOP服务器写入多个输出线圈(0xxxxx)时,通常会使用此功能代码。不过,现在很多设备仅支持FC15对输出线圈进行单次和多次写入的情况,并且这种情况并不少见。
为了应对这种情况,TOP服务器的Modbus驱动程序增加了一个特殊设置项,可以禁用"Modbus功能05"。当此设置被禁用时,驱动程序将仅使用FC15指令来对输出线圈进行写入操作。
十六进制代码为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”选项。
TOP服务器将会执行一个FC3读取,读取整个寄存器。
接着,驱动程序仅修改出问题的位(这将改变保持寄存器16位值的整体值)。
然后根据设备的支持以及特殊设置的描述,将经过修改的16位值写回Modbus从设备,可以使用FC6或16功能码。
因此,该函数的作用是确定正在访问的内存类型以及其读写操作。然而,该功能代码与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,以此类推。这种方法更加“友好”于用户。
然而,了解这一点非常重要,因为有些设备支持从0开始寻址,而其他设备支持从1开始寻址。TOP服务器的Modbus驱动程序有一个可配置的设置,可以指定您的Modbus从设备所支持的实现方式。
Modbus规范的默认设置是启用“基于零的寻址”。如果禁用此设置,驱动程序将使用基于1的寻址。请确保始终使用正确的设置,以免显示的值为设备中的错误地址。
举一个例子,假设您读取到了值400001,与您预期的值相比,它被认为是一个“错误”的值。在这种情况下,请检查一下与400001相邻的寄存器的值。如果确实相邻,您需要将寄存器的寻址方式从1换为从零开始(反之亦然)。
另外,还有一种基于1或基于0的位寻址方式可供选择。默认情况下,TOPServerModbus驱动程序支持从零开始的位寻址,因为这是Modbus规范的默认设置。这就意味着位的寻址范围是从0到15。
使用1位寻址,可以从1到16位进行寻址,这对于处理16位数据更加直观自然。此外,根据您的设备支持情况,TOPServerModbus驱动程序具有可配置的设置。
为了确保准确访问位值,您在TOPServer中选择的位寻址方法必须与设备支持的寻址方式相一致。如果设置错误,可能会导致访问到错误的位值。该设置允许您启用0-15位的访问或禁用1-16位的访问。
为确认制造商所支持的方法,请持续查阅制造商的文件或与其进行交流。若发现某选项因错误设置为“开启”而实际所需为“关闭”,或相反情况,则可能需切换该设置。
Modbus具有许多独特的特点,这是由于它是一个非常成熟和广泛使用的开放协议。一个灵活的Modbus主站,例如TOP服务器,提供了一系列可配置的选项,以与各种制造商的Modbus从站配合使用,以实现最大的兼容性。