基于STM32F407+dp83848实现ModbusTCP从站移植

文章目录

一、背景

在先前已经通过cubemx实现以太网,并且能ping通,现在需要在此基础上移植freemodbus从机程序。

上一期:
【LWIP学习】dp83848与STM32f407re的接线并实现ping通

二、参考教程与实验材料

2.1 参考教程

博客:
基于STM32F767通过STM32CubeMX实现ModbusTCP从站(后续)

教程配套代码:
F7_ModbusTCP

此次移植非常顺利,感谢博主

2.2 实验准备

freemodbus官网Github链接:FreeModbus源码

三、移植过程

  1. 确保当前工程能ping通,并且打开了串口

  2. 将mudbus文件夹放入工程,找到下载包内demo/STR71XTCP/Port文件夹,单独拿出来放到ModbusPort文件夹下。

    如图:

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

  4. 编译之后发现有错,下载教程中给的代码,依照代码进行修改。

    按我的回忆,修改了以下内容:

    4.1 portevent.c 全部改成了博主的写的

    4.2 porttcp.c 注释了vMBPortEventClose( );等函数

    4.3 port.h全部改成博主给的

    4.4 由于没放入acii和rtu相关文件,会报错找不到函数,把支持给关闭,修改mbconfig.h

    所有的修改都可以参考博主给的代码

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

  6. 添加user_mb_app.c和user_mb_app.h在这里写回调函数,复制博主的ModbusCB.c文件

  7. 编译成功

  8. 下载后能ping通

  9. 使用modbus poll测试,能读取保持寄存器

    9.1 modbus poll配置

    选择TCP连接,我的stm32配置的ip是192.168.1.111server port没改,还是502

    连接后的现象表示能成功读取寄存器,但是不能写保持寄存器

  10. 完善user_mb_app.c和user_mb_app.h

    写入以下代码,可以实现读和写保持寄存器

user_mb_app.c

c 复制代码
/**
  ******************************************************************************
  * @文件   
  * @作者 
  * @版本
  * @日期
  * @概要
  ******************************************************************************
  * @注意事项
  *
  *
  *
  ******************************************************************************
  */  

/* 头文件		--------------------------------------------------------------*/
#include "mb.h"
#include "user_mb_app.h"

/* 私有数据类型 --------------------------------------------------------------*/

/* 保持寄存器缓冲区 */
USHORT usSRegHoldBuf[S_REG_HOLDING_NREGS];

/* 私有定义 	--------------------------------------------------------------*/
/* 私有宏定义 	--------------------------------------------------------------*/
/* 私有变量 	--------------------------------------------------------------*/
/* 私有函数声明 --------------------------------------------------------------*/

/**
  * @功能
  * @参数
  * @返回值
  */
eMBErrorCode
eMBRegInputCB( UCHAR * pucRegBuffer, USHORT usAddress, USHORT usNRegs )
{
    eMBErrorCode    eStatus = MB_ENOERR;

    return eStatus;
}

eMBErrorCode
eMBRegHoldingCB( UCHAR * pucRegBuffer, USHORT usAddress, USHORT usNRegs, eMBRegisterMode eMode )
{
	eMBErrorCode    eStatus = MB_ENOERR;
	int i=0;
	USHORT usRegValue;
	

	/* 检查地址范围 */
	if( (usAddress < 1) || (usAddress + usNRegs > S_REG_HOLDING_NREGS + 1) )
	{
		return MB_ENOREG;  // 地址超出范围
	}
	
	if( eMode == MB_REG_READ )
	{
		/* 读取模式:将寄存器值写入缓冲区(大端字节序) */
		for(i=0; i<usNRegs; i++)
		{
			*pucRegBuffer = usSRegHoldBuf[i+usAddress-1] >> 8;      // 高字节
			pucRegBuffer++;
			*pucRegBuffer = usSRegHoldBuf[i+usAddress-1] & 0xff;    // 低字节
			pucRegBuffer++;
		}
	}
	else if( eMode == MB_REG_WRITE )
	{
		/* 写入模式:从缓冲区读取数据并写入寄存器(大端字节序) */
		for(i=0; i<usNRegs; i++)
		{
			// 从缓冲区读取大端字节序数据
			usRegValue = (*pucRegBuffer << 8);  // 高字节
			pucRegBuffer++;
			usRegValue |= (*pucRegBuffer & 0xff); // 低字节
			pucRegBuffer++;
			
			// 写入到寄存器数组
			usSRegHoldBuf[i+usAddress-1] = usRegValue;
		}
	}
	else
	{
		eStatus = MB_EINVAL;  // 无效的模式
	}
	
    return eStatus;
}

eMBErrorCode
eMBRegCoilsCB( UCHAR * pucRegBuffer, USHORT usAddress, USHORT usNCoils, eMBRegisterMode eMode )
{

	return MB_ENOREG;
}

eMBErrorCode
eMBRegDiscreteCB( UCHAR * pucRegBuffer, USHORT usAddress, USHORT usNDiscrete )
{

	return MB_ENOREG;
}

/**
  * @}
  */


/*******************文件结尾**************************************************/

user_mb_app.h

c 复制代码
#ifndef USER_MB_APP_H
#define USER_MB_APP_H

/* 保持寄存器数量定义 */
#define S_REG_HOLDING_NREGS                      400

#endif /* USER_MB_APP_H */

四、实验结果

读取保持寄存器 03

写入保持寄存器 16

五、源码分享

蓝奏:4.modbustcp移植

相关推荐
俊基科技6 小时前
A-59U工业级多模语音处理模块在矿山矿井通信与呼叫报警系统中的应用
嵌入式硬件·嵌入式开发·硬件开发·ai降噪·回音消除·拾音降噪
周周记笔记8 小时前
GD32F450xx MCU Datasheet 解读:硬件测试工程师的测试方法论
单片机·嵌入式硬件
AOI小白新手上路11 小时前
江科协51单片机16-1 AD/DA ADC 三通道综合显示(LCD1602 版)改造说明
单片机·嵌入式硬件·51单片机
HUI-47412 小时前
EG1135|SSOP‑16 同步整流降压控制器,大功率外置 MOS 降压优选
单片机·嵌入式硬件·硬件工程
单片机仿真设计12 小时前
【proteus仿真】基于 STM32 单片机恒温箱控制系统设计(仿真图+程序)
stm32·单片机·嵌入式硬件·proteus·毕设
国科安芯13 小时前
星载CAN总线通信网络中抗辐射MCU的通信可靠性设计分析
网络·人工智能·分布式·单片机·嵌入式硬件·架构
新晨单片机设计14 小时前
S003A-基于STM32单片机温度计(数码管显示)【Proteus仿真+Keil程序+原理图】
stm32·单片机·stm32单片机功能定制
一条破秋裤14 小时前
TIM 输入捕获与 PWMI:从边沿到频率、占空比
笔记·stm32·学习
AOI小白新手上路14 小时前
江科协51单片机16-1 DA数模转换实验(PWM 呼吸灯)
单片机·嵌入式硬件·51单片机
hongmai66688815 小时前
告别Wi-Fi,专注Mesh:ESP32-H2-MINI-1U-H2S模组规格与应用
单片机·嵌入式硬件·物联网·5g·h.265