二十一、W5100S_W5500+RP2040树莓派Pico<上位机搜索和配置设备>

本文介绍了上位机如何通过W5100S/W5500以太网芯片搜索和配置下位机,包括原理、步骤、代码示例及应用在工业自动化、物联网等领域的优势。重点讲解了如何通过UDP广播和DHCP配置实现设备间的高效通信和实时控制。
摘要由CSDN通过智能技术生成

1. 前言

  在自动化和控制系统领域,上位机和下位机是核心的组成部分。上位机负责发出控制命令并监控系统状态,而下位机则负责接收这些命令并直接控制设备。通过上位机和下位机的协同工作,可以实现各种复杂的自动化和控制系统功能。

  本章节将用 W5100S/W5500 + 树莓派RP2040 进行上位机搜索设备和配置设备 。

  W5100S/W5500是一款集成全硬件 TCP/IP 协议栈的嵌入式以太网控制器,同时也是一颗工业级以太网控制芯片。在以太网应用中使用 W5100S/W5500 让用户可以更加方便地在设备之间实现远程连接和通信。

2. 相关简介

2.1 简述

  上位机和下位机是在自动化和控制系统领域中经常使用的概念。简单来说,上位机是指能够发出控制命令并监控系统状态的计算机或计算机系统,而下位机则是负责接收上位机的控制命令并直接控制设备的计算机或计算机系统。

  上位机通常具有更高级别的控制和管理功能,可以独立运行复杂的应用程序,同时也能连接多个下位机,对它们进行监控、控制和数据处理。在分布式系统中,上位机通常运行在性能强大的计算机或服务器上,提供用户友好的图形界面,以便用户可以与系统进行交互。

  下位机则通常运行在低级别的计算机或嵌入式系统中,负责执行简单的控制任务,收集传感器数据并将其传递给上位机,或执行上位机发送的指令。下位机通常使用低级语言编写的程序,可以直接与硬件交互。在许多分布式系统中,下位机通过通信协议与上位机进行通信,以便上位机可以远程控制和监控下位机,并从下位机获取实时数据和状态信息。

  在工业自动化、物联网等领域中,上位机和下位机经常配合使用,实现控制、采集、处理和存储等功能。通过上位机和下位机的协同工作,可以实现各种复杂的自动化和控制系统功能。

2.2 原理

在这里插入图片描述

  搜索:上位机通过 UDP 广播发送 FIND 命令,设备作为下位机在收到后将自身配置信息发送给上位机,上位机收到后呈现获取到的设备信息;

​ 配置:在已经搜索到设备的基础上,上位机向该设备发送 SETT 命令后,设备收到后根据上位机显示的网络信息对本地进行重新配置,并在串口显示。

2.3 优点

  • 高效性:上位机配置下位机可以大大提高控制系统的效率。上位机发出控制命令,下位机接收并解释成相应的时序信号来直接控制设备,响应速度快,可靠性高。

  • 实时性:下位机可以实时地响应上位机的控制指令,并对设备进行实时控制,确保系统的稳定性和安全性。同时,下位机也可以实时地向上位机反馈设备状态数据,使得上位机可以及时了解系统状态并进行相应的控制调整。

  • 可靠性高:下位机通常具有自己的操作系统和编程语言,能够适应各种不同的硬件平台和系统架构方便系统的扩展和维护。此外,下位机还可以直接控制设备并获取设备状态数据,可靠性高。

  • 灵活性:上位机和下位机可以灵活地组合和扩展,以满足不同系统的需求。上位机可以同时连接多个下位机,对它们进行监控、控制和数据处理。同时,下位机也可以根据需要连接多个设备,实现设备的分布式控制。

  • 可维护性:上位机和下位机都有自己的开发系统和编程语言,方便系统的开发和维护。同时,上位机和下位机也可以进行远程监控和维护,提高系统的可维护性。

      总之,上位机配置下位机的优点主要包括高效性、实时性、可靠性高、灵活性和可维护性等。这些优点使得上位机和下位机在自动化和控制系统中的应用非常广泛。

2.4 应用

  • 工业自动化:

    • 上位机发出控制指令,下位机接收并解释成相应的时序信号来直接控制设备,响应速度快,可靠性高。

    • 上位机可以监控生产过程、发出控制指令、进行数据分析和优化等。

    • 下位机可以实时控制设备、采集设备状态数据、接收和执行控制指令等。

  • 物联网:

    • 上位机可以远程监控和管理设备、进行数据分析和处理等。

    • 下位机可以接收和执行控制指令、采集和传输设备状态数据等。

  • 智能家居:

    • 上位机可以发出控制指令、监控家庭网络等。

    • 下位机可以接收和执行控制指令、控制智能设备的运行和状态采集等。

  • 医疗设备:

    • 上位机可以发出控制指令、远程监控和管理医疗设备等。

    • 下位机可以接收和执行控制指令、控制医疗设备的运行和状态采集等。

  • 汽车电子:

    • 上位机可以发出控制指令、监控车辆状态等。

    • 下位机可以接收和执行控制指令、控制车辆各系统的运行和状态采集等。

