找回密码
 立即注册
查看: 453|回复: 8

modbus库

[复制链接]
  • TA的每日心情
    奋斗
    昨天 07:54
  • 签到天数: 70 天

    [LV.6]常住居民II

    8

    主题

    31

    回帖

    908

    积分

    高级会员

    积分
    908
    发表于 2024-2-18 22:46:53 | 显示全部楼层 |阅读模式
    在csdn上看到一个关于STC32G的主从库地址STC32G12K128单片机的 moubus-rtu 从机测试工程_单片机modbus rtu从站程序-CSDN博客
    大家可以看一下作为参考
    我基于这个改了一下用到我的一个5×5键盘项目上,使用STC8H单片机。在电脑上使用Modbus poll,串口助手进行测试正常,功能码都可以使用。
    但是与PLC连机通信(PLC做主机,单片机做从机),PLC一直报通信超时故障,一直没有找到问题在哪里,推测是3.5T这个地方有问题,项目时间比较紧,
    就仍然使用了梁工做的10H,03H这个代码了(微改了一下),和PLC直接联机正常了。
    如果有大师能够指点改正一下代码,STC库就可以有完整的主从机代码了。谢谢啦

    STC32G_Project_modbus_rtu_slave.zip

    1.42 MB, 下载次数: 33

    这个是源文件

    modbus_keypad.zip

    3.41 MB, 下载次数: 22

    这个是STC8H单片机用的modbus代码,电脑软件读写正常,但PLC做主机读写不正常 ...

    回复 送花

    使用道具 举报

  • TA的每日心情
    开心
    3 天前
  • 签到天数: 90 天

    [LV.6]常住居民II

    38

    主题

    986

    回帖

    6773

    积分

    荣誉版主

    冲哥视频教程和各种开源资料QQ交流群884047237,可群

    积分
    6773
    QQ
    发表于 2024-2-19 08:19:47 | 显示全部楼层
    最好抓下数据包,如果POLL能用的话,那PLC应该也是没有问题的,抓一下通信的时候主机发的数据,看下是不是PLC的程序没写对,发出的数据是不是有问题,尤其是读写的站号地址波特率等等

    点评

    如果抓包抓出来的主机数据没问题的话,用串口助手模拟下主机连接这个单片机,然后给他发抓到的PLC的命令,看回应了什么数据,在分析问题  详情 回复 发表于 2024-2-19 08:24
    回复 支持 反对 送花

    使用道具 举报

  • TA的每日心情
    开心
    3 天前
  • 签到天数: 90 天

    [LV.6]常住居民II

    38

    主题

    986

    回帖

    6773

    积分

    荣誉版主

    冲哥视频教程和各种开源资料QQ交流群884047237,可群

    积分
    6773
    QQ
    发表于 2024-2-19 08:24:02 | 显示全部楼层
    电子DIY小家 发表于 2024-2-19 08:19
    最好抓下数据包,如果POLL能用的话,那PLC应该也是没有问题的,抓一下通信的时候主机发的数据,看下是不是P ...

    如果抓包抓出来的主机数据没问题的话,用串口助手模拟下主机连接这个单片机,然后给他发抓到的PLC的命令,看回应了什么数据,在分析问题
    回复 支持 反对 送花

    使用道具 举报

  • TA的每日心情
    奋斗
    昨天 07:54
  • 签到天数: 70 天

    [LV.6]常住居民II

    8

    主题

    31

    回帖

    908

    积分

    高级会员

    积分
    908
     楼主| 发表于 2024-2-19 11:59:16 | 显示全部楼层
    电子DIY小家 发表于 2024-2-19 08:24
    如果抓包抓出来的主机数据没问题的话,用串口助手模拟下主机连接这个单片机,然后给他发抓到的PLC的命令 ...

    PLC发的命令正确,就是单片机没有回复。但是单片机与电脑poll通信,收发数据格式也对。抓到PLC发的命令和poll发的命令一样,串口助手收发就是正常的。

    点评

    这种情况下就只能mcu仿真看下是哪步没执行到了或者是哪里延迟太久了  详情 回复 发表于 2024-2-19 12:58
    回复 支持 反对 送花

    使用道具 举报

  • TA的每日心情
    开心
    3 天前
  • 签到天数: 90 天

    [LV.6]常住居民II

    38

    主题

    986

    回帖

    6773

    积分

    荣誉版主

    冲哥视频教程和各种开源资料QQ交流群884047237,可群

    积分
    6773
    QQ
    发表于 2024-2-19 12:58:27 | 显示全部楼层
    一束光的旅程 发表于 2024-2-19 11:59
    PLC发的命令正确,就是单片机没有回复。但是单片机与电脑poll通信,收发数据格式也对。抓到PLC发的命令和 ...

    这种情况下就只能mcu仿真看下是哪步没执行到了或者是哪里延迟太久了
    回复 支持 反对 送花

    使用道具 举报

  • TA的每日心情
    奋斗
    昨天 07:54
  • 签到天数: 70 天

    [LV.6]常住居民II

    8

    主题

    31

    回帖

    908

    积分

    高级会员

    积分
    908
     楼主| 发表于 2024-2-21 23:21:31 | 显示全部楼层
    电子DIY小家 发表于 2024-2-19 12:58
    这种情况下就只能mcu仿真看下是哪步没执行到了或者是哪里延迟太久了

    您好,我今天晚上在家针对这个情况研究了一下,还是连着电脑,显示调整的通信超时,发现时间长短对通信影响不大(时间调整幅度太大肯定影响通信),想着降低波特率测试一下。
    和电脑通信正常时使用的主频时22.1184MHZ,波特率9600。改为波特率4800(上位机poll也改了),就一直显示通信超时,波特率不变,改变主频,也是这个情况。这个程序好像只认主频22.1184MHZ,波特率9600。目前还没有发现到底什么原因导致这个情况。想请您帮忙看一下哪个地方出现的问题,谢谢啦

    Modbus.zip

    729.45 KB, 下载次数: 15

    重新移植整理的

    回复 支持 反对 送花

    使用道具 举报

  • TA的每日心情
    奋斗
    昨天 07:54
  • 签到天数: 70 天

    [LV.6]常住居民II

    8

    主题

    31

    回帖

    908

    积分

    高级会员

    积分
    908
     楼主| 发表于 2024-2-22 00:23:11 | 显示全部楼层
    一束光的旅程 发表于 2024-2-21 23:21
    您好,我今天晚上在家针对这个情况研究了一下,还是连着电脑,显示调整的通信超时,发现时间长短对通信影 ...

    发完贴,发现了一个问题,就是定时器4的初值在前面改了,后面modbus_slave.c文件没有改,大意了。天明去公司与PLC联机看看效果这么样
    #include "modbus_slave.h"
    #include        "STC8G_H_Timer.h"

    #if (MODBUS_CFG_SLAVE_EN == 1)
    #include "dataconversion.h"
    static uint16_t xdata uiTimerAutoLoadVal = 61580 ;//定时器的初始值
    这个牵涉到后面定时器重装
    /*******************************************************************************
    * 名    称: MODS_ReciveNew
    * 功    能: 串口接收中断服务程序会调用本函数。当收到一个字节时,执行一次本函数。
    * 入口参数: 无
    * 出口参数: 无
    * 作  者: Roger-WY
    * 创建日期: 2016-06-29
    * 修    改:
    * 修改日期:
    * 备    注:
    *******************************************************************************/
    void MODS_ReciveNew(uint8_t _byte)
    {
        g_mods_timeout = 0;

        /* 开启硬件定时器 延时3.5个字符的时间 超时则执行 MODS_RxTimeOut 函数 */
        Timer4_Stop();
        T4_Load(uiTimerAutoLoadVal);
        Timer4_Run(1);

        if(g_tModS.RxCount < S_RX_BUF_SIZE)
        {
            g_tModS.RxBuf[g_tModS.RxCount++] = _byte;
        }
    }

    屏幕截图 2024-02-22 001815.jpg
    屏幕截图 2024-02-22 001905.jpg
    回复 支持 反对 送花

    使用道具 举报

  • TA的每日心情
    奋斗
    昨天 07:54
  • 签到天数: 70 天

    [LV.6]常住居民II

    8

    主题

    31

    回帖

    908

    积分

    高级会员

    积分
    908
     楼主| 发表于 2024-2-22 11:59:40 | 显示全部楼层
    一束光的旅程 发表于 2024-2-22 00:23
    发完贴,发现了一个问题,就是定时器4的初值在前面改了,后面modbus_slave.c文件没有改,大意了。天明去 ...

    今天经过与PLC联机验证,通信正常。
    经过这几天验证,通信超时判断要紧密结合波特率和主频进行计算。
    整理好的文件上传上,供大家参考一下,只验证了从机,主机没有用到还没调,有兴趣的可以测试一下。

    Modbus1.zip

    730.54 KB, 下载次数: 40

    验证好的,共享一下

    回复 支持 反对 送花

    使用道具 举报

  • TA的每日心情

    10 小时前
  • 签到天数: 58 天

    [LV.5]常住居民I

    3

    主题

    540

    回帖

    716

    积分

    高级会员

    积分
    716
    发表于 2024-3-13 11:36:32 | 显示全部楼层
    学习下
    回复 送花

    使用道具 举报

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

    本版积分规则

    QQ|手机版|深圳国芯人工智能有限公司 ( 粤ICP备2022108929号-2 )

    GMT+8, 2024-5-2 19:58 , Processed in 0.076158 second(s), 70 queries .

    Powered by Discuz! X3.5

    © 2001-2024 Discuz! Team.

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