基于MODBUS-RTU协议的串口编程

Posted 时间足迹

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了基于MODBUS-RTU协议的串口编程相关的知识,希望对你有一定的参考价值。

       首先给大家描述一下当前样例串口编程的场景,使用一个水位传感器来测试水库水位的高度,水位传感器连接数据采集器,数据采集器通过485串口和USB口转换器和电脑连接,电脑程序通过USB口读取水位传感器上传到采集器的数据,网络连接如下图所示:

 

       样例代码如下,代码中“int hight = (list[3] - 4000) /160;”这个公式就可以获取到水位的高度,这个是比较难理解的,为什么这样就可以得到高度呢,其实这个公式是不完整的,完整公式是这样的:(传感器返回的电流值 - 传感器可输出电流的最小值)/传感器可输出电流的最大最小差值 * 传感器量程,当然这个计算方式的条件是压力传感器的输出信号与被测压力是线性的,如果是倒S型非线性或者S型非线性关系计算公式需要另行推算。

       另一个关键点就是读取的长度设置,这个如何选在在代码注释中已经说明啦。

public static void main(String[] args) {
        SerialParameters serialParameters = new SerialParameters();
        // 设定MODBUS通讯的串行口
        serialParameters.setCommPortId("com6");
        // 设定成无奇偶校验
        serialParameters.setParity(0);
        // 设定成数据位是8位
        serialParameters.setDataBits(8);
        // 设定为1个停止位
        serialParameters.setStopBits(1);
        // 设定端口名称
        serialParameters.setPortOwnerName("Numb nuts");
        // 设定端口波特率
        serialParameters.setBaudRate(BAUD_RATE);
 
        // 创建ModbusFactory工厂实例
        ModbusFactory modbusFactory = new ModbusFactory();
        // 创建ModbusMaster实例
        ModbusMaster master = modbusFactory.createRtuMaster(serialParameters);
 
 
        // 初始化
        try {
            master.init();
            
            /**
             * 读的位置从零开始,长度4
             * 长度大小是采集器寄存器的数量,寄存器的数量是采集器可接入的电流输入的路数
             */
            readHoldingRegistersTest(master,SLAVE_ADDRESS,0,4);
 
 
        } catch (ModbusInitException e) {
            e.printStackTrace();
        } finally {
            master.destroy();
        }
        
    }


 private static void readHoldingRegistersTest(ModbusMaster master,
            int slaveId, int start, int len) {
        try {
            ReadHoldingRegistersRequest request = new ReadHoldingRegistersRequest(
                    slaveId, start, len);
            ReadHoldingRegistersResponse response = (ReadHoldingRegistersResponse) master
                    .send(request);
            if (response.isException()) {
                System.out.println("Exception response: message="
                        + response.getExceptionMessage());
            } else {
                System.out.println(Arrays.toString(response.getShortData()));
                short[] list = response.getShortData();
                for(int i = 0; i < list.length; i++){
                    System.out.print(list[i] + " ");
                }
                System.out.println();
                int hight = (list[3] - 4000) /160;
                if(hight <= 0){
                    System.out.println("水位高度为:0CM");
                }else{
                    System.out.println("水位高度为:" + (hight + 13.5) + "CM");
                }
                               
            }
        } catch (ModbusTransportException e) {
            e.printStackTrace();
        }
    }

 最后给大家附上官方jar包,这个资源一般是比较难找到的,特别是对一些刚开始研究的同仁更是如此啦,资源包如下:https://files.cnblogs.com/files/cymiao/modbus.zip

 

以上是关于基于MODBUS-RTU协议的串口编程的主要内容,如果未能解决你的问题,请参考以下文章

普通PC通过USB转485串口 ModBus-RTU通信协议控制伺服电机

STM32+RS485+Modbus-RTU(主机模式+从机模式)-标准库/HAL库开发

STM32+RS485+Modbus-RTU(主机模式+从机模式)-标准库/HAL库开发

标准modbus-rtu通信协议是485通信吗?

串口通信modbus协议格式查询方式下怎么读写寄存器

C# 开发Modbus Rtu客户端 modbus测试Demo,Modbus 串口通信 , 虚拟MODBUS-RTU测试