微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > 基于CAN-bus 总线的模拟空调温/湿度控制系统

基于CAN-bus 总线的模拟空调温/湿度控制系统

时间:07-11 来源:互联网 点击:

ddress,地址0保留。当数据方向是从节点到主节点时,8字节数据的前4字节用于传递房间温度,后4字节用于传递房间湿度,当数据方向是主节点到从节点时,8字节数据的前4字节作为命令ID,后4字节用于传递命令参数(房间温/湿度SV值)。报文帧的格式如图1所示。


图5报文帧格式

对主节点到从节点的命令ID的定义如下:

表3控制命令类型及其参数

本系统要监控的数据是各房间的温度和湿度及它们的SV值。要将这些数据在总线上传输,必须将它们装入报文帧。为了使传输的数据只占用较小的空间而达到较高的精确度,在报文中每一种数值都分配了4字节的空间,数据按IEEE-754标准的float数据类型的格式存储。这样,在下位机进行编程就比较方便。但是,上位机的处理程序是用类似VB脚本的语言写的,数据对象的类型只有数值型、开关型和字符型三种,不能直接使用接收到的数据。因此,要对接收到的数据进行转换。

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

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

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

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

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


图6IEEE-754标准float存储格式

这里:
S代表符号位,1是负,0是正。
E幂,偏移127。
M24位的尾数(保存在23位中)。
零是一个特定值,表示幂是0,尾数是0。

在运行策略中新建一个名为SplitFloat的用户策略,新增一策略行并添加以下脚本程序,用于将数值型对象float转换到4字节存储单元Byte0Byte3:

‘计算浮点数的幂(二进制数小数点的位置)
exponent=0
float1=!abs(float)
whilefloat1>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)
ifroom1tempsv0then
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)

在运行策略中新建一个名为UniteFloat的用户策略,新增一策略行并添加以下脚本程序,用于将4字节存储单元Byte0Byte3转换到数值型对象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读取数据并进行处理和显示。

如果控制中心要修改房间的SV值,首先发出查询房间温/湿度SV值的命令,在收到房间温/湿度SV值后,在“修改控制室SV值”窗口中显示SV值(或在“修改风道温度/湿度表SV值”窗口中显示),然后发出带有参数的修改房间温度SV值命令报文,参数的内容就是要修改的SV值。

下位机的验收码设置成ID10为0,ID9~ID3为房间ID,后3位屏蔽。当总线上有发给该房间的报文时,并根据命令进行相应的操作。如果收到的是查询命令,下位机立即将房间的温/湿度数据发送到CAN总线上。数据报文的ID也是该房间的ID,以表示报文中的数据是该控制室的。如果是修改房间温/湿度SV值命令,下位机就从命令参数取出SV值并替换旧的SV值。

上位机控制流程编写的具体步骤:

1.在运行策略中新建一个名为“GetRoomTHV”的用户策略,并添加3个脚本程序,1个退出策略行,如图:


图7GetRoomTHV策略

其中,“查询房间温/湿度值”脚本如下:

‘发送控制室温/湿度查询命令
Out_Extern=0
Out_Remote=0
Out_ID=!BitLShift(RoomID,3)+0‘控制室ID+单帧(点对点)
Out_DataLen=8
Out_Data0=0
Out_Data1=0
Out_Data2=0
Out_Data3=0
Out_Data4=0
Out_Data5=0
Out_Data6=0
Out_Data7=0
!setstgy(ObjectToString)
‘发出命令
Out_CANData=Out_CANData2
‘等待命令发出
!TimerReset(1,0)
!TimerRun(1)
!TimerWaitFor(1,Delay)
!TimerStop(1)
‘接收控制室温/湿度
!setstgy(StringToObject)
roomtemp=roomhum=0
if(In_Extern>0)or(In_Remote>0)_
or((!BitAnd(In_ID,1024)>1024)_
and(!BitAnd(In_ID,7)>0))then
In_ID=0
exit
endif

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top