这些应用中,上位机和下位机通过分工协作实现各种复杂的自动化和控制系统功能,提高了生产效率和管理水平。

3. WIZnet以太网芯片

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

ModelEmbedded CoreHost I/FTX/RX BufferHW SocketNetwork Performance
W5100STCP/IPv4, MAC & PHY8 bit BUS, SPI16 KB4Max 25 Mbps
W6100TCP/IPv4/IPv6, MAC & PHY8 bit BUS, Fast SPI32 KB8Max 25 Mbps
W5500TCP/IPv4, MAC & PHYFast SPI32 KB8Max 15 Mbps
  1. W5100S/W6100 支持 8 bit数据总线接口,网络传输速度会优于W5500。
  2. W6100 支持IPv6,与W5100S 可以Pin to Pin兼容,若已使用W5100S的用户需要支持IPv6,则可直接换用。
  3. W5500 拥有比 W5100S更多的 socket数量以及发送与接收缓存

4. 上位机搜索和配置测试

4.1 程序流程图

在这里插入图片描述

4.2 测试准备

软件

  • Visual Studio Code
  • WIZnet UartTool
  • Smart ConfigTool

硬件

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

4.3 连接方式

  • 通过数据线连接PC的USB口(主要用于烧录程序,也可以虚拟出串口使用)
  • 通过TTL串口转USB,连接UART0 的默认引脚:
    • RP2040 GPIO 0(UART0 TX) <----> USB_TTL_RX
    • RP2040 GPIO 1(UART0 RX) <----> USB_TTL_TX
  • 使用模块连接RP2040进行连线时
    • RP2040 GPIO 16 <----> W5100S MISO
    • RP2040 GPIO 17 <----> W5100S CS
    • RP2040 GPIO 18 <----> W5100S SCK
    • RP2040 GPIO 19 <----> W5100S MOSI
    • RP2040 GPIO 20 <----> W5100S RST
  • 通过网线直接连接PC网口(或:PC和设备都通过网线连接交换机或路由器LAN口)

4.4 相关代码

​ 打开upper_computer_search.c文件(路径:examples/upper_computer_search/upper_computer_search.c)看下具体实现:

​ 可以看到这里是以dhcp模式配置网络信息的,因此在主控和W5100S初始化完成后,会进行DHCP初始化,然后增加一个定时器初始化,用来做dhcp过程中的计时以进行超时处理;接着进入dhcp配置网络信息,成功则直接进入循环调用回环测试函数,失败则用我们初始化的静态网络信息进行配置,然后就进入while循环运行do_udp_config函数即可,如下所示:

/* Network information to be configured. */
wiz_NetInfo net_info = {
    .mac = {0x00, 0x08, 0xdc, 0x1e, 0xed, 0x2e}, // Configured MAC address
    .ip = {192, 168, 1, 10},                     // Configured IP address
    .sn = {255, 255, 255, 0},                    // Configured subnet mask
    .gw = {192, 168, 1, 1},                      // Configured gateway
    .dns = {8, 8, 8, 8},                         // Configured domain address
    .dhcp = NETINFO_DHCP};                       // Configured dhcp model,NETINFO_DHCP:use dhcp; NETINFO_STATIC: use static ip.

static uint8_t ethernet_buf[ETHERNET_BUF_MAX_SIZE] = {
    0,
}; // Send and receive cachestatic

static uint8_t destip[4] = {183, 230, 40, 34}; // OneNET HTTP access IP
static uint16_t destport = 80;                 // OneNET HTTP access port
static uint8_t breakout_flag = 0;              // Define the DHCP acquisition flag

int main()
{
    struct repeating_timer timer; // Define the timer structure
    wiz_NetInfo get_info;         // Stores the read configuration information

    /* MCU init */
    stdio_init_all();     // Initialize the main control peripheral
    wizchip_initialize(); // Initialize the chip interface

    /*dhcp init*/
    DHCP_init(SOCKET_ID, ethernet_buf);                                   // DHCP initialization
    add_repeating_timer_ms(1000, repeating_timer_callback, NULL, &timer); // Add DHCP 1s Tick Timer handler

    printf("wiznet chip UpperComputer Search example.\r\n");
    network_init(&net_info);              // Configuring Network Information
    print_network_information(&get_info); // Read back the configuration information and print it
    
    while (true)
    {
        do_udp_config(SOCKET_ID); // Run and precess UpperComputer command.
    }
}

  do_udp_config函数需要传入一个socket端口号,因为上位机和下位机交互这里是通过udp实现的,在函数内部用Switch状态机轮询socket状态,运行udp模式并与上位机交互,如下所示:

