嵌入式学习-网络高级-Day01

server/2024/11/13 14:28:58/

嵌入式学习-网络高级-Day01

【1】Modbus协议

起源

分类

优势

应用场景

【2】Modbus TCP

特点

组成

报文头:7个字节

寄存器(存储数据)

功能码

总结

练习

【3】工具安装

Modbus Slave、Poll安装

网络调试助手

wireshark

练习

【1】Modbus协议

起源

Modbus由Modicon公司于1979年开发,是全球第一个真正用于工业现场的总线协议

在中国,Modbus 已经成为国家标准,并有专业的规范文档,感兴趣的可以去查阅相关的文件,详情如下:标准编号为:GB/T19582-2008文件名称:《基于 Modbus 协议的工业自动化网络规范》

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

其中Modbus TCP是在施耐德收购Modicon后1997年发布的。

分类

1)Modbus RTU

运行在串口上的协议,采用二进制表现形式以及紧凑的数据结构,通信效率较高,应用比较广泛

2)Modbus ASCII

运行在串口上的协议,采用ASCII码进行传输,并且每个字节的开始和结束都有特殊字符作为标志,传输效率远远低于Modbus RTU,一般只有通讯量比较少时才会考虑它。

3)Modbus TCP

是一种基于以太网的协议,使用 TCP/IP 协议栈进行通信。它使用以太网帧作为数据传输的封装,通过 IP 地址和端口号来标识设备

优势

简单、免费、容易使用

应用场景

Modbus协议是现在国内工业领域应用最多的协议,不只PLC设备,各种终端设备,比如水控机、水表、电表、工业秤、各种采集设备

【2】Modbus TCP

特点

1.遵循主从问答的形式通信。(主从问答:采集信息,控制)

(主问------从答(247)0:广播 1-247:从机 248-255:保留)

2.Modbus TCP协议是应用层协议,基于传输层TCP通信

3.Modbus TCP的默认端口号为502

组成

Modbus TCP协议包含三部分:报文头、功能码、数据

报文头有7个字节,功能码有1个字节,Modbus TCP协议最大数据帧长度为260个字节,数据最多为252个字节。

报文头:7个字节

事务处理标识符:序列号没有限制,主机发什么,从机回什么

协议标识符:0x0000正好是两个字节

长度:接下来的字节长度

单元标识符:从机标识(从机id)

寄存器(存储数据)

Modbus TCP通过寄存器的方式存储数据。

一共有四种类型的寄存器,分别是:离散量输入、线圈、输入寄存器、保持寄存器。

1) 离散量和线圈其实就是位寄存器(每个寄存器数据占1字节),工业上主要用于控制IO设备。

线圈寄存器,类比为开关量,每一个bit都对应一个信号的开关状态。所以一个byte就可以同时控制8路的信号。比如控制外部8路io的高低。 线圈寄存器支持读也支持写,写在功能码里面又分为写单个线圈寄存器和写多个线圈寄存器。

对应上面的功能码也就是:0x01 0x05 0x0f

离散输入寄存器,离散输入寄存器就相当于线圈寄存器的只读模式,他也是每个bit表示一个开关量,而他的开关量只能读取输入的开关信号,是不能够写的。比如我读取外部按键的按下还是松开。

所以功能码也简单就一个读的 0x02

2) 输入和保持寄存器是字寄存器(每个寄存器数据占2个字节),工业上主要用于存储工业设备的值。

保持寄存器,这个寄存器的单位不再是bit而是两个byte,也就是可以存放具体的数据量的,并且是可读写的。比如我我设置时间年月日,不但可以写也可以读出来现在的时间。写也分为单个写和多个写

所以功能码有对应的三个:0x03 0x06 0x10

输入寄存器,这个和保持寄存器类似,但是也是只支持读而不能写。一个寄存器也是占据两个byte的空间。类比我我通过读取输入寄存器获取现在的AD采集值

对应的功能码也就一个 0x04

功能码

15(十进制)转换为十六进制:0x0f

16(十进制)转换为十六进制:0x10

