详细设计1地址符号的分配在编写库函数的时候,不能够使用绝对地址进行编程,必须使用符号地址,所以在编写程序之前须定义符号地址,符号地址的定义如下:表1自由口库函数符号地址定义符号名地址填充开始地址VW1000发送数据个数VB1000发送帧帧头VB1001站地址_发送(字)VW1002站地址_发送(字节)VB1002控制码_发送VB1004发送控制码_低VB1005数据标识_发送(字)VD1006数据标识_发送VB1006数据长度_发送VB1010数据域_发送VB1012接收数据个数_以字形式表VW1099接收数据个数高位VB1099接收数据缓冲首地址VB1100站地址_接收(字)VW1102站地址_接收(字节)VB1102接收控制码_高VB1104接收控制码_低VB1105数据标识_接收VD1106数据域长度_高VB1110数据域首址VB1112生成控制码VB1041发送长度VW1042发送长度_高VB1042发送长度_低VB1043发送数据标识VW1044发送数据标识_高VB1044BCC校验_当前循环次数VW1046BCC校验_当前值VB1048BCC校验_V存储地址VD1049发送完成标志V1055.0接收完成标志V1055.1BCC校验成功标志V1055.2接收到信息BCC计算结果VB1056接收数据帧控制码_16进制VB1057接收数据帧控制码_0V1057.0接收数据帧控制码_1V1057.1接收数据帧控制码_2V1057.2接收数据帧控制码_3V1057.3接收数据帧控制码_4V1057.4接收数据帧控制码_5V1057.5接收数据帧控制码_6V1057.6接收数据帧控制码_7V1057.7接收数据数据域长度_字VW1058接收数据数据域长度_高VB1058接收数据数据域长度_低VB1059缓冲区最后地址VB11992错误代码定义在自由口通信中,当通信出现错误时,根据不同的错误类型,定义了一些错误代码。代码具体如下:表2自由口通信错误代码编号错误代码判断位置(主站|从站)代码意义10x00从站判断无错误20x01从站判断从站接收到数据帧指令错误30x02从站判断从站接收到数据帧R_W与数据标识不匹配40x03从站判断从站接收到数据帧BCC校验错误50x04从站判断从站奇偶校验错误60x05从站判断从站接收到数据帧控制码错误70x11主站判断主站检测设置的R_W与数据标识符不一致80x12主站判断应答帧数据长度与数据域长度不一致90x13主站判断运算错误100x14主站判断应答帧BCC校验错误110x15主站判断应答帧站地址错误120x16主站判断应答帧数据标识与命令帧数据标识不一致130x17主站判断应答帧指令错误140x18主站判断响应超时3初始化初始化库函数的主要功能是设置自由口通信的端口、接收信息开始字符、接收信息结束字符、接收信息控制字节、空闲检测时间、发送或接收的最大字符数。为了贴近于实际情况,在初始化局部变量中添加了3个输入型局部变量。分别用于对通信端口、接收信息开始字符、接收信息结束字符的设置。局部变量表如下:表3初始化局部变量定义符号变量类型数据类型L0.0PortINBOOLLB1FirstINBYTELB2FinalINBYTE4自由口在自由口库函数中添加了7个输入型的局部变量和2个输出型的局部变量,局部变量表如下:表4自由口局部变量定义符号变量类型数据类型L0.0SendINBOOLL0.1R_WINBOOLLB1SlaveINBYTELW2MarkINWORDLB4LenINBYTELD5DataPtrINDWORDLW9TimerINWORDL11.0DoneOUTBOOLLB12ErrorOUTBYTE自由口库函数的主要功能是完成数据的发送、接收、对接收到数据信息BCC校验、对BCC校验成功的数据帧进行解码,在程序上对数据的发送、对接收到数据信息BCC校验、对BCC校验成功的数据信息进行解码三个功能是通过顺序控制继电器指令来实现的,当满足条件时,分别调用不同的顺序控制继电器来实现功能。此外,由于库函数没有办法添加中断来检测数据帧的发送完成和接收完成,所以对于接收完成和发送完成是在该程序中通过检测特殊寄存器来实现的,该库函数的主体流程如图1。开始首次进入SM0.1=1置执行状态标志Done=1是否错误代码存储器=0否停止接收;将发送完成标志复位为0;置执行状态标志Done=1是发送完成标志为1是允许响应时间开始计时定时器计时到是停止接收;将发送完成标志复位为0;置执行状态标志Done=1;向错误代码存储器写入0x18SM4.5上升沿接收信息使能,允许接收信息;置发送完成标志为1;SM86.5上升沿是是否否停止接收;将发送完成标志复位为0;置接收完成标志为1发送端检测到上升沿否是执行状态标志Done=1是否进入数据发送功能接收完成标志检测到上升沿否是进入BCC校验功能BCC校验成功检测到上升沿进入数据解码功能是否否否图1自由口库函数主体流程图4.1数据发送所谓数据发送就是要将帧头、站地址、控制码、数据标识、数据域长度、数据域、BCC校验码、帧尾组合成为一个数据帧发送出去。在该环节中有两个地方需要注意:其一,求取BCC校验码时,需先取站地址开始处存储器里值与一个初值为0的地址符号存储器相异或,将异或所得结果再与下一个存储器相异或,一直到数据域的最后一个存储器,这个过程通过一个循环来实现,由于数据域长度的不确定,所以需要特别注意循环的次数确定;其二,求取到的BCC校验码在数据发送缓冲区中存放的具体位置,只知道BCC校验码是存放在数据域的后面,但是由于数据域长度的不确定导致了BCC校验码存放的位置的不确定,故确定BCC校验码存放位置也是需要注意的。由口库函数的数据发送流程图如图2:开始置执行标志Done=0清发送缓冲区、清接收缓冲区、清错误代码存储器Error设置帧头,将站地址转为ASCII发在帧头后确定控制码,并转为ASCII码放在站地址后面判定数据标识与读写是否匹配否将0x11写入存储器Error赋值执行标志Done=1是R_W写数据查询数据将数据标识转为ASCII放在控制码后将数据域长度转为ASCII放在数据标识后面确定数据帧长度确定数据域内容求取数据帧BCC校验码将求得的BCC校验码转为ASCII码放在数据域后为数据帧设置帧尾发送数据帧将数据标识转为ASCII放在控制码后确定数据帧长度求取数据帧BCC校验码将求得BCC校验码转为ASCII码放在数据标识后为数据帧设置帧尾发送数据帧结束图2数据发送流程图4.2对应答帧BCC校验对应答帧BCC校验是为了检测应答帧在数据传输的过程中是否出错,其校验的方法很简单,直接求取接收到的应答帧中站地址、控制码、数据标识、数据域长度、数据域的BCC校验码,将所得的结果与应答帧中传过来的BCC校验码比较,如果一致,表明数据传输过程中没有出错,如果不一致表明数据传送过程中出现了错误。对于校验发现出错的应答帧,不再对其进行解码,只需主站将错误信息代码通过错误代码存储器指示出来即可,BCC校验的流程图如图3:开始接收完成标志复位清‘BCC校验_当前值’为0将接收信息站地址的物理地址给‘BCC校验_V存储地址’计算BCC校验循环次数LW15循环次数达到LW15否‘BCC校验_V存储地址’中内容与‘BCC校验_当前值’相异或,并将结果放在‘BCC校验_当前值’中‘BCC校验_V存储地址’加1是将接收到的BCC校验码转为16进制存放在‘接收到信息BCC计算结果’中‘BCC校验_当前值’=‘接收到信息BCC计算结果’是否置‘BCC校验成功标志’为1向错误代码存储器Error中写入错误代码0x14结束图3BCC校验流程图4.3数据解码数据解码是自由口通信中最为主要的一个部分,数据解码的结果是从应答帧返回的数据帧信息中找出主站需要的信息。在数据解码过程中需要进行一些列的容错判断,比如说:返回的应答帧的站地址是否正确;返回帧的数据标识是否一致;返回帧的数据域长度是否正确等等,只有当所有的信息都正确的情况下,才能将应答帧中数据域的内容取出放入指定地方。数据解码的流程图如图4:开始复位‘BCC校验成功标志’为0命令帧站地址=应答帧站地址命令帧数据标识=应答帧数据标识命令帧控制码低位=应答帧控制码低位向错误代码存储器Error写入0x15向错误代码存储器Error写入0x16向错误代码存储器Error写入0x17是是是否否否将接收到控制码转为16进制接收到控制码是否正确否向错误代码存储器Error写入0x17是从站异常应答否是接收到数据帧长度为16向错误代码存储器Error写入0x17否是接收到数据域长度为2向错误代码存储器Error写入0x17否是将数据域错误代码转为16进制存入错误代码存储器Error命令帧为写数据还是查询数据写数据查询数据数据域长度正确否是将数据域数据转为16进制放在指定地址处向错误代码存储器Error写入0x12置执行完成标志Done=1设置缓冲区最后地址结束图4数据解码流程图