Modbus通信介绍 网络高级工具使用

目录

Modbus简介

ModbusTCP协议格式

》1.报文头(共7字节)

》2.功能码

》3.数据

练习:读传感器数据,读1个寄存器数据,写出主从数据收发协议。

练习:写出控制IO设备开关的协议数据,操作1个线圈。

模拟器使用

windows的地址获取

1. 按下ctrl+r

2. 输入cmd运行

3. 输入ipconfig获取ip

4. 查看ip

ModbusSlave(从机)界面介绍

ModbusPoll(主机)界面介绍

salve和poll使用例

网络调试助手界面介绍

网路助手的测试

Wireshark的基础使用教程

1.在虚拟机写程序实现poll端功能,编写客户端实现和Slave通信

2. 编写客户端程序实现对Slave单个线圈的控制


Modbus简介

Modbus通信协议具有多个变种,其中有支持串口,以太网多个版本,其中最著名的是

Modbus RTU的特点:

  1. 运行在串口上的协议
  2. 采用二进制表示形式
  3. 紧凑的数据结构
  4. 通信效率高,应用广

Modbus ASCII的特点:

  1. 运行在串口上的协议
  2. 采用ASCII码传输
  3. 利用特殊字符作为字节开始和结束标志
  4. 传输数据低,只用传输数据量少的时候才考虑使用

Modebus TCP的特点:

运行在以太网上的协议

  1. 采用主从问答方式进行通信
  2. Modbus Tcp是应用层协议,基于传输层Tcp协议实现
  3. Modbus Tcp端口号默认是502

ModbusTCP协议格式

ModbusTcp协议包含三部分:报文头,功能码,数据

》1.报文头(共7字节)

组成事务处理符:2字节

可以理解为报文的序列号,一般每次通信之后就要加1以区别不同的通信数据报文

协议标识符:2字节

00 00表示Modbus TCP协议(一般不改变)

长度:2字节

表示接下来的字节长度,单位字节

单元标识符:1字节

串行链路或其他,总线上连接的远程从站地址

》2.功能码

先了解寄存器

包含四种寄存器

  1. 线圈
    1. 位寄存器(每个寄存器数据占1字节)
    2. 主要用于控制IO设备
    3. 线圈寄存器,类比为开关量
    4. 一个byte就可以同时控制8路的信号
    5. 可读可写,写分为写单个写多个
    6. 共三种状态:读,写单个,写多个
  1. 离散量输入
    1. 位寄存器(每个寄存器数据占1字节)
    2. 主要用于控制IO设备
    3. 线圈寄存器的只读模式
    4. 只有一种状态:只能读
  1. 保持寄存器
    1. 字寄存器(每个寄存器数据占2个字节)
    2. 存储工业设备的值
    3. 可读可写,写分为写单个写多个
    4. 共三种状态:读,写单个,写多个
  1. 输入寄存器
    1. 字寄存器(每个寄存器数据占2个字节)
    2. 存储工业设备的值
    3. 只有一种状态:只能读

功能码详表:

》3.数据

数据格式可以看下面分享

实例分享 | ModbusTCP报文详解

字寄存器:

位寄存器:

练习:读传感器数据,读1个寄存器数据,写出主从数据收发协议。

从机给主机回复:0x0000 0000 0005 01 03 02 0012

解析:

0x0000事务处理标识符

0000 协议类型

0006 字节长度

01 从机ID(单元标识符)

03 功能码

02 字节计数

0012 数据长度

练习:写出控制IO设备开关的协议数据,操作1个线圈。

主机给从机:

0x0000 0x0000 0x0006 0x01 0x05 0x000b 0xFF00

从机给主机:

0x0000 0x0000 0x0006 0x01 0x05 0x000b 0xFF00

模拟器使用

windows的地址获取

1. 按下ctrl+r

2. 输入cmd运行

3. 输入ipconfig获取ip

4. 查看ip

ModbusSlave(从机)界面介绍

模拟的是实际的控制设备,相当于服务器端,用于响应主机的请求。

ModbusPoll(主机)界面介绍

模拟的是主机,相当于客户端

salve和poll使用例

网络调试助手界面介绍

网路助手的测试

》1.协议分析

网络助手需要用到下面的协议

00 00 00 00 00 06 01 06 00 01 00 01

这串协议的意思是向主机号为01的0001地址写入0001值

