搜索
bottom↓
楼主: xukai871105

STM32 移植FreeModbus 详细过程

  [复制链接]

出0入0汤圆

发表于 2014-12-5 22:33:46 | 显示全部楼层
modbus,学习一下。

出0入0汤圆

发表于 2014-12-7 18:19:55 | 显示全部楼层
BUCUO刚移植了下,感觉不错。

出0入0汤圆

发表于 2014-12-7 18:22:15 | 显示全部楼层
不错,学习一下!

出0入0汤圆

发表于 2014-12-7 23:33:21 | 显示全部楼层
楼主有俩疑问,1.我要是用03命令读保持寄存器4001和用06写保持寄存器 4001 是一个地址吧。也就是写什么就会读回来什么。
                     2.寄存器地址我看规范上写的是40001,为啥我要是定义这个地址会读不会来数,如果定义了4001就可以。我看了地址是定义的int16_t,40001就超范围了吧。

出0入0汤圆

发表于 2014-12-7 23:40:32 | 显示全部楼层
刚试验了一下把int16_t 改成uint16_t就可以。
eMBRegHoldingCB( UCHAR * pucRegBuffer, USHORT usAddress, USHORT usNRegs,
                 eMBRegisterMode eMode )
{
  //错误状态
  eMBErrorCode    eStatus = MB_ENOERR;
  //偏移量
  int16_t         iRegIndex;
  
  //判断寄存器是不是在范围内
  //自己更改了数据类型把int16_t 改成了uint16_t
  if( ( (uint16_t)usAddress >= REG_HOLDING_START ) \
     && ( usAddress + usNRegs <= REG_HOLDING_START + REG_HOLDING_NREGS ) )
  {
    //计算偏移量
    iRegIndex = ( int16_t )( usAddress - usRegHoldingStart );
   
    switch ( eMode )
    {
      //读处理函数  
      case MB_REG_READ:
        while( usNRegs > 0 )
        {
          *pucRegBuffer++ = ( uint8_t )( usRegHoldingBuf[iRegIndex] >> 8 );
          *pucRegBuffer++ = ( uint8_t )( usRegHoldingBuf[iRegIndex] & 0xFF );
          iRegIndex++;
          usNRegs--;
        }
        break;

      //写处理函数
      case MB_REG_WRITE:
        while( usNRegs > 0 )
        {
          usRegHoldingBuf[iRegIndex] = *pucRegBuffer++ << 8;
          usRegHoldingBuf[iRegIndex] |= *pucRegBuffer++;
          iRegIndex++;
          usNRegs--;
        }
        break;
     }
  }
  else
  {
    //返回错误状态
    eStatus = MB_ENOREG;
  }
  
  return eStatus;
}

出0入0汤圆

发表于 2014-12-29 21:32:04 | 显示全部楼层
楼主真强大,有没有stm32 lwip modbus的代码啊

出0入0汤圆

发表于 2014-12-30 10:17:46 | 显示全部楼层
xukai871105 发表于 2013-7-23 23:06
我只能建议你耐心一点分析几个主要的交换函数。
例如
eMBErrorCode

大神,您移植成功stm32 lwip modbus tcp了吗,我现在在做这个,但无从下手,急需大神的帮助啊,拜谢了

出0入0汤圆

发表于 2014-12-30 13:59:40 | 显示全部楼层
先收藏起来

出0入0汤圆

发表于 2015-1-6 17:41:02 | 显示全部楼层
很好 我花了办小时看了 有收获

出0入0汤圆

发表于 2015-1-7 22:58:35 | 显示全部楼层
厉害,学习学习!

出0入0汤圆

发表于 2015-1-8 08:23:54 | 显示全部楼层
谢谢分享

出0入0汤圆

发表于 2015-1-8 08:37:43 | 显示全部楼层
好资料,值得学习,顶一个。

出0入0汤圆

发表于 2015-1-9 12:11:35 | 显示全部楼层
楼主 你好!
我在移植完freemodbus后出现问题, 基本参考的你的程序,麻烦楼主帮我分析下。谢谢!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入0汤圆

发表于 2015-1-9 12:31:12 | 显示全部楼层
留一下,以备后用。

出0入0汤圆

发表于 2015-1-9 14:33:29 | 显示全部楼层
好贴,MODBUSB一直没搞过,正好看看

出0入0汤圆

 楼主| 发表于 2015-1-9 17:05:20 | 显示全部楼层
