详细设计
1地址符号的分配
在编写库函数的时候,不能够使用绝对地址进行编程,必须使用符号地址,所以在编写程序之前须定义符号地址,符号地址的定义如下:
表1 自由口库函数符号地址定义
2错误代码定义
在自由口通信中,当通信出现错误时,根据不同的错误类型,定义了一些错误代码。
代码具体如下:
表2 自由口通信错误代码
3初始化
初始化库函数的主要功能是设置自由口通信的端口、接收信息开始字符、接收信息结束字符、接收信息控制字节、空闲检测时间、发送或接收的最大字符数。
为了贴近于实际情况,
在初始化局部变量中添加了3个输入型局部变量。
分别用于对通信端口、接收信息开始字符、接收信息结束字符的设置。
局部变量表如下:
表3初始化局部变量定义
4自由口
在自由口库函数中添加了7个输入型的局部变量和2个输出型的局部变量,局部变量表如下:
表4自由口局部变量定义
自由口库函数的主要功能是完成数据的发送、接收、对接收到数据信息BCC校验、对BCC校验成功的数据帧进行解码,在程序上对数据的发送、对接收到数据信息BCC校验、对BCC校验成功的数据信息进行解码三个功能是通过顺序控制继电器指令来实现的,当满足条件时,分别调用不同的顺序控制继电器来实现功能。
此外,由于库函数没有办法添加中断来检测数据帧的发送完成和接收完成,所以对于接收完成和发送完成是在该程序中通过检测特殊寄存器来实现的,该库函数的主体流程如图1。
图1自由口库函数主体流程图
4.1数据发送
所谓数据发送就是要将帧头、站地址、控制码、数据标识、数据域长度、数据域、BCC 校验码、帧尾组合成为一个数据帧发送出去。
在该环节中有两个地方需要注意:其一,求取BCC校验码时,需先取站地址开始处存储器里值与一个初值为0的地址符号存储器相异或,将异或所得结果再与下一个存储器相异或,一直到数据域的最后一个存储器,这个过程通过一个循环来实现,由于数据域长度的不确定,所以需要特别注意循环的次数确定;其二,求取
到的BCC校验码在数据发送缓冲区中存放的具体位置,只知道BCC校验码是存放在数据域的后面,但是由于数据域长度的不确定导致了BCC校验码存放的位置的不确定,故确定B CC校验码存放位置也是需要注意的。
由口库函数的数据发送流程图如图2:
图2 数据发送流程图
4.2 对应答帧BCC校验
对应答帧BCC校验是为了检测应答帧在数据传输的过程中是否出错,其校验的方法很简单,直接求取接收到的应答帧中站地址、控制码、数据标识、数据域长度、数据域的BCC 校验码,将所得的结果与应答帧中传过来的BCC校验码比较,如果一致,表明数据传输过程中没有出错,如果不一致表明数据传送过程中出现了错误。
对于校验发现出错的应答帧,不再对其进行解码,只需主站将错误信息代码通过错误代码存储器指示出来即可,BCC校验的流程图如图3:
图3BCC校验流程图
4.3 数据解码
数据解码是自由口通信中最为主要的一个部分,数据解码的结果是从应答帧返回的数据帧信息中找出主站需要的信息。
在数据解码过程中需要进行一些列的容错判断,比如说:返回的应答帧的站地址是否正确;返回帧的数据标识是否一致;返回帧的数据域长度是否正确等等,只有当所有的信息都正确的情况下,才能将应答帧中数据域的内容取出放入指定地方。
数据解码的流程图如图4:
图4数据解码流程图。