[STM32]STM32移植freemodbus实现modbusTCP

2023-05-16

上次说到采用STM32F1移植了FreeModbus协议栈进行开发实现ModBus-RTU协议来进行一些线圈寄存器的控制(继电器开关)和一些保持寄存器的读写(参数配置灯),这次说一下如何实现ModBus-TCP开发。

    ModbusTCP的数据帧可分为两部分:报文头(MBAP)+帧结构(PDU),所以数据格式与RTU也是不一样的,由于是基于以太网TCP通讯,所以相对于RTU,也少了数据最后面的CRC校验。

下面说说移植过程。

    一、打开FreeModbus软件包,解压后可以看到rtu、tcp、asscii等文件夹,这次ascii与rtu是用不到的,这两个是对应ModBus-asscii与ModBus-rtu开发,这次主要使用的是tcp文件夹中的文件中的mbtcp.c与mbtcp.h,functions、include、port文件加是三种协议格式都要用到的共用文件。

    二、通过MDK的 manage project items操作将整个文件包添加到自己的keil工程下,

    三、打开mbconfig.h文件,

启用MB_TCP_ENABLED,

禁用MB_ASCII_ENABLED与MB_RTU_ENABLED。

#define MB_ASCII_ENABLED                        ( 0 )          //不使能

/*! \brief If Modbus RTU support is enabled. */

#define MB_RTU_ENABLED                          ( 0 )          //不使能

/*! \brief If Modbus TCP support is enabled. */

#define MB_TCP_ENABLED                          ( 1 )          //使能

确定自己要用的最大Modbus功能模块数。如

#define MB_FUNC_HANDLERS_MAX                    ( 16 )

这样配置文件修改完成。

    四、这里是最主要的部分:

    在自己的主程序中调用初始化函数eMBTCPInit(NULL);与eMBEnable();并修改内部相关接口。

主要有eMBTCPStart;eMBTCPStop;eMBTCPReceive;eMBTCPSend;如果一直启动ModBus通讯,前面两个函数可以不用改。

在eMBTCPReceive中的xMBTCPPortGetRequest( &pucMBTCPFrame, &usLength )中添加自己的网卡接收到的TCP数据指针与接收到的TCP数据长度。

在eMBTCPSend中的xMBTCPPortSendResponse( pucMBTCPFrame, usTCPLength )中添加自己的网卡发送函数,数据指针为pucMBTCPFrame,长度为usTCPLength 。

这样,TCP收发接口就做好了,至于以上两个函数中网卡套接字收发数据另外单独编写,这里不单独说。

    五、在自己的网卡接收函数中发送modbus事件信号,( void )xMBPortEventPost( EV_FRAME_RECEIVED );表达设备收到TCP数据。

    六、在自己的程序任务或者是while(1){}中调用eMBPoll();进行TCP事件获取,xMBPortEventGet( &eEvent ) == TRUE ;当收到TCP数据之后就可以对应启动xFuncHandlers.pxHandler对应的命令码功能函数,主要功能码与RTU一样,详见图片列表。

    七、由于ModBus-TCP与ModBus-RTU数据格式不一样,需要在modbus\port中的porttcp.c中定义自己的UID、TID、PID等标识,并且指定自己的TCP端口等,这里是与RTU有很大的区别。具体参照ModBus-TCP格式说明。

#define MB_TCP_UID           6

#define MB_TCP_LEN           4

#define MB_TCP_FUNC        7

#define MB_TCP_DEFAULT_PORT  2000

    八、最后是编写自己的各种寄存器并且给定地址与赋值,以下作为参考:

unsigned short usRegInputStart = REG_INPUT_START;

unsigned short usRegInputBuf[REG_INPUT_NREGS]= {0};

/* ----------------------- Holding register Defines ------------------------------------------*/

unsigned short usRegHoldingStart = REG_HOLDING_START;

unsigned short usRegHoldingBuf[200]= {0};

/* ----------------------- coils register Defines ------------------------------------------*/

unsigned char ucRegCoilsBuf[REG_COILS_SIZE / 8]= {0xff,0x00};

