jiazx0107@163.com
2023-08-22 5adce825013b49f0614db1746cffe43a7502de82
igds-protocol-modbus/src/main/java/com/ld/igds/protocol/modbus/ModbusUtil.java
@@ -1,8 +1,12 @@
package com.ld.igds.protocol.modbus;
import com.serotonin.modbus4j.BatchRead;
import com.serotonin.modbus4j.BatchResults;
import com.serotonin.modbus4j.ModbusMaster;
import com.serotonin.modbus4j.code.DataType;
import com.serotonin.modbus4j.exception.ModbusInitException;
import com.serotonin.modbus4j.exception.ModbusTransportException;
import com.serotonin.modbus4j.locator.BaseLocator;
import com.serotonin.modbus4j.msg.ReadCoilsRequest;
import com.serotonin.modbus4j.msg.ReadCoilsResponse;
import com.serotonin.modbus4j.msg.ReadDiscreteInputsRequest;
@@ -19,6 +23,7 @@
import com.serotonin.modbus4j.msg.WriteRegisterResponse;
import com.serotonin.modbus4j.msg.WriteRegistersRequest;
import com.serotonin.modbus4j.msg.WriteRegistersResponse;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
@@ -27,6 +32,7 @@
 * @author: Andy
 * @update-time: 2023/8/11
 */
