现如今很多传感器、采集模块等设备都支持modbus通讯协议,与PLC或上位机通讯方法简单且实用。但是仍有部分设备没按照modbus协议开发, 只能通过自由口来进行收发数据!这个时候,就需要我们根据设备的收发协议,自己定义!!
所谓的自由口通讯,就是通讯协议是由用户自由定义的。像USS协议、Modbus协议等等都是特定的自由口通讯协议。 下面我们按照编程的顺序,逐步的了解自由口通讯的配置过程
1.首先,端口的定义是不能少的!(波特率,数据位,奇偶校验等) 例如:
2.定义好了端口,我们就可以收发数据了! 收发数据由这两个功能块来完成
我们以发送指令为例,测试如下
3.接收数据的条件
在应用自由口通讯时,发送的过程往往比较简单,几乎所有和协议有关的东西都在接收程序里。因为接收数据时,需要判断 开始接收 和接收完成 的条件!
说到这里,我们不得不隆重介绍一下SMB86至SMB94和SMB186至SMB194:接收信息控制。定义如下
接收数据时,启始条件和结束条件的设定比较复杂。归类时,可大体分为以下几种
a) 起始条件 上图中将起始条件分为六种: ① 空闲线检测:所谓空闲线检测指的是如果传输线路上的空闲时间大于等于SMW90/190里面所设置的时间的话被认为是一次接收的启动, 空闲时间是从RCV被执行的一刻起开始记录,如果在空闲线时间未到的情况下有字符传输进来,那么空闲线时间的计时器将会被重新启动; ② 起始字符检测:对于起始字符的检测是设置在SMB88/188中的一个字符,如果在传输线路中收到了与SMB88/188中设置的起始字符相 同的字符,那么被认为是起始条件的满足,从这一刻起传输线路上接收到的数据将会陆续地按顺序进入信息缓冲区,如果检测不到起始字符, 则始终处于接收等待的状态; ③ 空闲线和起始字符:它是第一点和第二点的结合,即二者同时满足的前提下才能够被认为是一次起始条件的满足; ④ 断点检测:断点指的是在一个完整的字符传送的时间内,线上的逻辑全部为0。 ⑤ 断点和起始字符:它是断点检测和起始字符检测两个条件相与的关系,同时满足的时候将会作为起始条件的一个设定; ⑥ 任意字符:所谓的任意字符指的是RCV指令一旦执行便无条件地开始起始条件的满足,中间几乎没有接受等待的过程。任意字符也是空闲 线检测的一个特例,只是此时SMW90/190是被赋0的,这样就无需任何的等待,一旦RCV指令被执行,起始条件即刻满足,随之而来的数据 将直接进入到信息缓冲区。 b) 结束条件 ① 结束字符检测:结束字符被定义在SMB89/189中,如果传输的报文中出现了与SMB89/189中相一致的结束字符,接收的过程将结束。结 束字符无非就是一个字符,如何能够保证在传输的正常的数据里没有和结束字符相一致的数据呢?使用结束字符检测作为结束条件的应用有一 定局限,首先要确保中间的数据不会与结束字符相一致,比如采用ASCII字符传输的过程中, ASCII是有限的一些数,并不是所有的二进制数排 列组合都能够在ASCII码表中得以体现,所以此时可以把结束字符定义成为中间传送的数据当中所没有那个ASCII字符来作为结束条件; ② 字符间隔定时器和信息定时器:二者同为定时器且定时时间均由SMW92/192决定,二者之间的区别在于,字符间隔定时器指的是在数据的 传送过程中,如果检测到两个字符之间的时间间隔大于SMW92/192里面所设定的时间,那么接收的过程将被终止,而信息定时器指的是从信 息开始被接收一旦时间大于了信息定时器所指定的时间,接收将会被终止。 ③ 最大字符计数、校验错误、用户结束:三者与前面1、2、3三点不同,前面三点是用户可以自己组态和选择的,而4、5、6后三点是非正常的结束过程。 ④ 最大字符计数:是在SMB94/194中指定的最大长度,长度最大可以达到255,如果在接收过程中已经接收到信息缓冲区里面的数据的字节数大 于SMB94/194中所指定的数据长度,本次接收过程将会被勒令停止。最大字符计数在使用时一定要记得给SMB94/194赋值,如果未赋值将默认为0, 此时即便选择前面三个条件,可是没等前面三个条件满足时,最大字符计数已经勒令此次接收行为终止。 ⑤ 校验错误:指的是奇偶校验错误,这种是非正常的结束状态。一旦数据的奇偶校验产生错误,那么当前的这组数据显然是不可以被采信的,此时, 数据将会被放弃,接收结束。 ⑥ 用户结束:当由于某种原因,用户想提前结束现在正在进行的这次接收行为,那么可以在控制字里面禁止一个位然后执行RCV指令,这样用户条件 就结束了,禁止的位其实是SMB87/187的最高位,也就是接收使能位。 注意: ① SMB87/187是自由口通讯控制字,起始和结束条件是通过它来定义的;
② SMB94/194是最大传输字符限制,必须定义。
4.自动收发数据
两个设备通过自由口进行数据交换时,一般都是有特定含义的,我们需要仔细阅读第三方设备的自由口通讯定义!下面,我们以标准MODBUS_RTU为例,解读一下!
例:从01H号站变频器,读取从0004H地址开始的2个数据的值。 发送报文:01H(地址帧),03H(功能码帧),00H(起始地址高位),04H(起始地址低位),00H(数据个数高位),02H(数据个数低位),85H(CRC低位),CAH(CRC高位)
如上所诉,我们需要了解清楚每个字节的意义。
其次,我们还需要进行循环收发数据!因为自由口的一般工作方式为: A想读取B的某个参数→→→A发送一组报文给B→→→B解读之后把相对应的数据传给A
所以我们需要循环的收发报文!要想实现循环收发,可以参照几个中断事件!
|