java中modbus协议连接

  1. modbus在java中的使用,首先maven的pom中引入modbus4j包
		<dependency>
			<groupId>com.infiniteautomation</groupId>
	 		<artifactId>modbus4j</artifactId>
	        <version>3.0.3</version>
        </dependency>

    2. 我们创建类:ModBus4JTCPClient,创建ModbusMaster连接对象,以及读取寄存器方法

package io.powerx.test;

import org.apache.commons.lang3.StringUtils;

import com.serotonin.modbus4j.ModbusFactory;
import com.serotonin.modbus4j.ModbusMaster;
import com.serotonin.modbus4j.code.DataType;
import com.serotonin.modbus4j.exception.ErrorResponseException;
import com.serotonin.modbus4j.exception.ModbusInitException;
import com.serotonin.modbus4j.exception.ModbusTransportException;
import com.serotonin.modbus4j.ip.IpParameters;
import com.serotonin.modbus4j.locator.BaseLocator;
import com.serotonin.modbus4j.msg.ModbusResponse;
import com.serotonin.modbus4j.msg.WriteRegisterRequest;
import com.serotonin.modbus4j.msg.WriteRegistersRequest;

public class ModBus4JTCPClient {

	private ModbusFactory modbusFactory;

	public ModbusFactory getModbusFactory() {
		if (modbusFactory == null) {
			modbusFactory = new ModbusFactory();
		}
		return modbusFactory;
	}

	/**
	 * 
	 * @param ip
	 * @param port
	 * @return
	 * @throws ModbusInitException
	 */
	public ModbusMaster getMaster(String ip, int port) throws ModbusInitException {
		ModbusMaster m = null;
		IpParameters tcpParameters = new IpParameters();
		tcpParameters.setHost(ip);
		tcpParameters.setPort(port);
		m = getModbusFactory().createTcpMaster(tcpParameters, false);
		m.setTimeout(2000);
		m.init();
		return m;
	}

	/**
	 * Holding Register类型
	 * 
	 * @param master
	 * @param modbusId
	 * @param registerId
	 * @param registerNumber
	 * @param analysisFlag
	 * @return
	 * @throws ModbusTransportException
	 * @throws ErrorResponseException
	 * @throws ModbusInitException
	 */
	public Number readHoldingRegister(ModbusMaster master, int modbusId, int registerId, int registerNumber,
			String analysisFlag) throws ModbusTransportException, ErrorResponseException, ModbusInitException {
		Number value = null;
		if ("u".equals(analysisFlag)) {
			value = holdingRegister_UNSIGNED(master, modbusId, registerId, registerNumber);
		} else if ("s".equals(analysisFlag)) {
			value = holdingRegister_SIGNED(master, modbusId, registerId, registerNumber);
		}
		return value;
	}

	public Number holdingRegister_UNSIGNED(ModbusMaster master, int modbusId, int registerId, int registerNumber)
			throws ModbusTransportException, ErrorResponseException {
		BaseLocator<Number> loc = BaseLocator.holdingRegister(modbusId, registerId - 1,
				(registerNumber == 1) ? DataType.TWO_BYTE_INT_UNSIGNED : DataType.FOUR_BYTE_INT_UNSIGNED);

		return master.getValue(loc);
	}

	public Number holdingRegister_SIGNED(ModbusMaster master, int modbusId, int registerId, int registerNumber)
			throws ModbusTransportException, ErrorResponseException {
		return master.getValue(BaseLocator.holdingRegister(modbusId, registerId - 1,
				(registerNumber == 1) ? DataType.TWO_BYTE_INT_SIGNED : DataType.FOUR_BYTE_INT_SIGNED));
	}

	// Input Registers
	public void readInputRegisters(ModbusMaster master, int registerId, int registerNumber, int modbusId,
			String analysisFlag) throws ModbusTransportException, ErrorResponseException, ModbusInitException {
		Number value = null;
         //z代表是正数,s代表可能是负数
		if ("z".equals(analysisFlag)) {
			value = inputRegister_UNSIGNED(master, modbusId, registerId, registerNumber);
		} else if ("f".equals(analysisFlag)) {
			value = inputRegister_SIGNED(master, modbusId, registerId, registerNumber);
		}
	}

	public Number inputRegister_UNSIGNED(ModbusMaster master, int modbusId, int registerId, int registerNumber)
			throws ModbusTransportException, ErrorResponseException {
		return master.getValue(BaseLocator.inputRegister(modbusId, registerId - 1,
				(registerNumber == 1) ? DataType.TWO_BYTE_INT_UNSIGNED : DataType.FOUR_BYTE_INT_UNSIGNED));
	}

	public Number inputRegister_SIGNED(ModbusMaster master, int modbusId, int registerId, int registerNumber)
			throws ModbusTransportException, ErrorResponseException {
		return master.getValue(BaseLocator.inputRegister(modbusId, registerId - 1,
				(registerNumber == 1) ? DataType.TWO_BYTE_INT_SIGNED : DataType.FOUR_BYTE_INT_SIGNED));
	}

	/**
	 * 写入寄存器
	 * 
	 * @param master
	 * @param registerId
	 * @param modbusId
	 * @param sdata
	 * @return
	 * @throws ModbusTransportException
	 * @throws ModbusInitException
	 */
	public boolean writeRegister(ModbusMaster master, int registerId, int modbusId, short sdata)
			throws ModbusTransportException, ModbusInitException {
		// 创建请求对象
		WriteRegisterRequest request = new WriteRegisterRequest(modbusId, registerId - 1, sdata);
		// 发送请求并获取响应对象
		ModbusResponse response = master.send(request);
		if (response.isException()) {
			return false;
		} else {
			return true;
		}
	}

	public boolean writeRegisters(ModbusMaster master, int registerId, int modbusId, short[] sdata)
			throws ModbusTransportException, ModbusInitException {
		// 创建请求对象
		WriteRegistersRequest request = new WriteRegistersRequest(modbusId, registerId - 1, sdata);
		// 发送请求并获取响应对象
		ModbusResponse response = master.send(request);
		if (response.isException()) {
			return false;
		} else {
			return true;
		}
	}

	public void writeHoldingRegister(ModbusMaster master, int registerId, int modbusId, Number writeValue, int dataType)
			throws ModbusTransportException, ErrorResponseException, ModbusInitException {
		BaseLocator<Number> locator = BaseLocator.holdingRegister(modbusId, registerId - 1,
				(dataType == 1) ? DataType.TWO_BYTE_INT_UNSIGNED : DataType.FOUR_BYTE_INT_UNSIGNED);
		master.setValue(locator, writeValue);
	}




}

    3. 我们试一下在main方法中调用

        int registerId=100;
		int modbusId=1;
		ModBus4JTCPClient modbusTcp = new ModBus4JTCPClient();
		
		ModbusMaster master = modbusTcp.getMaster("localhost", 502);	//192.168.1.108
		
		
		modbusTcp.readInputRegisters(master, registerId, 1, modbusId, "u");

 

转载于:https://my.oschina.net/liketome/blog/1856449

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值