韓立立
(中國(guó)石油大學(xué) 理學(xué)院實(shí)驗(yàn)中心,山東 青島266580)
隨著計(jì)算機(jī)、網(wǎng)絡(luò)技術(shù)、軟件工程、自動(dòng)控制等多個(gè)高新技術(shù)的發(fā)展,越來(lái)越多的工業(yè)現(xiàn)場(chǎng)情況需要用計(jì)算機(jī)實(shí)現(xiàn)對(duì)CAN設(shè)備的監(jiān)控。當(dāng)CAN設(shè)備沒(méi)有通訊協(xié)議時(shí),就需要編寫(xiě)符合CAN總線傳輸?shù)耐ㄓ崊f(xié)議。
文中將著重闡述該系統(tǒng)通訊方法的實(shí)現(xiàn)。由于計(jì)算機(jī)不能直接發(fā)送數(shù)據(jù)到CAN總線上去,必須經(jīng)過(guò)CAN-以太網(wǎng)網(wǎng)關(guān)或CAN-232串口服務(wù)器轉(zhuǎn)換才能實(shí)現(xiàn)。
控制器局域網(wǎng)絡(luò)(CAN,Control Area Network),它最初是由德國(guó)的 BOSCH公司為汽車(chē)監(jiān)測(cè)、控制系統(tǒng)而設(shè)計(jì)的。目前,CAN總線是唯一已成為國(guó)際標(biāo)準(zhǔn)的,被公認(rèn)為是幾種最有前途的現(xiàn)場(chǎng)總線之一。
CAN具有下列主要特性[1]:單根雙絞線最遠(yuǎn)傳輸距離10km/5kb/s,最高傳輸速率1Mb/s/40m。非破壞性總線仲裁技術(shù),采用干擾概率低的短幀結(jié)構(gòu)多地址傳送; CAN可與輸入輸出設(shè)備、單片機(jī)、控制器、收發(fā)器等多種設(shè)備配合使用。全系統(tǒng)數(shù)據(jù)兼容性;錯(cuò)誤檢測(cè)和出錯(cuò)信息自動(dòng)判別、自動(dòng)重發(fā)、自動(dòng)脫離。
在總線中傳送的報(bào)文,每幀由7 部分組成,詳細(xì)說(shuō)明如下:
1)00:A 口(一般CAN-以太網(wǎng)網(wǎng)關(guān)有1-4個(gè)CAN端口)收到的數(shù)據(jù),0-3 對(duì)應(yīng)A-D 4個(gè)CAN 端口,為報(bào)文接收到的第1個(gè)字節(jié)。
2)10 00 00 00:接收到的CAN ID(CAN ID 為1,低位字節(jié)在前,高位在后)。
3)08:此CAN 數(shù)據(jù)包中的CAN 數(shù)據(jù)區(qū)長(zhǎng)度(最大8 個(gè)字節(jié))。
4)01 02 03 04 05 06 07 08:8 個(gè)字節(jié)的CAN數(shù)據(jù)區(qū)數(shù)據(jù)。
5)01:1 為擴(kuò)展幀(CAN2.0B)格式,0 為標(biāo)準(zhǔn)幀(CAN2.0A)。
6)00:遠(yuǎn)程傳輸位,0-非RTR 數(shù)據(jù)包,1-為RTR數(shù)據(jù)包。
7)00 00 00 00:保留的4 個(gè)數(shù)據(jù)字節(jié),為報(bào)文接收的最后字節(jié)。
CAN協(xié)議支持兩種報(bào)文格式,其唯一的不同是標(biāo)識(shí)符(ID)長(zhǎng)度不同,標(biāo)準(zhǔn)格式為11 位,擴(kuò)展格式為29 位。報(bào)文的尾部由幀結(jié)束標(biāo)出。在相鄰的兩條報(bào)文間有一很短的間隔位,如果這時(shí)沒(méi)有站進(jìn)行總線存取,總線將處于空閑狀態(tài)。
VB中通過(guò)Winsock控件與遠(yuǎn)程計(jì)算機(jī)或以太網(wǎng)設(shè)備建立連接,并通過(guò)用戶數(shù)據(jù)交換協(xié)議(UDP)或者傳輸控制協(xié)議(TCP)進(jìn)行數(shù)據(jù)交換。Microsoft Access、Visual Basic、Visual c++等的開(kāi)發(fā)人員都可使用它。用VB的Winsock 控件來(lái)編寫(xiě)客戶端和服務(wù)器應(yīng)用程序,只需設(shè)置控件的屬性并調(diào)用其方法就可輕易連接到一臺(tái)遠(yuǎn)程機(jī)器上去;并且還可在兩應(yīng)用程序間進(jìn)行雙向交換數(shù)據(jù),完成兩機(jī)間的通信,編程簡(jiǎn)單、快捷、安全[2]。
CAN的報(bào)文格式分兩種:擴(kuò)展幀和標(biāo)準(zhǔn)幀。標(biāo)準(zhǔn)幀每次只能傳送8個(gè)數(shù)據(jù)(16進(jìn)制),而現(xiàn)場(chǎng)需要傳輸?shù)臄?shù)據(jù)類(lèi)型不僅有開(kāi)關(guān)量,還有模擬量,且一般所需要傳輸?shù)臄?shù)據(jù)都很多。所以我們將CAN的8個(gè)數(shù)據(jù)(例如FFFF006E43301000)分成兩部分:前兩為FFFF代表開(kāi)關(guān)量,如果將16進(jìn)制轉(zhuǎn)換成2進(jìn)制為1111 1111 1111 1111,代表16個(gè)開(kāi)關(guān)量數(shù)據(jù),從左到右分別是 D1、D2…D16;后 6位006E43301000代表2個(gè)模擬量,前一個(gè)模擬量為整數(shù)(006E轉(zhuǎn)換成10進(jìn)制分別是110),后一個(gè)模擬量為小數(shù)編碼傳輸(43301000用IEEE754編碼,轉(zhuǎn)換成小數(shù)為176.0652,具體轉(zhuǎn)換方法如下:176.0652轉(zhuǎn)換成2進(jìn)制為10110000.0001,規(guī)格化二進(jìn)制數(shù):1.01100000001*2^7 (小數(shù)點(diǎn)移了7位),計(jì)算指數(shù):7+127=134 (127是個(gè)標(biāo)準(zhǔn)數(shù)值),按照IEEE754編碼排列為 0 10000110 01100000001 000000000000(不足32位,后面補(bǔ)0,直到補(bǔ)足32位),二進(jìn)制結(jié)果是0100 0011 0011 0000 0001 0000 0000 0000,十六進(jìn)制結(jié)果是0x43301000)。這樣每個(gè)CAN標(biāo)準(zhǔn)幀傳輸16個(gè)開(kāi)關(guān)量和1個(gè)10進(jìn)制0—65535的整數(shù)值和1個(gè)10進(jìn)制任意的小數(shù)值(如果實(shí)際需要傳輸?shù)恼麛?shù)數(shù)據(jù)大于 65535,可以作為小數(shù)傳輸),實(shí)際需要傳輸?shù)拈_(kāi)關(guān)量或模擬量有多少,就發(fā)送相應(yīng)倍率的CAN標(biāo)準(zhǔn)幀就可以了。例如實(shí)際需要傳輸500個(gè)開(kāi)關(guān)量和70個(gè)模擬量,500除以16取整應(yīng)該是32;70除以2取整為35;所以應(yīng)該傳輸35個(gè)CAN標(biāo)準(zhǔn)幀。這35個(gè)CAN標(biāo)準(zhǔn)幀的區(qū)分就在CAN ID中,舉例說(shuō)明(發(fā)送數(shù)據(jù)為P1—P600):
軟件發(fā)送 001400000008FFFF006E43301000000 000000000到CAN設(shè)備。代表從上位電腦寫(xiě)P1—P19到CAN設(shè)備其中P1-P16為1,P17為16進(jìn)制006E,10進(jìn)制為110;P38為16進(jìn)制43301000實(shí)際值為176.0652;
軟件發(fā)送 001500000008FFFF006E43301000000 000000000到CAN設(shè)備。代表從上位電腦寫(xiě)P21—P39到CAN設(shè)備其中P21-P36為1,P37為16進(jìn)制006E,10進(jìn)制為110;P38為16進(jìn)制43301000實(shí)際值為176.0652[3];
每組20個(gè)數(shù)據(jù)(第20個(gè)數(shù)據(jù)不用),在編制軟件時(shí)用循環(huán)很容易完成。
將 CAN-以太網(wǎng)網(wǎng)關(guān)的工作模式設(shè)置成服務(wù)器方式;將CAN-以太網(wǎng)網(wǎng)關(guān)CAN總線的通訊速率設(shè)置成和CAN設(shè)備一樣的速率;將計(jì)算機(jī)的IP地址設(shè)置成和CAN-以太網(wǎng)網(wǎng)關(guān)同一個(gè)網(wǎng)段里的不同IP地址;用VB新建個(gè)工程,將Winsock控件添加到工程中,其屬性中的RemoteHost屬性設(shè)置成CAN-以太網(wǎng)網(wǎng)關(guān)的IP地址,其屬性中的 RemotePort屬性設(shè)置成 CAN-以太網(wǎng)網(wǎng)關(guān)的偵聽(tīng)端口,在窗體上添加 Command1、Command2、Text1.Text3個(gè)控件,編寫(xiě)代碼如下:
Private Sub Command1_Click()
Winsock1.Connect
End Sub
Private Sub Command2_Click()’發(fā)送0014000 00008FFFF006E00780064000000000000
Dim X(19) As Byte
'X(0) = &H0
X(1) = &H14
X(2) = &H0
X(3) = &H0
X(4) = &H0
X(5) = &H8
X(6) =&HFF
X(7) = &HFF
X(8) = &H0
X(9) = &H6E
X(10) = &H0
X(11) = &H78
X(12) = &H0
X(13) = &H64
X(14) = &H0
X(15) = &H0
X(16) = &H0
X(17) = &H0
X(18) = &H0
X(19) = &H0
Winsock1.SendData X()
End Sub
接收數(shù)據(jù)代碼如下:
Private Sub Winsock 1_DataArrival (ByVal bytes Total as Long)
Dim p1, buf, data1 As String
Dim InByte, I
Buf = ""
Winsock 1.GetData data1
InByte = data1
For I = LBound(InByte) To UBound(InByte)
If Len(Hex(InByte(I))) = 1 Then Buf = Buf+ "0" + Hex(InByte(I))
If Len(Hex(InByte(I))) = 0 Then Buf = Buf+ "00"
If Len(Hex(InByte(I))) = 2 Then Buf = Buf+ Hex(InByte(I))
Next I
Text1.Text = Buf ‘將接收的數(shù)據(jù)放到Text1.Text里顯示
End Sub
將設(shè)備連接好,加電后,運(yùn)行軟件點(diǎn)擊Command1,和 CAN設(shè)備建立通訊鏈路,點(diǎn)擊Command2,將數(shù)據(jù)發(fā)送到CAN設(shè)備。當(dāng)CAN設(shè)備返回?cái)?shù)據(jù)時(shí),將自動(dòng)顯示在Text1.Text里。
用以上方法將數(shù)據(jù)讀上來(lái)后,可以自己編寫(xiě)監(jiān)控界面,也可以用DDE 或OPC的方式將采集數(shù)據(jù)放到任何組態(tài)軟件中,用組態(tài)軟件監(jiān)控設(shè)備運(yùn)行[4]?;谇度胧较到y(tǒng)的智能節(jié)點(diǎn)在CAN總線中的應(yīng)用靈活穩(wěn)定[5]。CAN總線技術(shù)下設(shè)計(jì)企業(yè)的生產(chǎn)監(jiān)控系統(tǒng),提高現(xiàn)代制造企業(yè)生產(chǎn)的信息化與網(wǎng)絡(luò)化水平。
[1] 京金華(北京)有限公司.CAN產(chǎn)品配置手冊(cè)[M].北京:出版者不詳,2007:2-22.
[2] 李天啟.Visual Basic 6學(xué)習(xí)捷徑[M].北京:清華大學(xué)出版社,1994:68-98.
[3] 王道義.VisualBasic 6使用詳解[M].北京:機(jī)械工業(yè)出版社,1997:32-55.
[4] 張亞娟.基于嵌入式系統(tǒng)的智能節(jié)點(diǎn)在 CAN總線中的應(yīng)用[J].通信技術(shù),2006(06):51-54.
[5] 蔡連君.基于 CAN總線的生產(chǎn)監(jiān)控系統(tǒng)研究[J].通信技術(shù),2009,42(10):151-152.