/**
 * @brief   Run receive UpperComputer command and precess.
 * @param   sn: socket number
 * @return  none.
 */
void do_udp_config(uint8_t sn)
{
    uint16_t i;
    uint16_t len;
    uint8_t rip[4];
    uint16_t rport;
    uint8_t bip[4] = {255, 255, 255, 255};
    uint16_t local_port = 1460;
    uint8_t sw_version[2] = {1, 0};

    memset(RecvMsg.op, 0, sizeof(RecvMsg)); // clear RecvMsg

    switch (getSn_SR(sn))
    {
    case SOCK_UDP:
        if ((len = getSn_RX_RSR(sn)) > 0)
        {
            recvfrom(sn, (uint8_t *)&RecvMsg, len, rip, &rport);
            // FIND: searching, SETT: setting, FIRM: firmware uploading
            if ((RecvMsg.op[0] == 'F') && (RecvMsg.op[1] == 'I') && (RecvMsg.op[2] == 'N') && (RecvMsg.op[3] == 'D'))
            {
                wizchip_getnetinfo(&netinfo); // get config network infomation.
                for (i = 0; i < 6; i++)
                {
                    ConfigMsg.mac[i] = netinfo.mac[i];
                    if (i < 4)
                    {
                        ConfigMsg.lip[i] = netinfo.ip[i];
                        ConfigMsg.gw[i] = netinfo.gw[i];
                        ConfigMsg.dns[i] = netinfo.dns[i];
                        ConfigMsg.sub[i] = netinfo.sn[i];
                    }
                    if (i < 2)
                    {
                        ConfigMsg.sw_ver[i] = sw_version[i];
                    }
                }
                RecvMsg = ConfigMsg;
                RecvMsg.op[0] = 'F';
                RecvMsg.op[1] = 'I';
                RecvMsg.op[2] = 'N';
                RecvMsg.op[3] = 'D';

                sendto(sn, (uint8_t *)&RecvMsg, sizeof(RecvMsg), bip, rport); // return network info to uppercomputer.
                printf("Find\r\n");
            }
            else if ((RecvMsg.op[0] == 'S') && (RecvMsg.op[1] == 'E') && (RecvMsg.op[2] == 'T') && (RecvMsg.op[3] == 'T'))
            {
                printf("Seet\r\n");
                if ((RecvMsg.mac[0] == ConfigMsg.mac[0]) && (RecvMsg.mac[1] == ConfigMsg.mac[1]) && (RecvMsg.mac[2] == ConfigMsg.mac[2]) &&
                    (RecvMsg.mac[3] == ConfigMsg.mac[3]) && (RecvMsg.mac[4] == ConfigMsg.mac[4]) && (RecvMsg.mac[5] == ConfigMsg.mac[5]))
                {
                    for (i = 0; i < 4; i++) // recv uppercomputer config network info
                    {
                        netinfo.ip[i] = RecvMsg.lip[i];
                        netinfo.sn[i] = RecvMsg.sub[i];
                        netinfo.gw[i] = RecvMsg.gw[i];
                        netinfo.dns[i] = RecvMsg.dns[i];
                        netinfo.dhcp = NETINFO_STATIC;
                    }
                    wizchip_setnetinfo(&netinfo); // write chip
                    printf("From the UpperComputer Config network information :\r\n");
                    print_network_information(&netinfo); // readback and print
                }
            } 
        }

        break;
    case SOCK_CLOSED:
        socket(sn, Sn_MR_UDP, local_port, 0x00);
        break;
    }
}

4.5 测试现象

​ 硬件连接无误后,编译烧录程序,打开WIZ UartTool,选择对应的COM口,填入参数:波特率115200,8位数据位,1位停止位,无校验位,无流控,填完参数后点击open打开,观察串口打印的信息以获取设备运行状态;等待设备打印相关网络信息后,打开ConfigTool上位机工具,点击Search可以看到上位机成功获取并呈现设备信息,然后修改IP地址,点击Setting可以看到串口这边打印了上位机配置后的网络信息,如下图所示:

在这里插入图片描述

在这里插入图片描述

5. 注意事项

  • 注意上位机搜索发现下位机设备后,才能进行配置操作。
  • 如果想用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官方库链接

    本章例程链接

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值