13693261870
2025-07-02 6708810c4de34dfb9513061432d656f91d56ee3a
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
package com.ruoyi.fuzhou.utils;
 
import com.ruoyi.fuzhou.domain.ReceiveModuleInfo;
import com.serotonin.modbus4j.*;
import com.serotonin.modbus4j.code.DataType;
import com.serotonin.modbus4j.exception.*;
import com.serotonin.modbus4j.ip.IpParameters;
import com.serotonin.modbus4j.locator.BaseLocator;
import com.serotonin.modbus4j.msg.*;
 
import java.util.ArrayList;
import java.util.List;
 
public class Modbus4jUtils {
    static ModbusFactory modbusFactory;
 
    static {
        modbusFactory = new ModbusFactory();
    }
 
    public static ModbusMaster getMaster(String ip, Integer port) throws ModbusInitException {
        IpParameters paras = new IpParameters();
        paras.setHost(ip);
        paras.setPort(port);
 
        ModbusMaster master = modbusFactory.createTcpMaster(paras, false);
        master.init();
 
        return master;
    }
 
    /**
     * 读取[01 coil status 0x]类型 开关数据
     */
    public static Boolean readCoilStatus(ModbusMaster master, int slaveId, int offset) throws ModbusTransportException, ErrorResponseException {
        BaseLocator<Boolean> loc = BaseLocator.coilStatus(slaveId, offset);
 
        return master.getValue(loc);
    }
 
    /**
     * 读取[02 input status 1x]类型 开关数据
     */
    public static Boolean reaInputStatus(ModbusMaster master, int slaveId, int offset) throws ModbusTransportException, ErrorResponseException {
        BaseLocator<Boolean> loc = BaseLocator.inputStatus(slaveId, offset);
 
        return master.getValue(loc);
    }
 
    /**
     * 读取[03 holding register 2x]模拟量数据
     */
    public static Number readHoldingRegister(ModbusMaster master, int slaveId, int offset, int dataType) throws ModbusTransportException, ErrorResponseException {
        BaseLocator<Number> loc = BaseLocator.holdingRegister(slaveId, offset, dataType);
 
        return master.getValue(loc);
    }
 
    /**
     * 读取[04 input register 3x]模拟量数据
     */
    public static Number readInputRegister(ModbusMaster master, int slaveId, int offset, int dataType) throws ModbusTransportException, ErrorResponseException {
        BaseLocator<Number> loc = BaseLocator.inputRegister(slaveId, offset, dataType);
 
        return master.getValue(loc);
    }
 
    /**
     * 批量读取
     */
    public static List<Integer> batchRead(ModbusMaster master, int count, int slaveId, int dataType) throws ModbusTransportException, ErrorResponseException {
        BatchRead<Integer> batch = new BatchRead<>();
 
        for (int i = 0; i < count; i++) {
            batch.addLocator(i, BaseLocator.holdingRegister(slaveId, i, dataType));
        }
        batch.setContiguousRequests(false);
 
        BatchResults<Integer> results = master.send(batch);
        List<Integer> list = new ArrayList();
        for (int i = 0; i < count; i++) {
            list.add(results.getIntValue(i));
        }
 
        return list;
    }
 
    /**
     * 写[01 coil status 0x]一个
     */
    public static Boolean writeCoil(ModbusMaster master, int slaveId, int offset, boolean value) throws ModbusTransportException, ErrorResponseException {
        WriteCoilRequest request = new WriteCoilRequest(slaveId, offset, value);
        WriteCoilResponse response = (WriteCoilResponse) master.send(request);
 
        return !response.isException();
    }
 
    /**
     * 写[01 coil status 0x]多个
     */
    public static Boolean writeCoils(ModbusMaster master, int slaveId, int startOffset, boolean[] values) throws ModbusTransportException, ErrorResponseException {
        WriteCoilsRequest request = new WriteCoilsRequest(slaveId, startOffset, values);
        WriteCoilsResponse response = (WriteCoilsResponse) master.send(request);
 
        return !response.isException();
    }
 
    /**
     * 写[03 holding register 4x]一个
     */
    public static Boolean writeRegister(ModbusMaster master, int slaveId, int offset, short value) throws ModbusTransportException, ErrorResponseException {
        WriteRegisterRequest request = new WriteRegisterRequest(slaveId, offset, value);
        WriteRegisterResponse response = (WriteRegisterResponse) master.send(request);
 
        return !response.isException();
    }
 
    /**
     * 写[03 holding register 4x]多个
     */
    public static Boolean writeRegisters(ModbusMaster master, int slaveId, int startOffset, short[] values) throws ModbusTransportException, ErrorResponseException {
        WriteRegistersRequest request = new WriteRegistersRequest(slaveId, startOffset, values);
        WriteRegistersResponse response = (WriteRegistersResponse) master.send(request);
 
        return !response.isException();
    }
 
    /**
     * 写入数字类型的模拟量
     */
    public static Boolean writeHoldingRegister(ModbusMaster master, int slaveId, int offset, Number value, int dataType) throws ModbusTransportException, ErrorResponseException {
        BaseLocator<Number> locator = BaseLocator.holdingRegister(slaveId, offset, dataType);
        master.setValue(locator, value);
 
        return true;
    }
 
    public static boolean getYdkfmStatus(ReceiveModuleInfo rmi) throws Exception {
        String ip = null == rmi.getIp() ? "localhost" : rmi.getIp();
        ModbusMaster master = getMaster(ip, rmi.getPort());
 
        Number val = readHoldingRegister(master, 1, 7, DataType.TWO_BYTE_INT_SIGNED);
 
        return val.intValue() > 1;
    }
 
    public static boolean ctrlYdkfm(ReceiveModuleInfo rmi, Boolean flag) throws Exception {
        String ip = null == rmi.getIp() ? "localhost" : rmi.getIp();
        ModbusMaster master = getMaster(ip, rmi.getPort());
 
        short val = (short) (flag ? 2 : 1);
        return writeRegister(master, 1, 7, val);
    }
}