3977|2

27

帖子

0

TA的资源

一粒金砂(中级)

楼主
 

【 ST NUCLEO-H743ZI测评】(4)移植Modbus测试(RTU) [复制链接]

本次活动测评开发板ST NUCLEO-H743ZI由ST意法半导体提供,感谢意法半导体对EEWorld测评的支持!
STM32H7

NUCLEO_H743ZI

【 ST NUCLEO-H743ZI测评】(1)初识ST NUCLEO-H743ZI
【 ST NUCLEO-H743ZI测评】(2)以太网测试
【 ST NUCLEO-H743ZI测评】(3)以太网转串口测试

串口和网口都调通了,接下来移植一个Modbus协议栈,在之前的CubeMX基础上,不需要配置其他外设。
一、在之前的工程中,添加Modbus协议栈源码及对应的include位置

二、修改port文件

mbportevent.c:主要实现事件通知,这里用FreeRTos的队列实现
mbportother.c:实现协议栈的临界段处理
mbportserial.c:实现串口初始化,发送处理,接收处理,等等。需要改里面的串口为usart3。
mbporttimer.c:实现Modbus所需要的定时(计时)功能,这里用FreeRTos的周期任务来实现的,也可以用硬件定时器或任务定时器等
具体实现代码作为附件上传。
三、main.c中添加代码
    添加保持寄存器的回调处理函数
  1. #include "mbport.h"
  2. #include "mbs.h"
  3. #include "mbutils.h"
  4. static uint16_t   usRegHoldingValue[16];

  5. eMBException
  6. eMyRegHoldingCB( UBYTE * pubRegBuffer, USHORT usAddress, USHORT usNRegs, eMBSRegisterMode eRegMode )
  7. {
  8.     eMBException    eException = MB_PDU_EX_ILLEGAL_DATA_ADDRESS;
  9.     STATIC const ULONG usRegsMappedAt = 0x0200;
  10.     ULONG           usRegStart = usAddress;
  11.     ULONG           usRegEnd = usAddress + usNRegs - 1;
  12.     USHORT          usIndex;
  13.     USHORT          usIndexEnd;

  14.     if( ( usNRegs > 0 ) &&
  15.         ( usRegStart >= usRegsMappedAt )
  16.         && ( usRegEnd <= ( usRegsMappedAt + MB_UTILS_NARRSIZE( usRegHoldingValue ) ) ) )
  17.     {
  18.         usIndex = ( USHORT ) ( usRegStart - usRegsMappedAt );
  19.         usIndexEnd = ( USHORT ) ( usRegEnd - usRegsMappedAt );
  20.         switch ( eRegMode )
  21.         {
  22.         case MBS_REGISTER_WRITE:
  23.             for( ; usIndex <= usIndexEnd; usIndex++ )
  24.             {
  25.                 usRegHoldingValue[usIndex] = ( USHORT ) * pubRegBuffer++ << 8;
  26.                 usRegHoldingValue[usIndex] |= ( USHORT ) * pubRegBuffer++;
  27.             }
  28.             break;

  29.         default:
  30.         case MBS_REGISTER_READ:

  31.             for( ; usIndex <= usIndexEnd; usIndex++ )
  32.             {
  33.                 *pubRegBuffer++ = ( UBYTE ) ( usRegHoldingValue[usIndex] >> 8 );
  34.                 *pubRegBuffer++ = ( UBYTE ) ( usRegHoldingValue[usIndex] & 0xFF );
  35.             }
  36.             break;
  37.         }
  38.         eException = MB_PDU_EX_NONE;
  39.     }
  40.     return eException;
  41. }
复制代码



    StartDefaultTask任务中添加初始化ModbusRTU、注册保持寄存器功能函数、轮询eMBSPoll等
  1. void StartDefaultTask(void const * argument)
  2. {
  3.   /* init code for LWIP */
  4.   MX_LWIP_Init();

  5.   /* USER CODE BEGIN 5 */

  6.   
  7.   xMBSHandle      xMBSHdl;
  8.   eMBErrorCode    eStatus;
  9.   
  10.   if( MB_ENOERR != ( eStatus = eMBSSerialInit( &xMBSHdl, MB_RTU, 1, 1, 115200, MB_PAR_NONE ) ) )
  11.   {
  12.   }
  13.   else if( MB_ENOERR != ( eStatus = eMBSRegisterHoldingCB( xMBSHdl, eMyRegHoldingCB ) ) )
  14.   {
  15.     ( void )eMBSClose( xMBSHdl );
  16.   }
  17.   else
  18.   {
  19.     do
  20.     {
  21.       /* Poll the communication stack. */
  22.       eMBSPoll( xMBSHdl );
  23.       osDelay(10);
  24.     }
  25.     while( MB_ENOERR == eStatus );
  26.     ( void )eMBSClose( xMBSHdl );
  27.   }
  28.   /* USER CODE END 5 */
  29. }
复制代码



四、编译运行,打开modbus调试助手测试
    读寄存器,初始数据为0

    写寄存器测试,写入 0001 0002 0003 0004 0005

    再次读出,判断刚才写入已成功。


五、附上modbus源码
Modbus.rar (94.01 KB, 下载次数: 47)

此内容由EEWORLD论坛网友dsjsjf原创,如需转载或用于商业用途需征得作者同意并注明出处


此帖出自stm32/stm8论坛

最新回复

1) 总结测试的很到位 2) 建议捎带着把modus的通信协议简单介绍一下,效果会更好^_^  详情 回复 发表于 2019-3-2 08:40
点赞 关注(1)
 

回复
举报

1368

帖子

6

TA的资源

版主

沙发
 
1) 总结测试的很到位
2) 建议捎带着把modus的通信协议简单介绍一下,效果会更好^_^
此帖出自stm32/stm8论坛

点评

谢谢捧场  详情 回复 发表于 2019-3-6 22:03
 
个人签名专注智能产品的研究与开发,专注于电子电路的生产与制造……QQ:2912615383,电子爱好者群: void
 

回复

27

帖子

0

TA的资源

一粒金砂(中级)

板凳
 
懒猫爱飞 发表于 2019-3-2 08:40
1) 总结测试的很到位
2) 建议捎带着把modus的通信协议简单介绍一下,效果会更好^_^

谢谢捧场
此帖出自stm32/stm8论坛
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/9 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表