首页 > 其他分享 >stm32与昆仑通态modbus通讯

stm32与昆仑通态modbus通讯

时间:2025-01-16 21:58:04浏览次数:3  
标签:modbus Modbus huart3 通态 STM32 stm32 UART Init

一、引言

在工业自动化和物联网等领域,STM32 微控制器和昆仑通态人机界面(HMI)的组合应用十分广泛。为了实现它们之间的数据交换和设备控制,通常采用 Modbus 通信协议。Modbus 是一种简单且通用的通信协议,支持多种物理接口,如 RS-485、RS-232 和 TCP/IP 等,其具有易于实现、开放性和可靠性高等优点,非常适合工业环境下的设备间通信。

二、STM32 与 Modbus 概述

STM32 是意法半导体(STMicroelectronics)推出的一系列高性能、低功耗的微控制器,具有丰富的外设和强大的处理能力,能够满足各种工业控制和通信的需求。而 Modbus 协议主要包括 Modbus RTU(基于二进制)和 Modbus ASCII(基于文本)两种常见的传输模式,以及 Modbus TCP(基于以太网)模式。对于 STM32 与昆仑通态之间的通信,我们可以根据具体的应用场景选择合适的 Modbus 模式。

三、硬件连接

首先,确保 STM32 与昆仑通态设备的物理连接正确。如果使用 RS-485 通信,需要连接 STM32 的 USART 接口和 RS-485 收发器(如 MAX485),并将 RS-485 接口连接到昆仑通态的相应端口。确保连接的线缆长度、终端电阻的配置等符合 RS-485 标准,以保证通信的稳定性和可靠性。

四、STM32 软件实现

以下是一个简单的 STM32 上实现 Modbus RTU 通信的示例代码片段,使用 STM32 的 HAL 库和 FreeModbus 开源库。

#include "stm32f4xx_hal.h"
#include "mb.h"
#include "mbport.h"

// 定义 USART 句柄
UART_HandleTypeDef huart3;

// 初始化 USART 接口
void MX_USART3_UART_Init(void)
{
    huart3.Instance = USART3;
    huart3.Init.BaudRate = 9600;
    huart3.Init.WordLength = UART_WORDLENGTH_8B;
    huart3.Init.StopBits = UART_STOPBITS_1;
    huart3.Init.Parity = UART_PARITY_NONE;
    huart3.Init.Mode = UART_MODE_TX_RX;
    huart3.Init.HwFlowCtl = UART_HWCONTROL_NONE;
    huart3.Init.OverSampling = UART_OVERSAMPLING_16;
    if (HAL_UART_Init(&huart3)!= HAL_OK)
    {
        Error_Handler();
    }
}

// 错误处理函数
void Error_Handler(void)
{
    while(1);
}

// Modbus 事件处理函数
eMBErrorCode eMBRegHoldingCB(UCHAR * pucRegBuffer, USHORT usAddress, USHORT usNRegs, eMBRegisterMode eMode)
{
    eMBErrorCode    eStatus = MB_ENOERR;
    int iRegIndex;

    if ((usAddress >= REG_INPUT_START) && (usAddress + usNRegs <= REG_INPUT_START + REG_INPUT_NREGS))
    {
        iRegIndex = (int)(usAddress - REG_INPUT_START);
        switch (eMode)
        {
            case MB_REG_READ:
                while (usNRegs > 0)
                {
                    *pucRegBuffer++ = (unsigned char)(usRegInputBuf[iRegIndex] >> 8);
                    *pucRegBuffer++ = (unsigned char)(usRegInputBuf[iRegIndex] & 0xFF);
                    iRegIndex++;
                    usNRegs--;
                }
                break;

            case MB_REG_WRITE:
                while (usNRegs > 0)
                {
                    usRegInputBuf[iRegIndex] = *pucRegBuffer++ << 8;
                    usRegInputBuf[iRegIndex] |= *pucRegBuffer++;
                    iRegIndex++;
                    usNRegs--;
                }
                break;
        }
    }
    else
    {
        eStatus = MB_ENOREG;
    }
    return eStatus;
}

int main(void)
{
    HAL_Init();
    MX_USART3_UART_Init();

    // 初始化 Modbus RTU
    eMBInit(MB_RTU, 1, 3, 9600, MB_PAR_NONE);
    eMBEnable();

    while (1)
    {
        // 调用 Modbus 处理函数
        eMBPoll();
    }
}

