基于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

原文地址:https://www.cnblogs.com/cymiao/p/9964130.html

时间: 2025-01-17 21:56:39

基于MODBUS-RTU协议的串口编程的相关文章

串口屏(触摸屏)组态软件+多台51单片机MODBUS RTU多机串口通信程序源码

串口屏(触摸屏)组态软件+多台51单片机MODBUS RTU多机串口通信程序源码实现触摸屏(串口屏)与单片机的通讯,主要是解决通讯协议的问题.本文使用开放的Modbus通讯协议,以广州易显的HMImaker触摸屏作主机(Master),单片机作从机(Slaver).HMImaker触摸屏本身支持Modbus通讯协议,只要单片机按照Modbus协议进行收发数据,就可以进行通信了.触摸屏与单片机之间采用RS-485标准接口直接连接,与多台51单片机MODBUS RTU多机串口通信一.包括如下实例:二

基于 TCP/IP 协议的网络编程

在说明基于 TCP/IP 协议的网络编程之前,先来了解一下 Socket(网络套接字): 利用套接字(Socket)开发网络应用程序早已被广泛的采用,以至于成为事实上的标准 通信的两端都要有 Socket,是两台机器间通信的端点(API 原话) 网络通信其实就是 Socket 间的通信 Socket 允许程序把网络连接当成一个流,数据在两个 Socket 间通过 IO 传输 一般主动发起通信的应用程序属客户端,等待通信请求的为服务端 网络编程某种程度上可以称作"Socket 编程" T

modbus rtu 协议转DLT645-2007和DLT645-1997电表协议转换器定制,

现场会碰到现场数据为Modbus协议,但是后台系统为DLT645协议系统,本模块支持将工业ModbusRtu协议转换为电表国标协议DLT645协议,支持1997和2007俩种标准,只需要进行简单的配置,就可以实现Modbus 协议转DLT645协议,方便客户将modbus数据接入到645电表系统中. 有需要请联系: QQ:2315590764 技术支持邮箱:2315590764#qq.com modbus rtu 协议转DLT645-2007和DLT645-1997电表协议转换器定制,,布布扣,

ModBus RTU协议

(一).通讯传送方式: 通讯传送分为独立的信息头,和发送的编码数据.以下的通讯传送方式定义也与Modbus RTU通讯规约相兼容: 编码 8位二进制 起始位 1位 数据位 8位 奇偶校验位 1位(偶校验位) 停止位 1位 错误校检 CRC(冗余循环码) 初始结构 = ≥4字节的时间 地址码 = 1 字节功能码 = 1 字节数据区 = N 字节错误校检 = 16位CRC码 结束结构 = ≥4字节的时间 地址码:地址码为通讯传送的第一个字节.这个字节表明由用户设定地址码的从机将接收由主机发送来的信息

MODBUS RTU协议中浮点数是如何存储,读到浮点数寄存器的数值如何转换成所需的浮点数

浮点数保存的字节格式如下: 地址 +0 +1 +2 +3内容 SEEE EEEE EMMM MMMM MMMM MMMM MMMM MMMM 这里S 代表符号位,1是负,0是正E 偏移127的幂,二进制阶码=(EEEEEEEE)-127.M 24位的尾数保存在23位中,只存储23位,最高位固定为1.此方法用最较少的位数实现了较高的有效位数,提高了精度. 零是一个特定值,幂是0 尾数也是0. 浮点数-12.5作为一个十六进制数0xC1480000保存在存储区中,这个值如下:地址 +0 +1 +2

基于MODBUS协议的单片机与(串口屏)触摸屏通信(图文)

导读:触摸屏能够直观.生动地显示运行参数和运行状态,而且通过触摸屏画面可以直接修改系统运行参数,人机交互性好.触摸屏和单片机通信,需要根据触摸屏采用的通信协议为单片机编写相应的通信程序.Modbus协议是美国Modicon公司推出的一种有效支持控制器之间以及控制器经由网络(例如以太网)和其它设备之间进行通信的协议.关键词:触摸屏,MCS-51单片机,Modbus协议,通信 在工业控制中经常需要观察系统的运行状态或者修改运行参数.触摸屏能够直观.生动地显示运行参数和运行状态,而且通过触摸屏画面可以

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

前言 本文将使用一个NuGet公开的组件技术来实现一个ModBus RTU的客户端,方便的对Modbus rtu的服务器进行读写,这个服务器可以是电脑端C#设计的,也可以是PLC实现的,也可以是其他任何支持这个通信协议的服务器. github地址:https://github.com/dathlin/HslCommunication 如果喜欢可以star或是fork,还可以打赏支持. 在Visual Studio 中的NuGet管理器中可以下载安装,也可以直接在NuGet控制台输入下面的指令安装

基于Modbus的C#串口调试开发

说明:本文主要研究的是使用C# WinForm开发的串口调试软件(其中包含Modbus协议相关操作).Modbus相关协议可以查阅百度文库等,可参考: <http://wenku.baidu.com/link?url=J-QZeQVLfvfZh7_lh8Qf0MdwANZuVjEoTqox6zJYrSnKyfgES2RTb_bjC5ZTn8-xgsuUAyiELRYVA3-3FBkBGywWhQ9YGoavJOzwB0IxTyK >. (1)先测试串口设置,发送和接收数据. (2)发送modb

基于树莓派的Linux串口编程_实现自发自收

串口是计算机上一种非常通用设备通信的协议,常用PC机上包含的是RS232规格的串口,具有连接线少,通讯简单,得到广泛的使用. Linux对所有设备的访问是通过设备文件来进行的,串口也是这样,为了访问串口,只需打开其设备文件即可操作串口设备.在linux系统下面,每一个串口设备都有设备文件与其关联,设备文件位于系统的/dev目录下面.如linux下的/ttyS0,/ttyS1分别表示的是串口1和串口2. 树莓派UART端口的位置:见下图的GPIO14(TXD).GPIO 15(RXD) 本文是基于