打印
[STM32F4]

STM32F407ZET7+ETH+LWIP移植freemodbus_TCP

[复制链接]
楼主: 突然下起雨
手机看帖
扫描二维码
随时随地手机跟帖
21
突然下起雨|  楼主 | 2024-3-31 23:33 | 只看该作者 |只看大图 回帖奖励 |倒序浏览
修改 portevent.c将以下程序,替换原来的程序
/* ----------------------- Modbus includes ----------------------------------*/
#include "mb.h"
#include "mbport.h"

/* ----------------------- Variables ----------------------------------------*/
static eMBEventType eQueuedEvent;
static BOOL     xEventInQueue;

/* ----------------------- Start implementation -----------------------------*/
BOOL
xMBPortEventInit( void )
{
    xEventInQueue = FALSE;
    return TRUE;
}

BOOL
xMBPortEventPost( eMBEventType eEvent )
{
    xEventInQueue = TRUE;
    eQueuedEvent = eEvent;
    return TRUE;
}

BOOL
xMBPortEventGet( eMBEventType * eEvent )
{
    BOOL            xEventHappened = FALSE;

    if( xEventInQueue )
    {
        *eEvent = eQueuedEvent;
        xEventInQueue = FALSE;
        xEventHappened = TRUE;
    }
    return xEventHappened;
}

使用特权

评论回复
22
突然下起雨|  楼主 | 2024-3-31 23:33 | 只看该作者
添加 #include “string.h”  和  #define NETCONN_COPY 0x01

使用特权

评论回复
23
突然下起雨|  楼主 | 2024-3-31 23:33 | 只看该作者

使用特权

评论回复
24
突然下起雨|  楼主 | 2024-3-31 23:34 | 只看该作者
新建User_modbus_TCP.c文件

#include <stdio.h>
#include <string.h>
#include "User_modbus_TCP.h"
#include "mb.h"
#include "mbutils.h"

void ModbusTCPInit(void)
{
    eMBTCPInit(MODBUS_TCP_PORT);
    eMBEnable();
}

void ModbusTCPDeInit(void)
{
    eMBDisable();
    eMBClose();
}

void ModbusTCPMain(void)
{
    if (MB_ENOERR != eMBPoll())
    {
        ModbusTCPDeInit();
        ModbusTCPInit();
    }
}

//线圈
#define REG_Coils_START   1
#define REG_Coils_SIZE    10

uint8_t  Coils_Data[REG_Coils_SIZE] = {1,1,0,1,0,0,1,1,1,0};

/**
* @brief: 读线圈---01,写线圈---05
*
* @param pucRegBuffer  缓存指针
* @param usAddress     起始地址
* @param usNCoils      线圈数量
* @param eMode         读写模式
* @return eMBErrorCode 错误码
*/
eMBErrorCode eMBRegCoilsCB(UCHAR *pucRegBuffer, USHORT usAddress, USHORT usNCoils, eMBRegisterMode eMode)
{
    uint16_t i = 0,byteOffset=0,bitOffset=0,RegIndex = usAddress - REG_Coils_START-1;
    if ((usAddress >= REG_Coils_START)&&(usAddress + usNCoils <= REG_Coils_START + REG_Coils_SIZE+1))
    {
        if (MB_REG_READ == eMode)
        {
          for(i=0;i<usNCoils;i++)
          {
              byteOffset = i / 8;
              bitOffset = i % 8;
              xMBUtilSetBits(&pucRegBuffer[byteOffset], bitOffset, 1, Coils_Data[RegIndex+i]);
          }
        }
        else
        {
          for(i=0;i<usNCoils;i++)
          {
              byteOffset = i / 8;
              bitOffset = i % 8;
              Coils_Data[RegIndex+i]=xMBUtilGetBits(&pucRegBuffer[byteOffset], bitOffset, 1);
          }
        }
    }
    else
    {
        return MB_ENOREG;
    }
   
    return MB_ENOERR;
}

//离散寄存器
#define REG_DISCRETE_START   10
#define REG_DISCRETE_SIZE    20

