2018-07-27  4tr  转自 会飞的李小浩

修改微信分享:

扫盲:什么是modbus?

Modbus是由Modicon(现为施耐德电气公司的一个品牌)在1979年发明的,是全球第一个真正用于工业现场的总线协议

Modbus协议是应用于电子控制器上的一种通用语言。通过此协议,控制器相互之间、控制器经由网络(例如以太网)和其它设备之间可以通信。它已经成为一种通用工业标准。有了它,不同厂商生产的控制设备可以连成工业网络,进行集中监控。此协议定义了一个控制器能认识使用的消息结构,而不管它们是经过何种网络进行通信的。它描述了一个控制器请求访问其它设备的过程,如何回应来自其它设备的请求,以及怎样侦测错误并记录。它制定了消息域格局和内容的公共格式。

modbus本身就是一个通信协议,可以基于串口,也可以基于网口,基于串口的有RTU;基于网口的有TCP,默认端口号为502,通常我们把服务器端作为主站,将带有modbus模块的设备作为从站处理。利用modbus从寄存器中读取或写入数据

modbus功能码参照表:

请求报文案例:

主站向从站发送请求报文:01 03 00 01 00 02 95 CB

01代表设备地址

03代表功能码(读取保存寄存器的值)

00 01代表采集点对应的寄存器号

00 02代表读取两个连续寄存器的值

95 CB代表01 03 00 01 00 02计算多得的CRC校验值

从站向主站放回的数据报文:01 03 04 00 00 00 00 FA 33 

01代表设备地址

03代表功能码(读取保存寄存器的值)

04代表设备返回的数据个数(单位为字节)

00 00 00 00代表为数据返回的连续两个寄电器的数据

FA 33代表01 03 04 00 00 00 00计算所得的CRC校验码

最后向大家推荐一款modbus从站虚拟机,可以用做测试【ModbusSlave.exe】

从站虚拟机测试案例:

提供一个读取及写入的工具类:

依赖jar包:commons-codec-1.6.jar         modbus4J.jar         seroUtils.jar

package com.hxz.mdbus;

import com.serotonin.modbus4j.ModbusFactory;
import com.serotonin.modbus4j.ModbusMaster;
import com.serotonin.modbus4j.exception.ModbusInitException;
import com.serotonin.modbus4j.exception.ModbusTransportException;
import com.serotonin.modbus4j.ip.IpParameters;
import com.serotonin.modbus4j.msg.ModbusRequest;
import com.serotonin.modbus4j.msg.ModbusResponse;
import com.serotonin.modbus4j.msg.ReadHoldingRegistersRequest;
import com.serotonin.modbus4j.msg.WriteRegistersRequest;
import com.serotonin.modbus4j.msg.WriteRegistersResponse;
import com.serotonin.util.queue.ByteQueue;

public class ReadAWriteUtil {

/**
     * 批量写数据到保持寄存器
     * @param ip 从站IP
     * @param port modbus端口
     * @param slaveId 从站ID
     * @param start 起始地址偏移量
     * @param values 待写数据
     */
    public static void modbusWTCP(String ip, int port, int slaveId, int start, short[] values) {  
        ModbusFactory modbusFactory = new ModbusFactory();  
        // 设备ModbusTCP的Ip与端口,如果不设定端口则默认为502  
        IpParameters params = new IpParameters();  
        params.setHost(ip); 
        // 设置端口,默认502 
        if (502 != port) {  
            params.setPort(port);  
        } 
        ModbusMaster tcpMaster = null;  
        // 参数1:IP和端口信息 参数2:保持连接激活  
        tcpMaster = modbusFactory.createTcpMaster(params, true);  
        try {  
            tcpMaster.init();  
            System.out.println("=======初始化成功========");  
        } catch (ModbusInitException e) {  
             System.out.println("初始化异常");  
        }  
        try {  
            WriteRegistersRequest request = new WriteRegistersRequest(slaveId, start, values);  
            WriteRegistersResponse response = (WriteRegistersResponse) tcpMaster.send(request);  
            if (response.isException()){
                System.out.println("Exception response: message=" + response.getExceptionMessage());
            }else{
                System.out.println("Success");
            }     
        } catch (ModbusTransportException e) {  
            e.printStackTrace();  
        } 
    }  
     
    
    /**
     * 读保持寄存器上的内容
     * @param ip 从站IP
     * @param port modbus端口
     * @param start 起始地址偏移量
     * @param readLenth 待读寄存器个数
     * @return
     */
    public static ByteQueue modbusTCP(String ip, int port, int start,int readLenth) {  
        ModbusFactory modbusFactory = new ModbusFactory();  
        // 设备ModbusTCP的Ip与端口,如果不设定端口则默认为502  
        IpParameters params = new IpParameters();  
        params.setHost(ip);
        //设置端口,默认502
        if(502!=port){
            params.setPort(port);
        }  
        ModbusMaster tcpMaster = null;  
        tcpMaster = modbusFactory.createTcpMaster(params, true);  
        try {  
            tcpMaster.init();  
            System.out.println("========初始化成功=======");  
        } catch (ModbusInitException e) {  
            return null;  
        }  
        ModbusRequest modbusRequest=null;  
        try {  
            //功能码03   读取保持寄存器的值
            modbusRequest = new ReadHoldingRegistersRequest(1, start, readLenth);  
        } catch (ModbusTransportException e) {  
            e.printStackTrace();  
        }  
        ModbusResponse modbusResponse=null;  
        try {  
            modbusResponse = tcpMaster.send(modbusRequest);  
        } catch (ModbusTransportException e) {  
            e.printStackTrace();  
        }  
        ByteQueue byteQueue= new ByteQueue(1024);  
        modbusResponse.write(byteQueue); 
        System.out.println("功能码:"+modbusRequest.getFunctionCode());  
        System.out.println("从站地址:"+modbusRequest.getSlaveId());  
        System.out.println("收到的响应信息大小:"+byteQueue.size());
        System.out.println("收到的响应信息值:"+byteQueue);  
        return byteQueue;  
    }
}

