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

news2024/11/15 6:48:42

目录

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;
    
}

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

ansible学习

在物理机查看环境&#xff0c;[kioskfoundation0 ~]$ cat /etc/rht 先清空当前环境&#xff0c;[kioskfoundation0 ~]$ rht-clearcourse 0 再切换rh294环境&#xff0c;[kioskfoundation0 ~]$ rht-setcourse rh294 验证环境是否切换成功&#xff0c;[kioskfoundation0 ~]$ cat…

230617已安装SqlServer2017Express,再安装一个SqlServer2017ExpressAdvanced试试

再安装一个 MsSqlServer 试试 再安装一个 MsSqlServer 试试, 这次用高级版 之前已经安装了 一个 MsSqlServer2017Express一个MsSqlServer2017LocalDB 现在再安装一个 MsSqlServer2017ExpressAdvanced 直接下一步 等待 下个页面列出了已经安装的MsSqlServer实例 之前已…

【群智能算法改进】一种改进的白鲸优化算法 改进白鲸优化算法 改进后的EBWO[2]算法【Matlab代码#42】

文章目录 【获取资源请见文章第5节&#xff1a;资源获取】1. 原始BWO算法2. 改进后的EBWO算法2.1 准反向学习QOBL策略2.2 旋风觅食策略 3. 部分代码展示4. 仿真结果展示5. 资源获取 【获取资源请见文章第5节&#xff1a;资源获取】 1. 原始BWO算法 白鲸优化算法 (BWO&#xff…

STM32pwm 时钟 配置 周期 频率 关系配置原理

一 概念 PWM&#xff08;脉冲宽度调制&#xff09;是一种常用的电子信号调制技术&#xff0c;用于控制电子设备中的电平和电流。它通过调整脉冲的宽度来控制信号的平均功率。 在PWM信号中&#xff0c;一个周期由一个固定的频率确定&#xff0c;称为PWM频率。每个周期内&#…

分布式锁服务关键技术和常见解决方案

前言 锁&#xff0c;核心是协调各个使用方对公共资源使用的一种机制。当存在多个使用方互斥地使用某一个公共资源时&#xff0c;为了避免并行使用导致的修改结果不可控&#xff0c;需要在某个地方记录一个标记&#xff0c;这个标记能够被所有使用方看到&#xff0c;当标记不存在…

Matter.js 插件:matter-wrap(世界是圆的)

theme: smartblue 本文简介 点赞 关注 收藏 学会了 记得以前看爆笑校园里有一集讲到&#xff0c;一个人对着前面开了一枪&#xff0c;过了一阵子弹打中他自己的后脑勺。作者想通过这个冷笑话告诉大家一件事&#xff1a;地球是圆的。 在 Matter.js 世界里&#xff0c;默认是没…

stable-diffusion-webui远程访问、插件在线安装

本篇文章可以解决以下问题&#xff1a;stable-diffusion-webui 安装插件报错、没有用户登录安全认证、云主机安装后无法远程访问。 成功安装stable-diffusion-webui后&#xff0c;可以通过命令 bash webui.sh 启动。启动后可以通过 http://127.0.0.1:7860访问。但无法进行远程…

QML快速上手1 - 预备知识

目录 前言QtQuick 预备知识二维坐标系textimagemousearea组件定位元件布局项输入元素 前言 此笔记及后续所有笔记均基于如下环境 Qt Quick 2.12Qt 5.12 参考文献&#xff1a; qmlbook 以下所有笔记均从上述qmlbook中选取精华得来&#xff0c;如果嫌英文太多或者原文太长&am…

【论文系列解读】MiniGPT-4: 增强视觉语言理解与先进的大型语言模型

Minigpt4 MiniGPT-4: Enhancing Vision-Language Understanding with Advanced Large Language Models MiniGPT-4: 增强视觉语言理解与先进的大型语言模型 (0) 总结&实测 minigpt是先提出来的&#xff0c;将视觉编码器和LLM对齐&#xff0c;blip2和它还是有蛮大区别的。…

Python中对基本文件操作

