两台电脑怎么样传输报文(技术大牛的经验好文教你学懂RS-485,数据的接收2(系列4))
1、报文
在开始具体讲解PLC如何接收数据之前,我们首先要向大家介绍报文这个概念,所谓报文就是一段完整的信息,图1?1所示为报文的一种格式。
图1?1
在通讯的过程中无论是发送还是接收都是一个报文一个报文为单位的进行的,发送之所以简单就是因为我们只要将准备在发送缓冲区的数据一次性的全部发送出去就好,一次发送一个报文,而接收就不同了,我们要判断一个报文的起始与结束,还要判断接收到的这个报文是否在传输的过程中因为干扰等原因产生错误。
2、单个报文的判断方法
如何判断一段报文的起始与结束呢?我们常用的有两种方法。
第一通过给报文设定固定的起始字符和结束字符,只要接收到起始字符既是一段报文的开始,只要收到结束字符既是一段报文的结束。
第二通过空闲时间判断,超过空闲时间没有接收到数据,我们就认为是一段报文已经结束,之后接收的数据就算新的报文。
那么本文我们还是先给大家讲解如何通过起始字符和结束字符来接收数据。
3、通过字符判断
在编写程序之前我们首先要明确我们使用的特殊位寄存器的状态,下面我们逐个按要求进行设置,这里要注意我们统一使用S7-200CPU的端口0。
SMB30=2#00001001=16#9
图3?1
1)自由口模式。第0、1位
2)通讯速率9600bps。第2、3、4位
3)每个字符的数据位是8位。第5位
4)不选用奇偶效验。第6、7位
SMB87=2#11100000=16#E0
图3?2
1)不使用中断条件作为检测信息的开始。第1位。
2)不使用空闲时间方式检测报文的开始结束。第2、3、4位。
3)使用结束字符检测报文的结束。第5位。
4)使用起始字符检测报文的开始。第6位。
5)允许信息接收功能。第7位。
注:第0位为无效位不使用。
SMB88=16#AA
用16进制AA作为报文的起始字符,只要PLC接收到字符AA说明一段报文的开始。
SMB89=16#BB
用16进制BB作为报文的结束字符,只要PLC接收到字符BB说明报文接收完毕停止接收。
SMB94=255
SMB94定义接收缓冲区大小,此处定义为最大255字节。(注:接收缓冲区是用来存放接收到的数据的区域,最大255字节,大家可以根据通讯情况自由定义。
4、程序编写
开始程序编写之前让我们首先了解一下接收指令的使用。
图4?1
RCV接收指令有两个管脚,TBL和PORT。
PORT:通讯端口编号,如果用0端口则写0,如果用1端口则写1.
TBL:定义接收缓冲区的起始地址,如果TBL中写VB100,同时接收的数据是两个字节,则VB100中的数值为2,同时VB101和VB102用来存放接收到的数据。
下面我们来看程序的具体写法。
5、接收测试
程序我们就编写完成了,主要是对特殊位寄存的设定,另外增加一个接收指令用于接收数据就好,下面我们用PLC接收几组发自电脑的数据,来具体了解通过起始、结束字符判断报文的方式来接收数据的使用方法。
1)接收测试1
首先我们使用串口调试软件发送一段报文16进制的aa1122ff23bb一共6个字节。根据我们上面的讲解,此段报文中aa是报文的起始字符,表示报文的开始bb是报文的结束字符,表示该段报文的结束,起始字符和结束字符之间是要发送给PLC的数据内容,当然现在我们发送的数据是没有任何含义的,如图5?1所示。
图5?1
图5?2所示是Step7MicroWin的状态表监控到的数据,因为我们设定的起始地址是VB100一共发送了6个字节的数据,所以数据的存放是从VB101到VB106中。这里可能有人要问那VB100中应该是6啊为什么是0呢?这个主要是因为在接收指令RCV之前我使用的SM0.0因此当一次数据接收完成后,就重新进入接收状态,这时会将Vb100中的数值清空,所以VB100始终是0。
图5?2
2)接收测试2
上面我们已经成功使用S7-200PLC接收到了电脑发送的数据现在我们用电脑发送一组没有起始字符的报文看看会出现什么情况,此次我们发送数据dd1122ff23bb如图5?3中内容所示。
图5?3
通过图5?4我们可以发现PLC没有接收到任何数据,原因就是PLC没有检测到起始字符
图5?4
3)接收测试3
本次我们发送给PLC的数据既有起始字符,也有结束字符,只是在结束字符后我们再增加2个字节的数据,看看会出现什么情况,这次我们发送aa1122bb2345。
图5?5
由图5?6我们可以发现电脑发送的数据PLC只能接收到aa1122bb,而2345这两个字节由于出现在报文的结束字符之后PLC就无法识别了。
图5?6
连载中。。。
注:这是一套关于RS-485的系列文章,前两篇已经发表过,有兴趣的朋友可以往前翻阅查找,相信通过这一系列的文章知识解说,大家会对RS-485的认识上升一个等级。
作者:马乐
版权为技成所有,未经同意盗取必究!
——END——