<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>

新聞中心

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

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

作者: 時(shí)間:2012-07-11 來(lái)源:網(wǎng)絡(luò ) 收藏

‘轉換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。

四、協(xié)議及報文格式

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

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

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

Address:目標地址,表示節點(diǎn)地址,范圍只能設定為0~125
TYPE:幀類(lèi)型。見(jiàn)下表中的幀類(lèi)型說(shuō)明。

表2HiLon幀類(lèi)型
HiLon幀類(lèi)型

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

在本系統中,數據中心要對各個(gè)房間的溫/濕度進(jìn)行監控并修各個(gè)房間的溫/濕度SV值,因此給各個(gè)控制室分配唯一的標志符;在下位機向上位機發(fā)送的數據報文中攜帶的數據是房間的溫/濕度值;上位機向下位機發(fā)送的命令報文攜帶命令號及控制室的溫/濕度SV值。本系統的傳輸數據量較小,且MCGS的采樣周期本系統取5ms相對下位機來(lái)說(shuō)較長(cháng),因此,本系統選擇使用單幀(點(diǎn)對點(diǎn))類(lèi)型幀。利用HiLon報文的特點(diǎn),將7位Address分配給房間ID,每一個(gè)房間ID對應一個(gè)Address,地址0保留。當數據方向是從節點(diǎn)到主節點(diǎn)時(shí),8字節數據的前4字節用于傳遞房間溫度,后4字節用于傳遞房間濕度,當數據方向是主節點(diǎn)到從節點(diǎn)時(shí),8字節數據的前4字節作為命令I(lǐng)D,后4字節用于傳遞命令參數(房間溫/濕度SV值)。報文幀的格式如圖1所示。

報文幀格式
圖5報文幀格式

對主節點(diǎn)到從節點(diǎn)的命令I(lǐng)D的定義如下:

表3控制命令類(lèi)型及其參數
控制命令類(lèi)型及其參數

本系統要監控的數據是各房間的溫度和濕度及它們的SV值。要將這些數據在總線(xiàn)上傳輸,必須將它們裝入報文幀。為了使傳輸的數據只占用較小的空間而達到較高的精確度,在報文中每一種數值都分配了4字節的空間,數據按IEEE-754標準的float數據類(lèi)型的格式存儲。這樣,在下位機進(jìn)行編程就比較方便。但是,上位機的處理程序是用類(lèi)似VB腳本的語(yǔ)言寫(xiě)的,數據對象的類(lèi)型只有數值型、開(kāi)關(guān)型和字符型三種,不能直接使用接收到的數據。因此,要對接收到的數據進(jìn)行轉換。

按IEEE-754標準,一個(gè)浮點(diǎn)數用兩個(gè)部分表示:尾數和2的冪。例如:

尾數代表浮點(diǎn)上的數據二進(jìn)制數。

二的冪代表指數。指數的保存形式是一個(gè)0到255的8位值。指數的實(shí)際值是保存值0到255減去127,一個(gè)范圍在127到-128之間的值。

尾數是一個(gè)24位值(代表大約7個(gè)十進(jìn)制數),最高位(MSB)通常是1,因此,不保存。一個(gè)符號位表示浮點(diǎn)數是正或負。在尾數的左邊有一個(gè)省略的二進(jìn)制點(diǎn)和1。這個(gè)數在浮點(diǎn)數的保存中經(jīng)常省略。

浮點(diǎn)數保存的字節格式如下:

IEEE-754標準float存儲格式
圖6IEEE-754標準float存儲格式

這里:
S代表符號位,1是負,0是正。
E冪,偏移127。
M24位的尾數(保存在23位中)。
零是一個(gè)特定值,表示冪是0,尾數是0。

在運行策略中新建一個(gè)名為SplitFloat的用戶(hù)策略,新增一策略行并添加以下腳本程序,用于將數值型對象float轉換到4字節存儲單元Byte0Byte3:

‘計算浮點(diǎn)數的冪(二進(jìn)制數小數點(diǎn)的位置)
exponent=0
float1=!abs(float)
whilefloat1>0
float1=!BitRShift(float1,1)
exponent=exponent+1
endwhile
exponent=exponent-1
‘計算浮點(diǎn)數的底數
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)



評論


相關(guān)推薦

技術(shù)專(zhuān)區

關(guān)閉
国产精品自在自线亚洲|国产精品无圣光一区二区|国产日产欧洲无码视频|久久久一本精品99久久K精品66|欧美人与动牲交片免费播放
<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>