最近在研究传输协议这一块。今天看了看Modbus4j相关的内容,感觉还是蛮简单的,就是官方有几个大坑没填,还需要自己去搞。
我使用的库是modbus4j,注意maven导入的时候要设置对应repository,阿里云仓库里面好像没有这个库
首先需要安装两个软件,一个是modbus slave,另一个是vspd,这两个软件网上都有相关的教程。也可以参考这篇博文:https://www.cnblogs.com/ioufev/p/10831289.html
先从简单的来,就用Modbus TCP来进行传输。在Modbus Slave的Connection中设置如下:
然后依次创建4个从站,从站ID相同,但是代表不同的功能。
其中ID代表的是从站的ID,而F则代表对应的功能码
- F = 1 读取线圈状态
- F = 2 读取输入状态
- F = 3 读取存储寄存器的值
- F = 4 读取写入寄存器的值
可以直接按照我的样式来设置值。至于那个 – 是怎么出现的,只需要按如下设置即可:
接下来是代码部分,TCP这块官方没什么坑,可以直接按照套路来,先生成modbus的数据主站:
public static void main(String[] args) throws Exception {
IpParameters ipParameters = new IpParameters();
//master数据主站的初始化
ipParameters.setHost("localhost");
ipParameters.setPort(502); //初始端口号,要和从站的一致
ModbusFactory modbusFactory = new ModbusFactory();
//通过工厂模式创建
ModbusMaster master = modbusFactory.createTcpMaster(ipParameters, false);
master.setTimeout(4000);
master.setRetries(1);
// ...
}
TCP的数据读取方式主要是通过BaseLocator工具类来实现的
//找到数据在从站中的位置,及其对应的数据类型
BaseLocator<Number> locator = BaseLocator.holdingRegister(1, 2, DataType.FOUR_BYTE_FLOAT);
//通过站获取从站的数据
Number value = master.getValue(locator);
这样就是一个通过master读取数据的典例。注意这里用的是BaseLocator.holdingRegister方法读取,对应的slave应该是slaveId = 1, F=3的从站,即:
其他的方法类似。这就是TCP部分的读写。串口RTU的话下一期继续。