1.首先安裝modbus slave 模擬器,自己到網上下載破解版的 有註冊碼
2.新建寄存器 設置單元內數值,點擊connection下面的connect,紅色的No connection 字樣消失 連接成功
3.java側讀取工具類,裏面有不同變量類型的讀取,讀取方法要與modbus slave 寄存器設置的變量類型保持一致
package utils;
import java.net.InetAddress;
import net.wimpi.modbus.Modbus;
import net.wimpi.modbus.ModbusException;
import net.wimpi.modbus.ModbusIOException;
import net.wimpi.modbus.ModbusSlaveException;
import net.wimpi.modbus.io.ModbusTCPTransaction;
import net.wimpi.modbus.msg.ReadCoilsRequest;
import net.wimpi.modbus.msg.ReadCoilsResponse;
import net.wimpi.modbus.msg.ReadInputDiscretesRequest;
import net.wimpi.modbus.msg.ReadInputDiscretesResponse;
import net.wimpi.modbus.msg.ReadInputRegistersRequest;
import net.wimpi.modbus.msg.ReadInputRegistersResponse;
import net.wimpi.modbus.msg.ReadMultipleRegistersRequest;
import net.wimpi.modbus.msg.ReadMultipleRegistersResponse;
import net.wimpi.modbus.msg.WriteCoilRequest;
import net.wimpi.modbus.msg.WriteSingleRegisterRequest;
import net.wimpi.modbus.net.TCPMasterConnection;
import unit.UnityRegister;
public class ModbusUtil {
/**
* 查詢Function 爲Input Status的寄存器
*
* @param ip
* @param address
* @param count
* @param slaveId
* @return
* @throws ModbusIOException
* @throws ModbusSlaveException
* @throws ModbusException
*/
public static int readDigitalInput(String ip, int port, int address, int slaveId) {
int data = 0;
try {
InetAddress addr = InetAddress.getByName(ip);
// 建立連接
TCPMasterConnection con = new TCPMasterConnection(addr);
con.setPort(port);
con.connect();
// 第一個參數是寄存器的地址,第二個參數時讀取多少個
ReadInputDiscretesRequest req = new ReadInputDiscretesRequest(address, 1);
// 這裏設置的Slave Id, 讀取的時候這個很重要
req.setUnitID(slaveId);
ModbusTCPTransaction trans = new ModbusTCPTransaction(con);
trans.setRequest(req);
// 執行查詢
trans.execute();
// 得到結果
ReadInputDiscretesResponse res = (ReadInputDiscretesResponse) trans.getResponse();
if(res.getDiscretes().getBit(0)){
data = 1;
}
// 關閉連接
con.close();
} catch (Exception e) {
e.printStackTrace();
}
return data;
}
/*查詢inputRegister類型數據*/
public static int readInputRegister(String ip, int port, int address,
int slaveId) {
int data = 0;
try {
InetAddress addr = InetAddress.getByName(ip);
TCPMasterConnection con = new TCPMasterConnection(addr);
//Modbus.DEFAULT_PORT;
con.setPort(port);
con.connect();
//這裏重點說明下,這個地址和數量一定要對應起來
ReadInputRegistersRequest req = new ReadInputRegistersRequest(address, 1);
//這個SlaveId一定要正確
req.setUnitID(slaveId);
ModbusTCPTransaction trans = new ModbusTCPTransaction(con);
trans.setRequest(req);
trans.execute();
ReadInputRegistersResponse res = (ReadInputRegistersResponse) trans.getResponse();
data = res.getRegisterValue(0);
con.close();
} catch (Exception e) {
e.printStackTrace();
}
return data;
}
public static int readRegister(String ip, int port, int address,
int slaveId) {
int data = 0;
try {
InetAddress addr = InetAddress.getByName(ip);
TCPMasterConnection con = new TCPMasterConnection(addr);
con.setPort(port);
con.connect();
ReadMultipleRegistersRequest req = new ReadMultipleRegistersRequest(address, 1);
req.setUnitID(slaveId);
ModbusTCPTransaction trans = new ModbusTCPTransaction(con);
trans.setRequest(req);
trans.execute();
ReadMultipleRegistersResponse res = (ReadMultipleRegistersResponse) trans.getResponse();
data = res.getRegisterValue(0);
con.close();
} catch (Exception e) {
e.printStackTrace();
}
return data;
}
/**
* 寫入數據到真機,數據類型是RE
*
* @param ip
* @param port
* @param slaveId
* @param address
* @param value
*/
public static void writeRegister(String ip, int port, int slaveId,
int address, int value) {
try {
InetAddress addr = InetAddress.getByName(ip);
TCPMasterConnection connection = new TCPMasterConnection(addr);
connection.setPort(port);
connection.connect();
ModbusTCPTransaction trans = new ModbusTCPTransaction(connection);
UnityRegister register = new UnityRegister(value);
WriteSingleRegisterRequest req = new WriteSingleRegisterRequest(
address, register);
req.setUnitID(slaveId);
trans.setRequest(req);
System.out.println("ModbusSlave: FC" + req.getFunctionCode()
+ " ref=" + req.getReference() + " value="
+ register.getValue());
trans.execute();
connection.close();
} catch (Exception ex) {
System.out.println("Error in code");
ex.printStackTrace();
}
}
public static int readDigitalOutput(String ip, int port, int address,
int slaveId) {
int data = 0;
try {
InetAddress addr = InetAddress.getByName(ip);
TCPMasterConnection con = new TCPMasterConnection(addr);
con.setPort(port);
con.connect();
ReadCoilsRequest req = new ReadCoilsRequest(address, 1);
req.setUnitID(slaveId);
ModbusTCPTransaction trans = new ModbusTCPTransaction(con);
trans.setRequest(req);
trans.execute();
ReadCoilsResponse res = ((ReadCoilsResponse) trans.getResponse());
if(res.getCoils().getBit(0)){
data = 1;
}
con.close();
} catch (Exception ex) {
ex.printStackTrace();
}
return data;
}
/**
* 寫入數據到真機的DO類型的寄存器上面
*
* @param ip
* @param port
* @param slaveId
* @param address
* @param value
*/
public static void writeDigitalOutput(String ip, int port, int slaveId,
int address, int value) {
try {
InetAddress addr = InetAddress.getByName(ip);
TCPMasterConnection connection = new TCPMasterConnection(addr);
connection.setPort(port);
connection.connect();
ModbusTCPTransaction trans = new ModbusTCPTransaction(connection);
boolean val = true;
if (value == 0) {
val = false;
}
WriteCoilRequest req = new WriteCoilRequest(address, val);
req.setUnitID(slaveId);
trans.setRequest(req);
trans.execute();
connection.close();
} catch (Exception ex) {
System.out.println("writeDigitalOutput Error in code");
ex.printStackTrace();
}
}
}
4.測試
public class Test {
public static void main(String[] args) throws IOException, MqttException, DwOpenException, InterruptedException {
ModbusUtil util= new ModbusUtil();
ModBusSlaveEntity modSlaveEntity=new ModBusSlaveEntity();
modSlaveEntity.setIp("127.0.0.1");
modSlaveEntity.setAddress(0);
modSlaveEntity.setSlaveId(1);
modSlaveEntity.setPort(Modbus.DEFAULT_PORT);
int slaveId=1;
int port=Modbus.DEFAULT_PORT;
int res= util.readInputRegister(modSlaveEntity.getIp(), modSlaveEntity.getPort(), modSlaveEntity.getAddress(), modSlaveEntity.getSlaveId());
System.out.println("res="+res);
}
}
讀取到了
package unit;
import net.wimpi.modbus.procimg.Register;
public class UnityRegister implements Register {
protected byte[] m_Register = new byte[2];
public UnityRegister() {
m_Register = null;
}
public UnityRegister(byte b1, byte b2) {
m_Register[0] = b1;
m_Register[1] = b2;
}
public UnityRegister(int value) {
setValue(value);
}
@Override
public int getValue() {
return ((m_Register[0] & 0xff) << 8 | (m_Register[1] & 0xff));
}
@Override
public int toUnsignedShort() {
return ((m_Register[0] & 0xff) << 8 | (m_Register[1] & 0xff));
}
@Override
public short toShort() {
return (short) ((m_Register[0] << 8) | (m_Register[1] & 0xff));
}
@Override
public byte[] toBytes() {
return m_Register;
}
@Override
public void setValue(int v) {
setValue((short) v);
}
@Override
public void setValue(short s) {
if (m_Register == null) {
m_Register = new byte[2];
}
m_Register[0] = (byte) (0xff & (s >> 8));
m_Register[1] = (byte) (0xff & s);
onChanged();
}
@Override
public void setValue(byte[] bytes) {
if (bytes.length < 2) {
throw new IllegalArgumentException();
} else {
m_Register[0] = bytes[0];
m_Register[1] = bytes[1];
}
onChanged();
}
public void onChanged(){
System.out.println(">>>>>>>>>>>>UnityRegister:這裏set了值:" + m_Register);
}
}