我们可以使用网络助手进行验证

》2.slave(从机相当于服务器)设置

》3.网络调试助手设置

》4.开始通信测试

Wireshark的基础使用教程

先将双方建立通信

输入ip.addr == 192.168.8.140后,按下enter键

然后用网络调试助手给slave发送数据,wireshark就抓到数据了

对抓到的数据进行基础分析

注:wireshark在嵌入式领域中并不常用,上面操作只是单纯为了抓包而抓包

1.在虚拟机写程序实现poll端功能,编写客户端实现和Slave通信

//练习1
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/socket.h>
#include <arpa/inet.h>
 #include <unistd.h>
#define MY_PORT 502
#define MY_ADDRESS "192.168.8.140" //根据自己情况输入


enum num{
    Length =0x06,//长度
    Unitid =0x01,//单元标识
    Fucode =0x03,//功能码
    Flowad =0x00,//起始寄存器高位
    Fhigad =0x00,//起始寄存器低位
    NUMlow =0x00,//数量高位
    NUMhig =0x01//数量低位
};

int main(int argc, char const *argv[])
{
     uint8_t buf[12]={0x00};
    //1.创建套接子
    int sockid;
    sockid = socket(AF_INET, SOCK_STREAM, 0);
    if (sockid < 0)
    {
        perror("socket err.");
        return -1;
    }
    //2.填充结构提
    struct sockaddr_in caddr;
    memset(&caddr,0,sizeof(caddr));
    caddr.sin_family = AF_INET;
    caddr.sin_port = ntohs(MY_PORT);
    caddr.sin_addr.s_addr = inet_addr(MY_ADDRESS);

    //3.connect链接服务器
    int conid = connect(sockid, (struct sockaddr *)&caddr, sizeof(caddr));
    if (conid < 0)
    {
        perror("connect err");
        return -1;
    }
    //4.发送消息
    buf[5]=Length;//长度
    buf[6]=Unitid;//单元标识
    buf[7]=Fucode;//功能码
    buf[8]=Flowad;//起始寄存器高位
    buf[9]=Fhigad;//起始寄存器低位
    buf[10]=NUMlow;//数量高位
    buf[11]=NUMhig;//数量低位

    int sendid = send(sockid, buf, sizeof(buf), 0);
    if (sendid < 0)
    {
        perror("send err.");
        return -1;
    }
    int recid = recv(sockid, buf, sizeof(buf), 0);
    if (recid < 0)
    {
        perror("recv err.");
        return -1;
    }
    for (int i = 0; i < sizeof(buf)-1; i++)
    {
        printf("%02x  ", buf[i]);
    }
    close(sockid);
    return 0;
}

开启slave端链接

读到值为0x14,对用十进制是20

2. 编写客户端程序实现对Slave单个线圈的控制

//练习2
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/socket.h>
#include <arpa/inet.h>
 #include <unistd.h>

#define MY_PORT 502
#define MY_ADDRESS "192.168.8.140"

struct Coil{ 
    uint8_t  Length;//长度
    uint8_t  Unitid;//单元标识
    uint8_t  Fucode;//功能码
    uint8_t  CoilHeight;//线圈地址(高位)
    uint8_t  CoilLow;//线圈地址(低位)
    uint8_t  DisMkHeight;//断通标志
    uint8_t  DisMkLow;//断通标志
};

struct Coil num={0x06,0x01,0x05,0x00,0x00,0xff,0x00};

