基于STM32F767通过STM32CubeMX实现ModbusTCP读多为寄存器操作(后续)

由于上篇着重介绍了实现功能的代码,以至于我没有和大家讲清楚FreeModbus应该怎么移植,在此先抱歉浪费大家时间了。
接下来我要开始实操怎么成功移植Freemodbus在STM32上(以下方法可以满足所有STM32设备)

实验准备:去FreeModbus官网下载Modbus的源码包,链接直接放上:Freemodbus官网
懒人直接点击Github链接:FreeModbus源码

3、很多人移植这个modbus时出现了加上modbus相关代码时就ping不同的情况,其实是在modbus源码中出现了死循环,如下所示处:

我的解决方案是使能串口后添加printf函数打印串口的代码在串口文件中,这个死循环即可跳出。
之后就能成功ping通板子,操作modbus了

以下是具体操作:

一、实验步骤

1、找到下载包内demo/STR71XTCP/Port文件夹,单独拿出来放到ModbusPort文件夹下。

2、找到下载包内modbus文件夹拿出来,放到可以ping通的STM32项目里,如图:

3、打开STM32CubeMX,创建项目,使能LWIP和ETH和串口下载到开发板,并保证可以ping通
一定要串口一定要串口一定要串口,保证mosbus源码不会死循环


4、添加串口的目的是让文章开头所说的地方的printf函数有输出的地方,使Mosbus不会因为死循环导致循序卡死
所以我们需要在串口程序部分添加串口用printf函数输出的功能代码

/* USER CODE BEGIN 0 */
/******************printf函数*********************/
#include "stdio.h"
#ifdef __GNUC__
#define PUTCHAR_PROTOTYPE int __io_putchar(int ch)
#else
#define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f)
#endif /* __GNUC__ */
PUTCHAR_PROTOTYPE
{HAL_UART_Transmit(&huart1 , (uint8_t *)&ch, 1, 0xFFFF);return ch;
}
/*************************************************/
/* USER CODE END 0 */

5、将之前下载的MosbusPort和modbus内的文件加到工程里,其中需要加的文件有

6、点击目标选项

7、在选项卡C/C++下的包含路径添加modbus相关头文件所在路径

添加完成后有两种情况,需要添加如下代码

eMBTCPInit( 0 );     //初始化ModbusTCP
eMBEnable();            //使能ModbuseMBPoll();                //轮询Modbus(该条添加在主循环中)

A.使用了操作系统,则在freertos.c文件下添加如下代码

B.没有使能操作系统,添加在main.c文件添加如下代码

8、新建ModbusCB.c文件,放在Modbus目录下,实现各个功能,这里只实现的保持寄存器功能(博主是懒狗,其他请大家照葫芦画瓢)