hsc0588 发表于 2015-1-9 12:11
楼主 你好!
我在移植完freemodbus后出现问题, 基本参考的你的程序,麻烦楼主帮我分析下。谢谢!
...

看不到图片

出0入0汤圆

发表于 2015-1-9 17:17:49 | 显示全部楼层

楼主,我按照你的程序成功移植到stm32f407上
可以通信并能读取保持寄存器和输入寄存器,但是,有个问题:比如:
定义#define REG_HOLDING_START 0001     
定义#define REG_HOLDING_NREGS 8
modbus poll 设置寄存器地址必须为0000 数量为8,可以通信
如图:

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入0汤圆

发表于 2015-1-9 17:21:19 | 显示全部楼层

但是如果我定义的
地址0001
数量8
在设置modbuspoll软件时,也设置成:
地址0001
数量8
则通信不成功。如图:

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入0汤圆

发表于 2015-1-9 17:22:43 | 显示全部楼层

楼主知道这是怎么回事儿啊?谢谢!

出0入0汤圆

发表于 2015-1-9 20:37:29 | 显示全部楼层
很好,谢谢分享  

出0入0汤圆

 楼主| 发表于 2015-1-9 20:45:23 | 显示全部楼层
本帖最后由 xukai871105 于 2015-1-9 20:47 编辑
hsc0588 发表于 2015-1-9 17:21
但是如果我定义的
地址0001
数量8


你查看一下保持寄存器全局数组的相关初始化设置。

出0入0汤圆

发表于 2015-1-11 15:37:30 | 显示全部楼层
好文 学习了

出0入0汤圆

发表于 2015-1-11 16:05:12 | 显示全部楼层
good

出0入0汤圆

发表于 2015-1-11 20:42:32 | 显示全部楼层
这个必须mark!

出0入0汤圆

发表于 2015-1-12 08:40:48 | 显示全部楼层
虽然没有全部搞懂,但是写的很有思维

出0入0汤圆

发表于 2015-1-12 12:07:14 | 显示全部楼层
xukai871105 发表于 2015-1-9 20:45
你查看一下保持寄存器全局数组的相关初始化设置。

看了 数组的初始化设置没有问题。
所有的寄存器都是要上位机软件设置的地址必须比从机设置的寄存器地址少1才能正常通讯

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入0汤圆

发表于 2015-1-12 12:29:12 | 显示全部楼层
做个标记!以后用得到!

出0入0汤圆

发表于 2015-1-12 18:11:46 | 显示全部楼层
我说咋过的 上位机的地址需要比下位机的少1,原来楼主的代码屏蔽了ëusRegAddress++;我想问:如果屏蔽了此语句,当与plc通信时,是否有问题?楼主

出0入0汤圆

 楼主| 发表于 2015-1-12 20:19:23 | 显示全部楼层
hsc0588 发表于 2015-1-12 18:11
我说咋过的 上位机的地址需要比下位机的少1,原来楼主的代码屏蔽了ëusRegAddress++;我想问:如果屏蔽了此 ...

其实这个我解释过很多遍了,modbus的地址模式共有两种,PLC模式从1开始,modbus模式从0开始
我提供的代码都是从0开始,所以我就注释了。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入0汤圆

 楼主| 发表于 2015-1-12 20:20:40 | 显示全部楼层
hsc0588 发表于 2015-1-12 18:11
我说咋过的 上位机的地址需要比下位机的少1,原来楼主的代码屏蔽了ëusRegAddress++;我想问:如果屏蔽了此 ...

或者你看看这篇博文
http://blog.csdn.net/xukai871105/article/details/15654689

出0入0汤圆

发表于 2015-1-13 00:28:18 | 显示全部楼层
果断收藏

出0入0汤圆

发表于 2015-1-13 10:46:31 | 显示全部楼层
xukai871105 发表于 2015-1-12 20:20
或者你看看这篇博文
http://blog.csdn.net/xukai871105/article/details/15654689

好的 谢谢楼主,之前没有看都楼主的注释了地址++。我得官网下的代码。

出0入0汤圆

发表于 2015-1-22 22:22:08 | 显示全部楼层
很好用 感谢楼主分享

出0入0汤圆

发表于 2015-1-26 16:37:20 | 显示全部楼层

出0入0汤圆

发表于 2015-2-4 10:52:26 | 显示全部楼层
谢谢,写的很详细!

