一束光的旅程 发表于 2024-2-18 22:46:53

modbus库

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

电子DIY小家 发表于 2024-2-19 08:19:47

最好抓下数据包,如果POLL能用的话,那PLC应该也是没有问题的,抓一下通信的时候主机发的数据,看下是不是PLC的程序没写对,发出的数据是不是有问题,尤其是读写的站号地址波特率等等

电子DIY小家 发表于 2024-2-19 08:24:02

电子DIY小家 发表于 2024-2-19 08:19
最好抓下数据包,如果POLL能用的话,那PLC应该也是没有问题的,抓一下通信的时候主机发的数据,看下是不是P ...

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

一束光的旅程 发表于 2024-2-19 11:59:16

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

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

电子DIY小家 发表于 2024-2-19 12:58:27

一束光的旅程 发表于 2024-2-19 11:59
PLC发的命令正确,就是单片机没有回复。但是单片机与电脑poll通信,收发数据格式也对。抓到PLC发的命令和 ...

这种情况下就只能mcu仿真看下是哪步没执行到了或者是哪里延迟太久了

一束光的旅程 发表于 2024-2-21 23:21:31

电子DIY小家 发表于 2024-2-19 12:58
这种情况下就只能mcu仿真看下是哪步没执行到了或者是哪里延迟太久了

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

一束光的旅程 发表于 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 = _byte;
    }
}

一束光的旅程 发表于 2024-2-22 11:59:40

一束光的旅程 发表于 2024-2-22 00:23
发完贴,发现了一个问题,就是定时器4的初值在前面改了,后面modbus_slave.c文件没有改,大意了。天明去 ...

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

soma 发表于 2024-3-13 11:36:32

学习下

小坤 发表于 2024-5-14 15:03:21

{:5_332:}
页: [1] 2
查看完整版本: modbus库