Modbus TCP读取寄存器数据

modbus4j读取寄存器数据

ModbusReadUtil读取工具类

package cn.sync.modbus;

import org.apache.log4j.Logger;

import com.serotonin.modbus4j.BatchRead;
import com.serotonin.modbus4j.BatchResults;
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;

/**
 * 
 * Modbus TCP协议读取数据
 * @author zyl
 *
 */
public class ModbusReadUtil {
    
	private static Logger logger = Logger.getLogger(ModbusReadUtil.class);
	
	/**
	 * 单列工厂。
	 */
	static ModbusFactory modbusFactory;
	static {
		if (modbusFactory == null) {
			modbusFactory = new ModbusFactory();
		}
	}
	
	/**
	 * 获取master 
	 * @param host  IP地址
	 * @param port  端口号
	 * @return
	 * @throws ModbusInitException
	 */
	public static ModbusMaster getMaster(String host,int port) throws ModbusInitException {
		try {
			IpParameters params = new IpParameters();
			params.setHost(host);
			params.setPort(port);
			ModbusMaster master = modbusFactory.createTcpMaster(params, false);// TCP 协议
			master.init();  //master初始化
			return master;
		} catch (Exception e) {
			logger.error("获取master出现异常"+e);
			e.printStackTrace();
		}
         return null;
	}
	
	
	/**
	 * 读取[03 Holding Register类型 2x]模拟量数据
	 * @param master ModbusMaster对象
	 * @param slaveId  
	 *            slave Id  设备ID
	 * @param offset
	 *            偏移截止位置
	 * @param dataType
	 *            数据类型,来自com.serotonin.modbus4j.code.DataType
	 * @return
	 * @throws ModbusTransportException
	 *             异常
	 * @throws ErrorResponseException
	 *             异常
	 * @throws ModbusInitException
	 *             异常
	 */
	public static Number readHoldingRegister(ModbusMaster master,int slaveId, int offset, int dataType)
			throws ModbusTransportException, ErrorResponseException, ModbusInitException {
		// 03 Holding Register类型数据读取
		BaseLocator<Number> loc = BaseLocator.holdingRegister(slaveId, offset, dataType);
		System.out.println("loc:"+loc);
		Number value =master.getValue(loc);
		System.out.println();
		return value;
   }
	
   
	/**
	 * 批量读取使用寄存器数据
	 * @param  master ModbusMaster对象
	 * @param batchRead   批量读取集合
	 * @throws ModbusTransportException
	 * @throws ErrorResponseException
	 * @throws ModbusInitException
	 */
	public static BatchResults<Integer> batchRead(ModbusMaster master,BatchRead<Integer> batchRead)throws Exception {
		try {
			batchRead.setContiguousRequests(false);
			BatchResults<Integer> results = master.send(batchRead);
			return results;
		} catch (Exception e) {
			logger.error("批量读取使用寄存器数据出现异常"+e);
			e.printStackTrace();
		}
		return null;
		
	}
	
	//测试
	public static void main(String[] args) {
		try {
			ModbusMaster master=getMaster("127.0.0.1",502);
			 BatchRead<Integer> batch = new BatchRead<Integer>();

				batch.addLocator(0, BaseLocator.holdingRegister(1,1002, DataType.FOUR_BYTE_FLOAT_SWAPPED));
				batch.addLocator(1, BaseLocator.holdingRegister(1,1004, DataType.FOUR_BYTE_FLOAT_SWAPPED));
				batch.addLocator(2, BaseLocator.holdingRegister(1,1006, DataType.FOUR_BYTE_FLOAT_SWAPPED));
				batch.addLocator(3, BaseLocator.holdingRegister(1,1008, DataType.FOUR_BYTE_FLOAT_SWAPPED));
				
				BatchResults<Integer> batchRead=batchRead(master,batch);
				System.out.println(batchRead.getValue(0));
				System.out.println(batchRead.getValue(1));
				System.out.println(batchRead.getValue(2));
				System.out.println(batchRead.getValue(3));
				//DataType.FOUR_BYTE_FLOAT_SWAPPED  float高低位数据处理
				Number v031 = readHoldingRegister(master,1,1010, DataType.FOUR_BYTE_FLOAT_SWAPPED);// 注意,float
				System.out.println("v031:"+v031);
		} catch (Exception e) {
			e.printStackTrace();
		}
		
	}
	
   
}

代码以及依赖JAR下载

  • 4
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Modbus TCP 读取寄存器数据的步骤如下: 1. 确定从设备的 IP 地址Modbus 设备地址。 2. 确定要读取寄存器地址和数量。 3. 使用 Modbus TCP 协议发送读取命令。读取命令应该包括以下内容: - 从设备的 IP 地址 - 从设备的 Modbus 设备地址 - 读取寄存器地址 - 读取寄存器数量 4. 从设备将响应读取命令,并将所请求的数据发送回 Modbus TCP 主设备。 5. 解析从设备返回的数据Modbus TCP 数据通常以字节为单位传输,因此需要将字节数据转换为可读的格式。常见的转换方式包括将字节数据转换为 16 位整数或浮点数。 6. 使用读取到的数据进行后续的处理。 以下是一个 Modbus TCP 读取寄存器数据的 Python 示例代码: ```python import socket # 从设备的 IP 地址Modbus 设备地址 ip_address = '192.168.1.100' device_address = 1 # 要读取寄存器地址和数量 register_address = 40001 register_quantity = 1 # Modbus TCP 读取命令 message = bytearray([0x00, 0x01, 0x00, 0x00, 0x00, 0x06, 0x01, 0x03, (register_address >> 8) & 0xFF, register_address & 0xFF, (register_quantity >> 8) & 0xFF, register_quantity & 0xFF]) # 创建 TCP 连接并发送读取命令 s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) s.connect((ip_address, 502)) s.send(message) # 接收从设备返回的数据 data = s.recv(1024) # 解析数据并打印结果 result = (data[9] << 8) + data[10] print(result) ``` 在这个示例代码中,我们使用 Python 的 socket 模块来创建 TCP 连接并发送读取命令。我们将从设备的 IP 地址Modbus 设备地址寄存器地址和数量打包成一个字节数组,并将其作为参数传递给 socket.send() 方法。然后,我们使用 socket.recv() 方法接收从设备返回的数据,并将其解析为一个整数。最后,我们打印这个整数作为读取到的寄存器数据

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值