java代码实现Modubs从站服务端

ModbusSlave.zip下载

1、ModbusTCPSlave

此处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();
}
}
}

2、BasicProcessImageListener

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);
}
}

3、Register

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;
}
}
posted @   一只桔子2233  阅读(2229)  评论(1编辑  收藏  举报
编辑推荐:
· [.NET]调用本地 Deepseek 模型
· 一个费力不讨好的项目,让我损失了近一半的绩效!
· .NET Core 托管堆内存泄露/CPU异常的常见思路
· PostgreSQL 和 SQL Server 在统计信息维护中的关键差异
· C++代码改造为UTF-8编码问题的总结
阅读排行:
· 【.NET】调用本地 Deepseek 模型
· CSnakes vs Python.NET:高效嵌入与灵活互通的跨语言方案对比
· DeepSeek “源神”启动!「GitHub 热点速览」
· 我与微信审核的“相爱相杀”看个人小程序副业
· Plotly.NET 一个为 .NET 打造的强大开源交互式图表库
历史上的今天:
2019-06-16 jquery 实现点评标签 类似淘宝大众点评的 快速准时 货品完好等
点击右上角即可分享
微信分享提示