代码解释:

  1. 头文件引入
    • stm32f4xx_hal.h 是 STM32 的 HAL 库头文件,用于初始化和配置 STM32 的硬件资源。
    • mb.hmbport.h 是 FreeModbus 库的头文件,用于实现 Modbus 协议的功能。
  2. USART 初始化函数
    • MX_USART3_UART_Init() 函数使用 HAL 库对 USART3 进行初始化,设置波特率为 9600bps,8 位数据位,1 位停止位,无校验位等。
  3. 错误处理函数
    • Error_Handler() 函数在出现错误时会进入一个无限循环,方便调试和查找问题。
  4. Modbus 事件处理函数
    • eMBRegHoldingCB() 函数是 Modbus 的保持寄存器回调函数,根据不同的操作模式(读或写),对相应的寄存器进行操作。当读取寄存器时,将寄存器数据发送到 Modbus 从机;当写入寄存器时,更新寄存器的值。
  5. 主函数
    • main() 函数中,首先初始化 HAL 库和 USART3 接口,然后使用 eMBInit() 初始化 Modbus RTU 模式,设置从机地址为 1,使用 USART3,波特率为 9600,无校验。接着使用 eMBEnable() 启用 Modbus 功能,最后在一个无限循环中调用 eMBPoll() 处理 Modbus 通信事件。

五、昆仑通态配置

在昆仑通态的开发环境中,需要进行以下配置:

  1. 添加设备:在设备窗口添加一个 Modbus 设备,设置设备的通讯参数,如串口参数(波特率、数据位、停止位、校验位),与 STM32 的设置一致。
  2. 创建变量:根据需要创建相应的变量,这些变量将与 STM32 中的寄存器对应。例如,创建一个读写寄存器,设置其寄存器地址,数据类型等。
  3. 画面开发:在画面中添加控件,如按钮、文本框等,将其属性与创建的变量关联,实现数据的显示和控制操作。

六、测试与调试

在完成 STM32 和昆仑通态的配置和编程后,需要进行测试和调试。

  1. STM32 端调试:可以使用 ST-Link 等调试工具,通过断点和单步执行的方式检查代码是否正常运行,观察变量的值和程序的执行流程。
  2. 昆仑通态端调试:在昆仑通态的运行环境中,使用其提供的调试工具,检查变量的读写操作是否正确,观察通信状态和数据的更新情况。

七、注意事项

  1. 确保 STM32 和昆仑通态的波特率、数据位、停止位和校验位设置完全一致,否则会导致通信失败。
  2. 对于 RS-485 通信,要注意总线的电气特性,避免因总线冲突或终端电阻问题导致通信异常。
  3. 在处理 Modbus 通信时,要考虑超时时间和重试机制,以应对通信异常的情况。

八、总结

STM32 与昆仑通态之间的 Modbus 通信为工业控制和自动化系统提供了一种简单而有效的数据交换和设备控制的解决方案。通过合理的硬件连接、正确的软件实现和精心的调试,能够实现稳定可靠的通信,满足各种工业应用的需求。通过使用 STM32 的强大处理能力和昆仑通态友好的人机界面开发环境,我们可以方便地构建功能强大的自动化控制系统。

上述代码只是一个基础示例,在实际应用中,可能需要根据具体的需求,如多个从机、不同的寄存器操作、不同的通信模式等进行进一步的扩展和优化。同时,对于不同型号的 STM32 微控制器,其 HAL 库的使用方法可能会有所不同,需要根据具体的芯片手册进行相应的调整。

✅作者简介:热爱科研的嵌入式开发者,修心和技术同步精进

❤欢迎关注我的知乎:对error视而不见

代码获取、问题探讨及文章转载可私信。

☁ 愿你的生命中有够多的云翳,来造就一个美丽的黄昏。

标签:modbus,Modbus,huart3,通态,STM32,stm32,UART,Init
From: https://blog.csdn.net/duierrorshuobu/article/details/145192683

