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);
}
}