十五、W5100S/W5500+RP2040之MicroPython开发<Modbus示例>

文章目录

  • 1. 前言
  • 2. 相关网络信息
    • 2.1 简介
    • 2.2 指令构成
    • 2.3 优点
    • 2.4 应用
  • 3. WIZnet以太网芯片
  • 4. Modbus TCP通信示例讲解以及使用
    • 4.1 程序流程图
    • 4.2 测试准备
    • 4.3 连接方式
    • 4.4 相关代码
    • 4.5 烧录验证
  • 5. 注意事项
  • 6. 相关链接

1. 前言

  在这个智能硬件和物联网时代,MicroPython和树莓派PICO正以其独特的优势引领着嵌入式开发的新潮流。MicroPython作为一种精简优化的Python 3语言,为微控制器和嵌入式设备提供了高效开发和简易调试的

  当我们结合WIZnet W5100S/W5500网络模块,MicroPython和树莓派PICO的开发潜力被进一步放大。这两款模块都内置了TCP/IP协议栈,使得在嵌入式设备上实现网络连接变得更加容易。无论是进行数据传输、远程控制,还是构建物联网应用,它们都提供了强大的支持。

  本章我们将以WIZnet W5100S为例,以MicroPython的开发方式进行Modbus TCP通信示例

2. 相关网络信息

2.1 简介

  Modbus TCP是一种基于TCP/IP协议的应用层协议,它是Modbus协议的扩展。Modbus协议是一种串行通信协议,最初由Modicon公司在1979年开发,用于工业自动化控制系统中设备之间的通信。Modbus TCP则是将Modbus协议转换为基于以太网的TCP/IP协议,以支持更广泛的设备和系统集成。

在这里插入图片描述

2.2 指令构成

Modbus TCP的数据帧可分为两部分:MBAP+PDU。MBAP为报文头,长度为7字节。PDU由功能码+数据组成。功能码为1字节,数据长度不定,由具体功能决定。

根据对象的不同,modbus的功能码有:0x01 读线圈,0x05 写单个线圈,0x0F 写多个线圈,0x02 读离散量输入,0x04 读输入寄存器,0x03 读保持寄存器,0x06 写单个保持寄存器,0x10 写多个保持寄存器。

在这里插入图片描述

2.3 优点

  • 简单性:Modbus TCP协议简单易用,可以方便地与其他通信协议进行集成。
  • 可靠性:Modbus TCP协议运行在TCP/IP协议上,这使得它具有很高的可靠性。TCP/IP协议是互联网的基础,它能够保证数据的及时、完整传输。
  • 广泛的应用场景:Modbus TCP协议可以应用于各种场景,包括工业自动化控制系统、能源管理、环境监测、楼宇自控等领域。
  • 开放性:Modbus TCP协议是一种开放的协议,这意味着它可以被任何设备或系统使用,而不仅仅局限于特定的硬件或软件。
  • 实时性:Modbus TCP协议能够支持实时数据通信,这对于需要快速响应的应用来说非常重要。

2.4 应用

  • 设备间的数据交换:在工业自动化控制系统中,Modbus TCP协议通常用于不同控制系统之间的数据交换。
  • 远程访问和控制:由于Modbus TCP协议基于TCP/IP协议,因此它可以通过互联网进行远程访问和控制,这对于需要远程监控和管理的应用来说非常有用。
  • 集成其他通信协议:由于Modbus TCP协议的开放性,它可以方便地与其他通信协议进行集成,这使得它可以在各种不同的系统和设备中使用。
  • 实时数据通信:Modbus TCP协议能够支持实时数据通信,这对于需要实时监控和控制的应用来说非常重要。例如,在能源管理和环境监测等领域,实时数据通信能够帮助实现更精确和及时的控制和决策。

3. WIZnet以太网芯片

WIZnet 主流硬件协议栈以太网芯片参数对比

ModelEmbedded CoreHost I/FTX/RX BufferHW SocketNetwork Performance
W5100STCP/IPv4, MAC & PHY8bit BUS, SPI16KB4Max 25Mbps
W6100TCP/IPv4/IPv6, MAC & PHY8bit BUS, Fast SPI32KB8Max 25Mbps
W5500TCP/IPv4, MAC & PHYFast SPI32KB8Max 15Mbps
  • W5100S/W6100 支持 8bit数据总线接口,网络传输速度会优于W5500。
  • W6100 支持IPV6,与W5100S 硬件兼容,若已使用W5100S的用户需要支持IPv6,可以Pin to Pin兼容。
  • W5500 拥有比 W5100S更多的 Socket数量以及发送与接收缓存

