报文格式
主站发送报文: 从站地址(1字节), 功能码01(1字节), 起始线圈地址(2字节), 线圈数量(2字节), CRC校验(2字节)
从站响应报文: 从站地址(1字节), 功能码01(1字节), 字节计数(1字节), 数据(n字节), CRC校验(2字节)
按照这个报文格式, 可以把读线圈功能方法设计成这样
❝可以定义一个接口,把所有需要对外提供的方法声明(只有方法签名,没有实现)写在接口里。 任何类如果实现(implements)了这个接口,就必须提供这些方法的具体实现。 这样,不管使用哪种具体实现(比如ModbusRTU, ModbusTCP),我们都可以统一用接口类型来调用,调用方式完全一致。
❞
发送接收报文处理步骤
第一步需要拼接发送报文 CRC校验码有现成的方法可以直接算出校验码
第二步是发送报文, 因为发送接收报文是一个方法, 所以第二步和第三步合并到一起
第四步是验证返回报文, 可以验证返回报文长度是否正确, 从从站的响应报文可以发现, 返回报文的固定字节数是5, 然后数据段是根据读的线圈数量来决定返回几个字节

还可以验证返回报文的CRC校验码是否正确, 结合上述两个验证条件都成立, 就可以进行解析报文
第五步解析报文的作用就是得到布尔数组, 从返回报文可以看到去掉前面三个字节之后就是数据字节, 所以
这样得到的是字节数组, 还需要将字节数据转换成布尔数组, 这里要用到数据转换库
测试
测试要用到Modbus的模拟器, 这里推荐几个, 使用方法大同小异
https://www.redisant.cn/mse
https://www.modbustools.com/modbus_slave.html
因为上位机作为主站, 所以测试工具要模拟成从站
读输入线圈
第一步中拼接报文功能码改成0x02就可以了
下一节内容: Modbus读寄存器开发