相关文章

  • STM32H563 HAL库 LWIP裸机移植
    一、STM32H563与LWIP简介STM32H563是STMicroelectronics推出的一款高性能32位微控制器,具有丰富的外设和强大的处理能力,适用于各种复杂的嵌入式系统应用。LWIP(LightweightIP)是一个小型开源的TCP/IP协议栈,旨在为嵌入式系统提供轻量级的网络功能,它能够在资源有限的......
  • MODBUS RTU转CCLINK IE台达ME300变频器与三菱plc通讯案例
    你是否曾经遇到过需要将不同的工业设备连接到同一个网络?这是一个非常常见的问题,那么今天我将为大家介绍一种解决方案。捷米特JM-CCLKIE-RTU网关是一款通讯网关,可以将各种不同的工业设备连接到CCLINKIEFB网络中。它不仅可以将MODBUS-RTU/RS485/RS232设备接入到CCLINKIE......
  • STM32F103使用flash_algo解析FLM相关
    1、全局区(.bss段和.data段)根据实际情况修改2、栈顶地址根据实际情况修改/*FlashOSRoutines(AutomagicallyGenerated)*Copyright(c)2009-2015ARMLimited*/#include"flash_blob.h"//代码区flash_code[]使用JLINK/STLINK等放到RAM,一般是0x20000000staticconst......
  • 揭秘10种主流PLC在ModbusTCP通信中的速度表现!
    大家好!我是付工。通透!终于把ModbusRTU弄明白了这样看来,ModbusTCP协议太简单了太简单了!C#轻松实现Modbus通信前面给大家介绍了一系列关于Modbus和ModbusTCP的知识。今天给大家来实测一下,对于不同品牌的PLC或板卡实现ModbusTCP通信时,通信速度有多快。一、测试界面我们......
  • stm32 无源蜂鸣器实验 播放音乐 猪八戒背媳妇
    前言在8051及stm32各类教辅资料中,均有无源蜂鸣器相关的实验。可以通过单片机控制无源蜂鸣器发出指定频率和时长的声音,从而实现播放音乐的功能。在以往的此类案例中,乐谱的谱写非常不方便,除了案例提供的乐谱数据外,学者要将一个其它的简谱转换成单片机可以播放的数据,基本不可......
  • STM32简介
    1、STM32是基于ARM-Cortex-M内核开发的32位微控制器。STM32分为高性能系列,主流系列,低功耗系列、无线系列:视频采用STM32F1系列高性能系列:STM32F2,F4,F7,H7(3224内核跑分,双核微控制器=550MHz的Cortex-M7+240MHz的Cortex-M4)2、ARM内核型号:经典ARM处理器:ARM7、ARM9、ARM11Corte......
  • 基于STM32的AI物联网计算实现指南
    基于STM32的AI物联网计算实现指南版权所有©深圳市为也科技有限公司摘要随着人工智能(AI)和物联网(IoT)的快速发展,智能设备在各行各业中的应用日益广泛。STM32系列微控制器凭借其高性能、低功耗和丰富的外设接口,成为实现AI物联网计算的理想选择。本文将全面介绍如何利用S......
  • 基于STM32控制VS1053B芯片的音频处理开发指南
    基于STM32控制VS1053B芯片的音频处理开发指南版权所有©深圳市为也科技有限公司摘要VS1053B是由VLSISolution推出的一款功能强大的音频编解码芯片,广泛应用于音频播放器、语音记录设备和其他嵌入式音频应用中。结合STM32微控制器,开发者可以实现高质量的音频处理功能......
  • STM32F1基于HAL库的学习记录实用使用教程分享(四、OLED IIC)
    往期内容STM32F1基于HAL库的学习记录实用使用教程分享(一、GPIO_Output)STM32F1基于HAL库的学习记录实用使用教程分享(二、GPIO_Input按键)STM32F1基于HAL库的学习记录实用使用教程分享(三、外部中断按键)文章目录往期内容前言一、IIC1.概念2.IIC作用3.IIC的特点II......
  • 揭秘10种主流PLC在ModbusTCP通信中的速度表现!
    大家好!我是付工。通透!终于把ModbusRTU弄明白了这样看来,ModbusTCP协议太简单了太简单了!C#轻松实现Modbus通信前面给大家介绍了一系列关于Modbus和ModbusTCP的知识。今天给大家来实测一下,对于不同品牌的PLC或板卡实现ModbusTCP通信时,通信速度有多快。一、测试界面我们使用自......