不同的指令码表示不同的功能,例如读取保持寄存器、写入单个寄存器等。以下是一些常见的Modbus指令码及其用途: 读操作: READ_COILS (1): 读取线圈状态(开关状态)。...READ_DISCRETE_INPUTS (2): 读取输入状态(离散输入)。 READ_HOLDING_REGISTERS (3): 读取保持寄存器的内容。...WRITE_MULTIPLE_REGISTERS (16): 写入多个保持寄存器的内容。 读写文件记录: READ_FILE_RECORD (20): 读取文件记录。...以下是一个使用J2Mod库进行Modbus读取保持寄存器的简单示例: import com.ghgande.j2mod.modbus.Modbus; import com.ghgande.j2mod.modbus.ModbusCoupler...从设备,并读取从地址0开始的5个保持寄存器的值。
一、示例介绍 该j2mod示例是一个通过Modbus协议读取输入继电器状态,并根据状态更新输出继电器状态的程序。使用时需要提供设备地址、输入继电器参考编号和输出继电器参考编号作为命令行参数。...准备请求:创建读取输入继电器状态的ModbusRequest对象和写入输出继电器状态的WriteCoilRequest对象,并设置其参考编号和单元ID。...保存上次状态:声明一个用于保存输出继电器上次状态的变量。 循环执行:反复执行以下步骤:读取输入继电器状态,如果状态与上次输出继电器状态不同,则更新输出继电器状态并保存新的状态。...关闭连接:在程序结束时关闭与设备的连接。 注意:该程序使用了Modbus协议和TCP连接来与设备进行通信,并使用了j2mod库提供的类来处理Modbus请求和响应。...,如果您使用Modbus协议栈向远程I/O进行写入,则很可能会在第一次写入消息后保持通信有效。这可以通过发送任何类型的消息来实现,也可以通过在给定的时间段内重复写入消息来实现。
j2mod 是一个用于 Modbus 通信协议的 Java 库,可以用来创建 Modbus TCP 服务器。...以下是一个简单的示例代码,演示如何使用 j2mod 创建一个 Modbus TCP 服务器。 首先,确保你已经添加 j2mod 库到你的项目中。...你可以从 j2mod 的官方网站(https://github.com/stephaneAG/j2mod)下载库的 JAR 文件,并将其添加到你的项目中。...你可以根据你的需求修改寄存器和线圈的数量以及其他参数。 请注意,这只是一个简单的示例,实际上,你可能需要根据你的具体应用场景进行更复杂的设置和处理。...你还可以根据 j2mod 库的文档(https://github.com/stephaneAG/j2mod/wiki)进一步了解如何使用该库。
一、示例介绍 该Java示例是一个用于读取和写入工业自动化设备输入输出寄存器的程序。主要功能包括: 解析命令行参数,获取设备地址、输入寄存器和输出寄存器的参考编号。 建立与设备的TCP连接。...创建读取输入寄存器和写入输出寄存器的请求,并设置单元ID。 创建事务,将请求与连接关联,并执行事务。 循环读取输入寄存器的值,并将值写入输出寄存器中,仅在值发生变化时更新输出寄存器。...关闭与设备的连接。 注意:该程序使用了Modbus协议进行通信,并依赖于j2mod库。...服务器地址 TCPMasterConnection con = null; // Modbus TCP 主连接 ModbusRequest ai_req; // 用于读取输入寄存器的请求...,如果您使用Modbus协议栈向远程I/O进行写入,则很可能会在第一次写入消息后保持通信有效。这可以通过发送任何类型的消息来实现,也可以通过在给定的时间段内重复写入消息来实现。
背景 改造老项目,须要加一个aop来拦截所的web Controller请求做一些处理,由于老项目比较多,且包的命名也不统一,又不想每个项目都copy一份相同的代码,这样会导致后以后升级很麻烦,不利于维护...我们都知道,java中的注解里面的值都是一个常量, 如: @Pointcut("execution(* com.demo.Serviceable+.*(..))")...这种方式原则上是没有办法可以进行改变的。但是我们又要实现这将aop中的切面值做成一个动态配置的,每个项目的值的都不一样的,该怎么办呢?...advisor.setAdvice(new LogAdvice ()); return advisor; } } 这里面的 pointcut.property值来自于你的...比如,我们定时器采用注解方式配置的时候,cron表达式也是注解里面的一个字符串常量,那么,我们能不能通过配置文件的方式来配置这个cron呢?原理都是一样的。
在Java中,有几个流行的库可以用于实现Modbus协议以读取设备数据。...以下是一些常用的库: 一、j2mod 这是jamod Modbus库的一个分支,取自1.2.1版本,根据Apache 2许可证发布,包含在该项目的SVN存储库中。...j2mod项目的目标是基于Java编程语言生成一个功能更全面的Modbus(tm)通信库。 这是一个积极开发的项目,接受具有Modbus主站和从站开发经验的专业软件工程师提交的文件。...j2mod是一个开源的Modbus协议Java实现。它支持Modbus RTU和Modbus TCP,并且提供了主站和从站的功能。...你可以使用j2mod来创建Modbus主站来读取和写入Modbus从站设备。
常见的Modbus库包括:j2mod:一个开源的Java库,用于通过Modbus协议读取和写入设备的寄存器。Modbus4J:同样是支持Modbus的Java库,功能强大且易于使用。...读取寄存器:使用readHoldingRegisters()方法从指定寄存器读取数据。第一个参数是设备的从站ID,第二个参数是寄存器地址,第三个参数是读取的寄存器数量。...读取寄存器数据int[] registerValues = master.readHoldingRegisters(1, 0, 10); 读取从设备中寄存器地址从0开始的10个寄存器的数据。...这里的1是slave ID,表示从设备的地址。输出寄存器值for 循环遍历读取到的寄存器值数组。...master.destroy(); 关闭与Modbus从设备的连接。小结这段代码演示了如何使用modbus4j库通过Modbus TCP协议从Modbus从设备读取寄存器的值。
首先,主服务器发送一个请求,告诉从站返回一个从地址开始的寄存器的值。...FC][BC][DATA(2+)][CRC] BC- 响应中的字节数(1 字节)DATA DATA包含保持寄存器值的字节序列(每个寄存器 2 个字节) 读取保持寄存器响应的长度至少为 7 个字节。...FC][BC][DATA(2+)][CRC] BC- 响应中的字节数(1 字节)DATA DATA包含保持寄存器值的字节序列(每个寄存器 2 个字节) 读取保持寄存器响应的长度至少为 7 个字节。...ADDR NUM CRC [01] [05] [00 0A] [00 00] [ED C8] 写入单个寄存器 - 0x06 设置单个从站的保持寄存器的值。...(2字节) NUM- 更新的线圈数量(2字节) 写入多个寄存器 - 0x10 设置从站保持寄存器的连续范围的值。
所有 I/O 都仅映射到保持寄存器的情况非常常见。线圈是 1 位寄存器,用于控制离散输出,可以读取或写入。离散输入是用作输入的 1 位寄存器,只能读取。...输入寄存器是用于输入的 16 位寄存器,只能读取。保持寄存器是最通用的 16 位寄存器,可以读取或写入,可用于各种用途,包括输入、输出、配置数据或任何“保持”数据的要求。...大多数控制解决方案 I/O 设备都使用保持寄存器来表示所有类型的输入和输出。在大多数情况下,相同的 I/O 也可以像其他寄存器类型一样访问,并且 I/O 状态或值在多个寄存器中镜像。...功能码寄存器类型1读取线圈2读取离散输入3读取保持寄存器4读取输入寄存器5写入单个线圈6写入单个保持寄存器15写入多个线圈16写入多个保持寄存器Modbus 异常(错误)代码当 Modbus 从站识别出数据包...如果请求多个寄存器,则至少有一个寄存器不被允许。3非法的数据值查询数据字段中包含的值对于从站来说是不可接受的。
5.3 0x03 读取保持寄存器值 该功能码用于读取从设备保持寄存器的内容,不支持广播模式。...5.4 0x04 读取输入寄存器值 该功能码用于读取从设备输入寄存器的内容,不支持广播模式。...需要注意,在 Modbus 协议规定的 PDU 中,规定所有线圈或寄存器地址从 0 开始计算。 5.6 0x06 写单个保持寄存器 该功能码用于更新从设备的单个保持寄存器的值,支持广播模式。...在广播模式下,所有从站设备的同一地址的值将被统一修改。 消息帧中需要指定从设备地址以及需要变更的保持寄存器地址和设定值。 起始地址由 2 个字节构成,取值范围为 0x0000 到 0xFFFF。...5.11 0x10 写多个保持寄存器 该功能码用于设置或写入从设备保持寄存器的多个连续的地址块(1~123个寄存器),支持广播模式。 在广播模式下,所有从站设备的同一地址的值将被统一修改。
功能码03 (03十六进制) 读取保持寄存器 功能:读取从机中保持寄存器的二进制内容。...示例:从从站设备1读取0...1(寄存器40001到40002)的请求: 响应(Response) 响应消息中的寄存器数据,每个寄存器由两字节组成,每个字节内的二进制内容右对齐。...以下是对请求的响应示例: 状态转移图 下图是写单个线圈这类事务状态转移图: 16(0x10)Write Multiple Registers 功能码16 (10十六进制) 写入多个寄存器 将一系列值写入到一系列保持寄存器中...请求(Request) 请求消息指定要写入的寄存器引用。寄存器的地址从0开始,寄存器1的地址为0。 请求写入的值在请求数据字段中指定。数据按每寄存器两字节组成。...以下是写入从站设备17的40002开始的两个寄存器(4个字节),写入十六进制值00 0A和01 02的请求示例: 响应(Response) 正常响应返回从机地址、功能码、起始地址和已写入的寄存器数量。
表 1 – 1 常用功能码 代码 名称 作用 01 读取线圈状态 取得一组逻辑线圈的当前状态(ON/OFF) 02 读取输入状态 取得一组开关输入的当前状态(ON/OFF) 03 读取保持寄存器 在一个或多个保持寄存器中取得当前的二进制值...例如:功能域码告诉终端读取一个寄存器,数据域则需要指明从哪个寄存器开始及读取多少个数据,内嵌的地址和数据依照类型和从机之间的不同能力而有所不同。...—-响应 2.3 读取保持寄存器(功能码03) 读取从机保持寄存器(4X类型)的二进制数据,不支持广播。...(功能码06) 把一个值预置到一个保持寄存器(4X类型)中,广播时,该功能把值预置到所有从机的相同类型的寄存器中。...04 读取输入寄存器 在一个或多个输入寄存器中取得当前的二进制值 05 强置单线圈 强置一个逻辑线圈的通断状态 06 预置单寄存器 把具体二进值装入一个保持寄存器 07 读取异常状态 取得8个内部线圈的通断状态
06h功能写入) 字操作 单个或多个 04h 读输入寄存器(输入寄存器只能读取,不能通过06h功能写入) 字操作 单个或多个 05h 写单个线圈(线圈表示用来控制输出IO控制) 位操作 单个 06h 写单个保持寄存器...字操作 单个 0Fh 写多个线圈 位操作 多个 10h 写多个保持寄存器 字操作 多个 Modbus TCP介绍 示例-通过03功能码读寄存器(从寄存器00开始,读取两个值,读到01寄存器结束) 客户端发送.... 01 03 00 00 00 02(用户数据) 01: 表示设备地址 03: 表示读保持寄存器功能码 00 00: 表示客户端读取的寄存器起始地址 00 02: 表示读取的寄存器值个数(由于为...表示设备地址 06: 表示写单个保持寄存器功能码 00 FF: 表示写入寄存器03h的值为0xFF 返回值如下图所示: ?...(向寄存器03~06地址里写不同值) 客户端发送 01 02 00 00 00 10 01 10 00 03 00 04 08 FF FF 00 0A 00 0F 00 06 01 02 00 00 00
你可以从任意一个窗口读写寄存器和线圈。如果你想改变一个单独的寄存器,简单地双击这个值即可。或者你可以改变多个寄存器/线圈值。提供数据的多种格式方式,比如浮点、双精度、长整型(可以字节序列交换)。...Slave为要访问的Modbus从站(从机)的地址,对应主窗口(主画面)中的ID值,默认为1。 B....如果连接并读取正确,此时主窗口将显示读取寄存器的相关信息。 6)、寄存器值改变: 在主窗口寄存器地址上双击鼠标,弹出修改对话框,如下图: 在Value输入框中输入值确认即可。...其中:Slave为要访问的Modbus从站的地址,对应主画面中的ID值,默认为1。 Address 为当前操作的寄存器的地址。图中为对寄存器40001操作。...比如2寄存器值修改成9,9寄存器值修改成100。
(ON/OFF)3 0x03读取保持寄存器在一个或多个保持寄存器中取得当前的二进制值4 0x04读取输入寄存器在一个或多个输入寄存器中取得当前的二进制值5 0x05强置单线圈强置一个逻辑线圈的通断状态6...0x06预置单寄存器把具体二进值装入一个保持寄存器7 0x07读取异常状态取得8个内部线圈的通断状态,这8个线圈的地址由控制器决定,用户逻辑可以将这些线圈定义,以说明从机状态,短报文适宜于迅速读取状态...15 0x0F强置多线圈强置一串连续逻辑线圈的通断。16 0x10预置多寄存器把具体的二进制值装入一串连续的保持寄存器。17 0x11报告从机标识可使主机判断编址从机的类型及该从机运行指示灯的状态。...可设定端口的输出状态,也可以读取该位的输出状态,可分为两种不同的执行状态,例如保持型或边沿触发型DO数字量输出电磁阀输出、电机的启停控制信号、LED显示等保持寄存器AO输出参数或保持参数,控制器运行时被设定的某些参数...例如,主机通过功能码03告诉从机返回寄存器的值(包含要读取寄存器的起始地址及读取寄存器的长度),则返回的数据包括寄存器的数据长度及数据内容。对于不同的从机,地址和数据信息都不相同(应给出通讯信息表)。
这种模式可以类比为IT领域中的客户端-服务器模型,其中服务器相当于从设备,客户端相当于主设备。 2. 数据类型 Modbus协议定义了四种数据类型:离散量输入、线圈、输入寄存器、保持寄存器。...2.2 离散输入 离散输入寄存器与线圈寄存器类似,但它只能读取输入的开关信号,不能写。例如,我们可以读取外部按键的按下还是松开状态。对应的功能码是0x02。...2.3 保持寄存器 保持寄存器的单位是两个byte,可以存放具体的数据量,并且是可读写的。例如,我们可以设置时间年月日,不仅可以写入,也可以读取当前的时间。...一个寄存器占据两个byte的空间。例如,我们可以通过读取输入寄存器获取当前的AD采集值。对应的功能码是0x04。 3....数据:根据功能码的不同,数据部分可以是要读取或写入的数据,也可以是执行操作的结果。 校验码:用于检查数据传输是否出错。 4.
寄存器是 16 位 - 如何读取浮点或 32 位数据?Modbus 协议将保持寄存器定义为 16 位宽;但是,对于读取和写入宽度超过 16 位的数据,存在一个广泛使用的事实标准。...所有 16 位值的字节顺序都是最高有效字节在前。40001:7 等符号是什么意思?这是引用寄存器中各个位的常用符号。此特定示例引用(Modicon 表示法)寄存器 40001,位 7。...位通常从位 0 开始编号,这是 Modbus 寄存器中 16 位字段中的最低有效位或最右边的位。如果使用此样式表示法,您可能会看到 40001:0 到 40001:15。如何读取寄存器中的各个位?...每个 Modbus 设备的文档往往略有不同。但是,如果您的设备将多个位打包到一个保持寄存器中,文档将记录在同一寄存器编号或地址中找到的最多 16 个不同项目。...您可能会找到对位 1 到位 16 的引用,在这种情况下,只需从数字中减一即可参考下表。您无法从保持寄存器中只读取一位。没有办法做到这一点 - Modbus 协议根本不提供该功能。
如果从机发送的功能码的最高位为1(比如功能码大与此同时127),则表明从机没有响应操作或发送出错。 数据区:数据区是根据不同的功能码而不同。...代码 含义 操作 03 读取数据 读取当前寄存器内一个或多个二进制值 06 重置单一寄存器 把设置的二进制值写入单一寄存器 数据区:数据区包含需要从机执行什么动作或由从机采集的返送信息。...例如,功能码告诉从机读取寄存器的值,则数据区必需包含要读取寄存器的起始地址及读取长度。对于不同的从机,地址和数据信息都不相同。 错误校验码:主机或从机可用校验码进行判别接收信息是否出错。...3.功能码03,读取点和返回值: 仪表采用Modbus RTU通讯规约,利用通讯命令,可以进行读取点(“保持寄存器”) 或返回值(“输入寄存器” )的操作。...保持和输入寄存器都是16位(2字节)值,并且高位在前。这样用于仪表的读取点和返回值都是2字节。一次最多可读取寄存器数是60。由于一些可编程控制器不用功能码03,所以功能码03被用作读取点和返回值。
不同的设备制造商可能会提供不同的方法来设置这些地址,例如通过拨码开关、软件界面或者直接通过Modbus命令。1.3.1.3通信过程当主机向从机发送命令时,主机会在消息的开始部分包含从机的地址。...03 (0x03): 读保持寄存器(Read Holding Registers)- 用于读取一组保持寄存器中的二进制内容。...本文仅列举几个常见的功能码,以及与之对应的数据部分的结构和作用:1.3.3.1 读取保持寄存器 (功能码03)主机发送数据部分:主机发送功能码03的数据,表示要读取从0x0032开始3个寄存器的内容。...从机回复的数据部分:从机发送功能码03的数据,表示读取到的数据总共6个字节,分别为0x00、0x01、0x00、0x02、0x00、0x03,即读取到的3个寄存器的数据为0x0001、0x0002...计算:对每一个字节,从最高位到最低位,将其与CRC寄存器当前的值进行异或运算。如果结果的最高位为1,则将寄存器的值左移一位并与0x8005进行异或运算;如果最高位为0,则只需左移一位。
版本,使用了2年还是很稳定的. 3.0.0有些小BUG ModBus通讯协议 方法名 作用 所需参数 返回值 对应功能码 ReadCoils 读取DO的状态 从站地址(8位) byte slaveAddress...ReadHoldingRegisters 读取AO的值 从站地址(8位) byte slaveAddress 起始地址(16位) ushort startAddress 读取数量(16...位) ushort numberOfPoints ushort[] 03 ReadInputRegisters 读取AI的值 从站地址(8 位) byte slaveAddress 起始地址(16...bool[] data 无返回值 15 WriteMultipleRegisters 写多个保持寄存器 从站地址(8位) byte slaveAddress 起始地址(16位) ushort...startAddress, 寄存器值(16位整型数组) ushort[] data 无返回值 16 ReadWriteMultipleRegisters 读写多个保持寄存器 从站地址(8位)
领取专属 10元无门槛券
手把手带您无忧上云