#include "mb.h"
uint16_t R[15];
eMBErrorCode
eMBRegInputCB( UCHAR * pucRegBuffer, USHORT usAddress, USHORT usNRegs )
{eMBErrorCode    eStatus = MB_ENOERR;static uint8_t flag = 0;//   flag == 0 ? GPIO_SetBits(GPIOC,GPIO_PIN_1) : GPIO_ResetBits(GPIOC,GPIO_PIN_1);  //modify by alanflag==0 ? HAL_GPIO_WritePin(GPIOC, GPIO_PIN_1, GPIO_PIN_SET) : HAL_GPIO_WritePin(GPIOC, GPIO_PIN_1, GPIO_PIN_RESET);flag ^= 1;return eStatus;
}eMBErrorCode
eMBRegHoldingCB( UCHAR * pucRegBuffer, USHORT usAddress, USHORT usNRegs, eMBRegisterMode eMode )
{eMBErrorCode    eStatus = MB_ENOERR;static uint8_t flag = 0;int i=0;//flag == 0 ? GPIO_SetBits(GPIOC,GPIO_PIN_2) : GPIO_ResetBits(GPIOC,GPIO_PIN_2);  //modify by alanflag==0 ? HAL_GPIO_WritePin(GPIOC, GPIO_PIN_2, GPIO_PIN_SET) : HAL_GPIO_WritePin(GPIOC, GPIO_PIN_1, GPIO_PIN_RESET);flag ^= 1;/*the following code is just for the testing the function of reading registerauthor: Alan*/R[0]=56;R[1]=78;R[2]=12;R[3]=34;for(i=0;i<usNRegs;i++){*pucRegBuffer=R[i+usAddress-1]>>8;pucRegBuffer++;*pucRegBuffer=R[i+usAddress-1]&0xff;pucRegBuffer++;}return eStatus;
}eMBErrorCode
eMBRegCoilsCB( UCHAR * pucRegBuffer, USHORT usAddress, USHORT usNCoils, eMBRegisterMode eMode )
{static uint8_t flag = 0;//flag == 0 ? GPIO_SetBits(GPIOC,GPIO_PIN_3) : GPIO_ResetBits(GPIOC,GPIO_PIN_6);  //modify by alanflag==0 ? HAL_GPIO_WritePin(GPIOC, GPIO_PIN_3, GPIO_PIN_SET) : HAL_GPIO_WritePin(GPIOC, GPIO_PIN_6, GPIO_PIN_RESET);flag ^= 1;return MB_ENOREG;
}eMBErrorCode
eMBRegDiscreteCB( UCHAR * pucRegBuffer, USHORT usAddress, USHORT usNDiscrete )
{static uint8_t flag = 0;//flag == 0 ? GPIO_SetBits(GPIOC,GPIO_PIN_4) : GPIO_ResetBits(GPIOC,GPIO_PIN_7);  //modify by alanflag==0 ? HAL_GPIO_WritePin(GPIOC, GPIO_PIN_4, GPIO_PIN_SET) : HAL_GPIO_WritePin(GPIOC, GPIO_PIN_7, GPIO_PIN_RESET);flag ^= 1;return MB_ENOREG;
}

此时程序基本完成,编译下载

二、实验结果

1.下载完成后先测试能不能ping通,得到下图即可

2.打开任何可以使用的mosbus测试工具,注意,本次实验为从站设计,所以测试工具设置为主站

填写好开发板IP地址和端口号

点击连接,等下方出现连接成功提示

点击读保持寄存器(功能码03)得到如下效果

如上图,根据ModbusBC.c中设置的R[0]~R[4]的内容分别为56,78,12,34,读取后内存相应位置也变成了对应的数字,实验成功

接下来分析一下发送和返回报文,由图可知

发送报文TX:00 00 00 00 00 06 01 03 00 00 00 10

前6位位MBAP报文头:00(Hi) 00(Lo) 00 00(协议标识,0000为使能modbus) 00 06(报文长度6位)

后6位为modbus报文:01(从机地址) 03(功能码) 00 00(起始地址) 00 10(寄存器数量)
由上图可知,我设定的起始地址为0,长度为16,该数字为10进制,报文内为16进制,所以长度为十进制的16就变为十六进制的10.

接收报文RX:00 00 00 00 00 23 01 03 20 00 38 00 4e 00 0c 00 22 00 00 00 00…

前6位位MBAP报文头:00(Hi) 00(Lo) 00 00(协议标识,0000为使能modbus) 00 23(报文长度23位)

后为modbus报文:01(从机地址) 03(功能码) 20(寄存器内容长度) 00 38(等于十进制的56)00 4e(等于十进制的78) 00 0c(等于十进制的12) 00 22(等于十进制的34) 00 00 00 00 00
之后全为00,表示其他寄存器值为0

实验结束,打完收工!!!!

                                     Good Game!!!!!!

以上内容欢迎大家转载引用,标明出处即可!!!!!