java借助modbus协议实现与设备的通讯,收发信息,实现对设备信息的采集相关推荐

  1. java 借助modbus协议实现与硬件之间的通讯

    首先咱们先讲一下通讯的基础知识: 通讯有模拟通讯和数字通讯,数字量通讯传输的是二进制脉冲信号,抗干扰能力强,数字量信号加密比较安全. 模拟量通讯:比如广播,发送的是一种波,收音机收到广播之后,进行解调 ...

  2. java netty modbus协议接收iot数据

    IoTserver 源代码开源在gitee上 : IoT netty java gitee server sample c++ libuv 的IoT tcp server IoT c++ libuv ...

  3. java modbus协议

    概念 Modbus是一种串行通信协议,Modbus协议目前存在用于串口.以太网以及其他支持互联网协议的网络的版本. 大多数Modbus设备通信通过串口EIA-485物理层进行. 通讯格式 地址域 功能 ...

  4. 协议篇之Modbus协议入门

    目录 引言 Modbus协议介绍 1.Modbus协议是不是开源的,免费的? 2.怎么传输,有线还是无线? 3.Modbus的数据格式? 4.Modbus和RS485什么关系? 5.什么是主从机? 6 ...

  5. Modbus教程| Modbus协议,ASCII和RTU帧,Modbus工作

    转载自:https://www.rfwireless-world.com/Tutorials/Modbus-Protocol-tutorial.html 这个Modbus教程涵盖了modbus协议基础 ...

  6. 串行通信 - Modbus协议

    Modbus协议采用的是主-从通信模式. Modbus协议主要有Modbus RTU.Modbus ASCII和Modbus TCP三种.前两者均支持RS-485总线协议.其中RTU采用二进制数据表达 ...

  7. STM32 —— Modbus 协议

    STM32 -- Modbus 协议 Modbus 协议简介 Modbus 是一种串行通信协议,由于其协议简单易用,且没有版权要求,目前已经成为工业领域通信协议的实时标准.ModBus 协议是又施耐德 ...

  8. IEC104协议规约通过工业智能网关(协议转换器)转换modbus协议?

    电力系统IEC104规约是国家电网公司制定的调度接入网络通信规约,目前在电力系统中应用广泛.IEC104 一般用于调度主站与变电站之间或者不同系统之间的网络数据通信. Modbus协议目前成为工控行业 ...

  9. Modbus 协议与 ESP-Modbus-DTU 工业物联网方案介绍

    Modbus 协议与 ESP-Modbus-DTU 工业物联网方案介绍 目录 1. Modbus 协议概述 2. 乐鑫 ESP-IDF 中对 Modbus 协议的支持 3. 乐鑫 ESP-Modbus ...

最新文章

  1. 博客非100%原创,在学习道路上,我一直站在别人肩上
  2. spring基于纯注解的声明式事务控制
  3. 比较两个数的大小,自定义比较两个整数的大小的方法
  4. 阿里云爬虫风险管理产品商业化,为云端流量保驾护航 1
  5. PixiJS学习(9)动画序列帧
  6. ## 7.1 奇异值分解SVD和对称矩阵谱分解
  7. 信息系统服务器维护,信息系统运行维护服务方案(IT运维服务方案)-20210729025444.pdf-原创力文档...
  8. 亲民地理第39期-佛山(2)南风古灶
  9. 如何将成绩用C语言分,如何利用C语言实现简单的分数化简
  10. 【专题5:硬件设计】 之 【50.运算放大器详解b - 负反馈电路、正反馈电路和共模干扰】
  11. win10查看服务器共享文件夹,Win10怎么样查看共享文件夹
  12. win7快速启动栏计算机,win7快速启动栏,教您Win7如何添加快速启动栏
  13. 华盛顿大学华人团队进入微软Imagine Cup总决赛!
  14. 京东疯狂月薪36k程序员最新Java面试题(常见面试题及答案汇总)
  15. 帆软通过js删除数据库表中的数据
  16. 请问现在好多抖音巨量广告落地页pages.tmall.com的页面如何生成
  17. 乐高收割机器人_乐高机器人制作~~农场收割机
  18. java软件工程师自我评价_java软件工程师自我评价简历范文
  19. 处理射手网字幕,方便打印
  20. 苹果x电池容量_苹果iPhone X电池老化严重:越来越多用户收到性能劣化影响

热门文章

  1. 录音软件-MAGIX Samplitude Pro X5 Suite v16.0.0.25 x64 WiN
  2. WordXML格式初步分析
  3. Excel冻结窗口_首行锁定
  4. 第二篇 SpringBoot 2 x中使用JdbcTemplate
  5. Mac OS X系统偏好设置某些功能点不动(灰色)的解决方法
  6. 用好Word模板 提高Word操作效率(转)
  7. 基于java平台的车险理赔管理系统
  8. 有哪些你看了以后大呼过瘾的数据分析书?
  9. 1年工作经验的一个初中学历程序员的感悟
  10. Javaweb (jsp)课程设计(电子设备管理系统)