ModbusTCP协议 Modbus由MODICON公司于1979年开发,是一种工业现场总线协议标准。1996年施耐德公司推出基于 以太网TCP/IP的Modbus协议:ModbusTCP。 Modbus协议是一项应用层报文传输协议,包括ASCII、RTU、TCP三种报文类型。 标准的Modbus协议物理层接口有RS232、RS422、RS485和以太网接口,采用master/slave方式通信
话不多说直接上代码:
import com.intelligt.modbus.jlibmodbus.exception.ModbusIOException;
import com.intelligt.modbus.jlibmodbus.exception.ModbusNumberException;
import com.intelligt.modbus.jlibmodbus.exception.ModbusProtocolException;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
import java.net.InetAddress;
import java.net.UnknownHostException;
import com.intelligt.modbus.jlibmodbus.Modbus;
import com.intelligt.modbus.jlibmodbus.master.ModbusMasterFactory;
import com.intelligt.modbus.jlibmodbus.tcp.TcpParameters;
import com.intelligt.modbus.jlibmodbus.master.ModbusMaster;
/**
* Modbus工具类
*
* @author k&p
*/
@Slf4j
@Component
public class ShelfModbusMasters {
private static volatile ModbusMaster master = null;
private static String host;
private static final int port = 2006;
// private static final int port = Modbus.TCP_PORT;
static {
// 从系统属性中读取 Modbus 主机地址
host = "172.17.10.42";
initializeModbusMaster();
}
private static void initializeModbusMaster() {
if (master == null) {
synchronized (ShelfModbusMasters.class) {
if (master == null) {
try {
TcpParameters tcpParameters = new TcpParameters();
InetAddress address = InetAddress.getByName(host);
tcpParameters.setHost(address);
tcpParameters.setKeepAlive(true);
tcpParameters.setPort(port);
master = ModbusMasterFactory.createModbusMasterTCP(tcpParameters);
Modbus.setAutoIncrementTransactionId(true);
master.connect();
log.info("创建连接到 Modbus 主机:{}", host);
} catch (UnknownHostException e) {
log.error("未知主机: {}", host, e);
} catch (Exception e) {
log.error("连接 Modbus 主机{}失败",host, e);
}
}
}
}
}
/**
* 重新连接Modbus主机
*/
private static void reconnectModbusMaster() {
try {
if (master != null && !master.isConnected()) {
master.connect();
log.info("重新连接Modbus主机");
}
} catch (ModbusIOException e) {
e.printStackTrace();
}
}
/**
* 读取一个字节
*
* @param offset 偏移量
* @return 一个字节
*/
public static Integer readByteData(int offset) {
// 尝试重新连接Modbus主机
reconnectModbusMaster();
// slaveId:slave连接的ID,offset:读取的起始地址,quantity:读取寄存器数量
int[] values = new int[1];
try {
values = master.readHoldingRegisters(1, offset, 1);
} catch (ModbusProtocolException | ModbusNumberException |
ModbusIOException e) {
log.error("读取物料就绪数值时出错!");
e.printStackTrace();
// 如果读取出错,尝试重新连接并重新读取
reconnectModbusMaster();
try {
values = master.readHoldingRegisters(1, offset, 1);
} catch (ModbusProtocolException | ModbusNumberException |
ModbusIOException ex) {
log.error("读取物料就绪数值时第二次出错!");
ex.printStackTrace();
}
}
log.info("<======{}:{}", offset, values[0]);
return values[0];
}
/**
* 写入字节数据
*
* @param offset 偏移量
* @param writeData 写入的数据
*/
public static void writeByteData(int offset, int writeData) {
// slaveId:slave连接的ID,address:写入的寄存器地址,value:写入的值
try {
master.writeSingleRegister(1, offset, writeData);
} catch (ModbusProtocolException | ModbusNumberException |
ModbusIOException e) {
e.printStackTrace();
// 如果写入出错,尝试重新连接并重新写入
reconnectModbusMaster();
try {
master.writeSingleRegister(1, offset, writeData);
} catch (ModbusProtocolException | ModbusNumberException |
ModbusIOException ex) {
ex.printStackTrace();
}
}
log.info("======>{}:{}", offset, writeData);
}
}