1.创建工程

配置好之后生成工程

2.将FreeModbus源码,拷贝到工程目录

3.将FreeModbus文件添加进工程

打开mbtcp.c文件发现,受MB_TCP_ENABLED宏定义的影响,所有代码都是灰的

因此跳转到宏定义的地方。打开TCP模式,并将RTU和ASCII模式关闭

打开mbrtu.c和mbascii.c文件检查,发现mbrtu.c源码有问题,不受宏定义影响

因此修改mbrtu.c源码

修改好之后,编译出现错误

4.移植底层接口

先看第一个错误,缺少port.h

借鉴demo里面STR71XTCP的程序。将STR71XTCP中的port文件夹,拷贝到工程中。

删除重复文件mbconfig.h

将文件加入工程

添加好之后,重新编译,出现错误,port.h中包含了STR71X相关代码

将这些代码修改

重新编译,出现错误,发现demo中STR71XTCP程序原来是带操作系统的。portevent.c文件不适用于裸机。

借鉴demo里面AVR的程序。将AVR中的portevent.c文件,拷贝过来并覆盖源文件。

重新编译,有部分宏没有定义。

打开port.h,重新定义。

重新编译,出现错误,NETCONN_COPY没有定义。这是因为lwip没有配置LWIP_NETCONN或者LWIP_SOCKET。

对于这个我们直接搜寻整个工程,发现NETCONN_COPY的值为1。将NETCONN_COPY的值直接替换掉。

重新编译,报告eMBRegCoilsCB、eMBRegDiscreteCB、eMBRegHoldingCB和eMBRegInputCB没有定义。

这四个接口是协议栈预留给用户自己去实现的,分别创建user_mb_app.h和user_mb_app.c两个文件

