新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > 基于CAN-bus 總線的模擬空調溫/濕度控制系統

        基于CAN-bus 總線的模擬空調溫/濕度控制系統

        作者: 時間:2012-07-11 來源:網絡 收藏

        ‘轉換Out_SendID到字符型
        ifOut_SendID=255then
        Out_SendID=Out_SendID+1
        else
        Out_SendID=0
        endif
        Out_CANData1=!I2Hex(Out_SendID)
        if!Len(Out_CANData1)>2thenOut_CANData1="0"+Out_CANData1
        Out_CANData2=Out_CANData1
        ‘轉換Out_Extern和Out_Remote到字符型
        Out_CANData1=!I2Hex(Out_Extern)+!I2Hex(Out_Remote)
        Out_CANData2=Out_CANData2+Out_CANData1
        ‘轉換Out_ID到字符型
        Out_CANData1=!I2Hex(Out_ID)
        Lenght=!Len(Out_CANData1)
        whileLenght8
        Out_CANData1="0"+Out_CANData1
        Lenght=!Len(Out_CANData1)
        endwhile
        Out_CANData2=Out_CANData2+Out_CANData1
        ‘轉換Out_DataLen到字符型
        Out_CANData1=!I2Hex(Out_DataLen)
        if!Len(Out_CANData1)>2thenOut_CANData1="0"+Out_CANData1
        Out_CANData2=Out_CANData2+Out_CANData1
        ‘轉換Out_Data07到字符型
        Out_CANData1=!I2Hex(Out_Data0)
        if!Len(Out_CANData1)>2thenOut_CANData1="0"+Out_CANData1
        Out_CANData2=Out_CANData2+Out_CANData1
        Out_CANData1=!I2Hex(Out_Data1)
        if!Len(Out_CANData1)>2thenOut_CANData1="0"+Out_CANData1
        Out_CANData2=Out_CANData2+Out_CANData1
        Out_CANData1=!I2Hex(Out_Data2)
        if!Len(Out_CANData1)>2thenOut_CANData1="0"+Out_CANData1
        Out_CANData2=Out_CANData2+Out_CANData1
        Out_CANData1=!I2Hex(Out_Data3)
        if!Len(Out_CANData1)>2thenOut_CANData1="0"+Out_CANData1
        Out_CANData2=Out_CANData2+Out_CANData1
        Out_CANData1=!I2Hex(Out_Data4)
        if!Len(Out_CANData1)>2thenOut_CANData1="0"+Out_CANData1
        Out_CANData2=Out_CANData2+Out_CANData1
        Out_CANData1=!I2Hex(Out_Data5)
        if!Len(Out_CANData1)>2thenOut_CANData1="0"+Out_CANData1
        Out_CANData2=Out_CANData2+Out_CANData1
        Out_CANData1=!I2Hex(Out_Data6)
        if!Len(Out_CANData1)>2thenOut_CANData1="0"+Out_CANData1
        Out_CANData2=Out_CANData2+Out_CANData1
        Out_CANData1=!I2Hex(Out_Data7)
        if!Len(Out_CANData1)>2thenOut_CANData1="0"+Out_CANData1
        Out_CANData2=Out_CANData2+Out_CANData1

        這樣,以后要將In_CANData的數據提取到In_*變量中,只需在腳本中按!setstgy(StringToObject)就可以了。而要將Out_*數據合并到Out_CANData,可先調用!setstgy(ObjectToString),然后再把Out_CANData2的值賦給Out_CANData。

        四、協議及報文格式

        因為MCGS不便于編寫復雜的腳本程序,所以傳輸協議的設計以簡單為原則。本系統使用HiLon協議A。HiLon協議A是一個通用的協議,基于非對稱型主從式網絡結構,支持廣播和點對點傳送命令數據,命令數據包可長達256字節,非常適合用作本系統的通信協議HiLon協議以CAN2.0A幀結構為基礎。下圖是幀報文格式,一個CAN2.0A標準幀由11位ID、1位RTR、4位DLC、數據區(最多8個字節)組成。

        HiLonA報文格式
        圖4HiLonA報文格式

        DIR:方向位。方向位決定一半的優先級而剩余的優先級,由節點地址決定低地址優先級高。當方向位為“1”時,地址域是源節點地址(從節點到主節點),優先級由地址決定;當方向位為“0”時,地址域是目標節點地址(主節點到從節點),優先級由地址決定。從節點也可使用地址濾波技術從而減少需處理的網絡信息量,因而能有效節省CAN節點控制器資源,提高控制器效率。

        Address:目標地址,表示節點地址,范圍只能設定為0~125
        TYPE:幀類型。見下表中的幀類型說明。

        表2HiLon幀類型
        HiLon幀類型

        DLC:每幀字節數(1~8)
        Index:索引字節。對于單幀數據,該字節表示傳輸數據的第一個字節;對于多幀數據,此字節表示索引字節,即此幀數據在數據包中的位置。
        Data:數據

        在本系統中,數據中心要對各個房間的溫/濕度進行監控并修各個房間的溫/濕度SV值,因此給各個控制室分配唯一的標志符;在下位機向上位機發送的數據報文中攜帶的數據是房間的溫/濕度值;上位機向下位機發送的命令報文攜帶命令號及控制室的溫/濕度SV值。本系統的傳輸數據量較小,且MCGS的采樣周期本系統取5ms相對下位機來說較長,因此,本系統選擇使用單幀(點對點)類型幀。利用HiLon報文的特點,將7位Address分配給房間ID,每一個房間ID對應一個Address,地址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。這個數在浮點數的保存中經常省略。

        浮點數保存的字節格式如下:

        IEEE-754標準float存儲格式
        圖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)



        評論


        相關推薦

        技術專區

        關閉
        主站蜘蛛池模板: 长沙市| 怀宁县| 南投县| 遂川县| 房产| 昌图县| 松溪县| 巩义市| 和政县| 彭州市| 西峡县| 望江县| 定远县| 平泉县| 景东| 弋阳县| 五台县| 封丘县| 巢湖市| 泸水县| 云霄县| 炉霍县| 清苑县| 潢川县| 大化| 罗源县| 孝感市| 长武县| 福海县| 化德县| 绥中县| 玉环县| 遂昌县| 许昌县| 进贤县| 吉林市| 永登县| 道孚县| 屏南县| 鄂托克旗| 清苑县|