出0入0汤圆

发表于 2015-2-7 19:00:12 | 显示全部楼层
学习!!!

出0入0汤圆

发表于 2015-2-7 19:34:44 | 显示全部楼层
一个周以前刚刚 移植成功。

现在有3台设备用我做的电流模块采集数据.

跟维纶的人机界面通讯质量杠杠.的 比以前使用的国产烂表(偶尔死机,经常丢包或是通讯不上)强上百倍.

谢了!  受益非浅.

出0入0汤圆

发表于 2015-2-17 16:56:31 | 显示全部楼层
看完之后想收藏起来,可是找不到收藏,只能MARK了。

出0入0汤圆

发表于 2015-2-18 00:11:15 | 显示全部楼层
好贴,楼主辛苦了

出0入0汤圆

发表于 2015-2-20 21:01:50 | 显示全部楼层
准备试用下

出0入0汤圆

发表于 2015-2-21 16:39:49 | 显示全部楼层
谢谢分享

出0入0汤圆

发表于 2015-2-26 13:41:51 | 显示全部楼层
楼主内容详细,非常有用,少走了不少弯路。

出0入4汤圆

发表于 2015-2-26 13:45:52 | 显示全部楼层
可以自己整一遍看看,谢谢楼主

出0入0汤圆

发表于 2015-3-2 14:51:39 | 显示全部楼层
本帖最后由 arm 于 2015-3-2 14:55 编辑

freemodbus 有1.5个字符超时的处理吗?

出0入0汤圆

发表于 2015-3-2 15:18:54 | 显示全部楼层
标记留着以后学习学习

出0入0汤圆

发表于 2015-3-2 15:53:48 | 显示全部楼层

modbus,收藏下来慢慢学习。

出0入0汤圆

发表于 2015-3-8 00:13:54 | 显示全部楼层
通信没有错误,但是数据不对,很奇怪。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入0汤圆

发表于 2015-3-11 14:02:05 | 显示全部楼层
如果采集来的数据直接在对应的四个数组中赋值比如说usRegInputBuf[REG_INPUT_NREGS]或者usRegHoldingBuf[REG_HOLDING_NREGS]  那么回调函数是不是就没有作用了呢?

出0入0汤圆