#ifndef _USER_MB_APP_H_
#define _USER_MB_APP_H_/* ----------------------- Modbus includes ----------------------------------*/
#include "mb.h"
#include "mbconfig.h"
#include "mbframe.h"
#include "mbutils.h"/* -----------------------Slave Defines -------------------------------------*/
#define S_DISCRETE_INPUT_START        0
#define S_DISCRETE_INPUT_NDISCRETES   16
#define S_COIL_START                  0
#define S_COIL_NCOILS                 64
#define S_REG_INPUT_START             0
#define S_REG_INPUT_NREGS             100
#define S_REG_HOLDING_START           0
#define S_REG_HOLDING_NREGS           100
/* salve mode: holding register's all address */
#define          S_HD_RESERVE                     0
#define          S_HD_CPU_USAGE_MAJOR             1
#define          S_HD_CPU_USAGE_MINOR             2
/* salve mode: input register's all address */
#define          S_IN_RESERVE                     0
/* salve mode: coil's all address */
#define          S_CO_RESERVE                     0
/* salve mode: discrete's all address */
#define          S_DI_RESERVE                     0/* -----------------------Master Defines -------------------------------------*/
#define M_DISCRETE_INPUT_START        0
#define M_DISCRETE_INPUT_NDISCRETES   16
#define M_COIL_START                  0
#define M_COIL_NCOILS                 64
#define M_REG_INPUT_START             0
#define M_REG_INPUT_NREGS             100
#define M_REG_HOLDING_START           0
#define M_REG_HOLDING_NREGS           100
/* master mode: holding register's all address */
#define          M_HD_RESERVE                     0
/* master mode: input register's all address */
#define          M_IN_RESERVE                     0
/* master mode: coil's all address */
#define          M_CO_RESERVE                     0
/* master mode: discrete's all address */
#define          M_DI_RESERVE                     0#endif
/** FreeModbus Libary: user callback functions and buffer define in slave mode* Copyright (C) 2013 Armink <armink.ztl@gmail.com>** This library is free software; you can redistribute it and/or* modify it under the terms of the GNU Lesser General Public* License as published by the Free Software Foundation; either* version 2.1 of the License, or (at your option) any later version.** This library is distributed in the hope that it will be useful,* but WITHOUT ANY WARRANTY; without even the implied warranty of* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU* Lesser General Public License for more details.** You should have received a copy of the GNU Lesser General Public* License along with this library; if not, write to the Free Software* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA** File: $Id: user_mb_app.c,v 1.60 2013/11/23 11:49:05 Armink $*/
#include "user_mb_app.h"/*------------------------Slave mode use these variables----------------------*/
//Slave mode:DiscreteInputs variables
USHORT   usSDiscInStart                               = S_DISCRETE_INPUT_START;
#if S_DISCRETE_INPUT_NDISCRETES%8
UCHAR    ucSDiscInBuf[S_DISCRETE_INPUT_NDISCRETES/8+1];
#else
UCHAR    ucSDiscInBuf[S_DISCRETE_INPUT_NDISCRETES/8]  ;
#endif
//Slave mode:Coils variables
USHORT   usSCoilStart                                 = S_COIL_START;
#if S_COIL_NCOILS%8
UCHAR    ucSCoilBuf[S_COIL_NCOILS/8+1]                ;
#else
UCHAR    ucSCoilBuf[S_COIL_NCOILS/8]                  ;
#endif
//Slave mode:InputRegister variables
USHORT   usSRegInStart                                = S_REG_INPUT_START;
USHORT   usSRegInBuf[S_REG_INPUT_NREGS]               ;
//Slave mode:HoldingRegister variables
USHORT   usSRegHoldStart                              = S_REG_HOLDING_START;
USHORT   usSRegHoldBuf[S_REG_HOLDING_NREGS]           ;/*** Modbus slave input register callback function.** @param pucRegBuffer input register buffer* @param usAddress input register address* @param usNRegs input register number** @return result*/
eMBErrorCode eMBRegInputCB(UCHAR *pucRegBuffer, USHORT usAddress, USHORT usNRegs)
{eMBErrorCode    eStatus = MB_ENOERR;USHORT          iRegIndex;USHORT *        pusRegInputBuf;USHORT          REG_INPUT_START;USHORT          REG_INPUT_NREGS;USHORT          usRegInStart;pusRegInputBuf = usSRegInBuf;REG_INPUT_START = S_REG_INPUT_START;REG_INPUT_NREGS = S_REG_INPUT_NREGS;usRegInStart = usSRegInStart;/* it already plus one in modbus function method. */usAddress--;if ((usAddress >= REG_INPUT_START)&& (usAddress + usNRegs <= REG_INPUT_START + REG_INPUT_NREGS)){iRegIndex = usAddress - usRegInStart;while (usNRegs > 0){*pucRegBuffer++ = (UCHAR) (pusRegInputBuf[iRegIndex] >> 8);*pucRegBuffer++ = (UCHAR) (pusRegInputBuf[iRegIndex] & 0xFF);iRegIndex++;usNRegs--;}}else{eStatus = MB_ENOREG;}return eStatus;
}/*** Modbus slave holding register callback function.** @param pucRegBuffer holding register buffer* @param usAddress holding register address* @param usNRegs holding register number* @param eMode read or write** @return result*/
eMBErrorCode eMBRegHoldingCB(UCHAR *pucRegBuffer, USHORT usAddress, USHORT usNRegs, eMBRegisterMode eMode)
{eMBErrorCode    eStatus = MB_ENOERR;USHORT          iRegIndex;USHORT *        pusRegHoldingBuf;USHORT          REG_HOLDING_START;USHORT          REG_HOLDING_NREGS;USHORT          usRegHoldStart;pusRegHoldingBuf = usSRegHoldBuf;REG_HOLDING_START = S_REG_HOLDING_START;REG_HOLDING_NREGS = S_REG_HOLDING_NREGS;usRegHoldStart = usSRegHoldStart;/* it already plus one in modbus function method. */usAddress--;if ((usAddress >= REG_HOLDING_START)&& (usAddress + usNRegs <= REG_HOLDING_START + REG_HOLDING_NREGS)){iRegIndex = usAddress - usRegHoldStart;switch (eMode){/* read current register values from the protocol stack. */case MB_REG_READ:while (usNRegs > 0){*pucRegBuffer++ = (UCHAR) (pusRegHoldingBuf[iRegIndex] >> 8);*pucRegBuffer++ = (UCHAR) (pusRegHoldingBuf[iRegIndex] & 0xFF);iRegIndex++;usNRegs--;}break;/* write current register values with new values from the protocol stack. */case MB_REG_WRITE:while (usNRegs > 0){pusRegHoldingBuf[iRegIndex] = *pucRegBuffer++ << 8;pusRegHoldingBuf[iRegIndex] |= *pucRegBuffer++;iRegIndex++;usNRegs--;}break;}}else{eStatus = MB_ENOREG;}return eStatus;
}/*** Modbus slave coils callback function.** @param pucRegBuffer coils buffer* @param usAddress coils address* @param usNCoils coils number* @param eMode read or write** @return result*/
eMBErrorCode eMBRegCoilsCB(UCHAR *pucRegBuffer, USHORT usAddress, USHORT usNCoils, eMBRegisterMode eMode)
{eMBErrorCode    eStatus = MB_ENOERR;USHORT          iRegIndex , iRegBitIndex , iNReg;UCHAR *         pucCoilBuf;USHORT          COIL_START;USHORT          COIL_NCOILS;USHORT          usCoilStart;iNReg =  usNCoils / 8 + 1;pucCoilBuf = ucSCoilBuf;COIL_START = S_COIL_START;COIL_NCOILS = S_COIL_NCOILS;usCoilStart = usSCoilStart;/* it already plus one in modbus function method. */usAddress--;if( ( usAddress >= COIL_START ) &&( usAddress + usNCoils <= COIL_START + COIL_NCOILS ) ){iRegIndex = (USHORT) (usAddress - usCoilStart) / 8;iRegBitIndex = (USHORT) (usAddress - usCoilStart) % 8;switch ( eMode ){/* read current coil values from the protocol stack. */case MB_REG_READ:while (iNReg > 0){*pucRegBuffer++ = xMBUtilGetBits(&pucCoilBuf[iRegIndex++],iRegBitIndex, 8);iNReg--;}pucRegBuffer--;/* last coils */usNCoils = usNCoils % 8;/* filling zero to high bit */*pucRegBuffer = *pucRegBuffer << (8 - usNCoils);*pucRegBuffer = *pucRegBuffer >> (8 - usNCoils);break;/* write current coil values with new values from the protocol stack. */case MB_REG_WRITE:while (iNReg > 1){xMBUtilSetBits(&pucCoilBuf[iRegIndex++], iRegBitIndex, 8,*pucRegBuffer++);iNReg--;}/* last coils */usNCoils = usNCoils % 8;/* xMBUtilSetBits has bug when ucNBits is zero */if (usNCoils != 0){xMBUtilSetBits(&pucCoilBuf[iRegIndex++], iRegBitIndex, usNCoils,*pucRegBuffer++);}break;}}else{eStatus = MB_ENOREG;}return eStatus;
}/*** Modbus slave discrete callback function.** @param pucRegBuffer discrete buffer* @param usAddress discrete address* @param usNDiscrete discrete number** @return result*/
eMBErrorCode eMBRegDiscreteCB(UCHAR *pucRegBuffer, USHORT usAddress, USHORT usNDiscrete)
{eMBErrorCode    eStatus = MB_ENOERR;USHORT          iRegIndex , iRegBitIndex , iNReg;UCHAR *         pucDiscreteInputBuf;USHORT          DISCRETE_INPUT_START;USHORT          DISCRETE_INPUT_NDISCRETES;USHORT          usDiscreteInputStart;iNReg =  usNDiscrete / 8 + 1;pucDiscreteInputBuf = ucSDiscInBuf;DISCRETE_INPUT_START = S_DISCRETE_INPUT_START;DISCRETE_INPUT_NDISCRETES = S_DISCRETE_INPUT_NDISCRETES;usDiscreteInputStart = usSDiscInStart;/* it already plus one in modbus function method. */usAddress--;if ((usAddress >= DISCRETE_INPUT_START)&& (usAddress + usNDiscrete    <= DISCRETE_INPUT_START + DISCRETE_INPUT_NDISCRETES)){iRegIndex = (USHORT) (usAddress - usDiscreteInputStart) / 8;iRegBitIndex = (USHORT) (usAddress - usDiscreteInputStart) % 8;while (iNReg > 0){*pucRegBuffer++ = xMBUtilGetBits(&pucDiscreteInputBuf[iRegIndex++],iRegBitIndex, 8);iNReg--;}pucRegBuffer--;/* last discrete */usNDiscrete = usNDiscrete % 8;/* filling zero to high bit */*pucRegBuffer = *pucRegBuffer << (8 - usNDiscrete);*pucRegBuffer = *pucRegBuffer >> (8 - usNDiscrete);}else{eStatus = MB_ENOREG;}return eStatus;
}