相较于软件协议栈,WIZnet的硬件协议栈以太网芯片有以下优点

  1. 硬件TCP/IP协议栈:WIZnet的硬件协议栈芯片提供了一种硬件实现的TCP/IP协议栈,这种硬件实现的协议栈比软件实现的协议栈具有更好的性能和稳定性。
  2. 不需要额外的嵌入式系统软件栈和内存资源:由于所有的以太网传输和接收操作都由独立的以太网控制器处理,因此不需要额外的嵌入式系统软件栈和内存资源。
  3. 抵抗网络环境变化和DDoS攻击:与易受网络环境变化和DDoS攻击影响的软件TCP/IP协议栈相比,硬件协议栈芯片能够提供更稳定的以太网性能。
  4. 适用于低规格的嵌入式系统:即使在低规格的嵌入式系统中,使用WIZnet的硬件协议栈芯片也可以比使用软件TCP/IP协议栈的高规格系统显示出更高效的互联网应用操作性能。

在这里插入图片描述

4. Modbus TCP通信示例讲解以及使用

4.1 程序流程图

在这里插入图片描述

4.2 测试准备

软件:

  • Thonny
  • Modbus Poll

硬件:

  • W5100S IO模块 + RP2040 树莓派Pico开发板 或者 WIZnet W5100S-EVB-Pico开发板
  • Micro USB 接口的数据线
  • 网线

4.3 连接方式

  • 通过数据线连接PC的USB口
  • 当使用W5100S/W5500 IO模块连接RP2040时
    • RP2040 GPIO 16 <----> W5100S/W5500 MISO
    • RP2040 GPIO 17 <----> W5100S/W5500 CS
    • RP2040 GPIO 18 <----> W5100S/W5500 SCK
    • RP2040 GPIO 19 <----> W5100S/W5500 MOSI
    • RP2040 GPIO 20 <----> W5100S/W5500 RST
  • 通过网线直接连接PC网口(或:PC和设备都通过网线连接交换机或路由器LAN口)

4.4 相关代码

  我们直接打开modbus_tcp_server.py文件。

第一步:可以看到在w5x00_init()函数中,进行了SPI的初始化。以及将spi相关引脚和复位引脚注册到库中,后续则是激活网络,并使用DHCP配置网络地址信息,当DHCP失败时,则配置静态网络地址信息。当未配置成功时,会打印出网络地址相关寄存器的信息,可以帮助我们更好的排查问题。

第二步:在modbus_run()函数中,会打开一个TCP服务器,然后等待接收到数据(即Modbus 指令)。

第三步:对Modbus指令进行核对,然后解析并作出相应的操作以及回复。