int main(){

    uint8_t	buf[12]={0x00};

    int sockfd=socket(AF_INET,SOCK_STREAM,0);
    if (sockfd<0)
    {
        perror("socket err.");
        return -1;
    }

    struct sockaddr_in caddr;
    memset(&caddr,0,sizeof(caddr));
    caddr.sin_family=AF_INET;
    caddr.sin_port=ntohs(MY_PORT);
    caddr.sin_addr.s_addr=inet_addr(MY_ADDRESS);

    int conid=connect(sockfd,(struct sockaddr*)&caddr,sizeof(caddr));
    if (conid<0)
    {
        perror("connect err.");
        return -1;
    }

     //4.发送消息
    buf[5]=num.Length;//长度
    buf[6]=num.Unitid;//单元标识
    buf[7]=num.Fucode;//功能码
    buf[8]=num.CoilHeight;//线圈地址(高位)
    buf[9]=num.CoilLow;//线圈地址(低位)
    buf[10]=num.DisMkHeight;//断通标志
    buf[11]=num.DisMkLow;//断通标志

    int sendid = send(sockfd, buf, sizeof(buf), 0);
    if (sendid < 0)
    {
        perror("send err.");
        return -1;
    }
    int recid = recv(sockfd, buf, sizeof(buf), 0);
    if (recid < 0)
    {
        perror("recv err.");
        return -1;
    }
    for (int i = 0; i < sizeof(buf); i++)
    {
        printf("%02x  ", buf[i]);
    }
    printf("\n");
    close(sockfd);
    return 0;
    
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/29359.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【2】Midjourney注册

随着AI技术的问世&#xff0c;2023年可以说是AI爆炸性成长的一年&#xff0c;近期最广为人知的AI服务除了chatgpt外&#xff0c;就是从去年五月就已经问世的AI绘画工具mid journey了。 ▲几个AI工具也代表了人工智能的热门阶段 只要输入一段文字&#xff0c;AI就会根据语意计算…

JAVA如何学习爬虫呢?

学习Java爬虫需要掌握以下几个方面&#xff1a; Java基础知识&#xff1a;包括Java语法、面向对象编程、集合框架等。 网络编程&#xff1a;了解HTTP协议、Socket编程等。 HTML、CSS、JavaScript基础&#xff1a;了解网页的基本结构和样式&#xff0c;以及JavaScript的基本语…

Web网页制作期末复习(1)——HTML5介绍、HTML5的DOCTYPE声明、HTML基本骨架、标题标签、段落 换行、水平线图片图片路径、超链接

目录 HTML5介绍 HTML5的DOCTYPE声明 HTML基本骨架 标题标签 段落、换行、水平线 图片 图片路径* 超链接 HTML5介绍 HTML5是用来描述网页的一种语言&#xff0c;被称为超文本标记语言。用HTML5编写的文件&#xff0c;后缀以.html结尾 HTML是一种标记语言&#xff0c;标…

基于机器学习算法:朴素贝叶斯和SVM 分类-垃圾邮件识别分类系统(含Python工程全源码)

目录 前言总体设计系统整体结构图系统流程图 运行环境Python 环境安装pytesseract注册百度云账号 模块实现1. 数据模块2. 模型构建3. 附加功能 系统测试1. 文字邮件测试准确率2. 网页测试结果 工程源代码下载其它资料下载 前言 本项目采用朴素贝叶斯和支持向量机&#xff08;S…

MySQL-SQL视图详细

♥️作者&#xff1a;小刘在C站 ♥️个人主页&#xff1a; 小刘主页 ♥️努力不一定有回报&#xff0c;但一定会有收获加油&#xff01;一起努力&#xff0c;共赴美好人生&#xff01; ♥️学习两年总结出的运维经验&#xff0c;以及思科模拟器全套网络实验教程。专栏&#xf…

原型模式(七)

不管怎么样&#xff0c;都要继续充满着希望 上一章简单介绍了抽象工厂模式(六), 如果没有看过,请观看上一章 一. 原型模式 引用 菜鸟教程里面的原型模式介绍: https://www.runoob.com/design-pattern/prototype-pattern.html 原型模式&#xff08;Prototype Pattern&#xf…

Camera | 11.瑞芯微摄像头采集图像颜色偏绿解决笔记

前言 在实际调试基于瑞芯微平台的camera过程中&#xff0c;发现显示的图片发绿&#xff0c; 现在把调试步骤分享给大家&#xff1a; 1、修改iq文件 sdk中位置&#xff1a; external/camera_engine_rkaiq/iqfiles/isp21/ov13850_ZC-OV13850R2A-V1_Largan-50064B31.xml【现在…

QT基础教程之一创建Qt项目

QT基础教程1创建Qt项目 根据模板创建 打开Qt Creator 界面选择 New Project或者选择菜单栏 【文件】-【新建文件或项目】菜单项 弹出New Project对话框&#xff0c;选择Qt Widgets Application 选择【Choose】按钮&#xff0c;弹出如下对话框 设置项目名称和路径&#xff0c;…

javaScript蓝桥杯---用什么来做计算

目录 一、介绍二、准备三、目标四、代码五、完成 一、介绍 古以算盘作为计算工具。算盘常为木制矩框&#xff0c;内嵌珠子数串&#xff0c;定位拨珠&#xff0c;可做加减乘除等运算。站在前人的肩膀上&#xff0c;后人研究出计算器&#xff0c;便利了大家的生活&#xff0c;我…

element-plus布局排版问题总结(更新ing)

文章目录 el-container空隙修改app组件 el-header容器空隙检查前端修改el-headerel-container el-container空隙 源码-更改了容器的显示&#xff0c;占满屏幕 <template><div class"common-layout"><el-container><el-header><el-row cl…

SpeechGen:用提示解锁语音语言模型(Speech LM)的生成能力

论文链接&#xff1a; https://arxiv.org/pdf/2306.02207.pdf Demo: https://ga642381.github.io/SpeechPrompt/speechgen.html Code: https://github.com/ga642381/SpeechGen 引言与动机 大型语言模型 &#xff08;LLMs&#xff09;在人工智能生成内容&#xff08;AIGC…

微服务技术简介

微服务技术简介 服务架构的演变微服务架构的常见概念微服务常见的解决方案Spring CloudSpring Cloud Alibaba微服务技术对比常用的微服务组件 微服务架构图 服务架构的演变 单体架构&#xff1a;当一个系统业务量很小的时候&#xff0c;将业务的所有功能集中在一个项目中开发&…

STM32速成笔记—串口通信

文章目录 一、什么是串口通讯二、串口通讯有什么用三、STM32的串口通信四、串口通信相关概念4.1 波特率4.2 全双工和半双工4.3 同步通信和异步通信 五、硬件连接六、串口通讯程序配置6.1 使能串口时钟和GPIO时钟6.2 初始化GPIO6.3 初始化串口参数6.4 使能串口6.5 串口接收中断6…

用python写网络爬虫

第二章 数据抓取 首先 &#xff0c; 我们会介绍一个叫 做Firebug Lite 的浏览器扩展&#xff0c; 用 于检查网页 内容 &#xff0c; 如 果你有一些网络开发背景的话&#xff0c; 可能 己经对该扩展十分熟悉 了 。 然后 &#xff0c;我们会介绍三 种抽取网 页数据的 方法 &…

java【抽象类与接口】

抽象类与接口 1 抽象类1.1 定义与使用1.2 抽象类和抽象方法使用原则 2 接口2.1 定义2.2 使用规则 3. JDK中内置接口3.1 Comparable接口3.2 Cloneable接口 抽象类与接口的对比 前言&#xff1a;如果强制要求子类必须覆写一些方法&#xff0c;则就会用到抽象类和抽象方法 1 抽象类…

使用 MATLAB 进行气象激光雷达图像分析(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

STM32——01-开发软件Keil5及STM32CubeMX的安装

1.1开发环境的安装 编程语言&#xff1a;C语言 需要安装的软件有两个&#xff1a;Keil5和STM32CubeMX 安装 安装包&#xff08;不需要太新&#xff0c;以 MDK324 为例&#xff0c;最新的 MDK327 有问题&#xff09; 安装过程一路下一步即可&#xff08;建议不要安装在 C …

2023-06-09:什么是Redis事务?原理是什么?

2023-06-09&#xff1a;什么是Redis事务&#xff1f;原理是什么&#xff1f; 答案2023-06-09&#xff1a; Redis中的事务是以一组命令的形式出现的&#xff0c;这些命令被认为是最小的执行单位。事务可以保证在一个单独独立的隔离操作中执行所有命令&#xff0c;而且所有命令…

深度研究微软的资产负债表和财务状况以及未来投资价值

来源&#xff1a;猛兽财经 作者&#xff1a;猛兽财经 微软股票的关键指标 猛兽财经认为&#xff0c;微软公布的2023财年第三季度财务业绩&#xff0c;有三个关键指标值得投资者关注。 第一个关键指标是利息收入。微软的利息收入目前已经同比增长了44%&#xff0c;从2022财年第…

从搭建hadoop开始学习大数据中分而治之的MapReduce(伪集群模式)

环境准备 首先需要将如下四个必要的文件下载到计算机&#xff08;已经附上了下载地址&#xff0c;点击即可下载&#xff09;。 Vmware Workstation 17.x 【官方的下载地址】 CentOS-7-x86_64-Minimal-2009【阿里云镜像站下载地址】 openjdk-8u41-b04-linux-x64-14_jan_2020【开…