重新编译,提示vMBPortEventClose未定义。由于我们是裸机程序,并未创建系统对象,也就不需要释放。直接将vMBPortEventClose注释即可。

重新编译,无错误

8.协议栈移植工作完成。

烧录之后,发现程序死在了vMBPortLog函数中。这是由于我们没有打印口,我们直接将这段代码注释即可。

FreeModbus移植到STM32F107(以太网传输方式)相关推荐

  1. Modbus以太网传输方式

    通信结构 MODBUS TCP/IP 的通信系统可以包括不同类型的设备: 502端口是为MODBUS通信保留的,在缺省状态下,强制侦听这个口. 连接至TCP/IP 网络的MODBUS TCP/IP 客 ...

  2. FreeModbus移植到STM32F103(串行传输方式)

    1.创建工程 2.将FreeModbus源码,拷贝到工程目录 3.将FreeModbus文件添加进工程 添加好之后,编译出现错误 4.移植底层接口 先看第一个错误,缺少port.h 借鉴AVR架构的程 ...

  3. STM32F407 freemodbus移植

    STM32F407 freemodbus移植 一.ModBus介绍 Modbus是一种串行通信协议,是Modicon公司(现在的施耐德电气Schneider Electric)于1979年为使用可编程 ...

  4. pacs系统片子往服务器传输方式,PACS系统-医学影像的传输.ppt

    <PACS系统-医学影像的传输.ppt>由会员分享,可在线阅读,更多相关<PACS系统-医学影像的传输.ppt(64页珍藏版)>请在人人文库网上搜索. 1.PACS系统.医疗图 ...

  5. 国产FPGA(紫光同创)—— 数据采集及千兆以太网传输(一)

    科研需要,使用国产FPGA(紫光PLG50H)实现数据采集及千兆以太网传输.总体流程如图所示 第一部分先对数据采集部分进行说明. 一.模数转换(ADC芯片-LTC2324) 本项目使用的是LTC232 ...

  6. FreeModbus 移植笔记- 1-认识FreeModbus

    FreeModbus 移植笔记 目录 1 FreeMODBUS介绍 2 FreeMODBUS官网及源码下载地址 3 移植之前的准备 3.1 FreeModbus V1.6 ​​​​​​​3.2 Mod ...

  7. 【计算机网络学习笔记(一)】之 OSI参考模型,网络传输方式分类,网络设备分类,网络组成结构

    文章目录 本文章由公号[开发小鸽]发布!欢迎关注!!! 一. OSI参考模型 (一) 应用层 (二) 表示层 (三) 会话层 (四) 传输层 (五) 网络层 (六) 数据链路层 (七) 物理层 二. ...

  8. socket通信——通过Udp传输方式,将一段文字数据发送出去

    需求:通过Udp传输方式,将一段文字数据发送出去 定义一个Udp发送端 思路: 1.建立updsocket服务 2.提供数据,并将数据封装到数据包中. 3.通过socket服务的发送功能,将数据包发出 ...

  9. 详细介绍!Linux 上几种常用的文件传输方式

    点击上方"方志朋",选择"设为星标" 做积极的人,而不是积极废人 责编:乐乐 来源:https://dwz.cn/VWIHhsOw 昨天发布一篇Linux文章( ...

