当前位置: 首页 > news >正文

网络编程之Modbus与HTTP

Modbus

一、基础概念

1.  起源

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

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

● Modbus通信协议具有多个变种,其中有支持串口,以太网多个版本,其中最著名的是Modbus RTU、Modbus ASCII和Modbus TCP三种,其中Modbus TCP是在施耐德收购Modicon后1997年发布的。

2.分类

1)Modbus RTU

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

2)Modbus ASCII

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

3)Modbus TCP

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

3.  优势

简单、免费、容易使用

4.  应用场景

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

 二、Modbus TCP

1.特点

1.  遵循主从问答协议 (主机 从机 主从问答:采集信息 、控制

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

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

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

2.组成

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

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

2.1报文头(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

2.2常用功能码 

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

线圈(可读可写): 00001-09999    读: 01  写单个: 05    写多个: 0f

离散量输入(只读):10001-19999    读:02    

保持寄存器(可读可写):40001-49999   读:03   写单个:06  写多个:10

输入寄存器(只读):30001-39999 0   读: 04

例:

总结:

读数据:

主机-->从机

线圈、离散输入:报文头 + 功能码 + 起始地址(2)+要读取的线圈数量(2)

保持寄存器、输入寄存器:报文头 + 功能码 + 起始地址(2)+要读取的寄存器数量(2)

从机-->主机

报文头 + 功能码 + 字节计数(1)+ data(不定)

写单个

主机-->从机

线圈:报文头 + 功能码 + 起始地址(2)+ 断通标志(2)

保持寄存器:报文头 + 功能码 + 起始地址(2)+data(2)

从机-->主机

原路返回

写多个

主机-->从机

线圈:报文头 + 功能码 + 起始地址(2)+线圈数量(2)+字节计数(1)+ data(不定)

保持寄存器:报文头 + 功能码 + 起始地址(2)+寄存器数量(2)+字节计数(1)+ data(不定)

从机-->主机

 报文头 + 功能码 +起始地址(2)+存储器数量(2) ---》(取部分原文返回)

3、linux下编程

三、Modbus RTU

 1.与Modbus TCP的区别

在一般工业场景使用modbus RTU的场景还是更多一些,modbus RTU基于串行协议进行收发数据,包括RS232/485等工业总线协议。

与modbus TCP不同的是RTU没有报文头MBAP字段,但是在尾部增加了两个CRC检验字节(CRC16),因为网络协议中自带校验,所以在TCP协议中不需要使用CRC校验码。

RTU和TCP的总体使用方法基本一致,只是在创建modbus对象时有所不同,TCP需要传入网络socket信息;而RTU需要传入串口相关信息。

 2.特点

(1)遵循主从问答的通信方式

(2)采用串口进行通信

 设置串口参数时要求:

波特率为9600(波特率是指每秒钟传输的比特数)

8位数据位 (数据位是指每个字符中包含的比特数)

1位停止位 (停止位是指在每个字符传输结束后添加的比特数)

无流控 (流控是指在数据传输过程中控制数据流量的一种机制,无流控表示在该设置下没有额外的控制机制来控制数据流量)

3.Modbus RTU协议格式

地址码(1) :从机ID

功能码(1) :同Modbus TCP (01 02 03 04 05 06 0f 10H)

数据 :

校验码(2):对地址码、功能码、数据码进行校验,由函数生成

例:

主机-->从机: 01 03 00 00 00 01 84 0a

01 :从机id

03 :功能码

00 00 :起始地址

00 01 :数量

84 0a:校验码

从机-->主机01 03 02 0014 b8 44

01 :从机id

03 :功能码

02 :字节计数

00 14 :数据

b8 44 :校验码

值得收藏 Modbus RTU 协议详解-CSDN博客

四、Modbus库

1.  编程步骤

1.  创建实例

2.  设置从机ID

3.  建立连接

4.  寄存器操作按需选择)

5.  关闭套接字

6.  释放实例

#include <modbus.h>
#include <stdio.h>
//  $$ 客户端 $$  int main(int argc, char const *argv[])
{//创建modbus实例modbus_t* ctx;ctx=modbus_new_tcp(argv[2],atoi(argv[1]));if(ctx==NULL){perror("modbus_new_tcp err");return -1;}else{printf("创建实例成功\n");}//设置从机IDif(modbus_set_slave(ctx,1)<0){perror("modbus_set_slave err");return -1;}else{printf("从机ID设置成功\n");}//建立连接if( modbus_connect(ctx)<0){perror("modbus_connect err");return -1;}else{printf("连接成功\n");}uint16_t data[128] = {0};//执行03功能int num=modbus_read_registers(ctx,0,2,data);for (int i = 0; i < num; i++){printf("%d ", data[i]);}putchar(10);//关闭套接字modbus_close(ctx);//关闭连接modbus_free(ctx);return 0;
}

HTTP协议

1.  http简介

HTTP协议是Hyper Text Transfer Protocol(超文本传输协议)的缩写,是用于Web Browser(浏览器)到Web Server(服务器)进行数据交互的传输协议。

HTTP是应用层协议

HTTP是一个基于TCP通信协议传输来传递数据(HTML 文件, 图片文件, 查询结果等)

HTTP协议工作于B/S架构上,浏览器作为HTTP客户端通过URL主动向HTTP服务端即WEB服务器发送所有请求,Web服务器根据接收到的请求后,向客户端发送响应信息。

HTTP默认端口号为80,但是你也可以改为其他端口

2.  http特点

HTTP是无连接:无连接的含义是限制每次连接只处理一个请求。服务器处理完客户的请求,并给客户应答后,即断开连接。采用这种方式可以节省传输时间。

(需要注意一点:HTTP协议本身是无连接的,即每个请求和响应都是独立的。但是http是基于TCP协议的连接管理方式,长连接和短连接用于优化HTTP请求和响应的传输效率。长连接是指在一个TCP连接上可以发送多个HTTP请求和响应,而不需要每次请求都建立和关闭一个新的TCP连接。短连接是指每个HTTP请求和响应都使用一个新的TCP连接。)

HTTP是媒体独立:这意味着,只要客户端和服务器知道如何处理的数据内容,任何类型的数据都可以通过HTTP发送。客户端以及服务器指定使用适合的MIME-type内容类型。

HTTP是无状态:HTTP协议是无状态协议。无状态是指协议对于事务处理没有记忆能力。无状态意味着如果后续处理需要前面的信息,则它必须重传,这样可能导致每次连接传送的数据量增大。另一方面,在服务器不需要先前信息时它的应答就较快。

HTTP 协议同学可能都知道,HTTP 协议是以明文方式发送内容,不提供任何方式的数据加密,如果攻击者截取了 Web 浏览器和网站服务器之间的传输报文,就可以直接读懂其中的信息,因此 HTTP 协议不适合传输一些敏感信息,比如信用开号、密码等。
为了解决 HTTP 协议的这一缺陷,需要使用另一种协议:HTTPS 协议。
HTTPS(全称:Hyper Text Transfer Protocol over Secure Socket Layer),是以安全为目标的 HTTP 通道,简单来说就是 HTTP 的安全版。即在 HTTP 下加入 SSL 协议,SSL 依靠证书来验证服务器的身份,并为浏览器和服务器之间的通信加密。
HTTPS 和 HTTP 的区别主要为以下三点:
● 1.http 是超文本传输协议,信息是明文传输;https 协议是由 http + ssl 协议构建的可进行加密传输、身份认证的网络协议,信息是密文传输,比 http 协议安全。
● 2.https 协议需要到 ca 申请证书,一般免费证书很少,需要缴费
● 3.http 和 https 使用的默认端口也不一样,前者是 80,后者是 443

3.http协议格式

1)客户端请求数据格式

