硬汉嵌入式论坛

 找回密码
 立即注册
查看: 2990|回复: 3
收起左侧

消化F429 Modbus 主机历程

[复制链接]

29

主题

514

回帖

606

积分

金牌会员

积分
606
QQ
发表于 2020-12-28 12:04:07 | 显示全部楼层 |阅读模式
本帖最后由 廷润 于 2020-12-28 17:45 编辑

消化Amfly的Modbus协议。
                a.发送命令的函数,等不到回复,超时后才响应正常接收。
                b.接收的BUFF不清零,断掉从机后,其他指令依然是原buff内容。
                c.打印显示,常规按键触发刷两次显示结果,长按刷三次显示结果。

例程的面很到位,具体使用还是要根据自己的内部协议做平衡取舍。

单独运行Host 历程的应该还有更多功能点失效的地方,待续。

=============分割线====================程序打包,少了 “output.sct” 文件,再其他工程拷一个过来就可以继续编译使用了。

现象a,请看一楼回复。寄存器值没匹配号的问题。


现象b,暂未解决,我当前的应用隐患如二楼回复。另外传输命令BUFF 大小20,如果使用485做屏幕交互通信,很有必要把这个值改大,我的项目写多个和返回多个都超过60.

现象c,如果产品有其他定时小,占用率频繁的任务运行。c的现象很可能会影响产品功能。

=============分割线====================
再次琢磨例程,发现数据更新偏慢,测试的代码和现象请看附件“src压力测试2.zip”
现象描述:当前存粹跑Host 例程,刷两次显示结果,真会概率第一次没拿到值(上一次BUFF结果 )。
操作方法:替换压缩包的两个文件,来回按K2,K3,会出现图片所示的结果。

不排除当前裸跑HOST例程程序跳转太快的原因,待进一步分析,评估FIFO的协调性


222.gif

V6-RS485_Host模式打印测试.zip

5.14 MB, 下载次数: 25

调整了打印

src压力测试2.zip

87.44 KB, 下载次数: 3

第二次测试

Releasing your creativity
回复

使用道具 举报

29

主题

514

回帖

606

积分

金牌会员

积分
606
QQ
 楼主| 发表于 2020-12-28 13:54:15 | 显示全部楼层
关于a, 事实上已经正常通讯了,
   异常定位在此函数,应该是历程独立出来后私有数值没匹配的问题。
static void MODH_Read_01H(void)
{
        uint8_t bytes;
        uint8_t *p;
       
        if (g_tModH.RxCount > 0)
        {
                bytes = g_tModH.RxBuf[2];        /* 数据长度 字节数 */               
               
                printf(" g_tModH.RxBuf[2]:%d \n\r",g_tModH.RxBuf[2]);
                switch (g_tModH.Reg01H)
                {
                        case REG_D01:
                                if (bytes == 8)
                                {
                                        p = &g_tModH.RxBuf[3];       
                                       
                                        g_tVar.D01 = BEBufToUint16(p); p += 2;        /* 寄存器 */       
                                        g_tVar.D02 = BEBufToUint16(p); p += 2;        /* 寄存器 */       
                                        g_tVar.D03 = BEBufToUint16(p); p += 2;        /* 寄存器 */       
                                        g_tVar.D04 = BEBufToUint16(p); p += 2;        /* 寄存器 */
                                       
                                        g_tModH.fAck01H = 1;
                                }
                                break;
                }
        }
}
Releasing your creativity
回复

使用道具 举报

29

主题

514

回帖

606

积分

金牌会员

积分
606
QQ
 楼主| 发表于 2020-12-28 14:43:18 | 显示全部楼层
关于b的现象,当前使用fifo,暂时还没想好如何清buffer,目前定位到g_RxBuf3,
   之前有个项目经验,是485读传感器的温度。正常读到温度后,我将传感器断电,依然能返回上一次BUFFER的结果,正常传感器失联,温度应该显示默认0或者错误值。

关于c的现象,将会消耗两倍的显示时间,如果项目通信频繁CPU资源吃紧,消耗不少资源。
Releasing your creativity
回复

使用道具 举报

29

主题

514

回帖

606

积分

金牌会员

积分
606
QQ
 楼主| 发表于 2020-12-28 16:47:04 | 显示全部楼层
关于从机例程,四个点灯的命令是:
01 05 01 01 00 01 5C 36
01 05 01 02 00 01 AC 36
01 05 01 03 00 01 FD F6
01 05 01 04 00 01 4C 37

函数的说明里面的备注对不上,感兴趣的同学自己读一下代码的功能逻辑,把功能码和数据一一对应即可。
实际上自己平台功能,经常也需要做寄存器地址,寄存器值一一对应实现精准控制功能。
Releasing your creativity
回复

使用道具 举报

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

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2025-8-12 21:20 , Processed in 0.040430 second(s), 26 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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