要创建slave从站,我们需要使用modbus的jar包
<!--modbus4j-->
<dependency>
<groupId>com.infiniteautomation</groupId>
<artifactId>modbus4j</artifactId>
<version>3.0.3</version>
</dependency>
这里有个坑,阿里巴巴的镜像是下载不了这个包的,建议使用默认镜像,然后科学上网下载,不然就只能下别人的包,然后手动导入。
创建服务器:
import com.serotonin.modbus4j.ModbusFactory;
import com.serotonin.modbus4j.ModbusSlaveSet;
import com.serotonin.modbus4j.ip.tcp.TcpSlave;
import org.springframework.boot.ApplicationArguments;
import org.springframework.boot.ApplicationRunner;
import org.springframework.stereotype.Component;
@Component
public class ModbusTCPSlave implements ApplicationRunner {
// public static void run() throws Exception {
// /* createSlave方法执行完成后,会进行监听,影响之后的业务运行,需要以线程的方式进行启动 */
// new Thread(() -> {
// createSalve();
// }).start();
// /* 为保证在进行点表数据初始化的时候slave已经启动完成,在此处进行了1s的休眠 */
// Thread.sleep(1000);
// /* 开始进行点表的初始化数据写入 */
// // InitModbusSlave();
// }
/**
* @description 创建ModbusTCP服务器
*/
private static void createSalve() {
//创建modbus工厂
ModbusFactory modbusFactory = new ModbusFactory();
//创建TCP服务端
// final ModbusSlaveSet salve = modbusFactory.createTcpSlave(false);
final ModbusSlaveSet salve = new TcpSlave(502, false);
//向过程影像区添加数据
salve.addProcessImage(Register.getModscanProcessImage(1));
//获取寄存器
salve.getProcessImage(1);
try {
System.out.println("salve启动成功");
salve.start();
// System.out.println("salve.start();");
} catch (Exception e) {
e.printStackTrace();
}
}
@Override
public void run(ApplicationArguments args) throws Exception {
/* createSlave方法执行完成后,会进行监听,影响之后的业务运行,需要以线程的方式进行启动 */
new Thread(() -> {
createSalve();
}).start();
/* 为保证在进行点表数据初始化的时候slave已经启动完成,在此处进行了1s的休眠 */
Thread.sleep(1000);
/* 开始进行点表的初始化数据写入 */
// InitModbusSlave();
}
}
初始化寄存器和线圈:
import com.serotonin.modbus4j.BasicProcessImage;
/**
* 寄存器及线圈
*/
public class Register {
public static BasicProcessImage getModscanProcessImage(int slaveId) {
/* 初始化过程影像区 */
BasicProcessImage processImage = new BasicProcessImage(slaveId);
/* 设置无效地址的默认值为Short类型的最大值 */
// processImage.setInvalidAddressValue(Short.MAX_VALUE);
/* 初始化过程影像区各个数值为0 */
for (int i = 0; i < 608; i++) {
processImage.setHoldingRegister(i, (short) 0);
}
/* 为影像区添加监听 */
processImage.addListener(new BasicProcessImageListener());
return processImage;
}
}
数据变化监听:
import com.serotonin.modbus4j.ProcessImageListener;
/**
* 监听线圈和寄存器,实现ProcessImageListener
*/
public class BasicProcessImageListener implements ProcessImageListener {
@Override
public void coilWrite(int i, boolean b, boolean b1) {
}
@Override
public void holdingRegisterWrite(int offset, short oldValue, short newValue) {
System.out.println("Register at " + offset + "," + "change " + oldValue + " to " + newValue);
}
}
以上,我们就可以在启动的时候创建一个slave从站
接着我们可以使用工具Modbus Poll测试连接一下,连接上了,就代表从站创建成功。