查看: 667|回复: 6

[GD32F450方案分享] GD32F450 主从一体modbus 实现

[复制链接]

8

主题

0

好友

221

积分

秀才

Rank: 3Rank: 3

该用户从未签到

发表于 2017-5-31 19:06:41 |显示全部楼层
之前写了不少modbus底层程序,一直都不太完善,做从站倒还简单些,主站用起来太麻烦。这次借GD32F450的评估板重新整理了下,终于可以实现主站自动管理了。
作为从站,只要等待接收报文然后处理返回就可以。但主站就要复杂些,总线上同一时间段只能有一个命令在执行,而主站通常需要基于事件来请求命令,比如开机、设置从站参数等,因此请求命令的程序位置、时刻无法确定,如果等待上次命令处理完毕再发送请求会导致程序阻塞,处理比较困难。
本程序基于缓冲池来处理主机命令,所有的命令请求不直接发送到端口总线而是写入缓冲池,然后统一管理缓冲池来处理命令,实现重要事件低延时和错误重发机制。
程序建立下面的缓冲池,每个缓冲位置记录一条命令信息。
         0                                                      mbSCBuffSize                                          mbCBuffSize
         |                                                           |                                                     |
     | Buff0 | Buff1 | Buff2 |  ....  | Buff[mbSCBuffSize-1] | Buff[mbSCBuffSize] | Buff[mbSCBuffSize+1] |  ....  | Buff[mbCBuffSize]|
         |                                       |                   |                                                     |
        静态                                    静态                动态                                                  动态
        缓冲                                    缓冲                缓冲                                                  缓冲
        起始                                    结束                开始                                                  结束

     处理程序按下面方式扫描缓冲池:
     先扫描动态区,从上次处理的位置开始,命中后退出。若扫描完整个动态区都没有命中,开始扫描静态区                              
     扫描静态区,方法同动态区。
     两个区域的区别在于:动态区的命令处理后会被清除,而静态一直保持就绪状态。
         
应用的时候可以将事件驱动的命令放入动态缓冲区,一直执行的命令放在静态区。

下面工程做一个简单演示:
IDE :   IAR ARM8.11.1
操作系统 : freeRTOS

评估板CN9标示TXRX的位置(UART1)作为modbus端口。
演示程序默认运行在从机模式,站号2,波特率9600,偶校验,可以接一个USB转TLL进行测试。

可以将mbapp.c文件初始化部分的mbModeSet(MB_RTU_SLAVE);改为mbModeSet(MB_RTU_MASTER);改为主机模式,主机模式会不断发送配置好的命令。

freertos-bbs-modbus.zip (3.15 MB, 下载次数: 24)
回复

使用道具 举报

0

主题

0

好友

29

积分

白丁

Rank: 1

  • TA的每日心情
    开心
    2017-5-12 10:56
  • 签到天数: 1 天

    连续签到: 1 天

    [LV.1]初来乍到

    发表于 2017-6-13 08:57:30 |显示全部楼层
    楼主,你好,有可以用MDK打开的版本吗?
    回复

    使用道具 举报

    8

    主题

    0

    好友

    221

    积分

    秀才

    Rank: 3Rank: 3

    该用户从未签到

    发表于 2017-6-14 19:06:34 |显示全部楼层
    lilei0902 发表于 2017-6-13 08:57
    楼主,你好,有可以用MDK打开的版本吗?

    一直在用IAR,工程比较大,做双IDE比较麻烦就没搞
    回复

    使用道具 举报

    0

    主题

    0

    好友

    29

    积分

    白丁

    Rank: 1

  • TA的每日心情
    开心
    2017-5-12 10:56
  • 签到天数: 1 天

    连续签到: 1 天

    [LV.1]初来乍到

    发表于 2017-6-18 17:03:42 |显示全部楼层
    你好,我下了个IAR的7.60版本,编译出现这样的警告:Warning[Lt009]: Inconsistent wchar_t size
                mbmasterapp.o(modbuslib.a) and 3 other objects have wchar_t size 32 bits
    下载程序后总是进入"HardFault_Handler",请问是什么问题?
    回复

    使用道具 举报

    7

    主题

    1

    好友

    408

    积分

    秀才

    Rank: 3Rank: 3

  • TA的每日心情
    开心
    2017-6-17 09:42
  • 签到天数: 3 天

    连续签到: 1 天

    [LV.2]偶尔看看I

    发表于 2017-6-18 18:26:55 |显示全部楼层
    楼主,你的贴子是怎么发成功的。我最近几天发的贴都一直处于待审核状态?
    回复

    使用道具 举报

    8

    主题

    0

    好友

    221

    积分

    秀才

    Rank: 3Rank: 3

    该用户从未签到

    发表于 2017-6-19 16:19:26 |显示全部楼层
    lilei0902 发表于 2017-6-18 17:03
    你好,我下了个IAR的7.60版本,编译出现这样的警告:Warning[Lt009]: Inconsistent wchar_t size
             ...

    这个地方有点印象,又查了下, IAR从8.11开始更改了wchar_t的尺寸,官网有说明,那个lib是IAR8.11编译的,之前的版本运行都会出错。

    IAR811UPDATE

    IAR811UPDATE
    回复

    使用道具 举报

    8

    主题

    0

    好友

    221

    积分

    秀才

    Rank: 3Rank: 3

    该用户从未签到

    发表于 2017-6-19 17:17:53 |显示全部楼层
    沙漠之风 发表于 2017-6-18 18:26
    楼主,你的贴子是怎么发成功的。我最近几天发的贴都一直处于待审核状态? ...

    这个没怎么注意,应该发完很快就可以看到了
    回复

    使用道具 举报

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

    关闭

    站长推荐上一条 /5 下一条

    手机版|爱板网 |网站地图  

    GMT+8, 2017-10-18 15:45 , Processed in 0.184202 second(s), 16 queries , Memcache On.

    苏公网安备 32059002001056号

    Powered by Discuz!

    回顶部