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