@Slf4j
@Component
public class ModbusUtil {
@@ -37,7 +43,15 @@
    private ModbusConfig modbusConfig;
    public boolean[] readCoilStatus(String ip, int port, int offset, int numberOfRegister) throws ModbusTransportException {
    /**
     * 读线圈--01
     *
     * @param ip
     * @param port
     * @param offset
     * @param numberOfRegister
     */
    public boolean[] readStatus01(String ip, int port, int offset, int numberOfRegister) throws ModbusTransportException {
        ModbusMaster master = modbusConfig.getMaster(ip, port);
        ReadCoilsRequest request = new ReadCoilsRequest(slaveId, offset, numberOfRegister);
@@ -48,32 +62,26 @@
    }
    /**
     * @Description: 读取外围设备输入的开关量,相当于功能码:02H-读离散输入状态
     * @Description: 02H-读离散输入量
     * @Param: [ip, offset, numberOfRegister]
     * @return: boolean[]
     * @throws:
     * @Author: Ricardo.Liu
     * @Date: 2020/5/8
     */
    public boolean[] readInputStatus(String ip, int port, int offset, int numberOfRegister) throws ModbusTransportException {
    public boolean[] readStatus02(String ip, int port, int offset, int numberOfRegister) throws ModbusTransportException {
        ModbusMaster master = modbusConfig.getMaster(ip, port);
        ReadDiscreteInputsRequest request = new ReadDiscreteInputsRequest(slaveId, offset, numberOfRegister);
        ReadDiscreteInputsResponse response = (ReadDiscreteInputsResponse) master.send(request);
        boolean[] booleans = response.getBooleanData();
        return valueRegroup(numberOfRegister, booleans);
    }
    /**
     * @Description: 读取保持寄存器数据,相当于功能码:03H-读保持寄存器
     * @Description: 03H-读保持寄存器
     * @Param: [ip, offset, numberOfRegister]
     * @return: short[]
     * @throws:
     * @Author: Ricardo.Liu
     * @Date: 2020/5/8
     */
    public short[] readHoldingRegister(String ip, int port, int offset, int numberOfRegister) throws ModbusTransportException {
    public short[] readStatus03(String ip, int port, int offset, int numberOfRegister) throws ModbusTransportException {
        ModbusMaster master = modbusConfig.getMaster(ip, port);
        ReadHoldingRegistersRequest request = new ReadHoldingRegistersRequest(slaveId, offset, numberOfRegister);
@@ -82,19 +90,43 @@
    }
    /**
     * @Description: 读取外围设备输入的数据,相当于功能码:04H-读输入寄存器
     * @Description: 04H-读输入寄存器
     * @Param: [ip, offset, numberOfRegister]
     * @return: short[]
     * @throws:
     * @Author: Ricardo.Liu
     * @Date: 2020/5/8
     */
    public short[] readInputRegisters(String ip, int port, int offset, int numberOfRegister) throws ModbusTransportException {
    public short[] readStatus04(String ip, int port, int offset, int numberOfRegister) throws ModbusTransportException {
        ModbusMaster master = modbusConfig.getMaster(ip, port);
        ReadInputRegistersRequest request = new ReadInputRegistersRequest(slaveId, offset, numberOfRegister);
        ReadInputRegistersResponse response = (ReadInputRegistersResponse) master.send(request);
        return response.getShortData();
    }
    public BatchResults<Integer> readBatch(String ip, int port) throws Exception {
        ModbusMaster master = modbusConfig.getMaster(ip, port);
        if (null == master) return null;
        return readBatch(master);
    }
    /**
     * 批量读取多个
     *
     * @param master
     * @throws ModbusTransportException
     */
    public BatchResults<Integer> readBatch(ModbusMaster master) throws Exception {
        BatchRead<Integer> batch = new BatchRead<>();
        batch.addLocator(0, BaseLocator.holdingRegister(1, 1, DataType.TWO_BYTE_INT_SIGNED));
        batch.addLocator(1, BaseLocator.inputStatus(1, 0));
        batch.setContiguousRequests(true);
        BatchResults<Integer> results = master.send(batch);
        log.info("batchRead:" + results.getValue(0));
        log.info("batchRead:" + results.getValue(1));
        return results;
    }
    /**
@@ -102,10 +134,8 @@
     * @Param: [ip, writeOffset, writeValue]
     * @return: boolean
     * @throws:
     * @Author: Ricardo.Liu
     * @Date: 2020/5/8
     */
    public boolean writeCoil(String ip, int port, int writeOffset, boolean writeValue) throws ModbusTransportException {
    public boolean writeValue05(String ip, int port, int writeOffset, boolean writeValue) throws ModbusTransportException {
        ModbusMaster tcpMaster = modbusConfig.getMaster(ip, port);
        WriteCoilRequest request = new WriteCoilRequest(slaveId, writeOffset, writeValue);
@@ -118,10 +148,8 @@
     * @Param: [ip, startOffset, data]
     * @return: boolean
     * @throws:
     * @Author: Ricardo.Liu
     * @Date: 2020/5/8
     */
    public boolean writeCoils(String ip, int port, int startOffset, boolean[] data) throws ModbusTransportException {
    public boolean writeValues15(String ip, int port, int startOffset, boolean[] data) throws ModbusTransportException {
        ModbusMaster tcpMaster = modbusConfig.getMaster(ip, port);
        WriteCoilsRequest request = new WriteCoilsRequest(slaveId, startOffset, data);
@@ -135,10 +163,8 @@
     * @Param: [ip, writeOffset, writeValue]
     * @return: boolean
     * @throws:
     * @Author: Ricardo.Liu
     * @Date: 2020/5/8
     */
    public boolean writeHoldingRegister(String ip, int port,int writeOffset, short writeValue) throws ModbusTransportException, ModbusInitException {
    public boolean writeValue06(String ip, int port, int writeOffset, short writeValue) throws ModbusTransportException, ModbusInitException {
        ModbusMaster tcpMaster = modbusConfig.getMaster(ip, port);
        WriteRegisterRequest request = new WriteRegisterRequest(slaveId, writeOffset, writeValue);
@@ -152,10 +178,8 @@
     * @Param: [ip, startOffset, data]
     * @return: boolean
     * @throws:
     * @Author: Ricardo.Liu
     * @Date: 2020/5/8
     */
    public boolean writeHoldingRegisters(String ip,int port, int startOffset, short[] data) throws ModbusTransportException, ModbusInitException {
    public boolean writeValues16(String ip, int port, int startOffset, short[] data) throws ModbusTransportException, ModbusInitException {
        ModbusMaster tcpMaster = modbusConfig.getMaster(ip, port);
        WriteRegistersRequest request = new WriteRegistersRequest(slaveId, startOffset, data);
@@ -168,8 +192,6 @@
     * @Param: [numberOfBits, values]
     * @return: boolean[]
     * @throws:
     * @Author: Ricardo.Liu
     * @Date: 2020/5/8
     */
    private boolean[] valueRegroup(int numberOfBits, boolean[] values) {
        boolean[] bs = new boolean[numberOfBits];