当前位置: 首页 > news >正文

springboot整合modbus4J(二)

springboot整合modbus4J(二)

  1. maven依赖
<dependency><groupId>com.infiniteautomation</groupId><artifactId>modbus4j</artifactId><version>3.1.0</version>
</dependency>
<dependency><groupId>net.wimpi</groupId><artifactId>jamod</artifactId><version>1.2</version>
</dependency>
  1. 代码
import com.serotonin.modbus4j.ModbusFactory;
import com.serotonin.modbus4j.ModbusMaster;
import com.serotonin.modbus4j.code.DataType;
import com.serotonin.modbus4j.exception.ErrorResponseException;
import com.serotonin.modbus4j.exception.ModbusInitException;
import com.serotonin.modbus4j.exception.ModbusTransportException;
import com.serotonin.modbus4j.ip.IpParameters;
import com.serotonin.modbus4j.locator.BaseLocator;
import com.serotonin.modbus4j.msg.*;
import net.wimpi.modbus.io.ModbusTCPTransaction;
import net.wimpi.modbus.msg.ReadMultipleRegistersRequest;
import net.wimpi.modbus.msg.ReadMultipleRegistersResponse;
import net.wimpi.modbus.net.TCPMasterConnection;
import net.wimpi.modbus.procimg.Register;
import org.springframework.beans.factory.config.YamlPropertiesFactoryBean;
import org.springframework.core.io.ClassPathResource;
import org.springframework.core.io.Resource;import java.net.InetAddress;
import java.util.Properties;/*** @Author: Administrator* @Date: 2023/8/24* @Description:*/
public class Modbus4jWriteUtils {static String host = "192.168.0.5";static int port = 4001;/*** 工厂。*/static ModbusFactory modbusFactory;static {if (modbusFactory == null) {modbusFactory = new ModbusFactory();}}/*** 获取tcpMaster** @return* @throws ModbusInitException*/public static ModbusMaster getMaster() throws ModbusInitException {IpParameters params = new IpParameters();//params.setHost((String)getCommonYml("system.modbus.client.host"));//params.setPort((Integer)getCommonYml("system.modbus.client.port"));params.setHost("127.0.0.1");params.setPort(4001);ModbusMaster tcpMaster = modbusFactory.createTcpMaster(params, false);tcpMaster.init();return tcpMaster;}/*** 写 [01 Coil Status(0x)]写一个 function ID = 5** @param slaveId*            slave的ID* @param writeOffset*            位置* @param writeValue*            值* @return 是否写入成功* @throws ModbusTransportException* @throws ModbusInitException*/public static boolean writeCoil(int slaveId, int writeOffset, boolean writeValue)throws ModbusTransportException, ModbusInitException {// 获取masterModbusMaster tcpMaster = getMaster();// 创建请求WriteCoilRequest request = new WriteCoilRequest(slaveId, writeOffset, writeValue);// 发送请求并获取响应对象WriteCoilResponse response = (WriteCoilResponse) tcpMaster.send(request);if (response.isException()) {return false;} else {return true;}}/*** 写[01 Coil Status(0x)] 写多个 function ID = 15** @param slaveId*            slaveId* @param startOffset*            开始位置* @param bdata*            写入的数据* @return 是否写入成功* @throws ModbusTransportException* @throws ModbusInitException*/public static boolean writeCoils(int slaveId, int startOffset, boolean[] bdata)throws ModbusTransportException, ModbusInitException {// 获取masterModbusMaster tcpMaster = getMaster();// 创建请求WriteCoilsRequest request = new WriteCoilsRequest(slaveId, startOffset, bdata);// 发送请求并获取响应对象WriteCoilsResponse response = (WriteCoilsResponse) tcpMaster.send(request);if (response.isException()) {return false;} else {return true;}}/**** 写[03 Holding Register(4x)] 写一个 function ID = 6** @param slaveId* @param writeOffset* @param writeValue* @return* @throws ModbusTransportException* @throws ModbusInitException*/public static boolean writeRegister(int slaveId, int writeOffset, int writeValue)throws ModbusTransportException, ModbusInitException {// 获取masterModbusMaster tcpMaster = getMaster();// 创建请求对象WriteRegisterRequest request = new WriteRegisterRequest(slaveId, writeOffset, writeValue);WriteRegisterResponse response = null;try {response = (WriteRegisterResponse) tcpMaster.send(request);if (response.isException()) {System.out.println(response.getExceptionMessage());return false;}} catch (Exception e) {e.getMessage();System.err.println(e.getMessage());}return true;}/**** 写入[03 Holding Register(4x)]写多个 function ID=16** @param slaveId*            modbus的slaveID* @param startOffset*            起始位置偏移量值* @param sdata*            写入的数据* @return 返回是否写入成功* @throws ModbusTransportException* @throws ModbusInitException*/public static boolean writeRegisters(int slaveId, int startOffset, short[] sdata)throws ModbusTransportException, ModbusInitException {// 获取masterModbusMaster tcpMaster = getMaster();// 创建请求对象WriteRegistersRequest request = new WriteRegistersRequest(slaveId, startOffset, sdata);// 发送请求并获取响应对象ModbusResponse response = tcpMaster.send(request);if (response.isException()) {System.out.println(response.getExceptionMessage());return false;} else {return true;}}/*** 写入数字类型的模拟量(如:写入Float类型的模拟量、Double类型模拟量、整数类型Short、Integer、Long)** @param slaveId* @param offset* @param value*            写入值,Number的子类,例如写入Float浮点类型,Double双精度类型,以及整型short,int,long* @param registerCount*            ,com.serotonin.modbus4j.code.DataType* @throws ModbusTransportException* @throws ErrorResponseException* @throws ModbusInitException*/public static void writeHoldingRegister(int slaveId, int offset, Number value, int dataType)throws ModbusTransportException, ErrorResponseException, ModbusInitException {// 获取masterModbusMaster tcpMaster = getMaster();// 类型BaseLocator<Number> locator = BaseLocator.holdingRegister(slaveId, offset, dataType);tcpMaster.setValue(locator, value);}/*** 获取配置文件参数** @param key*/public static Object getCommonYml(Object key){Resource resource = new ClassPathResource("application.yml");Properties properties = null;try {YamlPropertiesFactoryBean yamlFactory = new YamlPropertiesFactoryBean();yamlFactory.setResources(resource);properties = yamlFactory.getObject();} catch (Exception e) {e.printStackTrace();return null;}return properties.get(key);}/*** 读保持寄存器数据  0x03* @param slaveId* @param offset* @param dataType* @return* @throws ModbusInitException* @throws ModbusTransportException* @throws ErrorResponseException*/public static Number holdingRegister(int slaveId, int offset, int dataType) throws ModbusInitException, ModbusTransportException, ErrorResponseException {BaseLocator<Number> holdingRegister = BaseLocator.holdingRegister(slaveId, offset, dataType);Number value = getMaster().getValue(holdingRegister);return value;}public static void main(String[] args) {try {// Modbus TCP connection settingsInetAddress ipAddress = InetAddress.getByName("127.0.0.1");int port = 4001; // Modbus default port is 502TCPMasterConnection connection = new TCPMasterConnection(ipAddress);connection.setPort(port);connection.connect();// Create a Modbus request for batch reading holding registersReadMultipleRegistersRequest request = new ReadMultipleRegistersRequest(0, 2);request.setUnitID(1); // Set the Modbus unit ID// Prepare the transactionModbusTCPTransaction transaction = new ModbusTCPTransaction(connection);transaction.setRequest(request);// Execute the transactiontransaction.execute();// Get the responseReadMultipleRegistersResponse response = (ReadMultipleRegistersResponse) transaction.getResponse();if (response != null) {Register[] registers = response.getRegisters();for (Register value : registers) {System.out.println("value:" + value.getValue());}} else {System.out.println("Response is null.");}// Close the connectionconnection.close();} catch (Exception e) {e.printStackTrace();}}public static void main1(String[] args) throws ModbusInitException, ModbusTransportException, ErrorResponseException {//try {//@formatter:off// 测试01
//			boolean t01 = writeCoil(1, 0, true);
//			System.out.println("T01:" + t01);
//
//			// 测试02
//			boolean t02 = writeCoils(1, 0, new boolean[] { true, false, true });
//			System.out.println("T02:" + t02);// 测试03short v = -2;boolean t03 = writeRegister(1, 2,  100);System.out.println("T03:" + t03);Number number = holdingRegister(1,2,DataType.TWO_BYTE_INT_SIGNED);System.out.println(number);
//			// 测试04
//			boolean t04 = writeRegisters(1, 0, new short[] { -3, 3, 9 });
//			System.out.println("t04:" + t04);
//			//写模拟量//writeHoldingRegister(1,0, 10.1f, DataType.FOUR_BYTE_FLOAT);//			//@formatter:on
//			writeRegister(1, 4, (short)298);/* } catch (Exception e) {e.printStackTrace();}*/}
}
http://www.lryc.cn/news/143829.html

相关文章:

