modbus-tcp协议

modbus-tcp

功能码:
● 0x01:读线圈 Coil Status ON=1, OFF=0
● 0x02:读离散量输入 Input Status ON=1, OFF=0
● 0x03:读保持寄存器 Holding Register 指定数据类型, (可以是Float类型)
● 0x04:读输入寄存器 Input Register 指定数据类型 (可以是Float类型)

使用最多的是 读保持寄存器

jlibmodbus
pom 文件中引入 jar包

    <dependency>
        <groupId>com.intelligt.modbus</groupId>
        <artifactId>jlibmodbus</artifactId>
        <version>1.2.9.7</version>
    </dependency>

代码:

public class App {
	public static void main(String[] args) {
		try {
			// 设置主机TCP参数
			TcpParameters tcpParameters = new TcpParameters();
 
			// 设置TCP的ip地址
			InetAddress address = InetAddress.getByName("127.0.0.1");
 
			// TCP参数设置ip地址
			// tcpParameters.setHost(InetAddress.getLocalHost());
			tcpParameters.setHost(address);
 
			// TCP设置长连接
			tcpParameters.setKeepAlive(true);
			// TCP设置端口,这里设置是默认端口502
			tcpParameters.setPort(Modbus.TCP_PORT);
 
			// 创建一个主机
			ModbusMaster master = ModbusMasterFactory.createModbusMasterTCP(tcpParameters);
			Modbus.setAutoIncrementTransactionId(true);
 
			int slaveId = 1;//从机地址
			int offset = 0;//寄存器读取开始地址
			int quantity = 10;//读取的寄存器数量
 
 
			try {
				if (!master.isConnected()) {
					master.connect();// 开启连接
				}
 
				// 读取对应从机的数据,readInputRegisters读取的写寄存器,功能码04 int
//				int[] registerValues = master.readInputRegisters(slaveId, offset, quantity);

				// 读功能码03  int
//				int[] registerValues = master.readHoldingRegisters(slaveId, offset, quantity);


				// 读功能码02  bool 类型
//				boolean[] registerValues = master.readDiscreteInputs(slaveId, offset, quantity);

				// 读功能码01  bool 类型
//				boolean[] registerValues = master.readCoils(slaveId, offset, quantity);

				// ---------------------------------------------------------

				// Single写bool: 一次写单个bool
//				master.writeSingleCoil(slaveId, offset, true);
//				master.writeSingleCoil(slaveId, offset+1, true);
//				master.writeSingleCoil(slaveId, offset+2, true);
//				master.writeSingleCoil(slaveId, offset+3, true);
//				master.writeSingleCoil(slaveId, offset+4, true);


				// Multiple一次写多个bool
//				master.writeMultipleCoils(slaveId,offset,new boolean[]{true, true, false});

				// 写多个int
//				master.writeMultipleRegisters(slaveId,offset,new int[]{1,45,65,0,3});

				// 读写并存  功能码04  writeMultipleRegisters与readInputRegisters的合并
//				master.readWriteMultipleRegisters(slaveId,readAddress,quantity,writeAddress,new int[]{1,343,432,56,0});

				// 功能码03
				master.maskWriteRegister(slaveId,offset,1,6);
				master.maskWriteRegister(slaveId,offset+1,3,9);

				// 控制台输出
//				for (int value : registerValues) {
//					System.out.println("Address: " + offset++ + ", Value: " + value);
//				}
 
			} catch (ModbusProtocolException e) {
				e.printStackTrace();
			} catch (ModbusNumberException e) {
				e.printStackTrace();
			} catch (ModbusIOException e) {
				e.printStackTrace();
			} finally {
				try {
					master.disconnect();
				} catch (ModbusIOException e) {
					e.printStackTrace();
				}
			}
		} catch (RuntimeException e) {
			throw e;
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
}

仿真软件: https://ioufev.lanzout.com/inPtpxp9yef

  1. 西门子地址对应关系:

地址对应关系 举个🌰
1(modbus address) - 40001 (plc address) - 再来对应他们西门子的数据块DB*.DBW0

  1. bool类型读取顺序的字节序规则:

根据modbus地址 读
举个栗子🌰
modbus地址: 40001 bool bit0位
modbus地址: 40001 bool bit1位
modbus地址: 40001 bool bit2位

modbus地址: 40001 bool bit15位
其中, 这个 40001 在代码中代表的 offset变量, 读取到的数值 , 转化成 2进制16位 分别与 bit0 … bit15 对应起来

  1. 西门子读取bool规则 (西门子的字节序规则)

举个🌰
0010 0100 0001 1001
8位一个字节, 一个地址两个字节 分为前 8 位与后 8位
先从 前 8位 中 0010 0100
这8 位 从 ← 读 (从第8位往第1位读)
再 从 后 8 位 中 0001 1001
这后 8位 从 ← 读 (从第16位往第9位读)
把上面读到2个字节,
变成 我们传统的顺序读取方式(从左到右读 →)
0010 0100 0001 1001 -----> 0010 0100 1001 1000

支持Modbus TCP转Modubus RTU。RTU可以为RS232或者RS485。 支持RTU做主站或者Modubs TCP做主站。 支持多主机访问支持,最多连接100个TCP客户端。 支持所有的Modubus功能码和寄存器范围。 同时也可以做普通串口服务器使用。 ZLAN5142 概述 ZLAN5142 Modbus网关是上海卓岚信息科技有限公司开发的一款在Modbus TCPModbus RTU之间进行协议转化的转换器,其中Modbus RTU可以是RS485也可以是RS232接口。 ZLAN5142具备了强大的多主机访问支持功能和RS485总线冲突控制功能。所谓多主机功能是指,ZLAN5142作为Modbus TCP服务器时可以支持多达100个TCP客户端同时连接,多个TCP连接可以随机性的访问,ZLAN5142能够分别对不同的连接给出正确应答,保证数据稳定不丢包。相对于RS485总线只能够有一个主机进行访问,ZLAN5142实现了“多主机”功能。ZLAN5142实现了RS485总线的冲突控制,防止了多主机时的串口总线抢占问题。 另外,将ZLAN5142的“转化协议”选择为“无”,也可以当作普通的透明传输的串口服务器使用。但是不同于普通的串口服务器例如ZLAN5102,ZLAN5142即使作为普通串口服务器模式下也可以支持“多主机”功能,可解决多个计算机或主站如何同时监控一个串口设备的难题。 特点 支持Modbus TCP转Modubus RTU,RTU可以为RS232或者RS485。 支持RTU做主站或者TCP做主站。 支持多主机访问支持,最多连接100个TCP客户端。 支持1200~460800波特率。 支持RS485总线冲突调度机制,防止总线冲突。 支持所有的Modubus功能码和寄存器范围。 可作为普通的透传串口服务器使用,具备ZLAN5102相同功能。 小于1W的低功耗设计。 内嵌485防雷保护功能,适合室外485通信。 支持DNS,满足通过域名实现通信的要求。支持DHCP。 2KV网络浪涌保护。 外壳采用抗辐射的SECC板,保证在高电磁辐射区也能够正常工作。 规格 网络界面 以太网 10/100 Mbps, RJ45 保护 内建2KV电磁隔离 串口界面 界面 RS-232/485 串口数 1 校验位 None, Even, Odd, Space, Mark 数据位 5~9 停止位 1,2 流控 RTS/CTS,DTR/DCR, XON/XOFF 速率 1200bps~460800bps 软件特性 协议 TCP,HTTP,UDP,ICMP,ARP,IP,DNS,DHCP 虚拟串口平台 Windows 95/98/ME/NT/2000/XP/WIN7/WIN8 配置方式 Web浏览器、卓岚ZLVirCom、串口类AT命令 电器特性 电压输入 DC9~24V,100mA 机械特性 外壳材料 抗电磁材料SECC钢板 尺寸 长×宽×高=9.4cm×6.5cm×2.5cm 工作环境 工作温度,湿度 -45~85℃,5~95% RH 储存温度,湿度 -45~165℃,5~95% RH W
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值