客户端发送一个HTTP请求到服务器的请求消息包括以下格式:请求行、请求头部、空行和请求数据四个部分组成,下图给出了请求报文的一般格式。

注意:linux下回车符和换行符相同

URL:路径

请求方法:http协议中共定义了八种数据的请求方法。分别是:OPTIONS、HEAD、GET、POST、PUT、DELETE、TRACE、CONNECT;我们在实际应用中常用的也就是 get 和 post,其他请求方式也都可以通过这两种方式间接的来实现。

2)服务器响应数据格式

HTTP响应也由四个部分组成,分别是:状态行、消息报头、空行和响应正文

状态行:由三部分组成,HTTP协议的版本号、状态码、以及对状态码的文本描述。例如:HTTP/1.1 (协议版本)200 (状态码)OK (CRLF) 。(200表示请求已经成功)

相关文章:

  • 网页中调用自定义字体可以通过 ‌CSS‌ 的 @font-face 规则实现
  • 50天50个小项目 (Vue3 + Tailwindcss V4) ✨ | RandomChoicePicker(标签生成)
  • 【C++】继承和派生
  • STM32 Bootloader:使用文件头加载并启动应用程序
  • Python 函数参数详解:从基础到高级用法
  • 路由交换技术-思科拓扑搭建
  • 嵌入式通信模块实战新范式:基于虚拟仿真平台的NB-IoT核心技能训练——零硬件损耗的全栈式实验方案,重构物联网通信教学逻辑
  • 16层混压PCB的精密重构:高频基板局部化的黄金法则
  • 技术赋能——AI社媒矩阵营销工具如何重构社媒矩阵底层架构
  • 【hadoop】疫情离线分析案例
  • 山东大学 2025 web数据管理期末复习总结
  • 使用文件的基本操作和文件内容读写操作实现三个功能
  • 玛哈特零件矫平机:精密制造中的平整度守护者
  • 【11408学习记录】考研数学核心突破:矩阵本质、系统信息与向量空间基
  • Flutter 小技巧之:实现 iOS 26 的 “液态玻璃”
  • LLaMA Factory 微调教程:如何构建高质量数据集?
  • 低代码二次开发指南:基于HENGSHI SENSE的自动化报表生成教程
  • 【Docker基础】Docker核心概念:容器(Container)与镜像(Image)的区别与联系
  • (二十六)深度解析领域特定语言(DSL)第四章——词法分析:基于正则表达式的词法分析器
  • 【从零学习JVM|第七篇】快速了解直接内存
  • 湖南省建设厅网站/网络广告文案
  • 黑龙江网站建设/chrome手机版
  • 手机屏幕网站/周口网络推广公司
  • netbean做网站/信息流广告
  • 建站行业/新媒体seo培训
  • 怎么在电脑上自己做网站吗/百度推广平台登录入口