/* ----------------------- discrete register Defines ------------------------------------------*/

unsigned char ucRegDiscBuf[REG_DISC_SIZE / 8]= {0xff,0x00};

    九、最后将自己的寄存器数组通过eMBErrorCode eMBRegHoldingCB( UCHAR * pucRegBuffer, USHORT usAddress, USHORT usNRegs,eMBRegisterMode eMode )等函数进行调用。就可以实现数据的读取与写入了。

最后可以通过ModbusTCP_Master等工具与进行ModbusTCP的寄存器读写调试。

    结合之前写的一份STM32移植freemodbus实现modbusRTU,这样两种协议的移植就说完了。至于ModBus-asscii,本人未使用过,希望有遇到的朋友可以相互交流。
---------------------
作者:forgot
链接:https://bbs.21ic.com/icview-3275194-1-1.html
来源:21ic.com
此文章已获得原创/原创奖标签,著作权归21ic所有,任何人未经允许禁止转载。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

[STM32]STM32移植freemodbus实现modbusTCP 的相关文章

  • 机器人定位误差标定模型

    概述 以工业机器人为基础 xff0c 构建柔性制造单元或柔性生产线 xff0c 实现产品自动化 柔性化 智能化生产必将成为现代制造发展的重点 新型产业环境下 xff0c 工业机器人的应用范围将越来越广泛 作业任务也将越来越精细复杂 xff0

