Modbus初體驗(yàn)
package com.zz.modbus;
import com.intelligt.modbus.jlibmodbus.Modbus;
import com.intelligt.modbus.jlibmodbus.exception.ModbusIOException;
import com.intelligt.modbus.jlibmodbus.master.ModbusMaster;
import com.intelligt.modbus.jlibmodbus.master.ModbusMasterFactory;
import com.intelligt.modbus.jlibmodbus.tcp.TcpParameters;
import java.net.InetAddress;
import java.net.UnknownHostException;
/**
* @Projectname: modbusTest
* @Filename: ModusTest
* @Author: wyf
* @Data: 2022/12/7 13:56
* @Description: TODO
*/
public class ModbusTest {
public static void main(String[] args) throws UnknownHostException {
//設(shè)置主機(jī)參數(shù)
TcpParameters tcpParameters = new TcpParameters();
//設(shè)置Tcp的ip地址
InetAddress address = InetAddress.getByName("127.0.0.1");
//Tcp參數(shù)設(shè)置主機(jī)地址
tcpParameters.setHost(address);
//Tcp設(shè)置長(zhǎng)連接
tcpParameters.setKeepAlive(true);
//Tcp設(shè)置端口
tcpParameters.setPort(502);
//創(chuàng)建一個(gè)主機(jī)
ModbusMaster master = ModbusMasterFactory.createModbusMasterTCP(tcpParameters);
Modbus.setAutoIncrementTransactionId(true);
int slaveId = 1;
int offset = 0;
int quantity = 10;
try {
if (!master.isConnected()){
master.connect();
}
//04功能碼,讀取輸入寄存器
int[] registersValues = master.readInputRegisters(slaveId, offset, quantity);
//03功能碼,讀取保持寄存器
int[] readHoldingRegistersValues = master.readHoldingRegisters(slaveId, offset, quantity);
//01功能碼,讀取線圈
boolean[] coilsValues = master.readCoils(slaveId, offset, quantity);
//02功能碼,讀取離散輸入
boolean[] discreteInputsValues = master.readDiscreteInputs(slaveId, offset, quantity);
// 控制臺(tái)輸出
for (int value : registersValues) {
System.out.println("Address: " + offset++ + ", Value: " + value);
}
System.out.println("================================================");
for (int value : readHoldingRegistersValues) {
System.out.println("Address: " + offset++ + ", Value: " + value);
}
System.out.println("================================================");
for (boolean value : coilsValues){
System.out.println("Address: " + offset++ + ", Value: " + value);
}
System.out.println("================================================");
for (boolean value : discreteInputsValues){
System.out.println("Address: " + offset++ + ", Value: " + value);
}
} catch (Exception e) {
e.printStackTrace();
}finally {
try {
master.disconnect();
} catch (ModbusIOException e) {
e.printStackTrace();
}
}
}
}
04功能碼,讀取輸入寄存器,只讀
//04功能碼
//編寫請(qǐng)求
ModbusRequest inputRequest = ModbusRequestBuilder.getInstance().buildReadInputRegisters(slaveId, offset, quantity);
//發(fā)送請(qǐng)求
ReadInputRegistersResponse inputResponse = (ReadInputRegistersResponse) master.processRequest(inputRequest);
//獲取值
int[] registers01 = inputResponse.getHoldingRegisters().getRegisters();
for (int value : registers01){
System.out.println(value);
}
03功能碼,讀取保持寄存器,讀寫
//03功能碼,讀取保持寄存器
//編寫請(qǐng)求
ModbusRequest holdRequest = ModbusRequestBuilder.getInstance().buildReadHoldingRegisters(slaveId, offset, quantity);
//發(fā)送請(qǐng)求
ReadHoldingRegistersResponse holdResponse =(ReadHoldingRegistersResponse) master.processRequest(holdRequest);
//獲取值
int[] registers02 = holdResponse.getHoldingRegisters().getRange(2, 3);
for (int value : registers02){
System.out.println(value);
}
寫入寄存器
三個(gè)參數(shù)分別是:從機(jī)地址,寫入位置,寫入的值
ModbusRequest request = ModbusRequestBuilder.getInstance().buildWriteSingleRegister(slaveId, 1, 5);
WriteSingleRegisterResponse response = (WriteSingleRegisterResponse) master.processRequest(request);
02功能碼,讀取離散輸入,只讀
boolean[] discreteInputsValues = master.readDiscreteInputs(slaveId, offset, quantity);
01功能碼,讀取線圈,讀寫
boolean[] coilsValues = master.readCoils(slaveId, offset, quantity);