0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

第二十九章 W55MH32 Modbus_TCP_Server示例

W55MH32 ? 来源:W55MH32 ? 作者:W55MH32 ? 2025-07-24 16:18 ? 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

单芯片解决方案,开启全新体验——W55MH32 高性能以太网单片机

W55MH32是WIZnet重磅推出的高性能以太网单片机,它为用户带来前所未有的集成化体验。这颗芯片将强大的组件集于一身,具体来说,一颗W55MH32内置高性能Arm? Cortex-M3核心,其主频最高可达216MHz;配备1024KB FLASH与96KB SRAM,满足存储与数据处理需求;集成TOE引擎,包含WIZnet全硬件TCP/IP协议栈、内置MAC以及PHY,拥有独立的32KB以太网收发缓存,可供8个独立硬件socket使用。如此配置,真正实现了All-in-One解决方案,为开发者提供极大便利。

在封装规格上,W55MH32 提供了两种选择:QFN100和QFN68。

W55MH32L采用QFN100封装版本,尺寸为12x12mm,其资源丰富,专为各种复杂工控场景设计。它拥有66个GPIO、3个ADC、12通道DMA、17个定时器、2个I2C、5个串口、2个SPI接口(其中1个带I2S接口复用)、1个CAN、1个USB2.0以及1个SDIO接口。如此丰富的外设资源,能够轻松应对工业控制中多样化的连接需求,无论是与各类传感器、执行器的通信,还是对复杂工业协议的支持,都能游刃有余,成为复杂工控领域的理想选择。同系列还有QFN68封装的W55MH32Q版本,该版本体积更小,仅为8x8mm,成本低,适合集成度高的网关模组等场景,软件使用方法一致。更多信息和资料请进入http://www.w5500.com/网站或者私信获取。

此外,本W55MH32支持硬件加密算法单元,WIZnet还推出TOE+SSL应用,涵盖TCP SSL、HTTP SSL以及 MQTT SSL等,为网络通信安全再添保障。

为助力开发者快速上手与深入开发,基于W55MH32L这颗芯片,WIZnet精心打造了配套开发板。开发板集成WIZ-Link芯片,借助一根USB C口数据线,就能轻松实现调试、下载以及串口打印日志等功能。开发板将所有外设全部引出,拓展功能也大幅提升,便于开发者全面评估芯片性能。

若您想获取芯片和开发板的更多详细信息,包括产品特性、技术参数以及价格等,欢迎访问官方网页:http://www.w5500.com/,我们期待与您共同探索W55MH32的无限可能。

wKgZO2iBiBmAe3DyAACpGc5mWX8613.png

第二十九章 W55MH32 Modbus_TCP_Server示例

本篇文章,我们将详细介绍如何在W55MH32芯片上面实现Modbus TCP协议。并通过实战例程,为大家讲解如何在W55MH32上使用Modbus TCP作为服务器,监听端口,与客户端进行通信。

该例程用到的其他网络协议,如DHCP,请参考相关章节。有关 W55MH32 的初始化过程,请参考 Network Install章节,这里将不再赘述。

1 Modbus TCP简介

Modbus TCP是一种基于以太网的通信协议,它是经典Modbus协议的扩展。Modbus协议最初由Modicon公司在1979年开发,广泛应用于工业自动化系统,用于实现不同设备之间的数据通信。Modbus TCP结合了Modbus协议的简单性和以太网的高效性,是一种开放、标准化且广泛使用的工业通信协议。

2 Modbus TCP的基本原理

Modbus TCP使用TCP/IP协议栈进行通信,运行在OSI模型的传输层(TCP层)之上。设备之间通过以太网接口连接,数据通过TCP端口(通常是502端口)传输。

主从架构:

主机(Master):主动发起请求的设备(通常是PLC或工业PC)。

从机(Slave):响应主机请求的设备(如传感器、执行器、IO模块)。

数据传输:主机向从机发送请求,从机解析后执行相应操作,并返回结果。通信过程包括功能码、地址、数据值和错误校验等内容。

3 Modbus TCP的优势

开放性: 不需要支付许可证费用,广泛支持。