uint8_t  Discrete_Data[REG_DISCRETE_SIZE] = {1,1,0,1,0,0,1,1,1,0,1,0,0,1};

/**
* @brief:读离散寄存器---02
*
* @param pucRegBuffer  缓存指针
* @param usAddress     起始地址
* @param usNDiscrete   寄存器个数
* @return eMBErrorCode 返回错误码
*/
eMBErrorCode eMBRegDiscreteCB(UCHAR *pucRegBuffer, USHORT usAddress, USHORT usNDiscrete)
{
    uint16_t i = 0,byteOffset=0,bitOffset=0,RegIndex = usAddress - REG_DISCRETE_START-1;
  
    if ((usAddress >= REG_DISCRETE_START)&&(usAddress + usNDiscrete <= REG_DISCRETE_START + REG_DISCRETE_SIZE+1))
    {
      for(i=0;i<usNDiscrete;i++)
      {
          byteOffset = i / 8;
          bitOffset = i % 8;
          xMBUtilSetBits(&pucRegBuffer[byteOffset], bitOffset, 1, Discrete_Data[RegIndex+i]);
      }
    }
    else
    {
        return MB_ENOREG;
    }

    return MB_ENOERR;
}

//保持寄存器
#define REG_HOLDING_REGISTER_START   10
#define REG_HOLDING_REGISTER_SIZE    30

uint16_t  Holding_Data[REG_HOLDING_REGISTER_SIZE] =
{0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0A,0x0B,0x0C,0x0D,0x0E,0x0F,0x10,0x11,0x12};

/**
* @brief: 读保持寄存器---03,写保持寄存器---06
*
* @param pucRegBuffer  缓存指针
* @param usAddress     起始地址
* @param usNRegs       寄存器个数
* @param eMode         读写模式
* @return eMBErrorCode 返回错误码
*/

eMBErrorCode eMBRegHoldingCB(UCHAR *pucRegBuffer, USHORT usAddress, USHORT usNRegs, eMBRegisterMode eMode)
{
    uint16_t i = 0,RegIndex = usAddress - REG_HOLDING_REGISTER_START-1;
  
    if ((usAddress >= REG_HOLDING_REGISTER_START )&&(usAddress + usNRegs <= REG_HOLDING_REGISTER_START  + REG_HOLDING_REGISTER_SIZE+1))
    {
        if (MB_REG_READ == eMode)//读
        {
          for(i=0;i<usNRegs;i++)
          {
            pucRegBuffer[i*2] = (UCHAR)(Holding_Data[RegIndex+i]>>8);
            pucRegBuffer[i*2+1] = (UCHAR)Holding_Data[RegIndex+i];
          }
        }
        else//写
        {
          for(i=0;i<usNRegs;i++)
          {
            Holding_Data[RegIndex+i]=(pucRegBuffer[i*2]<<8)|(pucRegBuffer[i*2+1]);
          }
        }
    }
    else
    {
        return MB_ENOREG;
    }

    return MB_ENOERR;
}

//输入寄存器
#define REG_INPUT_REGISTER_START    1
#define REG_INPUT_REGISTER_SIZE    20

uint16_t  Input_Data[REG_DISCRETE_SIZE] =
{100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119};
/**
* @brief: 读输入寄存器---04
*
* @param pucRegBuffer  缓存指针
* @param usAddress     起始地址
* @param usNRegs       寄存器个数
* @return eMBErrorCode 返回错误码
*/
eMBErrorCode eMBRegInputCB(UCHAR *pucRegBuffer, USHORT usAddress, USHORT usNRegs)
{
    uint16_t i = 0,RegIndex = usAddress - REG_INPUT_REGISTER_START-1;
    if ((usAddress >= REG_INPUT_REGISTER_START)&&(usAddress + usNRegs <= REG_INPUT_REGISTER_START + REG_INPUT_REGISTER_SIZE+1))
    {
        for(i=0;i<usNRegs;i++)
        {
          pucRegBuffer[i*2] = (UCHAR)(Input_Data[RegIndex+i]>>8);
          pucRegBuffer[i*2+1] = (UCHAR)Input_Data[RegIndex+i];
        }
    }
    else
    {
        return MB_ENOREG;
    }
   
    return MB_ENOERR;
}

