基于CAN-bus 總線的模擬空調溫/濕度控制系統
一、系統結構
本系統是一個室內空調溫/濕度控制系統的模擬系統數據采集及控制中心通過CAN-bus總線定時采集各個房間的溫/濕度數據,并對各個房間的溫/濕度進行控制。系統的數據采集及控制中心由上位機的硬件即任一款ZLGCAN系列接口卡和PC構成,軟件由組態軟件MCGS和ZOPC_Server組成。控制室即下位機由DP-668實驗儀和ZLGCAN系列接口卡中的PCI-9810接口卡模擬。

圖1系統結構圖
二、MCGS工程框架
本空調溫/濕度控制系統需要對各個控制室及風道的溫/濕度值進行監控,因此工程需要有實時顯示和記錄各控制室溫/濕度值、修改房間溫/濕度SV值、報警顯示、報警顯示瀏覽記錄等功能、工程框架如下:
用戶窗口:封面窗口、主控窗口、控制室窗口1~6、風道平面圖、狀態條、修改控制室1~6SV值、修改SV值消息窗口、風道電加熱段消息窗口、修改風道溫度表1~2SV值、修改風道濕度表1~2SV值、風道內三級加熱報警窗口。

圖2用戶窗口
運行策略:啟動策略、退出策略、循環策略、卡車運動策略、控制柜燈閃爍策略、顯示控制室1~6策略、顯示時間策略、主控窗口中提示塊顯示策略。
主菜單:用戶登錄、封面窗口、打開主控窗口、打開各控制室、風道平面圖、修改SV值、歷史記錄、通信錯誤記錄、溫/濕度異常記錄、退出系統
子菜單:第一~六控制室、修改一~六號房間、SV值修改風道溫度、表1~2SV值、修改風道濕度表1~2SV值

圖3系統菜單
三、主要數據對象
建立好一個空調溫/濕度控制系統的MCGS工程后,實現上位機的主要任務就是建立組態工程與OPC設備的連接,實現上位機的主要任務就是建立組態工程與OPC設備的連接,并對采集到的數據進行處理和顯示。在這個工程的實時數據庫中,要進行顯示、操作的數據對象如表1所示。由于風道的數據對象較多,為了統一管理,將風道當作兩個房間節點來處理。這樣,每個房間都只有1個溫度值對象、1個濕度之對象、1個溫度SV值對象和1個濕度SV值對象。

為了使系統具備記錄數據及瀏覽歷史數據、錯誤數據和異常數據的能力,在實時數據庫中建立了save、ErrorSave和exception三個數據對象組。其中ErrorSave和exception的組對象成員有:RoomID1、ErrorTemp、ErrorHum、ErrorTempSV和ErrorHumSV,save的組成員對象如表1所示。在運行過程中,系統會定時保存save組對象到數據庫。當通信產生錯誤和房間溫/濕度異常時,系統會將ErrorSave和exception保存到數據庫。
在此系統中的OPC設備使用的是ZOPC_Server服務器。ZOPC_Server是一個OPC服務器軟件本軟件,支持操作全系列的ZLGCAN系列接口卡,只要在一臺PC機上插上ZLGCAN系列接口卡中的任何一種或幾種,再運行本服務器軟件,就可以使用任何一種支持OPC協議的客戶端軟件(比如組態軟件:組態王KingView、昆侖通態MCGS和Intouch等)來連接到此服務器通過此服務器,來跟CAN-bus網絡進行數據的傳輸。
本設計中,ZOPC_Server在數值存儲模式下和字符串存儲模式下提供的數據項都不能直接連接到實時數據庫中的數據對象,因此必須編寫腳本程序對數據進行處理。關于數據項存儲模式,這里選用被推薦的字符串存儲模式;但是,使用數值存儲模式會更容易實現此系統。
在實時數據庫添加字符型數據對象In_CANData和Out_CANData,字符數為30,將In_CANData和Out_CANData分別連接到OPC設備的輸入通道和輸出通道,In_CANData的讀寫屬性為只讀,Out_CANData的讀寫屬性為只寫。由于這兩個數據對象是字符型的,不便于進行數據處理,所以應該先將它們轉換為數值型對象。在MCGS腳本程序中,用戶不能定義子程序、子函數和變量,而數據對象可以看作是腳本程序中的全局變量,在所有的程序段共用。這給編寫較復雜的腳本程序帶來不便。要進行類似子程序和子函數的操作,只能用先將要處理的數據放入全局變量,然后調用策略行中的腳本進行處理,最后將返回的數據放入全局變量的方法進行處理。在實時數據庫加添以下數值型對象作為中間變量:

然后,在運行策略中新建一個名為StringToObject的用戶策略,新增一策略行并添加以下腳本程序,用于將In_CANData轉換到數值型對象:
In_Flag=!Hex2I(!mid(In_CANData,1,2))
In_Extern=!Hex2I(!mid(In_CANData,3,1))
In_Remote=!Hex2I(!mid(In_CANData,4,1))
In_ID=!Hex2I(!mid(In_CANData,5,8))
In_DataLen=!Hex2I(!mid(In_CANData,13,2))
In_Data0=!Hex2I(!mid(In_CANData,15,2))
In_Data1=!Hex2I(!mid(In_CANData,17,2))
In_Data2=!Hex2I(!mid(In_CANData,19,2))
In_Data3=!Hex2I(!mid(In_CANData,21,2))
In_Data4=!Hex2I(!mid(In_CANData,23,2))
In_Data5=!Hex2I(!mid(In_CANData,25,2))
In_Data6=!Hex2I(!mid(In_CANData,27,2))
In_Data7=!Hex2I(!mid(In_CANData,29,2))
同樣,在運行策略中新建一個名為ObjectToString的用戶策略,新增一策略行并添加下面的腳本程序,用于將數值型對象轉換到Out_CANData。在下面的程序中,Out_SendID進行自加是因為ZOPC_Server要判斷寫入的Out_SendID和上一次寫入的Out_SendID是否相同,如果不同才將報文發出。
評論