单片机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写的有需要的可以联系我,可以直接用。

转载于:https://blog.51cto.com/13638458/2157363

你可能感兴趣的:(单片机MODBUS通信源代码)