新聞中心

        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



        評論


        相關推薦

        技術專區

        關閉
        主站蜘蛛池模板: 康马县| 潞城市| 永平县| 谷城县| 乳山市| 兴隆县| 东乡族自治县| 庆安县| 铜鼓县| 皮山县| 保德县| 合山市| 定西市| 育儿| 广南县| 黔西县| 南溪县| 定兴县| 延安市| 商丘市| 侯马市| 炎陵县| 阿坝县| 天长市| 万全县| 息烽县| 池州市| 山西省| 子长县| 萝北县| 岑巩县| 临安市| 安龙县| 伊宁市| 吴桥县| 白山市| 云和县| 宜黄县| 肥西县| 大石桥市| 重庆市|