  • ROS2之topic
  • C语言数值表示——进制、数值存储方式
  • linux————keepalived+LVS(DR模式)
  • 8月28日,每日信息差
  • vue-element-admin最新版4.4实现多个url路由匹配到一个路径时,左侧菜单保持高亮状态
  • Android自定义view实现横向滚动弹幕
  • 学习ts(十二)Proxy与Reflect
  • 性能优化之分库分表
  • 每日一学——STP、VRRP 、BFD、POE
  • Spring MVC 一 :从MVC Servlet开始
  • Ansible学习笔记(二)
  • Web安全测试(一):HTTP请求详解
  • Android工具条
  • 【项目实战典型案例】05.前后端分离的好处(发送调查问卷)
  • (Deep Learning)准确率和召回率的基础概念
  • 【业务功能篇85】微服务-springcloud-Nginx-反向代理-网关
  • 深度适配?华为鸿蒙OS智能座舱酷狗音乐车载版5.0,车内尽享K歌
  • 数字孪生体技术--学习笔记
  • proxysql使用心得
  • 【C++ 学习 ⑰】- 继承(下)
  • kafka学习笔记
  • 阀门状态监测和预测性维护的原理和实施步骤
  • 复习之web服务器--apache
  • [Unity] 单例设计模式, 可供继承的单例组件模板类
  • Linux知识点 -- Linux多线程(三)
  • android java 硬编码保存mp4 jni数据转换
  • 那些你不得不知道的HTML知识点
  • 如何复制主播的性格(此乃广告文)
  • 【ES6】—【新特性】—Symbol详情
  • openresty安装与网站发布