按IEEE-754 标准,一个浮点数用两个部分表示:尾数和2 的幂。例如:

尾数代表浮点上的数据二进制数。

二的幂代表指数。指数的保存形式是一个0 到255 的8 位值。指数的实际值是保存值0 到255 减去127,一个范围在127 到-128 之间的值。

尾数是一个24 位值(代表大约7 个十进制数),最高位(MSB) 通常是1, 因此,不保存。一个符号位表示浮点数是正或负。在尾数的左边有一个省略的二进制点和1。 这个数在浮点数的保存中经常省略。

浮点数保存的字节格式如下:

通过CAN-bus总线对室内空调的温/湿度模拟系统进行控制

这里:

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 读取数据并进行处理和显示。