我们的S7-200SMART PLC不支持doublefloat数据类型,需要转换成float型才能计算使用。
浮点数的定义
在编写转换程序之前,我们需要先了解IEEE浮点数的定义:
浮点数的二进制信息包括了符号(sign),指数(exponent),尾数(fraction)这三类信息
浮点数的解析
通过二进制值按规则解析出浮点数
64位浮点数
32位浮点数
当指数位不全为0或不全为1时,m=1+M
m的计算规则如下图:
不论是32位浮点数还是64位浮点数,都是按照上面的规则进行计算解析出浮点数的实际值。
编程实现转换
目标
流量计读取到的负累计流量,64位浮点数实际值如下
利用在线计算器输入十六进制,得到转换出的Float64十进制实际值。
需要将64位浮点数转换成32为浮点数,在计算器中输入十进制数值,得到转换后的十六进制数值。
思路
逆向思考,要想得到同样的结果
符号位功能相同可直接对应过来
指数E需解析出同样的e(由于32位浮点数指数只有8个位,表示的最大无符号整数为255,如果将64位浮点数指数对应过来超过255,就会发生溢出错误)
尾数直接截取(仅影响精度)。
子程序
变量表
初始化,复位错误位,浮点数输出清零
取出指数部分,并排列成PLC可运算的整数,根据双精度浮点数的偏置和单精度浮点数的偏置,得出单精度浮点数的8位指数位的整数值。
单精度浮点数指数位只有八位,范围是0-255,如果指数比255大,则错误位置位,从子程序返回;如果在范围内,就将指数位排列在输出地址的最前端。
对尾数位进行处理,掐头去尾并对齐位置。将尾数位拼接至输出地址中指数位的后面,并整体右移1位,空出符号位。
获取双精度浮点数包含符号位的首个字节,将原符号位与输出的符号位同步.
转换过程图示
转换结果
主程序调用子程序
转换结果以双整型显示(SReal在变量表中类型定义为DWORD)
VD2700十六进制内容与上文计算器转换出的十六进制数值一致
VD2700十进制32位浮点数显示内容与64位浮点数的整数及小数点后5位相同,程序正确。
超范围错误位置位验证
输入一个较大的64位浮点数
将计算器中的十六进制输入进PLC中64位浮点数对应的地址中,
输入的64位浮点数超出了32位浮点数所能表示的范围,输出为0并且错误位M0.0被置位。
以上是一种实现64位浮点数转换为32位浮点数的一种PLC编程方法供大家参考。
总结
让我们总结一下编写64位浮点数转32位浮点数用到的PLC知识
利用指针获取数据,指针的数据类型是DINT型,&VB2616代表获取VB616的地址。
PLC程序的执行顺序是从上到下,从左到右的顺序。
变量表中OUT类型的变量Error,如果在后面的程序中有不明确状态的地方,那么使用前必须进行初始化(第一段程序)。
利用逻辑运算“与”功能,保留需要的位并将不需要的位清零。(程序段2的WAND_W,利用2#111111111110000实现与指数无关的位清零。)
利用SHR_W对字中的二进制数进行移位排列。
RET有条件返回指令,提前结束子程序。
移动指针已获取不同位置的数据,指针+1,指向的字节寄存器位置+1,例如指针指向VB2616,指针+1则指针指向VB2617.*LD0代表操作指针指向的实际数据。
利用MOV_B,MOV_W,MOV_DW传送指令自由排列数据。
利用SHR,SHL指令掐头去尾,即移出数据会被丢弃,补进来的数据都是0.(注意使用的是移位不是循环移位)
必须熟练掌握西门子PLC的字节排列顺序,遵循高字低位的原则,最左边是二进制的最高位,最右边是二进制的最低位。
使用“字节地址”格式可按字节、字或双字访问多数存储区(V、I、Q、M、S、L 和 SM)中的数据。 要按字节、字或双字访问存储器中的数据,必须采用类似于指定位地址的方法指定地址。 如下所示,地址包括区域标识符、数据大小指定和字节、字或双字值的起始字节地址。
相关文章