package com.rib.modbus;
import com.serotonin.modbus4j.BatchRead;
import com.serotonin.modbus4j.BatchResults;
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;
public class Modbus4jUtil {
/**
* 获取master
*
* @return
* @throws ModbusInitException
*/
public static ModbusMaster getMaster() throws ModbusInitException {
IpParameters params = new IpParameters();
params.setHost("192.168.30.10");
params.setPort(502);
ModbusMaster master = new ModbusFactory().createTcpMaster(params, true);
master.init();
return master;
}
/**
* 读取[01 Coil Status 0x]类型 开关数据
*
* @param slaveId
* slaveId
* @param offset
* 位置
* @return 读取值
* @throws ModbusTransportException
* 异常
* @throws ErrorResponseException
* 异常
* @throws ModbusInitException
* 异常
*/
public static Boolean readCoilStatus(int slaveId, int offset)
throws ModbusTransportException, ErrorResponseException, ModbusInitException {
// 01 Coil Status
BaseLocator<Boolean> loc = BaseLocator.coilStatus(slaveId, offset);
ModbusMaster modbusMaster = getMaster();
Boolean value = modbusMaster.getValue(loc);
return value;
}
/**
* 读取[02 Input Status 1x]类型 开关数据
*
* @param slaveId
* @param offset
* @return
* @throws ModbusTransportException
* @throws ErrorResponseException
* @throws ModbusInitException
*/
public static Boolean readInputStatus(int slaveId, int offset)
throws ModbusTransportException, ErrorResponseException, ModbusInitException {
// 02 Input Status
BaseLocator<Boolean> loc = BaseLocator.inputStatus(slaveId, offset);
Boolean value = getMaster().getValue(loc);
return value;
}
/**
* 读取[03 Holding Register类型 2x]模拟量数据
*
* @param slaveId
* slave Id
* @param offset
* 位置
* @param dataType
* 数据类型,来自com.serotonin.modbus4j.code.DataType
* @return
* @throws ModbusTransportException
* 异常
* @throws ErrorResponseException
* 异常
* @throws ModbusInitException
* 异常
*/
public static Number readHoldingRegister(int slaveId, int offset, int dataType)
throws ModbusTransportException, ErrorResponseException, ModbusInitException {
// 03 Holding Register类型数据读取
BaseLocator<Number> loc = BaseLocator.holdingRegister(slaveId, offset, dataType);
Number value = getMaster().getValue(loc);
return value;
}
/**
* 读取[04 Input Registers 3x]类型 模拟量数据
*
* @param slaveId
* slaveId
* @param offset
* 位置
* @param dataType
* 数据类型,来自com.serotonin.modbus4j.code.DataType
* @return 返回结果
* @throws ModbusTransportException
* 异常
* @throws ErrorResponseException
* 异常
* @throws ModbusInitException
* 异常
*/
public static Number readInputRegisters(int slaveId, int offset, int dataType)
throws ModbusTransportException, ErrorResponseException, ModbusInitException {
// 04 Input Registers类型数据读取
BaseLocator<Number> loc = BaseLocator.inputRegister(slaveId, offset, dataType);
Number value = getMaster().getValue(loc);
return value;
}
/**
* 批量读取使用方法
*
* @throws ModbusTransportException
* @throws ErrorResponseException
* @throws ModbusInitException
*/
public static void batchRead() throws ModbusTransportException, ErrorResponseException, ModbusInitException {
BatchRead<Integer> batch = new BatchRead<Integer>();
batch.addLocator(0, BaseLocator.holdingRegister(1, 1, DataType.FOUR_BYTE_FLOAT));
batch.addLocator(1, BaseLocator.inputStatus(1, 0));
ModbusMaster master = getMaster();
batch.setContiguousRequests(false);
BatchResults<Integer> results = master.send(batch);
System.out.println(results.getValue(0));
System.out.println(results.getValue(1));
}
/**
* 测试
*
* @param args
*/
public static void main(String[] args) {
try {
// 01测试
// Boolean v011 = readCoilStatus(1, 0);
// Boolean v012 = readCoilStatus(1, 1);
// Boolean v013 = readCoilStatus(1, 6);
// System.out.println("v011:" + v011);
// System.out.println("v012:" + v012);
// System.out.println("v013:" + v013);
// // 02测试
// Boolean v021 = readInputStatus(1, 0);
// Boolean v022 = readInputStatus(1, 1);
// Boolean v023 = readInputStatus(1, 2);
// System.out.println("v021:" + v021);
// System.out.println("v022:" + v022);
// System.out.println("v023:" + v023);
//
// // 03测试
Number v031 = readHoldingRegister(1, 0, DataType.FOUR_BYTE_INT_UNSIGNED);// 注意,float
// Number v032 = readHoldingRegister(1, 3,
// DataType.FOUR_BYTE_FLOAT);// 同上
System.out.println("v031:" + v031);
// System.out.println("v032:" + v032);
Number v033 = readHoldingRegister(1, 1, DataType.FOUR_BYTE_INT_UNSIGNED);// 注意,float
System.out.println("v033:" + v033);
//
// // 04测试
// Number v041 = readInputRegisters(1, 1, DataType.FOUR_BYTE_FLOAT);//
// Number v042 = readInputRegisters(1, 3, DataType.FOUR_BYTE_FLOAT);//
// System.out.println("v041:" + v041);
// System.out.println("v042:" + v042);
// //批量读取
// batchRead();
} catch (Exception e) {
e.printStackTrace();
}
}
}
SUN先森-YM
- 粉丝: 2
- 资源: 12
最新资源
- 期末数据分析项目(23级人工智能).zip
- ._qvideo_newvideo_tips_00079
- Videoframe_20241102_005845_com.huawei.himovie.jpg
- Screenshot_20241106_002752_com.tencent.mtt.jpg
- ru.zdevs.zarchiver_289.com.apk
- 基于C++核心的轻量级嵌入式GUI设计源码
- 基于Java语言的spark算法演示程序设计源码
- 基于Java、HTML、CSS的2023年SSM专业课设计源码仓库
- 基于Java语言的struts2项目设计源码分析
- 基于Flask框架的全面广告管理系统设计源码
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