找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1933|回复: 12
收起左侧

51单片机的Modbus RTU通信示例一

[复制链接]
ID:476652 发表于 2022-1-27 15:16 | 显示全部楼层 |阅读模式
各位大师,我最近在学习Modbus RTU在51上的应用,
我用的是STC12C5A60S2单片机开发板和STC8A8K64S4A12开发板做Modbus RTU从站,程序用到是从网上找来几个大神的51程序,
主站用Modbus Poll软件,
看着程序不错,可就是不能和Modbus Poll软件通信成功,老是提示超时。
我是做工业plc控制的,对51单片机不是很懂,希望大神们不要笑话,
请有懂得大神指点指点,万分感谢!!
51hei图片_20220127151352.jpg 51hei图片_202201271513521.jpg 51hei截图_20220127150729.png

从网上找的大神的源程序也一并奉上
MCGS与51单片机modbus通讯proteus仿第二版(完整版).rar (4.92 MB, 下载次数: 128)
回复

使用道具 举报

ID:883242 发表于 2022-1-27 19:20 | 显示全部楼层
从站有点难度,为啥不用cortexxx
回复

使用道具 举报

ID:883242 发表于 2022-1-27 19:21 | 显示全部楼层
从站代码有难度,为什么不用cortex-M0单片机呢?资源和速度都足够了。
回复

使用道具 举报

ID:476652 发表于 2022-1-27 20:41 | 显示全部楼层
现在cortex-M0的芯片都很贵了,做从站都想节省费用,用51做从站,用STM32F407做主站,
回复

使用道具 举报

ID:883242 发表于 2022-1-27 21:06 | 显示全部楼层
Cortex-M4不嫌贵,反到嫌Cortex-M0贵?而且MODBUS/RTU主站好写,只要发数据帧,等从站回复即可,很普通的顺序逻辑。从站难写,要监听总线上面的数据帧,判断哪些数据帧跟自己无关,哪些数据帧是对自己说的。
回复

使用道具 举报

ID:161164 发表于 2022-1-28 02:27 | 显示全部楼层
用例程在STC89上玩了一个晚上
半成功地用Modbus点亮几个LED和传回几个键值
睡前留一下言

因为例程用的是AT89
是12T单片
楼主用STC12和STC8都是1T单片机
波特率和定时器的设定要改一改

我用STC89+11.0592Mhz
改了TH1和TL1的计算方程还是不行

  1.         TH1 = -11059200L/12/32/9600;    //求当波特率是9600时定时器的初值<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
  2.         TL1 = -11059200L/12/32/9600;
复制代码


对比了STC的官方例程才发现要加括号

  1.         TH1 = -(11059200L/12/32/9600);    //求当波特率是9600时定时器的初值<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
  2.         TL1 = -(11059200L/12/32/9600);
复制代码


而且89单片机可以设定倍速

  1.         PCON |= 0X80;                   //波特率加倍
复制代码

就是说方程式用9600算
Modbus上位机的设定就要用19200

为什么说是半成功呢?
因为虽然可以控制LED和读取键值
但是反应很慢而且还会Timeout
还有很多地方要研究一下

想不到会再这里遇到一样干PLC的同行
明天继续
回复

使用道具 举报

ID:311903 发表于 2022-1-28 08:23 | 显示全部楼层
从站最简单的做法通过定时器判断一定时间没有数据就认为一帧,然后解析报文,判断是否属于自己的报文,是则返回即可;或者你也可以按字符格式解析,满足一帧的条件时再判断也可以,总的来简单的从站应用还是比较简单的
回复

使用道具 举报

ID:311903 发表于 2022-1-28 08:28 | 显示全部楼层
还有一个比较有意思的事情,这个代码串口初始化跟硬件相关,你得按你的板子晶振频率来修改相应的串口初始化,以及校验模式
回复

使用道具 举报

ID:476652 发表于 2022-1-28 12:40 | 显示全部楼层
我的单片机水平肯定远远赶不上前面几位大神的水平了!!
也感谢大神 lkc8210通宵达旦的寻找问题,
回复

使用道具 举报

ID:161164 发表于 2022-1-28 15:46 | 显示全部楼层
温柔的郎 发表于 2022-1-28 12:40
我的单片机水平肯定远远赶不上前面几位大神的水平了!!
也感谢大神 lkc8210通宵达旦的寻找问题,

上班摸鱼的时候玩了一下仿真
竟然成功了!!
没有Timeout
不知道为什么真机会timeout
回复

使用道具 举报

ID:90212 发表于 2022-2-11 22:07 | 显示全部楼层
同行!我也是干自动化,但现在落魄成电工了!
人家电工为了提升都开始学plc了,我却倒过来了,叹叹叹

搞串口通信,必须神器!
因为串口具有独占性,所以能用来检测串口通信的神器很少,我一般用CommMonitor,有坡姐版的,很好用

我从经验来判断,可能是通信协议不一致,比如奇偶校验等!
回复

使用道具 举报

ID:313048 发表于 2022-2-12 10:32 | 显示全部楼层
lkc8210 发表于 2022-1-28 15:46
上班摸鱼的时候玩了一下仿真
竟然成功了!!
没有Timeout

仿真是理想情况下的,真机可能存在波特率偏差,通信干扰等情况。
回复

使用道具 举报

ID:161164 发表于 2022-2-12 11:03 | 显示全部楼层
AUG 发表于 2022-2-12 10:32
仿真是理想情况下的,真机可能存在波特率偏差,通信干扰等情况。

回家研究发现是数据地址溢出了
原代码所设的传回数组只有16Byte
其中头3Byte及尾2Byte用作地址/功能码 / 字节长度 及 CRC验证
可用的只余下11Byte
而每个Modbus数据占用两个Byte
所以上位机只能要求5个数据
我当时要求的是10个
而代码又没有溢出保护
所以跑飞了
回复

使用道具 举报

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

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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