随机推荐

  • 觉得C/C++难懂的、面临找工作面试笔试的,速来看这本书!

    如果你是C C 43 43 的初学者 xff0c 请看这本书 xff0c 因为其他的书也许你看了还不如不看 xff0c 一定要选一本好书 xff1b 如果你正准备求职 xff0c 那么请认真看这本书 xff0c 因为这本书会教会你工作中必备
  • rosdep update错误失败一直timeout解决方法

    更新rosdep 终端输入 rosdep update 失败1 The read operation timed out xff08 包括ERROR unable to process source xff0c ERROR error lo
  • bat, shell脚本ssh自动输入密码

    我电脑是win11 xff0c 并且自带ubuntu系统 xff0c 打开cmd xff0c 然后输入ubuntu xff0c 可以直接进入ubuntu系统 xff0c 然后执行简单的linux命令 我在两个系统下都写了自动连接远程服务的脚
  • FreeRtos 文件结构

    最核心的三个文件 1 xff09 tasks c 2 xff09 list c 3 xff09 queue c tasks c 任务相关 list c 为一个双向链表 queue c 队列 xff0c 信号量用于任务间通讯 4 xff09
  • 论文超详细精读:SMPL: A Skinned Multi-Person Linear Model

    文章目录 前言总览一 Introduction二 Related WorkBlend Skinning xff08 混合蒙皮 xff09 Blend shapes xff08 混合变形 xff09 Learning pose and sha
  • 1、列表推导式、字典推导式

    34 34 34 1 列表推导式 xff1a 作用 快速生成列表 需求1 xff1a 如何快速生成一个 34 data0 34 34 data1 34 34 data99 34 的列表 语法 xff1a y for x in xxx 实现
  • pwm超详细解读,大佬细说pwm的控制方式

    pwm xff0c 也就是常说的脉冲宽度调制脉冲宽度调制技术 目前 xff0c pwm技术的应用是非常多的 为了增进大家对pwm的认识 xff0c 本文将对pwm 的几种控制方法进行详细的阐述 xff0c 保证大家彻底理解 如果你对pwm
  • WiFi信号覆盖面积小?如何扩大Wifi信号覆盖范围?

    WiFi已是现代生活不可缺少的组成之一 xff0c 在WiFi的帮助下 xff0c 一个家庭网络或办公网络 xff0c 能够通过无线的方法连接诸多设备 为增进大家对WiFi的认识 xff0c 本文将对WiFi以及扩大WiFi信号覆盖范围的方
  • 数据存储方式有哪些?这3种数据存储方式了解吗?

    数据存储具有很强的现实意义 xff0c 只有采取合理的数据存储方式 xff0c 才能够有利于数据的管理 检索等 为增进大家对数据存储方式的认识 xff0c 本文将对三种数据存储方式予以介绍 如果你对数据存储方式具有兴趣 xff0c 不妨继续
  • 这里带你了解IR2104驱动电路

    Ir2014驱动电路及自举电容的应用 以前做智能车的时候用H桥驱动电路 xff0c 驱动芯片就是用的IR2104 xff0c MOS管用的IR7843 xff0c 想把以前的知识总结一下 1 为什么需要H桥电路 因为驱动电机正反转 xff0
  • 什么是神经网络模型,常见神经网络模型有哪些?

    神经网络模型是机器学习 深度学习的核心 xff0c 针对不同的问题 xff0c 我们需要搭建不同的神经网络模型 为增进大家对神经网络模型的认识 xff0c 本文将对常见的神经网络模型予以介绍 如果你对神经网络模型具有兴趣 xff0c 不妨继
  • STM32L431使用TencentOS tiny操作系统连接腾讯物联网开发平台

    去年腾讯为了宣传自己针对物联网的开源操作系统TencentOS tiny xff0c 举办了一场试用活动 xff0c 当时幸运获得一块 板子实物就这样 xff0c 没啥好介绍的 xff0c 都是基础的外设 xff0c 如今闲来无事 xff0
  • [总线技术]汽车ECU网络传输-诊断协议测试-基于Canoe软件CAPL脚本编写

    一 xff0e 汽车电子电控结构 先介绍一下汽车电子电控的结构 xff0c 汽车并不像电脑一样 xff0c 只有一个CPU xff0c 而是分为多个 CPU 独立工作 xff0c 就是由很多很多个控制器组成的 xff0c 比如 xff1a
  • [STM32F1]关于STM32F103芯片按钮机制串口发送程序

    就是目前遇到一个项目 xff0c 是监视各个按钮状态并将各个按钮的状态发送至上位机 xff0c 上位机进行整体程序逻辑动作 一般情况下串口发送可以直接一直发送给上位机 xff0c 通过解析不同数据位0和1的状态可以知道具体哪个按钮按下 xf
  • [uCOS/RTOS]freertos——创建任务(一)

    FreeRTOS操作系统学习 前言 FreeRTOS操作系统的学习正式开始 一 了解FreeRTOS FreeRTOS共有32个优先级 xff08 0 31 xff09 使用时0和31不使用 优先级规则 xff1a 数字越大优先级越高 任务
  • 基于FreeRTOS的UART空闲中断框架设计

    设计背景 xff1a 针对大部分国产低端MCU ARM CortexM0 来说 xff0c 并没有空闲中断 xff0c 此时就需要一个定时器Timer配合来完成此任务 对于UART接受不定长数据 xff0c 空闲中断还是非常实用的 xff0
  • 2、可迭代对象与迭代器

    1 Iterable 可迭代对象 概念 xff1a python中能够使用for循环遍历的都是可迭代对象 1 常见的可迭代对象 1 1 序列如 xff1a list str tuple range 1 2 非序列 xff1a dict se
  • 帮你分清嵌入式与单片机

    从事计算机和或电子行业相关领域工作的朋友 xff0c 一般都听说过单片机和嵌入式 但是要问单片机和嵌入式两者之间有什么联系 xff0c 大多数人都不能很好的解释清楚 想要弄清楚嵌入式和单片机有什么联系 xff0c 首先就要弄明白什么是嵌入式
  • [MM32生态]Python,让嵌入式应用开发更便捷、更高效、更专注

    前言 前面分享了基于PikaScript如何在MM32平台上部署Python开发环境的帖子 xff0c 实现了Python基础开发环境的部署 xff0c 可以通过串口终端软件在线编写Python xff0c 然后直接运行得到结果 通过Pyt
  • [STM32]STM32移植freemodbus实现modbusTCP

    上次说到采用STM32F1移植了FreeModbus协议栈进行开发实现ModBus RTU协议来进行一些线圈寄存器的控制 xff08 继电器开关 xff09 和一些保持寄存器的读写 xff08 参数配置灯 xff09 xff0c 这次说一下