新闻中心

EEPW首页>嵌入式系统>设计应用> 基于CAN-bus 总线的模拟空调温/湿度控制系统

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

作者: 时间:2012-07-11 来源:网络 收藏

在运行策略中新建一个名为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个退出策略行,如图:

GetRoomTHV策略
图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

“计算控制室的温度”的执行条件是!BitAnd(!BitRShift(In_ID,3),127)=RoomID表达式的值为非0,脚本程序如下:

Byte0=In_Data0
Byte1=In_Data1
Byte2=In_Data2
Byte3=In_Data3
!setstgy(UniteFloat)
roomtemp=float

“计算控制室的湿度”的执行条件是!BitAnd(!BitRShift(In_ID,3),127)=RoomID表达式的值为非0,脚本程序如下:

Byte0=In_Data4
Byte1=In_Data5
Byte2=In_Data6
Byte3=In_Data7
!setstgy(UniteFloat)
roomhum=float

2.在运行策略中新建名为“查询各控制室温/湿度”的循环策略,循环时间为2000ms。添加如下图所示的策略行。

查询各控制室温/湿度策略
图8查询各控制室温/湿度策略

“初始化”的脚本程序如下:

RoomID=1

“查询1号控制室温/湿度”的脚本程序如下:

RoomID1=RoomID
RoomID=RoomID+1
if(roomtemp=0)or(roomhum=0)then
room1st=1
ErrorTemp=roomtemp
ErrorHum=roomhum
!SaveData(ErrorSave)‘记录通信错误
exit
endif
room1temp=roomtemp
room1hum=roomhum
ifroom1temp>room1tempsvthen
room1st=1
ErrorTemp=room1temp
ErrorHum=room1hum
!SaveData(exception)‘记录温度异常
exit
else
room1st=0
endif

其它策略行脚本程序与上类似。

所有的“策略调用”均调用GetRoomTHV策略。

3.在运行策略中新建一个名为“GetRoomSV”的用户策略,其他步骤同1。

GetRoomSV策略
图9GetRoomSV策略

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

‘发送控制室温/湿度SV查询命令
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=1
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)
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
roomtemp=roomhum=0



评论


相关推荐

技术专区

关闭