二十五、W5100S/W5500+RP2040树莓派Pico<Modebus TCP Server示例>
文章目录
- 1 前言
- 2 简介
- 2 .1 什么是Modbus TCP?
- 2.2 Modbus TCP指令介绍
- 2.3 请求数据过程
- 2.4 Modbus TCP协议优点
- 2.5 Modbus TCP应用场景
- 3 WIZnet以太网芯片
- 4 Modbus TCP示例概述以及使用
- 4.1 流程图
- 4.2 准备工作核心
- 4.3 连接方式
- 4.4 主要代码概述
- 4.5 结果演示
- 5 注意事项
- 6 相关链接
1 前言
Modbus TCP协议是一种广泛应用于工业自动化、楼宇自控、能源管理等领域的数据通信协议。它基于TCP/IP网络,将Modbus协议封装在TCP/IP协议栈中,使用以太网作为物理层,通过TCP连接来实现设备之间的通信。
W5100S/W5500是一款集成全硬件 TCP/IP 协议栈的嵌入式以太网控制器,同时也是一颗工业级以太网控制芯片。本教程将介绍W5100S/W5500以太网FTP应用的基本原理、使用步骤、应用实例以及注意事项,帮助读者更好地掌握这一技术。
2 简介
2 .1 什么是Modbus TCP?
Modbus TCP实质上是Modbus协议(或Modbus RTU)在以太网TCP/IP网络上的运行。像Modbus RTU一样,Modbus TCP也采用客户端/服务器原理,但在这种情况下,客户端(主设备)会启动来自服务器(从设备)的请求和响应。任何设备都可以成为客户端或服务器。
Modbus TCP不需要计算校验和,因为较低层已经提供了校验和保护。它使用10 Mbps的以太网标准来传输Modbus消息的整个结构。Modbus TCP协议提供了在单个网络中的许多设备之间的快速通信。
2.2 Modbus TCP指令介绍
Modbus TCP协议的数据帧可以分为两部分:MBAP和PDU。
MBAP(Modbus应用协议报文头):
事务处理标识:一个递增的数字,每次发送消息递增一下,尽量不重复,因为占用2个字节,所以范围是:0~65535。
协议标识:固定值0,表示Modbus TCP协议。
长度:等于后面字段的长度。
单元标识符:从机地址,也就是slave id。
PDU(协议数据单元):
功能码:Modbus规定了多个功能,每个功能都设定一个功能码。你要对从机做什么操作,那么就在这里设定好,从机读取到这个数据就知道要做什么。
数据:对于主机来说就是想要操作从机寄存器里的哪些数据。
Modbus TCP协议中定义了多种功能码,包括:
0x01:读线圈
0x05:写单个线圈
0x0F:写多个线圈
0x02:读离散量输入
0x04:读输入寄存器
0x03:读保持寄存器
0x06:写单个保持寄存器
0x10:写多个保持寄存器
每种功能码对应的操作和数据格式都有所不同。
例如,功能码0x01用于读取线圈,请求格式为“MBAP 功能码 起始地址H 起始地址L 数量H 数量L”
响应格式为“MBAP 功能码 数据长度 数据”。
2.3 请求数据过程
在典型的Modbus TCP通信过程中:
- Modbus TCP客户端(也称为主设备)向Modbus TCP服务器(也称为从设备)发送请求。这个请求包含功能码(指示要执行的操作类型),并且可能还包括数据地址和值,具体取决于功能码。
- 收到请求后,Modbus TCP服务器根据功能码处理它。例如,如果功能码指示读取操作,服务器将访问其内存中的指定数据地址,并准备相应的数据以进行响应。
- 然后,Modbus TCP服务器向客户端发送响应。这个响应包含功能码和请求的数据(对于读取操作)或对执行的操作的确认(对于写入操作)。
- Modbus TCP客户端接收到服务器的响应,并根据需要处理数据。
2.4 Modbus TCP协议优点
MODBUS TCP协议的优点包括:
- 灵活的网络拓扑结构:MODBUS TCP基于以太网通信,因此其网络拓扑结构更为灵活。从串行链路上一主多从的构造,演变为多客户端/多服务器端的构造模型。
- 易于寻址:使用MODBUS TCP,主站设备(客户端)可以通过IP地址找到MODBUS从设备(服务器),并通过MODBUS网关连接到另一个MODBUS RTU网络。
- 主从模式:MODBUS协议的工作原理是基于主从模式。在一个网络中,MODBUS协议通过主设备(客户端)和从设备(服务器)之间的请求-应答机制来交换信息。这种模式使得通信过程清晰且易于理解。
- 开放性:MODBUS是一种开放的协议,这意味着它可以被任何厂商的设备所支持,从而提高了设备间的互操作性。
- 简单性:MODBUS协议简单易懂,易于实现和维护。
- 高效性:MODBUS TCP协议在TCP/IP网络上运行,利用了TCP/IP协议的优点,如高效的数据传输、错误检测和修复等。
2.5 Modbus TCP应用场景
Modbus TCP协议的应用场景广泛,以下是一些主要的领域:
- 工业自动化:Modbus TCP协议在工业自动化领域被广泛应用,特别是在智能制造和工业物联网中。它允许设备之间进行可靠的通信,以实现生产过程的自动化和控制。
- 楼宇自动化:在楼宇自动化领域,Modbus TCP协议可以用于连接楼宇设备(如温度控制器、照明系统、安全系统等)以实现节能和舒适的室内环境。
- 能源管理:在能源管理领域,Modbus TCP协议可以用于监测和控制系统中的能源使用。通过连接能源测量设备和控制系统,可以实现实时能源监测和优化控制,降低能源消耗并提高能源效率。
- 过程控制:在过程控制领域,Modbus TCP协议可以用于连接传感器和执行器,以实现实时监控和控制。它可以应用于各种工业过程,如化工、制药、食品加工等。
- 智能家居:在智能家居领域,Modbus TCP协议可以用于连接智能家居设备(如智能灯泡、智能插座、智能安防等)以实现家庭自动化和智能控制。
3 WIZnet以太网芯片
WIZnet 主流硬件协议栈以太网芯片参数对比
Model | Embedded Core | Host I/F | TX/RX Buffer | HW Socket | Network Performance |
---|---|---|---|---|---|
W5100S | TCP/IPv4, MAC & PHY | 8bit BUS, SPI | 16KB | 4 | Max.25Mbps |
W6100 | TCP/IPv4/IPv6, MAC & PHY | 8bit BUS, Fast SPI | 32KB | 8 | Max.25Mbps |
W5500 | TCP/IPv4, MAC & PHY | Fast SPI | 32KB | 8 | Max 15Mbps |
- W5100S/W6100 支持 8bit数据总线接口,网络传输速度会优于W5500。
- W6100 支持IPV6,与W5100S 硬件兼容,若已使用W5100S的用户需要支持IPv6,可以Pin to Pin兼容。
- W5500 拥有比 W5100S更多的 Socket数量以及发送与接收缓存。
4 Modbus TCP示例概述以及使用
4.1 流程图
程序的运行框图如下所示:
4.2 准备工作核心
软件
- Visual Studio Code
- WIZnet UartTool
- Modbus Poll
硬件
- W5100S IO模块 + RP2040 树莓派Pico开发板 或者 WIZnet W5100S-EVB-Pico开发板
- Micro USB 接口的数据线
- TTL 转 USB
- 网线
4.3 连接方式
-
通过数据线连接PC的USB口(主要用于烧录程序,也可以虚拟出串口使用)
-
通过TTL串口转USB,连接UART0 的默认引脚:
- RP2040 GPIO0(UART0 TX) <----> USB_TTL_RX
- RP2040 GPIO1(UART0 RX) <----> USB_TTL_TX
-
使用模块连接RP2040 进行接线时
- RP2040 GPIO16 <----> W5100S MISO
- RP2040 GPIO17 <----> W5100S CS
- RP2040 GPIO18 <----> W5100S SCK
- RP2040 GPIO19 <----> W5100S MOSI
- RP2040 GPIO20 <----> W5100S RST
-
通过PC和设备都通过网线连接路由器LAN口
4.4 主要代码概述
我们使用的是WIZnet官方的ioLibrary_Driver库。该库支持的协议丰富,操作简单,芯片在硬件上集成了TCP/IP协议栈,该库又封装好了TCP/IP层之上的协议,我们只需简单调用相应函数即可完成协议的应用。
第一步:在modbus_tcp.c文件中引用对应的库文件。
第二步:宏定义常量和定义全局变量。
第三步:定义两个函数,包括一个1秒定时器回调函数(用于处理DHCP超时处理),一个设置网络地址函数。
第四步:主函数首先是对串口和SPI进行初始化以及链路检测。然后是设置W5100S的网络地址,首先使用DHCP的方式进行获取,失败后使用预设的静态IP地址。然后将LED GPIO的初始化。最后则是在主循环里面跑Modbus TCP状态机程序。
第五步:在状态机中,首先是打开一个TCP Server模式的socket,然后等待客户端连接。在连接成功之后,会等待客户端的请求信息,接收到请求信息之后,会对包内容解析并作出响应的操作以及回复。
/* main function */
int main()
{struct repeating_timer timer; // Define the timer structure/*mcu init*/stdio_init_all(); // Initialize the main control peripherawizchip_initialize(); // spi initializationwizchip_setnetinfo(&net_info); // Configure once first/*dhcp init*/DHCP_init(SOCKET_ID, ethernet_buf); // DHCP initializationadd_repeating_timer_ms(1000, repeating_timer_callback, NULL, &timer); // Add DHCP 1s Tick Timer handlerprintf("wiznet chip modbus tcp server example.\r\n");network_init(&net_info); // Configuring Network Informationprint_network_information(&get_info); // Read back the configuration information and print it/* LED gpio init */gpio_init(PICO_DEFAULT_LED_PIN);gpio_set_dir(PICO_DEFAULT_LED_PIN, GPIO_OUT);while (true){do_Modbus(SOCKET_ID);}
}/* Do_Modubs function */
void do_Modbus(uint8_t sn)
{uint8_t state = 0;uint16_t len;getSIPR(lip);state = getSn_SR(sn);switch (state){case SOCK_SYNSENT:break;case SOCK_INIT:listen(sn);if (!b_listening_printed){b_listening_printed = 1;printf("Listening on %d.%d.%d.%d:%d\r\n",lip[0], lip[1], lip[2], lip[3], local_port);}break;case SOCK_LISTEN:break;case SOCK_ESTABLISHED:if (getSn_IR(sn) & Sn_IR_CON){setSn_IR(sn, Sn_IR_CON);printf("Connected\r\n");getSn_DIPR(sn, rip);port = getSn_DPORT(sn);printf("RemoteIP:%d.%d.%d.%d Port:%d\r\n", rip[0], rip[1], rip[2], rip[3], port);if (b_listening_printed)b_listening_printed = 0;}len = getSn_RX_RSR(sn);if (len > 0){mbTCPtoEVB(sn);}break;case SOCK_CLOSE_WAIT:disconnect(sn);break;case SOCK_CLOSED:case SOCK_FIN_WAIT:close(sn);socket(sn, Sn_MR_TCP, local_port, Sn_MR_ND); // Sn_MR_NDbreak;default:break;}
}/* mbTCPtoEVB function */
void mbTCPtoEVB(uint8_t sn)
{int32_t ret;if (MBtcp2evbFrame() != 0) // Frame received complete{uint16_t maxsize = 0;if (pucASCIIBufferCur[0] == 0x01)//Check whether the device address is 0x01{if ((uint8_t)pucASCIIBufferCur[1] == 0x05)//Write to a single device{if ((uint8_t)pucASCIIBufferCur[4] == 0xff){gpio_put(PICO_DEFAULT_LED_PIN, 1);printf("LED ON\r\n");}else if ((uint8_t)pucASCIIBufferCur[4] == 0x00){printf("LED OFF\r\n");gpio_put(PICO_DEFAULT_LED_PIN, 0);}send(sn, recv_data, recv_len);}else if ((uint8_t)pucASCIIBufferCur[1] == 0x01)//Read Write to a single device{if (recv_data[recv_len - 1] != 0x01){printf("len error!\r\n");}else{printf("Read OK!\r\n");send_data[0] = recv_data[0];send_data[1] = recv_data[1];send_data[2] = recv_data[2];send_data[3] = recv_data[3];send_data[4] = 0x00;send_data[5] = 0x04;send_data[6] = 0x01;send_data[7] = 0x01;send_data[8] = 0x01;send_data[9] = gpio_get(PICO_DEFAULT_LED_PIN);send_len = 10;send(sn, (uint8_t *)send_data, send_len);memset(send_data, 0, send_len);}}else{printf("error code!\r\n");}}else{printf("address error!\r\n");}}
}
4.5 结果演示
1.用Modbus Poll连接到W5100S上
2.发送写指令,打开LED灯
3.设置读指令为0x01,读取个数为1
4.发送读取一次指令
5.读取成功,并在Modbus Poll上显示出LED的状态
5 注意事项
- 设置和读取的地址必须为1,并且读取个数必须为1,否则无法写入或读取信息。如需修改,请修改app/MODBUS_TCP_SERVER目录下的mb.c文件中的mbTCPtoEVB函数。
- 如果想用WIZnet的W5500来实现本章的示例,我们只需修改两个地方即可:
(1)在library/ioLibrary_Driver/Ethernet/下找到wizchip_conf.h这个头文件,将_WIZCHIP_ 宏定义修改为W5500。
(2)在library下找到CMakeLists.txt文件,将COMPILE_SEL设置为ON即可,OFF为W5100S,ON为W5500。
6 相关链接
WIZnet官网
WIZnet官方库链接
本章例程链接
想了解更多,评论留言哦!
相关文章:

二十五、W5100S/W5500+RP2040树莓派Pico<Modebus TCP Server示例>
文章目录 1 前言2 简介2 .1 什么是Modbus TCP?2.2 Modbus TCP指令介绍2.3 请求数据过程2.4 Modbus TCP协议优点2.5 Modbus TCP应用场景 3 WIZnet以太网芯片4 Modbus TCP示例概述以及使用4.1 流程图4.2 准备工作核心4.3 连接方式4.4 主要代码概述4.5 结果演示 5 注意…...
Android画个圆点状态灯
1、创建一个 XML 文件在 res/drawable 目录下(默认为黑色) <?xml version"1.0" encoding"utf-8"?> <shape xmlns:android"http://schemas.android.com/apk/res/android"android:shape"oval"><…...

高性能网络编程 - 解读3种线程模型
文章目录 Pre线程模型1:传统阻塞 I/O 服务模型线程模型2:Reactor 模式Reactor 模式的基本设计思想Reactor 模式中的关键组成3种典型实现单 Reactor 单线程单 Reactor 多线程主从 Reactor 多线程 小结 线程模型3:Proactor 模型 Pre 高性能网络…...

MATLAB中deconvwnr函数用法
目录 语法 说明 示例 使用 Wiener 滤波对图像进行去模糊处理 deconvwnr函数的功能是使用 Wiener 滤波对图像进行去模糊处理。 语法 J deconvwnr(I,psf,nsr) J deconvwnr(I,psf,ncorr,icorr) J deconvwnr(I,psf) 说明 J deconvwnr(I,psf,nsr) 使用 Wiener 滤波算法对…...

赛宁网安入选国家工业信息安全漏洞库(CICSVD)2023年度技术组成员单
近日,由国家工业信息安全发展研究中心、工业信息安全产业发展联盟主办的“2023工业信息安全大会”在北京成功举行。 会上,国家工业信息安全发展研究中心对为国家工业信息安全漏洞库(CICSVD)提供技术支持的单位授牌表彰。北京赛宁…...

Git系列之Git集成开发工具及git扩展使用
🎉🎉欢迎来到我的CSDN主页!🎉🎉 🏅我是君易--鑨,一个在CSDN分享笔记的博主。📚📚 🌟推荐给大家我的博客专栏《Git实战开发》。🎯🎯 &a…...
selenium headless 无头模式慢
selenium设置headlessTrue发现非常慢,headlessFalse要快很多。 最后测试发现升级到selenium最新版本,selenium4.15.2。设置--headlessnew,解决了,速度正常了。 新版selenium有了两种headless模式,参见:He…...

快速修复因相机断电导致视频文件打不开的问题
3-5 本文主要解决因相机突然断电导致拍摄的视频文件打不开的问题。 在日常工作中,有时候需要使用相机拍摄视频,比如现在有不少短视频拍摄的需求,如果因电池突然断电的原因,导致拍出来的视频播放不了,这时候就容易出大…...
Ceph 笔记, ssh写入缓存
硬件建议 — Ceph 文档 写入缓存 企业级 SSD 和 HDD 通常包括断电保护功能,包括 在运行时断电时确保数据耐久性,以及 使用多级缓存来加快直接或同步写入速度。这些设备 可以在两种缓存模式之间切换 -- 刷新到的易失性缓存 具有 fsync 的持久性媒体&a…...

WebSocket魔法师:打造实时应用的无限可能
1、背景 在开发一些前端页面的时候,总是能接收到这样的需求:如何保持页面并实现自动更新数据呢?以往的常规做法,是前端使用定时轮询后端接口,获取响应后重新渲染前端页面,这种做法虽然能达到类似的效果&…...

网络运维Day06-补充
文章目录 RAID磁盘阵列RAID0条带模式RAID1镜像模式RAID5高性价比模式RAID01RAID10 逻辑卷一块磁盘的使用流程逻辑卷的使用流程 制作逻辑卷步骤一:添加硬盘步骤二:分区规划步骤三:制作物理卷步骤四:制作卷组步骤五:制作…...
openssl+SM2开发实例一(含源码)
一、SM2算法介绍 SM2(国密算法2) 是中国国家密码管理局(CNCA)颁布的椭圆曲线密码算法标准,属于非对称加密算法。它基于椭圆曲线离散对数问题,提供了安全可靠的数字签名、密钥交换和公钥加密等功能。SM2被设…...

操作系统 | 编写内核
🌈个人主页:Sarapines Programmer🔥 系列专栏:《操作系统实验室》🔖少年有梦不应止于心动,更要付诸行动。 目录结构 1. 操作系统实验之编写内核 1.1 实验目的 1.2 实验内容 1.3 实验步骤 1.4 实验过程 …...
Rust逆向学习 (4)
Reverse for Struct Rust中的结构体是一个重要的内容,由于Rust中没有类的概念,因此其他编程语言中的封装、继承、多态与Rust中的表现都有较大差异。 我们使用参考书中的一个示例开始进行分析。 Struct 初始化 struct User {username: String,email: …...

uniapp vue2 vuex 持久化
1.vuex的使用 一、uniapp中有自带vuex插件,直接引用即可 二、在项目中新建文件夹store,在main.js中导入 在根目录下新建文件夹store,在此目录下新建index.js文件 index.js import Vue from vueimport Vuex from vuexVue.use(Vuex)const store new Vuex.Store(…...

【媒体邀约】媒体宣传——企业成长的催化剂
传媒如春雨,润物细无声,大家好,我是51媒体网胡老师。 媒体宣传是企业成长的催化剂,它在各种方面对企业的成功和发展起到了关键作用。 1. 曝光和知名度: 媒体宣传可以将企业和其产品或服务推向广泛的受众,…...
ansible问题排查
拷贝模板时报错:AnsibleError: template error while templating string: Missing end of comment tag. 原因 shell脚本中地{#和jinja中的语法comment tag相同,而且只有一半,导致无法渲染导致。 解决 在有语法冲突的地方使用组合标签{% r…...
7天入门python系列之第四天python数据结构
第3天主要是学习Python的函数和模块 编者打算开一个python 初学主题的系列文章,用于指导想要学习python的同学。关于文章有任何疑问都可以私信作者。对于初学者想在7天内入门Python,这是一个紧凑的学习计划。但并不是不可完成的。第四天开始python 数据…...

远程电脑未连接显示器时分辨率太小的问题处理
背景:单位电脑显示器坏了,使用笔记本通过向日葵远程连接,发现分辨率只有800*600并且不能修改,网上找了好久找到了处理方法这里记录一下,主要用到的是一个虚拟显示器软件usbmmidd_v2 1)下载usbmmidd_v2 2)…...

Java 设计模式——解释器模式
目录 1.概述2.结构3.案例实现3.1.抽象表达式类3.2.终结表达式3.3.非终结表达式3.4.环境类3.5.测试 4.优缺点5.使用场景 1.概述 (1)如下图,设计一个软件用来进行加减计算。我们第一想法可能就是使用工具类,提供对应的加法和减法的…...

eNSP-Cloud(实现本地电脑与eNSP内设备之间通信)
说明: 想象一下,你正在用eNSP搭建一个虚拟的网络世界,里面有虚拟的路由器、交换机、电脑(PC)等等。这些设备都在你的电脑里面“运行”,它们之间可以互相通信,就像一个封闭的小王国。 但是&#…...
【根据当天日期输出明天的日期(需对闰年做判定)。】2022-5-15
缘由根据当天日期输出明天的日期(需对闰年做判定)。日期类型结构体如下: struct data{ int year; int month; int day;};-编程语言-CSDN问答 struct mdata{ int year; int month; int day; }mdata; int 天数(int year, int month) {switch (month){case 1: case 3:…...

springboot 百货中心供应链管理系统小程序
一、前言 随着我国经济迅速发展,人们对手机的需求越来越大,各种手机软件也都在被广泛应用,但是对于手机进行数据信息管理,对于手机的各种软件也是备受用户的喜爱,百货中心供应链管理系统被用户普遍使用,为方…...

云启出海,智联未来|阿里云网络「企业出海」系列客户沙龙上海站圆满落地
借阿里云中企出海大会的东风,以**「云启出海,智联未来|打造安全可靠的出海云网络引擎」为主题的阿里云企业出海客户沙龙云网络&安全专场于5.28日下午在上海顺利举办,现场吸引了来自携程、小红书、米哈游、哔哩哔哩、波克城市、…...
多场景 OkHttpClient 管理器 - Android 网络通信解决方案
下面是一个完整的 Android 实现,展示如何创建和管理多个 OkHttpClient 实例,分别用于长连接、普通 HTTP 请求和文件下载场景。 <?xml version"1.0" encoding"utf-8"?> <LinearLayout xmlns:android"http://schemas…...

关于iview组件中使用 table , 绑定序号分页后序号从1开始的解决方案
问题描述:iview使用table 中type: "index",分页之后 ,索引还是从1开始,试过绑定后台返回数据的id, 这种方法可行,就是后台返回数据的每个页面id都不完全是按照从1开始的升序,因此百度了下,找到了…...

Mac下Android Studio扫描根目录卡死问题记录
环境信息 操作系统: macOS 15.5 (Apple M2芯片)Android Studio版本: Meerkat Feature Drop | 2024.3.2 Patch 1 (Build #AI-243.26053.27.2432.13536105, 2025年5月22日构建) 问题现象 在项目开发过程中,提示一个依赖外部头文件的cpp源文件需要同步,点…...
【Go语言基础【13】】函数、闭包、方法
文章目录 零、概述一、函数基础1、函数基础概念2、参数传递机制3、返回值特性3.1. 多返回值3.2. 命名返回值3.3. 错误处理 二、函数类型与高阶函数1. 函数类型定义2. 高阶函数(函数作为参数、返回值) 三、匿名函数与闭包1. 匿名函数(Lambda函…...

C++:多态机制详解
目录 一. 多态的概念 1.静态多态(编译时多态) 二.动态多态的定义及实现 1.多态的构成条件 2.虚函数 3.虚函数的重写/覆盖 4.虚函数重写的一些其他问题 1).协变 2).析构函数的重写 5.override 和 final关键字 1&#…...

Razor编程中@Html的方法使用大全
文章目录 1. 基础HTML辅助方法1.1 Html.ActionLink()1.2 Html.RouteLink()1.3 Html.Display() / Html.DisplayFor()1.4 Html.Editor() / Html.EditorFor()1.5 Html.Label() / Html.LabelFor()1.6 Html.TextBox() / Html.TextBoxFor() 2. 表单相关辅助方法2.1 Html.BeginForm() …...