1.文件的作用 保存数据放在磁盘中 2.打开文件 fopen(‘文件’,‘w’)或者fopen(‘文件’,‘r’) 3.文件操作 3.1 写数据(write) 如果文件不存在那么创建&#xff0c;如果存在那么就先清空&#xff0c;然后写入数据 对象open(“文件”,w) 对象.write&#xff08;“写入数…

论文浅尝 | 用于推荐的知识自适应对比学习

笔记整理&#xff1a;俞洪涛&#xff0c;浙江大学硕士&#xff0c;研究方向为知识图谱表示学习 链接&#xff1a;https://dl.acm.org/doi/10.1145/3539597.3570483 动机 在基于知识图谱的推荐系统中&#xff0c;用户和项目的交互信息通常会在模型中占主导地位&#xff0c;而KG中…

OPA Gatekeeper对Kubernetes资源操作限制

OPA介绍 Open Policy Agent&#xff08;OPA&#xff0c;发音为“oh-pa”&#xff09;是一个开源的通用策略引擎&#xff0c;它统一了堆栈中的策略执行。OPA 提供了一种高级声明性语言&#xff0c;可让您将策略指定为代码和简单的 API&#xff0c;以从您的软件中卸载策略决策制…

第七十六天学习记录:计算机硬件技术基础:Intel系列微处理器

Intel系列微处理器概述 8086/8088微处理器 8086/8088微处理器是英特尔公司于1978年推出的16位处理器&#xff0c;在80年代是个非常流行的芯片&#xff0c;被广泛用于个人电脑和工作站。它是x86家族处理器的一员&#xff0c;被视为现代PC体系结构的基础。 8086/8088微处理器的…

对耳朵伤害最小的耳机类型,列举几款不入耳的骨传导耳机

骨传导耳机是最近几年火爆起来的耳机&#xff0c;它是将声音转化为不同频率的机械振动&#xff0c;通过人的颅骨、骨迷路、内耳淋巴液、螺旋器、听神经、听觉中枢来传递声波。与普通耳机相比最大的区别是声音不经过外耳道&#xff0c;避免了耳道长时间堵塞导致的中耳炎疾病发生…

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

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

石化园区宽带自组网应急通信方案

痛点需求 传统的通信手段在可靠性、即时性、安全性、可视化等方面的能力相对较弱&#xff0c;无法从根本上满足石化园区的应急通信需求。结合某大型石化园区实际需求&#xff0c;现亟需建设一套高可靠、高安全、广覆盖、机动灵活且支持多媒体通信的应急通信系统&#xff0c;以…

阿里云建站主机之虚拟主机、轻量或云服务器ECS

阿里云搭建网站主机可以选择云服务器ECS、云虚拟主机或轻量应用服务器&#xff0c;轻量应用服务器2核2G3M带宽一年108元&#xff0c;2核4G4M带宽轻量服务器一年297.98元12个月&#xff0c;云服务器ECS可以选择通用算力型u1&#xff0c;云虚拟主机共享型119元一年起&#xff0c;…

大数据Doris(四十三):kafka 简单json格式数据导入到Doris

文章目录 kafka 简单json格式数据导入到Doris 一、创建 Doris 表 二、创建 Kafka topic 三、创建 Ro

AI实战营:生成模型+底层视觉+AIGC多模态 算法库MMagic

目录 环境安装 黑白照片上色 文生图-Stable Diffusion 文生图-Dreambooth 图生图-ControlNet-Canny 图生图-ControlNet-Pose 图生图-ControlNet Animation 训练自己的ControlNet 环境安装 mim install mmagicpip install opencv-python pillow matplotlib seaborn tqdm …

阿里二面:使用 Nacos 做注册中心怎么做优雅发布?

大家好&#xff0c;我是君哥。 今天来聊一聊使用 Nacos 做注册中心怎么做优雅发布。 跟其他的注册中心一样&#xff0c;Nacos 作为注册中心的使用如下图&#xff1a; Service Provider 启动后注册到 Nacos Server&#xff0c;Service Consumer 则从 Nacos Server 拉取服务列表…