基于CAN-bus 總線的模擬空調(diào)溫/濕度控制系統(tǒng)
在運行策略中新建一個名為UniteFloat的用戶策略,新增一策略行并添加以下腳本程序,用于將4字節(jié)存儲單元Byte0Byte3轉(zhuǎn)換到數(shù)值型對象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)))
五、實現(xiàn)
系統(tǒng)的控制中心采用定時查詢的方法,每2秒鐘對各個房間的溫度值和濕度值進行一次查詢。查詢時,組態(tài)軟件先向?qū)崟r數(shù)據(jù)庫中的數(shù)據(jù)對象Out_CANData寫入查詢房間溫/濕度命令的報文。命令報文的房間ID對應(yīng)要查詢的房間號,命令I(lǐng)D為0x00000000,無命令參數(shù)。然后經(jīng)過ZOPC_Server將報文發(fā)到CAN總線上。在發(fā)送查詢命令后控制中心將等待一段時間(這一段時間要大于MCGS的最小采集周期),然后再從實時數(shù)據(jù)庫中的數(shù)據(jù)對象In_CANData讀取數(shù)據(jù)并進行處理和顯示。
如果控制中心要修改房間的SV值,首先發(fā)出查詢房間溫/濕度SV值的命令,在收到房間溫/濕度SV值后,在“修改控制室SV值”窗口中顯示SV值(或在“修改風道溫度/濕度表SV值”窗口中顯示),然后發(fā)出帶有參數(shù)的修改房間溫度SV值命令報文,參數(shù)的內(nèi)容就是要修改的SV值。
下位機的驗收碼設(shè)置成ID10為0,ID9~ID3為房間ID,后3位屏蔽。當總線上有發(fā)給該房間的報文時,并根據(jù)命令進行相應(yīng)的操作。如果收到的是查詢命令,下位機立即將房間的溫/濕度數(shù)據(jù)發(fā)送到CAN總線上。數(shù)據(jù)報文的ID也是該房間的ID,以表示報文中的數(shù)據(jù)是該控制室的。如果是修改房間溫/濕度SV值命令,下位機就從命令參數(shù)取出SV值并替換舊的SV值。
上位機控制流程編寫的具體步驟:
1.在運行策略中新建一個名為“GetRoomTHV”的用戶策略,并添加3個腳本程序,1個退出策略行,如圖:
圖7GetRoomTHV策略
其中,“查詢房間溫/濕度值”腳本如下:
‘發(fā)送控制室溫/濕度查詢命令
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)
‘發(fā)出命令
Out_CANData=Out_CANData2
‘等待命令發(fā)出
!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
“計算控制室的溫度”的執(zhí)行條件是!BitAnd(!BitRShift(In_ID,3),127)=RoomID表達式的值為非0,腳本程序如下:
Byte0=In_Data0
Byte1=In_Data1
Byte2=In_Data2
Byte3=In_Data3
!setstgy(UniteFloat)
roomtemp=float
“計算控制室的濕度”的執(zhí)行條件是!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.在運行策略中新建名為“查詢各控制室溫/濕度”的循環(huán)策略,循環(huán)時間為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
其它策略行腳本程序與上類似。
所有的“策略調(diào)用”均調(diào)用GetRoomTHV策略。
3.在運行策略中新建一個名為“GetRoomSV”的用戶策略,其他步驟同1。
圖9GetRoomSV策略
“查詢房間溫/濕度SV值”腳本如下:
‘發(fā)送控制室溫/濕度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)
‘發(fā)出命令
Out_CANData=Out_CANData2
‘等待命令發(fā)出
!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
評論