from usocket import socket
from machine import Pin,SPI
import network
import timelocal_ip = ''
local_port = 5000led = Pin(25, Pin.OUT)"""
W5x00 chip initialization.param: None
returns: None"""
def w5x00_init():global local_ipspi=SPI(0,2_000_000, mosi=Pin(19),miso=Pin(16),sck=Pin(18))nic = network.WIZNET5K(spi,Pin(17),Pin(20)) #spi,cs,reset pinnic.active(True)try:#DHCPprint("\r\nConfiguring DHCP")nic.ifconfig('dhcp')except:#None DHCPprint("\r\nDHCP fails, use static configuration")nic.ifconfig(('192.168.1.20','255.255.255.0','192.168.1.1','8.8.8.8'))#Set static network address information#Print network address informationprint("IP         :",nic.ifconfig()[0])print("Subnet Mask:",nic.ifconfig()[1])print("Gateway    :",nic.ifconfig()[2])print("DNS        :",nic.ifconfig()[3],"\r\n")local_ip = nic.ifconfig()[0]#If there is no network connection, the register address information is printedwhile not nic.isconnected():time.sleep(1)print(nic.regs())"""
Modbus packet parsing.param1: receive data
param2: connecting object
returns: None"""
def modbus_parsing(data,conn):senddata = bytearray(128)if data[2] != 0x00 and data[3] != 0x00:print("protocol error")else:if data[6] == 0x01:if data[7] == 0x01:if int(data[8])+int(data[9]) == 0 and int(data[10])+int(data[11])==1:print("Read OK!")senddata[0] = data[0]senddata[1] = data[1]senddata[2] = data[2]senddata[3] = data[3]senddata[4] = 0x00senddata[5] = 0x04senddata[6] = 0x01senddata[7] = 0x01senddata[8] = 0x01senddata[9] = led.value()conn.send(senddata)else:print("address error!")elif data[7] == 0x05:if int(data[8])+int(data[9]) == 0:if data[10] == 0xFF:print("LED ON!")led.value(1)elif data[10] == 0x00:print("LED OFF!")led.value(0)else:print("value error!")conn.send(data)else:print("address error!")else:print("The function code is not processed!")else:print("slave address error!")"""
Start the Modbus TCP server.param: None
returns: None"""
def modbus_run():global local_ipglobal local_ports = socket()s.bind((local_ip, local_port)) #Source IP Addresss.listen(0)print("remote ip:",local_ip,",port:",local_port)conn, addr = s.accept()print("type",type(conn))print("Connected:", conn, "address:", addr[0]) while True:data = conn.recv(2048)if data != 'NULL':modbus_parsing(data,conn)def main():print("WIZnet chip Modbus TCP example")w5x00_init()modbus_run()if __name__ == "__main__":main()

4.5 烧录验证

要测试以太网示例,必须将开发环境配置为使用Raspberry Pi Pico。

  • 所需的开发环境
    • Thonny
  • 如果你必须编译MicroPython,则必须使用Linux或Unix环境。

第一步:将程序复制到Thonny中,然后选择环境为Raspberry Pi Pico,最后点击运行。

第二步:在Modbus Poll上进行连接,地址为开发板的地址,端口号为5000。

第三步:在Modbus Poll上下发指令控制LED,并读取LED灯状态。

注意:因为MicroPython的print函数是启用了stdout缓冲的,所以有时候并不会第一时间打印出内容。

在这里插入图片描述

5. 注意事项

  • 如果采用的是WIZnet的W5500来实现本章的示例,则只需烧录W5500的固件并运行示例程序即可。
  • 示例只对读取单个线圈(0x01)进行了处理,并且读取长度必须为1

6. 相关链接

WIZnet官网

本章例程链接

想了解更多,评论留言哦!

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

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

相关文章

C语言-第十六周做题总结

id:374 A.求最大值及其下标 题目描述 本题要求编写程序&#xff0c;找出给定的n个数中的最大值及其对应的最小下标&#xff08;下标从0开始&#xff09;。 输入 输入在第一行中给出一个正整数n&#xff08;1<n≤10&#xff09;。第二行输入n个整数&#xff0c;用空格分开…

C++ 获取位域成员的位宽

C 中可以使用位域来节省内存&#xff0c;实现不同长度的数据的存放&#xff0c;例如&#xff1a; struct BF {uint32_t a1 : 4;uint32_t a2 : 5;uint32_t a3 : 6; } bf;结构体变量 bf 大小为 2 Byte&#xff0c;其成员变量 a1, a2, a3 分别占 4&#xff0c; 5&#xff0c; 6 位…

ApsaraMQ Serverless 演进之路,助力企业降本

作者&#xff1a;家泽 ApsaraMQ 与时俱进&#xff0c;砥砺前行 阿里云消息队列从诞生开始&#xff0c;至今已有十余年。今年&#xff0c;阿里云消息产品全面品牌升级为 ApsaraMQ&#xff0c;与时俱进&#xff0c;砥砺前行。 2012 年&#xff0c;RocketMQ 诞生于集团内部&…

测试理论知识八:敏捷开发测试、极限编程测试

1. 敏捷开发模式下的测试 敏捷开发的核心理念&#xff1a; 个体和互动高于流程和工具。 工作的软件高于详尽的文档。 客户合作高于合同谈判。 响应变化高于遵循计划。 2. 敏捷开发的特征 敏捷开发提倡迭代式和增量式的开发模式&#xff0c;并强调测试在其中的重要作用。这…

【Linux系统基础】(4)在Linux上部署Tomcat、Nginx软件

Tomcat安装部署【简单】 简介 Tomcat 是由 Apache 开发的一个 Servlet 容器&#xff0c;实现了对 Servlet 和 JSP 的支持&#xff0c;并提供了作为Web服务器的一些特有功能&#xff0c;如Tomcat管理和控制平台、安全域管理和Tomcat阀等。 简单来说&#xff0c;Tomcat是一个W…

锐捷ssh配置

配置实例 ssh-Server ssh-Server(config)#enable service ssh-server // 启用ssh服务 ssh-Server(config)#username admin privilege 15 password Test123456 // 设置ssh登陆的账户密码 ssh-Server(config)#line vty 0 4 ssh-Server(config-line)#transport input ssh …

线性回归简介

线性回归简介 1、情景描述2、线性回归 1、情景描述 假设&#xff0c;我们现在有这么一张图&#xff1a; 其中&#xff0c;横坐标x表示房子的面积&#xff0c;纵坐标y表示房价。我们猜想x与y之间存在线性关系&#xff1a; y k x b ykxb ykxb 现在&#xff0c;思考一个问题&…

Java final、finally、finalize 有什么区别?

Java final、finally、finalize 有什么区别&#xff1f; final、finally 和 finalize 是 Java 中三个完全不同的概念&#xff0c;分别用于修饰变量、定义异常处理块和垃圾回收。 final&#xff1a; final 是一个关键字&#xff0c;用于修饰类、方法、变量等。被 final 修饰的…

安徽省人民政府关于印发《打造通用人工智能产业创新和应用高地若干政策》通知

安徽省人民政府关于印发《打造通用人工智能产业创新和应用高地若干政策》通知 原文地址 各市、县人民政府&#xff0c;省政府各部门、各直属机构&#xff1a; 现将《打造通用人工智能产业创新和应用高地若干政策》印发给你们&#xff0c;请认真贯彻落实。 安徽省人民政府 2…

纯HTML代码实现给图片增加水印并下载保存到本地

<!DOCTYPE html> <html> <head><meta charset"utf-8"><meta name"viewport" content"widthdevice-width, initial-scale1, maximum-scale1, user-scalableno"/><title>图片水印打码工具-宋佳乐博客</tit…

计算机图形学理论(3):着色器编程

本系列根据国外一个图形小哥的讲解为本&#xff0c;整合互联网的一些资料&#xff0c;结合自己的一些理解。 CPU vs GPU CPU支持&#xff1a; 快速缓存分支适应性高性能 GPU支持&#xff1a; 多个 ALU快速板载内存并行任务的高吞吐量&#xff08;在每个片段、顶点上执行着色…

nn.Embedding()个人记录

维度 import torch.nn as nnembedding nn.Embedding(num_embeddings 10, embedding_dim 256) nn.Embedding()随机产生一个权重矩阵weight&#xff0c;维度为&#xff08;num_embeddings, embedding_dim&#xff09; 输入维度&#xff08;batch_size, Seq_len&#xff09…

winlogbeat收集Windows事件日志传给ELK

服务器部署winlogbeat后&#xff0c;修改winlogbeat.yml: ###################### Winlogbeat Configuration Example ######################### This file is an example configuration file highlighting only the most common # options. The winlogbeat.reference.yml fi…

基于Java+SpringBoot+MyBatis-plus+Vue前后端分离小区管理系统设计与实现2.0

博主介绍&#xff1a;✌全网粉丝5W&#xff0c;全栈开发工程师&#xff0c;从事多年软件开发&#xff0c;在大厂呆过。持有软件中级、六级等证书。可提供微服务项目搭建与毕业项目实战&#xff0c;博主也曾写过优秀论文&#xff0c;查重率极低&#xff0c;在这方面有丰富的经验…

力扣日记12.24-【二叉树篇】236. 二叉树的最近公共祖先

力扣日记&#xff1a;【二叉树篇】236. 二叉树的最近公共祖先 日期&#xff1a;2023.12.24 参考&#xff1a;代码随想录、力扣 ps&#xff1a;提前祝 平安夜快乐&#xff01; 236. 二叉树的最近公共祖先 题目描述 难度&#xff1a;中等 给定一个二叉树, 找到该树中两个指定节点…

linux线程取消, pthread线程取消,pthread_testcancel用法

pthread_cancel Linux中&#xff0c;线程在运行时如果想要取消&#xff0c;一种方法是调用pthread_cancel()函数&#xff0c;它的原型是&#xff1a; /* Cancel THREAD immediately or at the next possibility. */ extern int pthread_cancel (pthread_t __th); 参数pthre…

Python连接数据库

文章目录 一、安装mysql二、SQLyog可视化操作三、python实现数据库单表类封装1. config 文件——config.py2. 封装类&#xff08;model&#xff09;——model.py3. 测试文件——test.py 一、安装mysql 官网安装&#xff0c;或者Windows64位直接在我的资源里面上传了mysql&…

【PostgreSQL】从零开始:(二十七)数据类型-UUID 类型

UUID 类型 UUID&#xff08;通用唯一标识符&#xff09;是一个128位的数字标识符&#xff0c;用于在计算机系统中唯一地标识实体。它的标准格式为32个十六进制数字&#xff0c;用连字符分隔成五个组&#xff0c;形式如&#xff1a;8-4-4-4-12。UUID在各种系统和平台上广泛使用…

华为OD机试 - 测试用例执行计划(Java JS Python C)

题目描述 某个产品当前迭代周期内有 N 个特性(F1,F2,......FN)需要进行覆盖测试,每个特性都被评估了对应的优先级,特性使用其 ID 作为下标进行标识。 设计了 M 个测试用例(T1,T2,......,TM),每个测试用例对应一个覆盖特性的集合,测试用例使用其 ID 作为下标进行标识,…

C/C++ 基础函数

memcpy&#xff1a;C/C语言中的一个用于内存复制的函数&#xff0c;声明在 string.h 中&#xff08;C是 cstring&#xff09; void *memcpy(void *destin, void *source, unsigned n);作用是&#xff1a;以source指向的地址为起点&#xff0c;将连续的n个字节数据&#xff0c;…