流量网站怎么做的免费精品网站模板
2026/4/18 1:55:08 网站建设 项目流程
流量网站怎么做的,免费精品网站模板,网站建设什么软件,多个网站备案springboot整合modbus4j实现tcp通讯 前言 本文基于springboot和modbus4j进行简单封装#xff0c;达到开箱即用的目的#xff0c;目前本方案仅实现了tcp通讯。代码会放在最后#xff0c;按照使用方法操作后就可以直接使用 介绍 在使用本方案之前#xff0c;有必要对modb…springboot整合modbus4j实现tcp通讯前言本文基于springboot和modbus4j进行简单封装达到开箱即用的目的目前本方案仅实现了tcp通讯。代码会放在最后按照使用方法操作后就可以直接使用介绍在使用本方案之前有必要对modbus有一个简单的认知其中包含modbus协议Modbus通讯协议简介Modbus是一种串行通信协议是Modicon公司现在的施耐德电气Schneider Electric于1979年为使用可编程逻辑控制器PLC通信而发表。Modbus已经成为工业领域通信协议的业界标准De facto并且现在是工业电子设备之间常用的连接方式。 [1]Modbus比其他通信协议使用的更广泛的主要原因有公开发表并且无版权要求易于部署和维护对供应商来说修改移动本地的比特或字节没有很多限制Modbus允许多个 (大约240个) 设备连接在同一个网络上进行通信举个例子一个测量温度和湿度的装置并且将结果发送给计算机。在数据采集与监视控制系统SCADA中Modbus通常用来连接监控计算机和远程终端控制系统RTU。Modbus功能码部分代码名称寄存器地址范围位/字操作操作数量01读线圈状态Read Coils00001 ~ 09999位操作单个或多个02读离散输入状态Read Discrete Inputs10001 ~ 19999位操作单个或多个03读保存寄存器Read Holding Registers40001 ~ 49999字操作单个或多个04读输入寄存器Read Input Registers30001 ~ 39999字操作单个或多个05写单个线圈Write Single Coil00001 ~ 09999字操作单个06写单个保存寄存器Write Single Register40001 ~ 49999字操作单个Modbus仿真软件**modbus poll**modbus主机master仿真器用于测试和调试modbus从设备。该软件支持modbus rtu、ASCII、TCP/IP。用来帮助开发人员测试modbus从设备或者其它modbus协议的测试和仿真。它支持多文档接口即可以同时监视多个从设备/数据域。每个窗口简单地设定从设备ID功能地址大小和轮询间隔。你可以从任意一个窗口读写寄存器和线圈。如果你想改变一个单独的寄存器简单地双击这个值即可。或者你可以改变多个寄存器/线圈值。提供数据的多种格式方式比如浮点、双精度、长整型可以字节序列交换。**modbus slave**modbus从设备slave仿真器可以仿真32个从设备/地址域。每个接口都提供了对EXCEL报表的OLE自动化支持。主要用来模拟Modbus从站设备接收主站的命令包回送数据包。帮助Modbus通讯设备开发人员进行Modbus通讯协议的模拟和测试用于模拟、测试、调试Modbus通讯设备。可以32个窗口中模拟多达32个Modbus子设备。与Modbus Poll的用户界面相同支持功能01、02、03、04、05、06、15、16、22和23监视串口数据。这两款软件请自行下载使用方式本方案基于springboot可以在springboot中引入该项目后简单操作maven安装到本地modbus4j install modbus-spring-boot-autoconfigure install modbus-spring-boot-starter直接使用高效方便~引入jar包dependency groupIdcom.dashuai/groupId artifactIdmodbus-spring-boot-starter/artifactId version0.0.1-SNAPSHOT/version /dependency编写配置文件配置根据实际情况下编写支持一下所有的配置至于是服务器做主还是做从根据实际情况而定modbus: tcp: master: # 默认的主设备地址和端口 default-ip: 192.168.11.180 default-port: 502 # 主设备的地址和端口集合按照顺序一一对应 ips: - 192.168.11.180 ports: - 1502 slave: # 从设备端口 port: 1502 encapsulated: false # 从设备详细配置 process-images: # 从设备号可创建多个 - slave-id: 1 # 线圈 coils: # 地址位和默认值 - offset: 0 value: true # 离散输入状态 inputs: - offset: 100 value: true # 保持寄存器 holding-register: # 起始地址位和寄存器个数 start-offset: 200 count: 100 # 输入寄存器 input-register: start-offset: 300 count: 100 - slave-id: 2 coils: - offset: 0 value: true inputs: - offset: 100 value: true holding-register: start-offset: 200 count: 100 input-register: start-offset: 300 count: 100注入ModbusTCPMaster对象Autowired private ModbusTCPMaster modbusTCPMaster;支持的方法读取01/02/03/04功能码的数据按照数据类型目标类型、返回类型直接读取批量读取写入数据Master测试案例由于是测试Modbus TCP 的通讯所以我准备了两台机器我本地ip是192.168.11.180测试机器ip为192.168.11.194Master可以理解为客户端Slave可以理解为服务端客户端向服务器请求读取数据我在我本地和测试机器中分别启动一个modbus slave在我本地使用当前方案进行读取读取线圈状态在本地中开启一个modbus slave连接方式为TCP/IP端口为502选择Setup-Slave Definition开启一个从设备从设备为1功能码为01地址位从10开始一共2个设置10号地址位的值为0false11号地址位的值为1true使用以上同样的方式在192.168.11.194上设置一个从设备端口为1502从设备号为110号地址位的值为1true11号地址位的值为0flase测试程序配置文件默认的master为读取我本地的数据modbus: tcp: master: # 默认的主设备地址和端口 default-ip: 192.168.11.180 default-port: 502 # 主设备的地址和端口集合按照顺序一一对应 ips: - 192.168.11.194 ports: - 1502注入ModbusTCPMaster对象Autowired private ModbusTCPMaster modbusTCPMaster;测试方法Test public void readCoilStatus() throws ErrorResponseException, ModbusTransportException, ModbusInitException { // 使用默认的master进行读取 Boolean value modbusTCPMaster.readCoilStatus(1, 10); System.out.println(default,slaveId:1,address:10,value value); value modbusTCPMaster.readCoilStatus(1, 11); System.out.println(default,slaveId:1,address:11,value value); // 指定ip进行读取默认的master也可以进行指定ip读取 value modbusTCPMaster.readCoilStatus(192.168.11.194, 1502, 1, 10); System.out.println(ip:192.168.11.194,port:1502,slaveId:2,address:10,value value); value modbusTCPMaster.readCoilStatus(192.168.11.194, 1502, 1, 11); System.out.println(ip:192.168.11.194,port:1502,slaveId:2,address:11,value value); }测试结果读取离散输入状态在本地新建一个slaveFile-New选择Setup-Slave Definition将slaveId设置为2选择02功能码地址位从100开始初始化2个寄存器100地址位的值设置为1101地址位的值设置为0用同样的方式在192.168.11.194那台测试服务器上配置地址位一样但是值都配置为1进行测试读取测试方法Test public void readInputStatus() throws ErrorResponseException, ModbusTransportException, ModbusInitException { // 使用默认的master进行读取 Boolean value modbusTCPMaster.readInputStatus(2, 100); System.out.println(default,slaveId:2,address:100,value value); value modbusTCPMaster.readInputStatus(2, 101); System.out.println(default,slaveId:2,address:101,value value); // 指定ip进行读取 value modbusTCPMaster.readInputStatus(192.168.11.194, 1502, 2, 100); System.out.println(ip:192.168.11.194,port:1502,slaveId:2,address:100,value value); value modbusTCPMaster.readInputStatus(192.168.11.194, 1502, 2, 101); System.out.println(ip:192.168.11.194,port:1502,slaveId:2,address:101,value value); }测试结果读取保存寄存器读取整数在本地新建一个slaveFile-New选择Setup-Slave Definition将slaveId设置为3选择03功能码地址位从200开始初始化2个寄存器200地址位的值设置为20201地址位的值设置为21用同样的方式在192.168.11.194那台测试服务器上配置地址位一样值分别设置成30和31测试方法Test public void read03Short() throws ErrorResponseException, ModbusTransportException, ModbusInitException { Short value modbusTCPMaster.read03Short(3, 200); System.out.println(default,slaveId:3,address:200,value value); value modbusTCPMaster.read03Short(3, 201); System.out.println(default,slaveId:3,address:201,value value); value modbusTCPMaster.read03Short(192.168.11.194, 1502, 3, 200); System.out.println(ip:192.168.11.194,port:1502,slaveId:3,address:200,value value); value modbusTCPMaster.read03Short(192.168.11.194, 1502, 3, 201); System.out.println(ip:192.168.11.194,port:1502,slaveId:3,address:201,value value); }测试结果读取小数在本地继续新建一个slaveFile-New选择Setup-Slave Definition将slaveId设置为4选择03功能码地址位从300开始初始化4个寄存器按住CtrlA全选点击鼠标右键选择Format选择Float AB CD双击数值区域将300地址位的值设置成33.33302地址位的数值设置成44.44在192.168.11.194测试服务器上做同样的操作数值分别设置成55.55和66.66测试代码Test public void read03FloatABCD() throws ErrorResponseException, ModbusTransportException, ModbusInitException { Float value modbusTCPMaster.read03FloatABCD(4, 300); System.out.println(default,slaveId:4,address:300,value value); value modbusTCPMaster.read03FloatABCD(4, 302); System.out.println(default,slaveId:4,address:302,value value); value modbusTCPMaster.read03FloatABCD(192.168.11.194, 1502, 4, 300); System.out.println(ip:192.168.11.194,port:1502,slaveId:4,address:300,value value); value modbusTCPMaster.read03FloatABCD(192.168.11.194, 1502, 4, 302); System.out.println(ip:192.168.11.194,port:1502,slaveId:4,address:302,value value); }测试结果批量读取在本地新建一个slaveFile-New选择Setup-Slave Definition将slaveId设置为5选择03功能码地址位从400开始初始化5个寄存器400地址位的值设置为0后续5个地址的数值依次加1分别为0、1、2、3、4用同样的方式在192.168.11.194那台测试服务器上配置地址位一样值分别设置成0、11.11、22.22、33.33、44.44、55.55批量读取支持两种方式进行本地slave192.168.11.194测试机器上slave配置测试方法1Test public void testBatchRead() throws ModbusTransportException, ErrorResponseException { final ArrayListBatchReadParam batchReadParamList new ArrayList(); for (int i 0; i 5; i) { final BatchReadParam batchReadParam new BatchReadParam(5, 400 i); batchReadParamList.add(batchReadParam); } final MapInteger, Short resultMap modbusTCPMaster.batchRead(batchReadParamList, DataType.TWO_BYTE_INT_SIGNED, Short.class); System.out.println(default,slaveId:5,address:400~404,resultMap resultMap); }测试结果1测试方法2Test public void testBatchRead2() throws ModbusTransportException, ErrorResponseException, ModbusInitException { ListInteger floatOffsets Arrays.asList(400, 402, 404, 406, 408); final MapInteger, Float resultMap modbusTCPMaster.batchRead(192.168.11.194, 1502,5, floatOffsets, DataType.FOUR_BYTE_FLOAT, Float.class); System.out.println(ip:192.168.11.194,port:1502,slaveId:5,address:400~408,resultMap resultMap); }测试结果2写入线圈状态在本地新建一个slaveFile-New选择Setup-Slave Definition将slaveId设置为6选择01功能码地址位从600开始初始化2个寄存器用同样的方式在192.168.11.194那台测试服务器上配置初始化的地址位一样。我们分别向本地的600地址位写入true和194上的600以及601批量写入true本地配置192.168.11.194测试机器上slave配置测试代码1Test public void testWriteCoil() throws ModbusTransportException { final boolean result modbusTCPMaster.writeCoil(6, 600, true); System.out.println(default,slaveId:6,address:600,result result); }测试结果1测试代码2Test public void testBatchWriteCoil() throws ModbusTransportException { final boolean[] writeValueArr {true, true}; final boolean result modbusTCPMaster.batchWriteCoil(192.168.11.194, 1502, 6, 600, writeValueArr); System.out.println(ip:192.168.11.194,port:1502,slaveId:6,address:600~601,result result); }测试结果2写入保存寄存器在本地新建一个slaveFile-New选择Setup-Slave Definition将slaveId设置为7选择03功能码地址位从700开始初始化4个寄存器我们向本地的700地址位写入11.11本地配置测试代码Test public void testWriteHoldingRegister() throws ModbusTransportException, ErrorResponseException { modbusTCPMaster.writeHoldingRegister(7, 700, 11.11, DataType.FOUR_BYTE_FLOAT); }测试结果其实还有一些方法这里就不进行逐个测试了有兴趣的可以自己搭建测试一下~~~Slave测试案例使用我本地的环境进行测试测试在我本地启动一个slave并初始化对应的地址位和数值然后使用modbus poll软件进行连接和读取测试程序配置文件主要是slave部分modbus: tcp: master: # 默认的主设备地址和端口 default-ip: 192.168.11.180 default-port: 502 # 主设备的地址和端口集合按照顺序一一对应 ips: - 192.168.11.194 ports: - 1502 slave: # 从设备端口 port: 2502 # 从设备详细配置 process-images: # 从设备号可创建多个 - slave-id: 1 # 线圈 coils: # 地址位和默认值 - offset: 1 value: true # 离散输入状态 inputs: - offset: 100 value: true # 保持寄存器 holding-register: # 起始地址位和寄存器个数 start-offset: 200 count: 100 # 输入寄存器 input-register: start-offset: 300 count: 100 - slave-id: 2 coils: - offset: 500 value: true**解释**我在我本地启动了2个从设备从设备号分别为1和2在从设备1中我启动了线圈状态地址位为1默认数值为true启动了离散输入状态地址位为100默认数值为true启动了保存寄存器起始地址位为200一共初始化100个地址位启动了输入寄存器起始位置为300也是初始化100个地址位在从设备2中我只启动了线圈状态地址位为500默认数值为true测试代码Test public void testModbusSlave() { System.out.println(我启动了slave~~~~~); System.out.println(modbusTCPSlave modbusTCPSlave); try { Thread.sleep(600000); } catch (InterruptedException e) { e.printStackTrace(); } }测试结果可以看到全部都能够正常连接并读取写入的话就不测试了代码地址到此结束附上代码请动动小手给个star谢谢~~~modbus4jhttps://github.com/MangoAutomation/modbus4j.gitmodbus-spring-boot-autoconfigurehttps://gitee.com/qiu_min/modbus-spring-boot-autoconfigure.gitmodbus-spring-boot-starterhttps://gitee.com/qiu_min/modbus-spring-boot-starter.git

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询