基于STM32F767通过STM32CubeMX实现ModbusTCP从站(后续)相关推荐

  1. 基于STM32F767通过STM32CubeMX实现ModbusTCP

    基于STM32F767通过STM32CubeMX实现ModbusTCP读多为寄存器操作(一) 本文为modbus代码讲解概述,实现modbus具体操作请点击以下博客: 基于STM32F767通过STM ...

  2. stm32驱动rgb屏电路图_基于STM32F767驱动 LTDC LCD(RGB屏)

    [实例简介] 基于STM32F767驱动 LTDC LCD(RGB屏) 可以作为参考资料 [实例截图] [核心代码] 基于STM32F767驱动LTDCLCD(RGB屏) └── 基于STM32F76 ...

  3. 西门子、三菱、欧姆龙等PLC不编写程序实现ModbusTCP从站功能的案例

    案例所使用的IGT-SER智能网关可将几乎所有PLC的协议转成Modbus协议,不用PLC编程,只需通过网关的配置软件设置一下PLC寄存器地址与Modbus地址的对应关系即可:更详细的应用案例    ...

  4. python modbus-tk 实现三菱FX5U modbus-tcp 从站通讯

    一.三菱FX5U 从站设置 1. 打开GX works3 软件 2. 新建项目 3.按向导流程指示设置modbus-tcp从站功能                                   ...

  5. 基于FPGA状态机设计实现EtherCAT从站

    0 引言 EtherCAT是由BECKHOFF提出的在工业控制领域获得广泛应用的现场总线之一,该总线具备全双工工作模式,可基于主站(Master)和从站(Slave)连接的模式实现数据传递,且具有低延 ...

  6. 西门子PLC S7-1200作为ModbusTCP从站数据交互

    设备类型 S7-1215C 协议 Modbus TCP  PLC作为服务端 测试工具:以太网调试助手 数据发送 00310000000608030000000E 0031 流水号 0000 固定 00 ...

  7. 基于STM32F103移植canfestival协议栈(从站)CANopen

    CAN open是一个基于CAN串行总线的网络传输系统的应用层协议,遵循ISO/OSI协议.CAN现场总线只是实现了OSI七层架构中的物理层和数据链路层,而canopen协议是基于他之上的一个应用层协 ...

  8. 基于Profibus-DP协议的PLC智能从站设计

    摘要:工业控制系统中,PLC是专门为在工业环境下应用而设计的数字运算操作电子系统,是实现工业自动化.物联网控制的基础,有着非常广阔的应用前景.PLC种类很多,各种功能模块也异常丰富,模块之间可以非常方 ...

  9. modbusTcp 从站和主站

    主要测试读保持寄存器,地址4xxxx开始.不废话直接上代码 下面是从站(server)代码: #include <stdio.h> #include <unistd.h> #i ...

最新文章

  1. c语言课程设计的摘要,投票程序设计-C语言课程设计摘要.doc
  2. 面试问题-使用Java线程做数学运算
  3. Visual C++ 2011-6-6
  4. 如何升级浏览器_绿茶浏览器app下载安装_绿茶浏览器软件最新版免费下载
  5. 机器学习中防止过拟合方法
  6. java新的日期_java8你应该了解的新特性(新时间与日期API)
  7. 浏览器插件之ActiveX开发(三)
  8. 【Python】解析Python中的条件语句和循环语句
  9. 22个开源的PHP框架
  10. 简述python文件操作_python 文件操作总结
  11. Bootstarp4 文字排版
  12. 升压和升降压拓扑中IDC与IO的关系推导 // 《精通开关电源设计》P41式2-2
  13. mac 中的 zip 和 unzip 命令
  14. 本地传奇架设详细教程
  15. 【Week7 作业B】TT的旅行日记
  16. Excel 快速计算相邻行之间的时间差
  17. react-native map函数遍历数据及其布局
  18. 【安卓】处理Android Studio中文字体为繁体字
  19. 制作一个简单HTML电影网页设计(HTML+CSS)
  20. python openpyxl库读写更新excel表格

热门文章

  1. Android-自定义圆形ProgressBar加载
  2. 常用算法的计算复杂度
  3. 配套课件 自动控制原理--卢京潮 2009 完整版
  4. 消息队列探秘 – RabbitMQ 消息队列工作原理
  5. php爬虫程序是什么,php爬虫怎么运行
  6. 最新JAVA安装教程(Mac版)
  7. Dos命令利用Type,Copy函数合并txt文本文件
  8. 链叨叨直播间丨CryptoMechaKing——末世机甲“元宇宙游戏”来临
  9. Python写超级马里奥
  10. 墨西哥付款方式有哪些