使用特权

评论回复
25
突然下起雨|  楼主 | 2024-3-31 23:34 | 只看该作者
新建User_modbus_TCP.h文件
#ifndef __User_modbbus_TCP_H__
#define        __User_modbbus_TCP_H__

#include "main.h"

#define MODBUS_TCP_PORT 0         //0代表默认即为502,也可以自己设

extern void ModbusTCPInit(void);
extern void ModbusTCPMain(void);

#endif

使用特权

评论回复
26
突然下起雨|  楼主 | 2024-3-31 23:34 | 只看该作者
主程序中

使用特权

评论回复
27
突然下起雨|  楼主 | 2024-3-31 23:35 | 只看该作者
printf重定向(必须要有,不然会卡主,目前不知道原因,有知道的可以在评论区解释一下!)



#include <stdio.h>
int fputc(int ch, FILE *f)
{
  HAL_UART_Transmit(&huart3, (uint8_t *)&ch, 1, 0xffff);
  return ch;
}
到这里程序就移植完成了!!!

使用特权

评论回复
28
突然下起雨|  楼主 | 2024-3-31 23:35 | 只看该作者
测试
①打开modbus poll 在connection选connect连接或按F3

使用特权

评论回复
29
突然下起雨|  楼主 | 2024-3-31 23:35 | 只看该作者
端口号在User_modbus_TCP.h定义,0为默认即为502,也可以按照自己需求修改

使用特权

评论回复
30
突然下起雨|  楼主 | 2024-3-31 23:36 | 只看该作者
点击"Setup"→“Read/Write Definition…”,或者按快捷键F8设置从机地址,功能码,起始地址,寄存器数量等信息

使用特权

评论回复
31
突然下起雨|  楼主 | 2024-3-31 23:36 | 只看该作者
测试结果

使用特权

评论回复
32
突然下起雨|  楼主 | 2024-3-31 23:36 | 只看该作者
其他同理!!

功能代码表放在下面了!


使用特权

评论回复
33
maudlu| | 2024-4-7 10:25 | 只看该作者
配置FreeModbus_TCP的参数,如端口号、Modbus地址、功能码等

使用特权

评论回复
34
robincotton| | 2024-4-7 14:43 | 只看该作者
FreeModbus是一个开源的Modbus协议实现,支持Modbus RTU和Modbus TCP。在移植FreeModbus时,需要特别注意其API的使用方式,以及与LwIP的协同工作。确保Modbus服务器端能够正确响应Modbus客户端的请求。

使用特权

评论回复
35
lihuami| | 2024-4-7 16:07 | 只看该作者
在STM32F407ZET7上配置以太网MAC控制器时,请遵循官方文档和示例代码进行操作。

使用特权

评论回复
36
fengm| | 2024-4-7 22:01 | 只看该作者
下载FreeModbus源码,并将必要的文件(如modbus文件夹和port文件夹)移植到项目中。

使用特权

评论回复
37
1988020566| | 2024-4-9 15:13 | 只看该作者
如果使用FreeRTOS作为实时操作系统,需要正确配置任务和中断优先级,以及与LWIP的任务调度相协调。

使用特权

评论回复
38
sdCAD| | 2024-4-9 17:47 | 只看该作者
合理分配和管理内存资源,避免内存泄漏或溢出,特别是在网络通信和数据处理时。

使用特权

评论回复
39
wwppd| | 2024-4-10 16:41 | 只看该作者
需要注意配置LwIP协议栈、配置FreeModbus参数、移植FreeModbus TCP协议栈、实现回调函数

使用特权

评论回复
40
averyleigh| | 2024-4-11 21:45 | 只看该作者
良好的错误处理机制对于保障系统的健壮性至关重要。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则