C/C++知识点之单片机MODBUS通信源代码
小标 2019-04-01 来源 : 阅读 1734 评论 0

摘要:本文主要向大家介绍了C/C++知识点之单片机MODBUS通信源代码,通过具体的内容向大家展示,希望对大家学习C/C++知识点有所帮助。

本文主要向大家介绍了C/C++知识点之单片机MODBUS通信源代码,通过具体的内容向大家展示,希望对大家学习C/C++知识点有所帮助。

C/C++知识点之单片机MODBUS通信源代码

好久没有写些什么了,最近在出差也没做关于Linux的东西。由于是做自动化的因此最近做了一块单片机的板子要作为MODBUS从站来与上面的触摸屏进行显示功能还不是很完善但是MODBUS功能的模块程序已经写好经过测试基本可以用。
具体要求是下面有2个AI和4个DO量需要检测和控制,我使用的是90C52单片机模拟量采集部分用的OP07的放大器电路,这里就不详细说明了(有需要的可以留言,有图纸),最麻烦的就是MODBUS通讯部分。
一开始我根据MODBUS标准协议规定来做了程序但是不能通讯经过总结主要问题出在二个地方
第一:crc校验计算不正确
第二:发送的程序太大导致发送时间过长主站端认为超时(我自己认为的原因)


经过仔细研究发现CRC校验的程序我根本写不出来也理解不了网络上有很多现成的可以直接拿来来用就很好了,经过精简程序是可以进行通信了但是还有一个很重要的问题是超时判断的问题一直没能处理所以进行了以下时间问题的总结
Modbus字符与数据帧间隔时间问题
1、MODBS协议中的规定如下
在RTU模式,报文有时间长至少3.5个字符时间的空间间隔区分如下图


整个报文必须以连续的字符流发送,如果两个字符之间的空闲大于1.5个字符时间,则报文帧认为不完整,应该被接收点丢弃。


需要注意的是RTU接收驱动程序的实现,由于1.5T和3.5T的定时,隐含着大量对中断的管理。在高通信速率下,导致CPU负担加重,因此在<=19200pbs时这两个定时必须严格遵守;对于>19200pbs的情形应该使用2个定时的固定值,建议字符间的超时时间t1.5为750us;帧间超时时间为1.75ms
上面是MODBUS协议中的规定,但在实际使用中1.5T都没有必要关注。而帧与帧之间的3.5T则需要程序处理一下。由于RTU模式没有起始符和结束符,两个数据包之间只能靠时间间隔来区分。在仪表在工厂实际使用过程中一般都是间隔40ms、50ms甚至更长时间读一次数据,这个间隔完全超过了T3.5;
假设现在波特率是9600bps要发送取数据的请求:
01 03 00 01 00 01 D5 CA (格式为8个数据位1个停止位)
那么每个字节包含一个起始位一个停止位也就是10位
那么发送这串命令要花费时间为:8×10/9600×1000=8.3ms
即第一帧发送时间为8.3ms而3.5T的时间为3.5×10/9600×1000=3.65ms
所以第二帧数据开始发送的时间至少是第12ms开始(8.3+3.65=11.95ms)
之后修改程序后终于可以达到预期的效果但是我用三个软件进行调试都可以读到数据(串口调试助手,MODBUSSIM,modscan)其中只有modscan接收数据的时候闪一下红但是能读到数据不知道为什么调节了他的poll时间还是不行其他两个软件正常也可以写数据。想了一下觉得这两天也就干了这么些事。程序是用keil写的有需要的可以联系我,可以直接用。

本文由职坐标整理并发布,希望对同学们有所帮助。了解更多详情请关注职坐标编程语言C/C+频道!

本文由 @小标 发布于职坐标。未经许可,禁止转载。
喜欢 | 0 不喜欢 | 0
看完这篇文章有何感觉?已经有0人表态,0%的人喜欢 快给朋友分享吧~
评论(0)
后参与评论

您输入的评论内容中包含违禁敏感词

我知道了

助您圆梦职场 匹配合适岗位
验证码手机号,获得海同独家IT培训资料
选择就业方向:
人工智能物联网
大数据开发/分析
人工智能Python
Java全栈开发
WEB前端+H5

请输入正确的手机号码

请输入正确的验证码

获取验证码

您今天的短信下发次数太多了,明天再试试吧!

提交

我们会在第一时间安排职业规划师联系您!

您也可以联系我们的职业规划师咨询:

小职老师的微信号:z_zhizuobiao
小职老师的微信号:z_zhizuobiao

版权所有 职坐标-一站式IT培训就业服务领导者 沪ICP备13042190号-4
上海海同信息科技有限公司 Copyright ©2015 www.zhizuobiao.com,All Rights Reserved.
 沪公网安备 31011502005948号    

©2015 www.zhizuobiao.com All Rights Reserved

208小时内训课程