Java 讀取 modbus slave模擬器數據 示例

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

}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章