此处new TcpSlave(10000, false)
因ubuntu下1000以下端口需要root权限,故这里使用了10000这个端口,windows下可以使用502端口
package slave;
import com.serotonin.modbus4j.ModbusFactory;
import com.serotonin.modbus4j.ModbusSlaveSet;
import com.serotonin.modbus4j.ip.tcp.TcpSlave;
public class ModbusTCPSlave {
public static void main(String[] args) throws Exception {
run();
}
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(10000, false);
//向过程影像区添加数据
salve.addProcessImage(Register.getModscanProcessImage(1));
//获取寄存器
salve.getProcessImage(1);
try {
salve.start();
System.out.println("salve.start();");
} catch (Exception e) {
e.printStackTrace();
}
}
}
package slave;
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);
}
}
package slave;
import com.serotonin.modbus4j.BasicProcessImage;
/**
* 寄存器及线圈
*/
public class Register {
public static BasicProcessImage getModscanProcessImage(int slaveId) {
/* 初始化过程影像区 */
BasicProcessImage processImage = new BasicProcessImage(slaveId);
/* 初始化寄存器数据范围 */
processImage.setInvalidAddressValue(Short.MIN_VALUE);
/* 初始化过程影像区各个数值为0 */
for (int i = 0; i < 608; i++) {
processImage.setHoldingRegister(i, (short) 0);
}
/* 为影像区添加监听 */
processImage.addListener(new BasicProcessImageListener());
return processImage;
}
}
原文:https://www.cnblogs.com/kikyoqiang/p/14891564.html