美文网首页
java modbus协议

java modbus协议

作者: 浪人残风 | 来源:发表于2021-05-04 17:51 被阅读0次

概念

Modbus是一种串行通信协议,Modbus协议目前存在用于串口、以太网以及其他支持互联网协议的网络的版本。
大多数Modbus设备通信通过串口EIA-485物理层进行。

通讯格式

地址域 功能码 数据 CRC校验(低字节在前)
1字节 1字节 N字节 2字节

在单片机硬件通讯串口行业,很多厂家都把485串口参数设置为:
波特率9600,无奇偶校验,1停止位

功能码说明

实际用途中常用的功能码有:

  • 0x03用来读取单片机寄存器的数据
  • 0x06用来给单片机写入数据
功能码0x03:读单个或多个保持寄存器
设备地址(1字节) 功能码(1字节) 寄存器起始地址(2字节) 寄存器数量(2字节) CRC校验(2字节)
XX 03 XX XX XX XX XX XX

响应:

设备地址(1字节) 功能码(1字节) 数据长度(2字节) 数据(N字节) CRC校验(2字节)
XX 03 XX XX N字节 XX XX

示例
查询设备类型

设备地址(1字节) 功能码(1字节) 数据长度(2字节) 数据(N字节) CRC校验(2字节)
01 03 00 01 00 01 D5 CA

查询设备类型响应

设备地址(1字节) 功能码(1字节) 数据长度(2字节) 数据(N字节) CRC校验(2字节)
01 03 02 00 21 78 5C
功能码0x06:写单个寄存器
设备地址(1字节) 功能码(1字节) 寄存器地址(2字节) 数据(N字节) CRC校验(2字节)
XX 06 XX XX N字节 XX XX

响应:

设备地址(1字节) 功能码(1字节) 寄存器地址(2字节) 数据(N字节) CRC校验(2字节)
XX 06 XX XX N字节 XX XX

示例
写数据

设备地址(1字节) 功能码(1字节) 寄存器地址(2字节) 数据(N字节) CRC校验(2字节)
01 06 00 14 00 00 C9 CE

Java版modbus协议代码:

package com.wrs.project.modbus;


import java.util.ArrayList;
import java.util.List;

public class ModbusUtils {

    /**
     * 读指令
     * @param deviceAddress 设备地址
     * @param registerAddress 寄存器起始地址
     * @param registerCount 寄存器个数
     * @return
     */
    public static byte[] getReadModbus(int deviceAddress, int registerAddress, int registerCount) {
        int registerLow = registerAddress & 0xFF;
        int registerHigh = registerAddress >>> 8;
        int countLow = registerCount & 0xFF;
        int countHigh = registerCount >>> 8;
        int[] data = new int[]{registerHigh, registerLow, countHigh, countLow};
        byte[] sendData = getModbusData(deviceAddress, 0x03, data);
        return sendData;
    }

    /**
     * 写指令
     * @param deviceAddress 设备地址
     * @param registerAddress 寄存器起始地址
     * @param writeData 寄存器个数
     * @return
     */
    public static byte[] getWriteModbus(int deviceAddress, int registerAddress, int[] writeData) {
        int registerLow = registerAddress & 0xFF;
        int registerHigh = registerAddress >>> 8;
        int[] data = new int[writeData.length + 2];
        data[0] = registerHigh;
        data[1] = registerLow;
        for (int i = 0; i < writeData.length; i ++) {
            data[i + 2] = writeData[i];
        }
        byte[] sendData = getModbusData(deviceAddress, 0x06, data);
        return sendData;
    }

    public static List<Byte> isValidModbusResponseData(List<Byte> list) {
        if (null != list && list.size() >= 4) {
            int size = list.size();
            int leng = ByteUtils.byteToInt(list.get(2));
            int totalSize = leng + 5;
            if (size < totalSize) {
                return null;
            }
            List tempList = list.subList(0, totalSize - 2);
            byte[] tempData = ArrayUtils.listTobyte(tempList);
            int crc = CRCUtils.getCRC(tempData);
            int low = crc & 0xFF;
            int high = crc >>> 8;
            byte lowData = list.get(totalSize - 2);
            byte hightData = list.get(totalSize - 1);
            if (low == ByteUtils.byteToInt(lowData) && high == ByteUtils.byteToInt(hightData)) {
                return list.subList(0, totalSize);
            } else {
                return null;
            }
        } else {
            return null;
        }
    }

    public static byte[] getModbusData(int address, int function, int[] data) {
        int leng = 2;
        if (null != data) {
            leng += data.length;
        }
        byte[] tempData = new byte[leng];
        tempData[0] = ByteUtils.intToByte(address);
        tempData[1] = ByteUtils.intToByte(function);
        if (null != data) {
            for (int i = 0; i < data.length; i++) {
                tempData[i + 2] = ByteUtils.intToByte(data[i]);
            }
        }
        int crc = CRCUtils.getCRC(tempData);
        int low = crc & 0xFF;
        int high = crc >>> 8;
        List list = new ArrayList();
        list.addAll(ArrayUtils.byteToList(tempData));
        list.add(ByteUtils.intToByte(low));
        list.add(ByteUtils.intToByte(high));
        return ArrayUtils.listTobyte(list);
    }
}

项目源码下载

相关文章

  • java modbus协议

    概念 Modbus是一种串行通信协议,Modbus协议目前存在用于串口、以太网以及其他支持互联网协议的网络的版本。...

  • Modbus 通讯开发资料总结

    1 主要内容 Modbus 通讯协议简介 Modbus 开发常用测试软件和库 2 Modbus协议是什么?Modb...

  • MODBUS RTU协议理解

    一、MODBUS 工业上常用的一种串口通讯协议,协议包括RTU、TCP、ASCII;其中MODBUS RTU协议最...

  • python 玩转 modbus

    modbus_tk :完整modbus协议栈的实现,支持modbus tcp/rtu{1.提供slave模拟器,即...

  • 气象站 DTU 格式 modbus 协议说明

    气象站DTU实现协议 标签: Modbus 气象站 Modbus RTU协议说明 设备号:01波特率:9600 设...

  • 【原创】CSerialPort实现Modbus协议串口编程

    ModBus协议 Modbus协议是一种标准的工业控制通讯协议,无论是串口通讯,以太网通讯还是CAN通讯,在数据层...

  • MODBUS协议

    读寄存器数据(功能码0x03) 请求数据格式:id(一个字节)|功能码(一个字节)|起始地址(两个字节)|寄存器数...

  • Modbus协议

    一、Modbus 协议简介 Modbus 协议是应用于电子控制器上的一种通用语言。通过此协议,控制器相互之间、控制...

  • modbus协议

    一、介绍Modbus是20世纪70年代后期由Modicon(现为施耐德电气)为了配合其可编程逻辑控制器(PLC)一...

  • Modbus协议和应用开发介绍

    因业务需要了解Modbus协议的使用,因此对Modbus的协议,以及相应的C#处理应用进行了解,针对协议的几种方式...

网友评论

      本文标题:java modbus协议

      本文链接:https://www.haomeiwen.com/subject/cazcdltx.html