简洁性: 数据格式简单易懂,开发和维护成本低。

兼容性: 支持多种工业设备和系统。

实时性: 基于TCP/IP,通信速度快,延迟低。

可扩展性: 能够集成到基于以太网的工业网络中。

4注意事项

通信可靠性: TCP连接可能存在断开或超时的情况,需要进行异常处理。

数据安全性: Modbus TCP本身不包含加密机制,可使用TLS等协议增加安全性。

设备地址: 每个从机需要唯一的单元标识符(Unit Identifier)。

网络配置: 需正确设置IP地址、子网掩码和网关。

Modbus TCP因其高效性和兼容性,已成为工业物联网(IIoT)和工业4.0中不可或缺的一部分。

5应用场景

接下来,我们了解下在W55MH32上,可以使用Modbus TCP协议完成哪些操作及应用呢?

1.工业自动化控制系统(PLC、SCADA等):通过与PLC和SCADA系统集成,W55MH32可以实现设备的实时监控与控制,支持生产线的参数调整、启动和停止等操作,同时能够采集传感器数据并上传至控制系统,用于分布式管理和优化工业流程。

2.智能楼宇自动化(HVAC系统、能源管理):W55MH32可连接楼宇的HVAC设备,支持远程调节空调和通风系统,并采集电力、水、气等能耗数据,上传至能源管理系统,帮助优化楼宇能效。此外,还可集成智能照明和安防传感器,实现更智能的楼宇管理。

3.数据采集与监控(远程I/O模块、传感器网络):通过远程I/O模块,W55MH32能够采集温度、压力、湿度等多种传感器数据,并实现远程监控与报警功能。采集的数据还能用于设备健康状态分析,支持预测性维护,提升设备可靠性。

