按IEEE-754 标准,一个浮点数用两个部分表示:尾数和2 的幂。例如:
尾数代表浮点上的数据二进制数。
二的幂代表指数。指数的保存形式是一个0 到255 的8 位值。指数的实际值是保存值0 到255 减去127,一个范围在127 到-128 之间的值。
尾数是一个24 位值(代表大约7 个十进制数),最高位(MSB) 通常是1, 因此,不保存。一个符号位表示浮点数是正或负。在尾数的左边有一个省略的二进制点和1。 这个数在浮点数的保存中经常省略。
浮点数保存的字节格式如下:
这里:
S 代表符号位,1 是负,0 是正。
E 幂,偏移127。
M 24 位的尾数(保存在23 位中)。
零是一个特定值,表示幂是0, 尾数是0。
在运行策略中新建一个名为SplitFloat 的用户策略,新增一策略行并添加以下脚本程序,用于将数值型对象float 转换到4 字节存储单元Byte0 Byte3:
‘ 计算浮点数的幂(二进制数小数点的位置)
exponent = 0
float1 = !abs(float)
while float1《》0
float1 = !BitRShift(float1, 1)
exponent = exponent + 1
endwhile
exponent = exponent - 1
‘ 计算浮点数的底数
mantissa = !abs(float) * (!BitLShift(2, 23 - (exponent + 1))) - 8388608
exponent = exponent + 127
Byte0 = !BitRShift(exponent, 1)
if room1tempsv 《 0 then
Byte0 = !BitOr(Byte0, 128)
endif
Byte1 = !BitAnd(!BitOr(!BitRShift(mantissa, 16), !BitLShift(exponent, 7)), 255)
Byte2 = !BitAnd(!BitRShift(mantissa, 8), 255)
Byte3 = !BitAnd(mantissa, 255)[page]
在运行策略中新建一个名为UniteFloat 的用户策略,新增一策略行并添加以下脚本程序,用于将4 字节存储单元Byte0 Byte3 转换到数值型对象float:
mantissa = (!BitAnd(Byte0, 128) + !BitAnd(Byte1, 127)) * 65536 + _
(Byte2 * 256) + Byte3 + 8388608
exponent = !BitOr(!BitLShift(Byte0, 1), !BitRShift(Byte1, 7)) - 127
float = mantissa / (!BitLShift(2, 23 - (exponent + 1)))
五、实现
系统的控制中心采用定时查询的方法,每2 秒钟对各个房间的温度值和湿度值进行一次查询。查询时,组态软件先向实时数据库中的数据对象Out_CANData 写入查询房间温/湿度命令的报文。命令报文的房间ID 对应要查询的房间号,命令ID 为0x00000000,无命令参数。然后经过ZOPC_Server 将报文发到CAN总线上。在发送查询命令后控制中心将等待一段时间(这一段时间要大于MCGS 的最小采集周期),然后再从实时数据库中的数据对象In_CANData 读取数据并进行处理和显示。