| | |
| | | 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; |
| | |
| | | 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; |
| | | |
| | |
| | | * @author: Andy |
| | | * @update-time: 2023/8/11 |
| | | */ |
| | | @Slf4j |
| | | @Component |
| | | public class ModbusUtil { |
| | | |
| | |
| | | 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); |
| | |
| | | } |
| | | |
| | | /** |
| | | * @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); |
| | |
| | | } |
| | | |
| | | /** |
| | | * @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; |
| | | } |
| | | |
| | | /** |
| | |
| | | * @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); |
| | |
| | | * @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); |
| | |
| | | * @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); |
| | |
| | | * @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); |
| | |
| | | * @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]; |