4.工业设备互联(变频器、伺服驱动器:W55MH32可与变频器、伺服驱动器等设备通信,实现参数调节和运行状态监控,支持高精度的运动控制和状态反馈。同时,作为中转站,它还能实现不同设备之间的互联互通,构建开放的工业互联生态。

6 Modbus TCP报文结构

Modbus TCP报文由以下几个部分组成:

事务处理标识符(2字节):用于标识请求与响应之间的配对。主机在请求中设置一个唯一的标识符,从机在响应中回传相同的值,方便主机识别对应的响应。

协议标识符(2字节):通常为0x0000,表示该报文使用的是Modbus协议。

长度字段(2字节):表示后续数据的字节数(不包括事务处理标识符和协议标识符)。

单元标识符(1字节):标识目标从机设备的地址。在Modbus TCP中,该字段通常用于区分逻辑设备。

功能码(1字节):定义当前操作的类型(如读写寄存器等)。

数据部分(可变长度):包含具体的操作数据,例如寄存器地址、要读取或写入的值等。

7 Modbus TCP常用功能码

功能码 0x01:读取线圈状态,用于读取从机设备中的一组线圈状态(0或1)。

功能码 0x02:读取离散输入,用于读取从机设备中的一组离散输入状态(只读,0或1)。

功能码 0x03:读取保持寄存器,用于读取从机设备中的一组保持寄存器值(通常是可读写的数值)。

功能码 0x04:读取输入寄存器,用于读取从机设备中的一组输入寄存器值(只读数据)。

功能码 0x05:写单个线圈,用于写入从机设备中的一个线圈状态(设置为0或1)。

功能码 0x06:写单个寄存器,用于向从机设备中的一个保持寄存器写入数据。

功能码 0x0F:写多个线圈,用于同时写入从机设备中的多个线圈状态。

功能码 0x10:写多个寄存器,用于同时向从机设备中的多个保持寄存器写入数据。

8实现过程

接下来,我们在W55MH32上实现Modbus TCP协议服务器模式:

注意:测试实例需要PC端和W55MH32处于同一网段。

步骤一:初始化并注册LED相关函数

1.     user_led_init();
2. 
3.     user_led_control_init(get_user_led_status, set_user_led_status);
4. 

在程序初始化部分添加LED所使用的GPIO外设初始化和注册设置、获取LED状态的函数,用于在接收到特定的Modbus TCP数据时进行状态的显示。

user_led_control_init()函数如下:

1. void user_led_control_init(int(*get_fun)(void),void(*set_fun)(uint32_t))
2. {
3.     if(get_fun!= NULL&& set_fun!= NULL)
4.     {
5.         getUserLED_cb= get_fun;
6.         setUserLED_cb= set_fun;
7.     }
8. }

user_led_control_init()为LED控制初始化函数,允许用户注册两个回调函数:一个用于获取LED状态,另一个用于设置LED状态。这些回调函数将在get_led_status()和set_led_status()函数中被调用。函数如下:

1. int get_led_status(void)
2. {
3.     return getUserLED_cb();
4. }
5. void set_led_status(int32_t val)
6. {
7.     setUserLED_cb(val);
8. }

get_led_status()和set_led_status()为获取和设置LED状态的函数,get_led_status()函数调用注册的获取LED状态的回调函数,并返回其返回值。set_led_status()函数调用注册的设置LED状态的回调函数,并传入新的状态值。

步骤二:主循环调用do_Modbus()函数

1.  while(1)
2.     {
3.         do_Modbus(SOCKET_ID);
4.     }

在循环中不断执行do_Modbus()函数的操作,用于处理Modbus TCP通信,根据套接字的不同状态执行相应的操作,包括监听连接请求、处理连接建立事件、接收和处理数据以及关闭连接等。

步骤三:进入do_Modbus()函数,处理接收的报文

 1.  void do_Modbus(uint8_t sn)
 2. {
 3.     uint8_t state=0;
 4.     uint16_t len;
 5.     getSIPR(lip);
 6.     state= getSn_SR(sn);
 7.     switch(state)
 8.     {
 9.     case SOCK_SYNSENT:
10.         break;
11.     case SOCK_INIT:
12.         listen(sn);
13.         if(!b_listening_printed)
14.         {
15.             b_listening_printed=1;
16.             printf("Listening on %d.%d.%d.%d:%drn",
17.                    lip[0], lip[1], lip[2], lip[3], local_port);
18.         }
19.         break;
20.     case SOCK_LISTEN:
21.         break;
22.     case SOCK_ESTABLISHED:
23.         if(getSn_IR(sn)&Sn_IR_CON)
24.         {
25.             setSn_IR(sn,Sn_IR_CON);
26.             printf("Connectedrn");
27.             getSn_DIPR(sn, rip);
28.             port= getSn_DPORT(sn);
29.             printf("RemoteIP:%d.%d.%d.%d Port:%drn", rip[0], rip[1], rip[2], rip[3], port);
30.  
31.             if(b_listening_printed)
32.                 b_listening_printed=0;
33.         }
34.         len= getSn_RX_RSR(sn);
35.         if(len>0)
36.         {
37.             mbTCPtoEVB(sn);
38.         }
39.         break;
40.     case SOCK_CLOSE_WAIT:
41.         disconnect(sn);
42.         break;
43.     case SOCK_CLOSED:
44.     case SOCK_FIN_WAIT:
45.         close(sn);
46.         socket(sn,Sn_MR_TCP, local_port,Sn_MR_ND);// Sn_MR_ND
47.         break;
48.     default:
49.         break;
50.     }
51. 

首先,程序会获取本地IP地址和指定socket的状态,根据socket的状态,执行相应的操作。例如,如果socket处于监听状态,则开始监听;如果处于已建立连接状态,则处理接收到的数据。在处理已建立连接状态时,检查是否有新的连接请求,并打印连接信息(包括远程IP地址和端口号)。如果有接收到的数据,则调用mbTCPtoEVB()函数检查Modbus TCP数据并执行对应操作。mbTCPtoEVB()函数内容如下:

 1. void mbTCPtoEVB(uint8_t sn)
 2. {
 3.     if(MBtcp2evbFrame()!=0)                        // Frame received complete
 4.     {
 5.         if(pucASCIIBufferCur[0]==0x01)             // Check whether the device address is 0x01
 6.         {
 7.             if((uint8_t)pucASCIIBufferCur[1]==0x05)// Write to a single device
 8.             {
 9.                 if((uint8_t)pucASCIIBufferCur[4]==0xff)
10.                 {
11.                     set_led_status(0);
12.                     printf("LED ONrn");
13.                 }
14.                 elseif((uint8_t)pucASCIIBufferCur[4]==0x00)
15.                 {
16.                     set_led_status(1);
17.                     printf("LED OFFrn");
18.                 }
19.                 send(sn, recv_data, recv_len);
20.             }
21.             elseif((uint8_t)pucASCIIBufferCur[1]==0x01)// Read Write to a single device
22.             {
23.                 if(recv_data[recv_len-1]!=0x01)
24.                 {
25.                     printf("len error!%xrn", recv_data[recv_len-1]);
26.                 }
27.                 else
28.                 {
29.                     printf("Read OK!rn");
30.                     send_data[0]= recv_data[0];
31.                     send_data[1]= recv_data[1];
32.                     send_data[2]= recv_data[2];
33.                     send_data[3]= recv_data[3];
34.                     send_data[4]=0x00;
35.                     send_data[5]=0x04;
36.                     send_data[6]=0x01;
37.                     send_data[7]=0x01;
38.                     send_data[8]=0x01;
39.                     send_data[9]=~get_led_status();
40.                     send_len    =10;
41.                     send(sn, send_data, send_len);
42.                     memset(send_data,0, send_len);
43.                 }
44.             }
45.             else
46.             {
47.                 printf("error code!rn");
48.             }
49.         }
50.         else
51.         {
52.             printf("address error!rn");
53.         }
54.     }
55. }
56. 

mbTCPtoEVB()函数用于处理从Modbus TCP接收到的数据,根据数据内容执行相应的操作,包括写单个设备和读单个设备操作,并根据操作结果发送响应数据。比如在接收到一段Modbus TCP数据之后,首先会进行检查、比对,符合预设的值时,对LED进行开或关的状态设置,并打印相应的信息,再调用send()函数将接收到的数据原样发送回去。如果接收到的数据不符合预期,会打印相应的错误信息。

9运行结果

烧录例程运行后,首先可以看到进行了PHY链路检测,然后打印了设置的网络地址信息,然后开始监听地址和端口号,信息如下图所示:

wKgZO2iB6_qAbPglAAB-brmRUfg773.png

我们使用网络调试助手进行连接:

wKgZPGiB6_uAIjIdAABtQd-BBp8368.png

然后发送“00 01 00 00 00 06 01 01 00 00 00 01”报文后回复“0 01 00 00 00 04 01 01 01 FE”如下图所示:

接着我们发送“ 01 00 00 00 06 01 05 00 00 ff 00 00 00”令,LED就被打开了,且指令被进行了回传:

wKgZPGiB6_qASXy4AABzojicN7g582.png

发送“0 01 00 00 00 06 01 05 00 00 00 00 00 00”可以关闭LED:

wKgZO2iB6_qAeUWSAAB2lG_5ihc588.png

10总结

本文讲解了如何在 W55MH32芯片上实现 Modbus TCP协议的服务器模式,通过实战例程展示了从初始化 LED相关函数、主循环调用处理函数到解析处理接收到的报文的完整过程。文章详细介绍了 Modbus TCP的概念、基本原理、优势、注意事项、应用场景、报文结构和常用功能码,帮助读者理解其在工业通信中的实际应用价值。

下一篇文章将讲解在 W55MH32芯片上实现 HTTP_Server与 NetBIOS功能,解析如何通过 NetBIOS名称访问 HTTP服务器的网页内容,同时通过实战例程讲解具体实现步骤与要点,敬请期待!

WIZnet是一家无晶圆厂半导体公司,成立于 1998年。产品包括互联网处理器 iMCU?,它采用 TOE(TCP/IP卸载引擎)技术,基于独特的专利全硬连线 TCP/IP。iMCU?面向各种应用中的嵌入式互联网设备。

WIZnet在全球拥有 70多家分销商,在香港、韩国、美国设有办事处,提供技术支持和产品营销。

香港办事处管理的区域包括:澳大利亚、印度、土耳其、亚洲(韩国和日本除外)。


审核编辑 黄宇

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 嵌入式
    +关注

    关注

    5156

    文章

    19720

    浏览量

    318288
  • 以太网
    +关注

    关注

    41

    文章

    5692

    浏览量

    176333
  • MODBUS
    +关注

    关注

    28

    文章

    2152

    浏览量

    79764
收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    第三十章 W55MH32 HTTP_Server&NetBIOS示例

    本文讲解了如何在 W55MH32?芯片上实现 HTTP_Server?与 NetBIOS?功能,并通过 NetBIOS?访问 HTTP?服务器网页内容,通过实战例程展示了在主循环中并行处理 HTTP?与 NetBIOS?相关事务的过程。
    的头像 发表于 07-24 16:21 ?175次阅读
    第三十章 <b class='flag-5'>W55MH32</b> HTTP_<b class='flag-5'>Server</b>&amp;NetBIOS<b class='flag-5'>示例</b>

    第二十七章 W55MH32?Interrupt示例

    本文讲解了如何在 W55MH32?芯片上使用 TOE?中断功能并进行回环数据测试,通过实战例程展示了从初始化中断引脚、处理中断、开启中断功能到在主循环中运行 TCP?回环服务器的完整过程。文章详细
    的头像 发表于 07-24 16:14 ?113次阅读
    <b class='flag-5'>第二十</b>七章 <b class='flag-5'>W55MH32</b>?Interrupt<b class='flag-5'>示例</b>

    第二十六章 W55MH32?上位机搜索和配置示例

    本文讲解了如何在 W55MH32?芯片上实现上位机搜索和配置功能,通过实战例程展示了使用开源上位机配置工具 SmartConfigTool?搜索局域网中的 W55MH32?并进行网络地址配置的过程
    的头像 发表于 07-24 16:13 ?126次阅读
    <b class='flag-5'>第二十</b>六章 <b class='flag-5'>W55MH32</b>?上位机搜索和配置<b class='flag-5'>示例</b>

    第二十五章 W55MH32 TCP_Server_Multi_Socket示例

    本文讲解了如何在 W55MH32?芯片上使用 8?个 socket?实现 TCP?服务器模式,让多个客户端连接进行数据回环测试,通过实战例程展示了从初始化 socket?到监听端口、处理客户端连接
    的头像 发表于 07-24 16:10 ?126次阅读
    <b class='flag-5'>第二十</b>五章 <b class='flag-5'>W55MH32</b> <b class='flag-5'>TCP_Server</b>_Multi_Socket<b class='flag-5'>示例</b>

    第二十四章 W55MH32TCP_Client_Multi_Socket示例

    本文讲解了如何在 W55MH32?芯片上使用 8?个 socket?实现 TCP?客户端模式,同时连接 1?个服务器进行数据回环测试,通过实战例程展示了从初始化 socket?到建立连接、数据交互
    的头像 发表于 07-24 16:08 ?114次阅读
    <b class='flag-5'>第二十</b>四章 <b class='flag-5'>W55MH32TCP</b>_Client_Multi_Socket<b class='flag-5'>示例</b>

    第二十三章 W55MH32 MQTT_OneNET示例

    本文讲解了如何在 W55MH32?芯片上实现 MQTT?协议并连接 OneNET?平台,通过实战例程展示了从准备工作、连接配置到消息订阅、发布及接收处理的完整过程。文章详细介绍了 MQTT?协议
    的头像 发表于 07-24 14:59 ?157次阅读
    <b class='flag-5'>第二十</b>三章 <b class='flag-5'>W55MH32</b> MQTT_OneNET<b class='flag-5'>示例</b>

    第二十二章 W55MH32 MQTT&amp;Aliyun示例

    本文讲解了如何在 W55MH32?芯片上实现 MQTT?协议并连接阿里云平台,通过实战例程展示了从准备工作、连接配置到消息订阅、发布及接收处理的完整过程。文章详细介绍了 MQTT?协议的概念、特点
    的头像 发表于 07-24 14:17 ?177次阅读
    <b class='flag-5'>第二十</b>二章 <b class='flag-5'>W55MH32</b> MQTT&amp;Aliyun<b class='flag-5'>示例</b>

    第二十一章 W55MH32 PHY配置示例

    本文讲解了如何在 W55MH32?芯片上设置不同的 PHY?模式,通过实战例程展示了根据不同传输场景,将 PHY?模式在 100Mbps?全双工、10Mbps?半双工和掉电模式之间切换以降
    的头像 发表于 07-24 13:44 ?148次阅读
    <b class='flag-5'>第二十</b>一章 <b class='flag-5'>W55MH32</b> PHY配置<b class='flag-5'>示例</b>

    十九章 W55MH32 FTP_Client示例

    本文讲解了如何在 W55MH32?芯片上实现 FTP?协议的客户端模式,通过实战例程展示了使用该客户端模式访问 FTP?服务器并下载文件的过程,涵盖 FTP?客户端模式初始化、在主循环中运行相关函数
    的头像 发表于 07-24 13:39 ?125次阅读
    第<b class='flag-5'>十九章</b> <b class='flag-5'>W55MH32</b> FTP_Client<b class='flag-5'>示例</b>

    第十八章 W55MH32 FTP_Server示例

    本文讲解了如何在 W55MH32?芯片上实现 FTP?协议的服务器模式,通过实战例程展示了使用 W55MH32?作为 FTP?服务器与 PC?端进行文件传输、目录操作等功能的过程,涵盖获取网络配置
    的头像 发表于 07-24 11:55 ?89次阅读
    第十八章 <b class='flag-5'>W55MH32</b> FTP_<b class='flag-5'>Server</b><b class='flag-5'>示例</b>

    第十五章 W55MH32 SNMP示例

    本文讲解了如何在 W55MH32?芯片上实现 SNMP?功能,通过实战例程展示了使用 MIB Browser?管理 W55MH32?的具体过程,涵盖在 MIB Browser?中创建分支、添加叶子
    的头像 发表于 07-24 10:43 ?179次阅读
    第十五章 <b class='flag-5'>W55MH32</b> SNMP<b class='flag-5'>示例</b>

    九章 W55MH32 HTTP Server示例

    本文介绍了在 W55MH32?芯片上实现 HTTP Server?功能,并通过浏览器修改其网络地址信息的方法。阐述了 HTTP?协议的概念、特点、应用场景、工作流程、请求方法、响应内容,以及 Web?页面构成和交互方式。展示了在W55M
    的头像 发表于 07-24 09:35 ?140次阅读
    第<b class='flag-5'>九章</b> <b class='flag-5'>W55MH32</b> HTTP <b class='flag-5'>Server</b><b class='flag-5'>示例</b>

    第三章 W55MH32 TCP Client示例

    本文介绍在 W55MH32?芯片上实现 TCP?客户端模式进行数据回环测试的方法。阐述 TCP?协议概念、特点、与 UDP?区别、应用场景及相关机制。展示实现过程,包括开启 Keepalive?功能,在主循环运行测试程序。烧录例
    的头像 发表于 07-24 09:06 ?177次阅读
    第三章 <b class='flag-5'>W55MH32</b> <b class='flag-5'>TCP</b> Client<b class='flag-5'>示例</b>

    第二W55MH32 DHCP示例

    本文介绍 DHCP?协议,包括其在 IP?网络自动分配参数的功能、便捷配置等特点、工作原理、报文格式和应用场景。通过 W55MH32?实战例程展示动态获取网络地址信息过程,含注册定时器中断、启用模式和获取信息等步骤,烧录后可完成检测与信息打印,PC?端能 PING?通设备。
    的头像 发表于 07-24 09:02 ?169次阅读
    <b class='flag-5'>第二</b>章 <b class='flag-5'>W55MH32</b> DHCP<b class='flag-5'>示例</b>

    第二十九章 读写内部FLASH

    本文介绍了W55MH32内部FLASH,其含主存储、系统存储等,可存储代码及掉电保存数据。读写需解锁、擦除页等步骤,标准库提供相关函数。还展示了擦除编程测试及模拟EEPROM读写的实验。
    的头像 发表于 06-20 14:09 ?625次阅读
    <b class='flag-5'>第二十九章</b> 读写内部FLASH