寄存器PLC地址和寄存器的对应关系:

00001-09999:线圈

10001-19999:离散量输入

30001-39999:输入寄存器

40001-49999:保持寄存器

点亮一个灯:05

读温、湿度数据:03 04

具体协议分析:实例分享 | ModbusTCP报文详解

总结

读数据

主机---》从机:

报文头------功能码-------起始地址-------数量

从机---》主机:

报文头(字节长度可能发生变化)------功能码------字节计数-------数据

写数据

写单个

主机---》从机:

报文头------功能码-------地址-------数据/断通标志(2个字节)

(数据:保持寄存器 断通标志:线圈)

从机---》主机:

原文返回

对于读数据以及写单个来说,在主机询问报文里面报文头中字节长度固定,都是0x0006,(1个字节的单元标识符,1个字节功能码,2个字节的地址,2个字节的数据)

写多个

主机---》从机:

报文头------功能码-------起始地址-------数量--------字节计数--------数据

从机---》主机:

原文返回(报文头------功能码-------起始地址-------数量)

练习

练习一

主机---》从机:

12 34 00 00 00 06 01 03 00 63 00 02

12 34 :事务处理标识符

00 00 :协议标识符

00 06 :字节长度

01 :单元标识符03 :功能码(保持寄存器)

00 63 :起始地址 6*16+3=99,40100

00 02:寄存器数量

从机---》主机:

12 34 00 00 00 07 01 03 04 02 13 30 08

12 34 :事务处理标识符

00 00 :协议标识符

00 07 :字节长度

01 :单元标识符

03功能码(保持寄存器)

04 :字节计数

02 13 :40100寄存器的数据

30 08 :40101寄存器的数据

练习二

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

主机--》从机:0000 0000 0006 01 03 0007 0001

从机--》主机:0000 0000 0005 01 03 02 1234

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

主机--》从机:0000 0000 0006 04 05 0012 ff00

从机--》主机:0000 0000 0006 04 05 0012 ff00

【3】工具安装

Modbus Slave、Poll安装

1)默认安装

2)破解:点击connection-》connect,输入序列号(序列号在SN.txt)

3)使用:

从机:Modbus Slave

先设置:

再连接:点击connection-》connect

主机:

先设置

再连接:(一定要先开启从机(salve端),再开启主机(poll端))

网络调试助手

wireshark

捕获器选择:

windows如果连接有线网络,选择本地连接/以太网

如果连接无线网络,选择WLAN

如果只是在本机上的通信,选择NPCAP Loopback apdater

或Adapter for loopback traffic capture

过滤条件:

过滤端口:tcp.port==502

过滤IP:ip.addr == 192.168.3.11(windows 的ip)

练习

在虚拟机写程序实现poll端功能,编写客户端实现和Slave通信,完成03功能码。

发送的内容是什么?怎么去读数据?

uint8_t data[12]={0x00,0x00,0x00,0x00.......};

#include <stdio.h>
#include <sys/types.h> /* See NOTES */
#include <sys/socket.h>
#include <netinet/in.h>
#include <netinet/ip.h>
#include <unistd.h>
#include <arpa/inet.h>
#include <string.h>
#include <stdlib.h>int main(int argc, char const *argv[])
{char buf[128] = {0};uint8_t data[12]={0x12,0x34,0x00,0x00,0x00,0x06,0x01,0x03,0x00,0x00,0x00,0x02};// 1.创建套接字(socket)------------》有手机int sockfd = socket(AF_INET, SOCK_STREAM, 0);if (sockfd < 0){perror("socket err");return -1;}printf("sockfd:%d\n", sockfd);// 2.指定(服务器)网络信息--------》有对方的号码struct sockaddr_in saddr;
    saddr.sin_family = AF_INET;
    saddr.sin_port = htons(atoi(argv[2]));
    saddr.sin_addr.s_addr = inet_addr(argv[1]);// 3.连接(connect)-------------------》拨打电话if (connect(sockfd, (struct sockaddr *)&saddr, sizeof(saddr)) < 0){perror("connect err");return -1;}printf("connect okk\n");// 4.接收发送消息(recv send)---》通话send(sockfd,data,sizeof(data),0);uint8_t d[32]={0};read(sockfd,d,sizeof(d));for(int i=0;i<d[8];i++){//d[8]:表示字节计数:前8个位置分别为:7个字节报文头+1个字节功能码printf("%#x ",d[9+i]);}putchar(10);// 5.关闭套接字(close)------------》挂电话close(sockfd);return 0;
}