最新文章

  1. python算法题_Python算法题
  2. php根据修改时间删除指定目录下文件
  3. CentOS6启动过程总结与GRUB问题修复
  4. AC日记——字符串位移包含问题 1.7 19
  5. 【chromium】 渲染显示相关概念
  6. 有木有使用tomcat 7.0 报Out of Memory的同志
  7. 【实践】CTR预估在动态样式建模和特征表达学习方面的进展
  8. python图像对比度增强图片清晰度_Python 图像对比度增强的几种方法(小结)
  9. Navicat Premium 12.1.21 最新版激活工具及方法
  10. 新 IT 框架概述和双态 IT
  11. VUE-地区选择器(V-Distpicker)
  12. CogPDF417Tool工具
  13. Linux添加中文字体
  14. 监控记录交换机端口流量及性能,MSRM3一分钟搞定
  15. canvas绘制文本文本的
  16. c++做题记录1 01:全面的MyString 查看提交统计提问 总时间限制: 1000ms 内存限制: 65536kB 描述 程序填空,输出指定结果
  17. ModelAndView绑定数据模型配合Thymeleaf渲染数据用法学习
  18. 360PC权重 怎样查询网站的360PC权重
  19. 原生微信小程序购物车
  20. 安卓11客制需求:第三方应用aida64检测蓝牙版本修改为5.0

热门文章

  1. Qt官方文档阅读笔记-QStyledItemDelegate Class描述
  2. linux指令解压rpm,dpkg rpm apt yum 的常用指令 +linux 各种解压缩方法.docx
  3. C语言中二维数组移动一行,二维数组对每一行进行排序。。
  4. 802.11 n wlan linux驱动下载,802.11n无线网卡驱动
  5. string转map集合_集合(下)
  6. 用python怎么下载_如何使用python下载视频
  7. 数字化改革看“浙”里 CDEC2021中国数字智能生态大会杭州站举行
  8. 船舶定位实时查询系统_港口人员精准定位系统,实时安全管控与智能预警
  9. 前端基础-html-视频标签的介绍
  10. 计组之数据运算:7、定点数原码除法运算(恢复余数法、加减交替法)