发表于 2015-3-11 14:56:58 | 显示全部楼层
WERWER 发表于 2015-3-11 14:02
如果采集来的数据直接在对应的四个数组中赋值比如说usRegInputBuf[REG_INPUT_NREGS]或者usRegHoldingBuf[RE ...

理解错了  回调函数  就是存储数据, 或者处理什么操作的  用于访问你的内存数据。弱弱的问一下输入寄存器和保持寄存器有什么区别呢,如果我想要把当主机要查询的时候从机采集的数据发送出去,那么我采集来的数据是要保存在输入寄存器呢还是保持寄存器呢

出0入0汤圆

发表于 2015-3-11 15:11:36 | 显示全部楼层
学习一下!收藏

出0入0汤圆

 楼主| 发表于 2015-3-11 15:47:55 | 显示全部楼层
WERWER 发表于 2015-3-11 14:56
理解错了  回调函数  就是存储数据, 或者处理什么操作的  用于访问你的内存数据。弱弱的问一下输入寄存 ...

可以说有区别也可以说没区别

输入寄存器,只读
保持寄存器,可读可写

仿真的指令也稍有差别

出0入0汤圆

发表于 2015-3-11 16:26:12 | 显示全部楼层
xukai871105 发表于 2015-3-11 15:47
可以说有区别也可以说没区别

输入寄存器,只读

那如果我想要   主机要查询的时候把从机采集的数据发送出去,那么我从机采集来的数据是要保存在输入寄存器呢还是保持寄存器呢?还是都可以 只是说在保持寄存器中这个采集的数据可以被主机用相对应的功能吗如0x06或0x10修改,而如果是保存在输入寄存器中主机就只能知道采集到是什么数据具体的修改数据方法是从机采集到数据更新掉原来旧的数据,不知道这样理解对不对?

出0入0汤圆

发表于 2015-3-12 17:54:38 | 显示全部楼层
发现新国内了,我要学

出0入42汤圆

发表于 2015-3-12 18:11:37 | 显示全部楼层
谢谢楼主分享,学习一下

出0入0汤圆

发表于 2015-3-22 11:13:19 | 显示全部楼层

楼主 你好。

我的 很多是侯会提示 time out

然后接收的数据
000000-Tx:01 03 00 00 00 08 44 0C
000001-Tx:01 03 00 00 00 08 44 0C
000002-Tx:01 03 00 00 00 08 44 0C
000003-Tx:01 03 00 00 00 08 44 0C
000004-Tx:01 03 00 00 00 08 44 0C
000005-Tx:01 03 00 00 00 08 44 0C
000006-Tx:01 03 00 00 00 08 44 0C

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入0汤圆

发表于 2015-3-22 11:16:22 | 显示全部楼层
在做这个实验之前, 已经试过485 能够接收到数据。 通过串口--485--串口 在串口调试助手上有相应输出。  串口1 485控制脚d8

出0入0汤圆

发表于 2015-3-22 11:16:55 | 显示全部楼层
嗯 好贴 准备在了解一下modbus 然后进行移植

出0入0汤圆

发表于 2015-3-31 07:36:34 | 显示全部楼层
Mark!!

出0入0汤圆

发表于 2015-3-31 11:43:05 | 显示全部楼层
靠 徐凯 的玩意儿又蹦出来了 哈哈哈 好帖果然是永远都会火

出0入4汤圆

发表于 2015-4-14 15:11:22 | 显示全部楼层
很好的资料,自己移到ucos上看看

出0入0汤圆

发表于 2015-4-14 17:30:26 | 显示全部楼层
好帖!谢谢楼主分享!

出0入0汤圆

发表于 2015-4-16 10:40:07 | 显示全部楼层
modbus mark

出0入0汤圆

发表于 2015-4-17 23:14:50 | 显示全部楼层
谢谢楼主分享,长见识了

出0入0汤圆

发表于 2015-4-22 16:00:55 | 显示全部楼层
好资料,值得学习,顶一个。

出0入0汤圆

发表于 2015-4-26 21:21:34 | 显示全部楼层
收藏一下,有空学习

出0入0汤圆

发表于 2015-4-27 21:52:28 | 显示全部楼层
移植成功!
貌似#define REG_HOLDING_START 0001 比去掉 usRegAddress++ 好点

出0入0汤圆

 楼主| 发表于 2015-4-29 12:31:47 | 显示全部楼层
bbglx 发表于 2015-4-27 21:52
移植成功!
貌似#define REG_HOLDING_START 0001 比去掉 usRegAddress++ 好点

这个我还认真研究过

modbus标准规范中,寄存器地址总是从0开始
而大多数PLC设备,寄存器地址又从1开始

其实没有那种方法好的问题,主要看你连接的是什么设备。

出0入0汤圆

发表于 2015-4-29 18:39:55 | 显示全部楼层
好东西,先收藏一下~

出0入0汤圆

发表于 2015-5-9 18:25:56 | 显示全部楼层
正在研究,受益匪浅!

出0入0汤圆

发表于 2015-5-11 23:05:10 | 显示全部楼层
很好,学习中......

出0入0汤圆

发表于 2015-5-24 20:55:45 | 显示全部楼层
485收发控制的管脚在哪家请高手指教

出0入0汤圆

发表于 2015-5-28 09:26:31 | 显示全部楼层
万分感谢楼主分享,代码移植已成功!

出0入0汤圆

发表于 2015-6-3 15:45:25 | 显示全部楼层
楼主啊,我想问下,是不是你这个freemodbus是在从机上运行的?那主机的呢?怎么写呢?

出0入0汤圆

发表于 2015-6-3 22:43:48 | 显示全部楼层
谢谢楼主分享,资料收藏了

出0入0汤圆

发表于 2015-6-22 14:53:52 | 显示全部楼层
现在我碰到了一个奇怪的问题,波特率设置为115200时,通讯时就是超时,9600可以通讯,但是在RTU模式下,返回的是以@(0x40)开头的一串乱码,目前没有找到规律。

出0入0汤圆

发表于 2015-6-23 10:57:35 | 显示全部楼层
mark it!!!

出0入0汤圆

发表于 2015-7-10 09:25:58 | 显示全部楼层
很有帮助,感谢楼主

出0入0汤圆

发表于 2015-7-29 13:13:35 | 显示全部楼层
楼主,mdk版本的没有吗?

出0入0汤圆

发表于 2015-7-29 15:49:50 | 显示全部楼层
看看收藏学习下

出0入0汤圆

发表于 2015-8-4 09:50:43 | 显示全部楼层
不错啊 支持一下 正需要呢

出0入0汤圆

发表于 2015-8-4 09:52:50 | 显示全部楼层
不错啊 支持一下 正需要呢

出0入0汤圆

发表于 2015-8-4 10:03:02 | 显示全部楼层
不错啊 支持一下 正需要呢

出0入0汤圆

发表于 2015-8-4 13:56:25 | 显示全部楼层
请问一下楼主,把freemodbus 移植到 ucos 有什么注意事项。

出0入0汤圆

发表于 2015-8-25 11:08:03 | 显示全部楼层
Freemodbus 不支持多从机?那。。。。。。。。。。。。。。。。。。。

出0入0汤圆

发表于 2015-8-31 15:10:42 | 显示全部楼层
源码main.c的282行后面少了一句usBitOffset += 8;

出0入0汤圆

发表于 2015-9-9 16:14:25 | 显示全部楼层
调试了两天,发现把下面的注释加上,只要清中断,只能进一次中断,以后就进不去了,很是奇怪,有遇到的吗?
if(USART_GetITStatus(USART2,USART_IT_TC))
    {
        
        bTaskWoken = pxMBFrameCBTransmitterEmpty();
        //USART_ClearITPendingBit(USART2, USART_IT_TC);
    }
         
    if(USART_GetITStatus(USART2,USART_IT_RXNE))
    {      
      
        bTaskWoken = pxMBFrameCBByteReceived();
         //USART_ClearITPendingBit(USART2, USART_IT_RXNE);
    }

出0入0汤圆

发表于 2015-9-10 08:08:52 | 显示全部楼层
很好,讲得很详细,点赞

出0入0汤圆

发表于 2015-9-10 08:37:13 | 显示全部楼层
马克, 学习一下

出0入0汤圆

发表于 2015-9-23 15:21:56 | 显示全部楼层
wushaofei1985 发表于 2012-9-21 23:52
很早以前看过,一直没用过,自己通过大段的switch套switch语句解析MOSBUS。呵呵,这个我感觉也就那样吧,可 ...

帅哥 这个为什么没有清中断呢?
发现加了清中断就只能进第一次
void UART1_IRQ(void)
{

        if(USART_GetITStatus(USART1,USART_IT_TXE))
        {
                //加上就不行了USART_ClearITPendingBit(USART1, USART_IT_TXE);
            pxMBFrameCBTransmitterEmpty(  );
        }
        else if(USART_GetITStatus(USART1,USART_IT_RXNE))
        {
                //加上就不行了USART_ClearITPendingBit(USART1, USART_IT_RXNE);
                pxMBFrameCBByteReceived(  );
        }
}

出0入0汤圆

发表于 2015-10-13 16:08:01 | 显示全部楼层
永康程序猿发来贺电, 按照肉猪的, 在KEIL上成功了。原子mini开发板

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入0汤圆

发表于 2015-10-15 13:07:03 | 显示全部楼层
感谢 写的太好了

出0入0汤圆

发表于 2015-10-15 14:10:41 | 显示全部楼层
很不错哦,马上要用到,感谢

出0入13汤圆

发表于 2015-10-15 17:17:47 | 显示全部楼层
好东西,谢谢分享

出0入0汤圆

发表于 2015-11-27 21:07:03 | 显示全部楼层
楼主您好,我是西工大学生一名,将您代码下载至STM32板中,并使用ModbusPoll工具读取数据,一直显示TimeoutError,不知到是不是我操作不当,谢谢!

出0入0汤圆

发表于 2015-11-28 10:55:49 | 显示全部楼层
学习了,谢谢分享

出0入0汤圆

发表于 2015-11-30 20:42:01 | 显示全部楼层
楼主好,刚测试您的代码,发现读取开关量时,数组中第一个数据读出来全部为零,模拟量输入、HoldingRegister、线圈都是正常的

出0入0汤圆

发表于 2015-12-5 16:55:11 | 显示全部楼层
为何02指令读开关量输入出错呢。

出0入0汤圆

发表于 2015-12-6 15:27:43 | 显示全部楼层
非常感谢,很实用的帖子
需要 485通讯的地方用得着

出0入0汤圆

发表于 2015-12-6 19:00:31 | 显示全部楼层
Mark        

出0入0汤圆

发表于 2015-12-6 23:33:22 | 显示全部楼层
评论区真的有好多大神
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-4-25 07:16

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表