http://www.ppmy.cn/server/141218.html

相关文章

浔川 AI 翻译 v5.0 上线时间相关公告

浔川 AI 翻译 v5.0 上线时间相关公告 尊敬的用户&#xff1a; 我们非常高兴地向大家宣布&#xff0c;浔川 AI 翻译 v5.0 存在提前上线的可能性&#xff01; 目前预计的上线时间为 2024 年 11 月 16 日。 不过需要注意的是&#xff0c;由于开发和测试过程中可能会遇到各种不可预…

零基础Java第十五期:抽象类接口(一)

目录 一、抽象类 1.1. 抽象的概念 1.2. 抽象类语法 1.3. 抽象类的特性 1.4. 图形类例子 二、 接口 2.1. 接口的概念 2.2. 语法规则 2.3. 接口的特性 2.4. 接口的使用 2.5. 实现多个接口 2.6. 工作当中常用的接口 一、抽象类 1.1. 抽象的概念 如果 一个类中没…

推荐一款功能强大的视频修复软件:Apeaksoft Video Fixer

Apeaksoft Video Fixer是一款功能强大的视频修复软件&#xff0c;专门用于修复损坏、不可播放、卡顿、画面失真、黑屏等视频问题。只需提供一个准确且有效的样本视频作为参考&#xff0c;该软件就能将受损视频修复到与样本视频相同的质量。该软件目前支持MP4、MOV、3GP等格式的…

选择适合你的报表工具,山海鲸报表与Tableau深度对比

在数据分析和报表制作的领域&#xff0c;企业往往面临着选择合适工具的难题。尤其是当市场上有很多功能强大的工具时&#xff0c;如何从中挑选出最适合自己需求的报表软件成为了一个关键问题。今天&#xff0c;我们将对比两款报表工具——山海鲸报表和Tableau&#xff0c;看看它…

《现代网络技术》读书笔记:SDN数据平面和OpenFlow

本文部分内容来源于《现代网络技术&#xff1a;SDN,NFV,QoE、物联网和云计算&#xff1a;SDN,NFV,QoE,IoT,andcloud》 SDN数据平面 SDN 数据平面也称为基础设施层&#xff0c;而在ITU-T的Y3300标准中则称为资源层&#xff0c;它是网络转发设备根据 SDN控制平面的决策来执行数据…

智能家居的未来:AI让生活更智能还是更复杂?

内容概要 智能家居的概念源于将各种家居设备连接到互联网&#xff0c;并通过智能技术进行控制和管理。随着人工智能的迅速发展&#xff0c;这一领域也迎来了前所未有的机遇。从早期简单的遥控器到如今可以通过手机应用、语音助手甚至是环境感应进行操作的设备&#xff0c;智能…

【人工智能训练师】3 集群搭建

开启集群环境 本次环境为单节点伪集群环境&#xff0c;环境中已经安装JDK1.8、Hadoop2.7.7、Mysql5.7、hive2.3.4。— 1.环境中已经安装/root/software/hadoop-2.7.7&#xff0c;格式化HDFS&#xff0c;开启集群&#xff0c;查看集群状态。&#xff08;HDFS端口为9000&#x…

【微服务】Docker 容器化

一、初识Docker 1. 为什么需要 Docker 大型项目组件较多&#xff0c;运行环境也较为复杂&#xff0c;部署时会遇到一些问题&#xff1a; 依赖关系复杂&#xff0c;容易出现兼容性的问题开发、测试、生产环境有差异 Docker 如何解决依赖的兼容问题 将应用的Libs&#xff08;…