得知。舉個例子,當有 A、B、C 三個節點,其識別 ID 分別為 1、2、3,當 C 要傳給A 節點資料的時候,只要將資料欄框裡面的識別碼設定為 1 再將資料傳 到CAN 網路上面,由於各節點都有用 MASK 設定各自可接受的 ID,因此該筆 訊息只有節點A 可以接收到。其他節點因為訊息被 MASK 濾掉,這樣也不需要 先將訊息讀入再判斷該筆資料是否是給他的。
除了唯一的識別ID,每個節點再多規劃一個廣播用 ID,當訊息上面的識別 ID 使廣播用的 ID 時,每個節點都可以同時收到該筆訊息,這是為了當某個點 要對多數節點傳送訊息而準備。例如,當有個節點發生錯誤的時候,可以利用 廣播用ID 通知 CAN 網路上每個節點系統有錯誤發生,應該採取對應的措施,
而不用再對每個節點一個一個通知,以節省時間。
由上面的規劃,本論文中CAN 網路系統每個節點最少都可以接收兩種不同 的ID,一種為系統本身的識別 ID,另外一種為廣播用 ID。
3-1-2 使用者自訂欄框
先前有提過CAN 網路沒有對資料欄框中資料的部份做分配,因次在本論文 的系統當中,我們自行規劃三種自訂欄框,節點跟節點之間溝通的訊息都靠這 三種欄框,圖3.1 分別為三種欄框的格式和大小。其中三個欄框都有個共通點,
就是最前面會帶有Type 和 Device 的欄位,大小均為 1Byte,Type 指的是該筆
圖3.1 三種自訂欄框
訊息代表的事件,Device 表示由哪個節點傳送,由於我們系統的訊息事件和節 點不多,所以Type 和 Device 都取 1Byte,1Byte 可以代表 256 筆訊息事件和 256 個節點。三個欄框唯一不同之處就是Data 部份,依據不同需求來選擇不同長度 的Data 大小。設定好自訂欄框之後,將此欄框封裝到 CAN 封包 Data 的部份,
在將封包傳送到對應的節點,對應的節點收到封包將自訂欄框取出後,解析該 欄框後做出對應的事件。
3-2 CAN 網路監控程式介紹
CAN 網路上的訊息傳輸都是利用廣播的方式將訊息傳到網路上去,然後利 用個節點的MASK 設定將想要收到訊息給收進來,我們網路監控程式就利用此 特性,來監看網路上所有訊息,並且可以利用遮罩(Mask)的設定,將不想要看 的訊息給濾除掉。本監控程式要搭配USB CAN 使得 PC 變成 CAN 網路上的一 個節點才能監看網路上的訊息。3-2-1 介紹 USB CAN,3-2-2 介紹 USB CAN 軟 體介面的建立,0 介紹 CAN 網路監控程式。
3-2-1 USB CAN 介紹[17]
USB CAN 可以讓 PC 透過 USB 介面連接到 CAN 網路上面,使得 PC 也變 成CAN 網路上面的一個節點,透過 USB CAN 方便讓電腦收集和分析 CAN 網 路上面的訊息,或是透過USB CAN 傳達訊息到 CAN 網路上各節點。本章採用 的USB CAN 為周立功單片機發展有限公司所開發出來的 USBCANII 智能 CAN 接口卡,USBCANII 有兩個 CAN 通道,可讓使用者同時連到兩個不同的 CAN 網路上面,並且附有ZLGVCI 接口函式庫,方便使用者搭配不同開發程式開發 符合自己需求的產品,以下為USBCANII 外觀和硬體規格:
(a) (b)
圖3.2 USBCANII 外觀 (a)正面 (b)背面 硬體規格:
z PC 接口:USB1.1
z CAN 控制器:PHILIPS SJA1000 z CAN 收發器: PHILIPS PCA82C250 z CAN 網路傳輸速率:5Kbps~1Mbps
z CAN 通訊接口:DB9,符合 DeviceNET 和 CANOpen 標準
z 支援 CAN 網路協定:支援 CAN 2.0B(兼容 CAN2.0A 協定),符合 ISO/IS 11898
z 最高 Frame 流量:每個通道 5000 Frame/sec
z 供電方式:USB 供電或是外接+9V~+25V,400mA 的電源
3-2-2 USB CAN 軟體介面的建立
USBCANII 有提供接口函式庫方便使用者開發符合自己所需要的程式,要 使用這些函式需將原廠所附的三個文件 ControlCAN.h、ControllCAN.lib、
ControlCAN.dll 和一個資料夾 kerneldlls 加到開發的程式中。
通常要使用廠商所提供的動態連結檔有兩個方式[18]:
(1)Implicitly Link(隱式連結)又稱靜態載入,靜態載入方式所使用的 dll 檔
會在應用程式執行時載入,然後就可以呼叫所有由 dll 檔中匯出的函式,
就好像是包含在程式一般,此方法較簡單,載入方式是由編譯器負責處 理,但是編譯時需額外的import library(.lib),本節一開始的 dll 檔使用方 式即為此方式。
(2)Explicitly Link(顯式連結)又稱動態載入,動態載入就是在程式需要的時 候才將dll 檔載入,不需要的時候即釋放 dll 檔,此方法可以更有效的使用 記憶體,應用程式載入時的速度較快,不需額外加入 lib 檔,但是使用方 式複雜。
當我們依照一開始介紹的方法在Borland C++ Builder 上面使用靜態連結的 方式將dll 檔載入,則會產生問題無法使用。會產生問題的原因出在靜態載入的 時候需要使用到lib 檔,lib 檔分為兩種格式:
(1)COFF 格式:Microsoft 所使用。
(2)OMF 格式:Borland 所使用。
USB CAN 所附 lib 檔是給 Visual C++使用,所以直接拿來 Borland C++ Builder 上面使用會出現問題,由於lib 檔無法使用我們只好採用動態連結的方式來載入 dll 檔。
接 下 來 介 紹 動 態 載 入 的 流 程 , 首 先 要 使 用 WINDOWS API 裡 面 的 LoadLibrary 手動載入 dll 檔,並且使用 GetProcessAddress 來取得所要使用的函 式的位址,最後不需要此dll 檔的時候,使用 FreeLibrary 將 dll 釋放掉,下面就 使用接口函式庫所提供的一個函式當作例子:
DWORD __stdcall VCI_OpenDevice(DOWORD DevType, DWORD DevIndex, DWORD Reserved)
功能:用來打開USB CAN 設備
(1)使用 LoadLibrary 載入 dll 檔:
HINSTANCE hDLL;
hDLL = ::LoadLibrary("ControlCAN.dll");
(2)取得函式位址:首先用 typedef 把 VCI_OpenDevice 定義成一個自訂函式指 標 的 型 別 然 後 在 宣 告 一 個 vciOpenDevice 函 數 指 標 , 最 後 利 用 GetProcessAddress 取得函式位址並指定給 vciOpenDevice,如此一來就可 以使用vciOpenDevice 函式就像是使用靜態載入的 VCI_OpenDevice。
DWORD __fastcall OpenDevice(DWORD DeviceType,DWORD DeviceInd,DWORD Reserved);
VCI_OpenDevice vciOpenDevice;
vciOpenDevice = (VCI_OpenDevice)GetProcAddress(hDLL,"VCI_OpenDevice");
(3)釋放 dll 檔:假如程式不再使用 dll 檔可用 FreeLibrary 將不使用的 dll 檔釋
下面簡單介紹物件的建立過程,並且只介紹VCI_OpenDevice 如何加入此物件,
若要使用其他函式可用相同方法加到此物件(其他函式用…來代替):
[1]用 typedef 自訂函式指標的型別
DWORD __fastcall OpenDevice(DWORD DeviceType,DWORD DeviceInd,DWORD Reserved);
…
…
[2]定義 USBCAN 類別
class USBCAN {
public:
__fastcall USBCAN(void);
__fastcall ~USBCAN(void);
DWORD __fastcall OpenDevice(DWORD DeviceType,DWORD DeviceInd,DWORD Reserved);
…
__fastcall USBCAN::USBCAN() {
hDLL = ::LoadLibrary("ControlCAN.dll");
vciOpenDevice = (VCI_OpenDevice)GetProcAddress(hDLL,"VCI_OpenDevice");
…
… }
[4]dll 檔的釋放寫在 USBCAN 的解構子,如此當物件消失的時候會順便將 dll 檔釋放出來,避免dll 檔一直佔用資源。
__fastcall USBCAN::~USBCAN() {
::FreeLibrary(hDLL);
}
[5]設定物件的方法:
DWORD __fastcall USBCAN::OpenDevice(DWORD DeviceType,DWORD DeviceInd,DWORD Reserved)
{
return vciOpenDevice(DeviceType,DeviceInd,Reserved);
}
…
…
經過以上設定後,就可以完成USBCAN 類別的建立。下面將介紹如何使用 此類別來建立物件開啟USB CAN 設備(此類別其他的方法將放在附錄介紹)。
USBCAN UsbCanObj; //建立 UsbCanObj 物件
UsbCanObj. OpenDevice(VCI_USBCAN2,this->DevIndex,0) //開啟 USB CAN Device
3-2-3 網路監控程式
圖3.3 網路監控程式主畫面
圖 3.3 為我們利用 3-2-2 提到的軟體介面所建立的網路監控程式的主要畫 面,總共分成三個部份:
(a) 控制 USBCAN 節點屬性:
當要開始使用監控程式的時候,需先將 USBCAN 相關參數設定好,首 先,先點下 Open 按鈕後會跳出參數設定視窗如圖 3.4,此畫面可以讓我 們設定 ID 遮罩,濾波器形式,工作模式還有傳輸速度, 由於本 USBCAN 使用的 CAN Controller 為 PHILIPS SJA-1000,因此參數的詳細設定,可 以直接參考 SJA-1000 的說明文件。此 USBCNA 有兩組 CAN 節點,所 以有兩組參數可供設定,Device Index 是當 PC 不只接上一台 USBCAN
時,可以讓我們選擇想要控制的裝置。當設定好參數之後,選擇 OK 跳 回主畫面,此時再按 Start 按鈕即可開始監聽 CAN 網路上面的訊息。
圖3.4 USB CAN 系統參數設定畫面
(b) 監聽 CAN BUS 訊息的顯示部份:
監控程式將在 CAN Bus 上面監聽到的訊息會在此部份顯示出來,
在此我們可以看到訊息的
(1) direction:傳遞方向,讓我們知道該訊息是由 PC 端接收或是發 送。
(2) CAN :接收或傳送節點,由於 USBCANII 可以讓 PC 擁有兩 個 CAN 節點,此部份可以顯示出是哪個節點收發該訊息。
(3) Time ID:顯示時間 Tag
(4) Frame ID:顯示該訊息的識別碼,根據 3-1 節的規劃此 ID 是將
接收此訊息的識別 ID,可以藉由 Frame ID 來斷該訊息的去處。
為該訊息帶有的 Data。
圖3.5 監控程式擷取畫面
利用有系統的建立系統識別ID 和規劃好的自訂欄框,再搭配網路鍵控程式 可以讓我們在以較簡單的方式掌握分散式控制CAN 網路上面的訊息傳遞,當系 統出問題時,也可以藉由觀測訊息傳遞狀況,來把問題找出。
第4章 網路延遲時間與量測
4-1 網路控制系統
回授控制系統若是其控制迴路及回授迴路都經由網路來做傳輸媒介,則這 些控制系統稱為網路控制系統(networked control systems, NCSs)[2],其中使用的 網路可能是有線網路如 Ethernet,無線網路如 IEEE802.11,或是工業用網路如 CAN。透過網路來做控制,有許多有許多優點,例如[1]: 統網路化之後,也帶來幾個缺點,例如時間延遲( delay time),資料遺失(data dropout),封包碰撞,取樣週期降低,網路排程(network scheduling)等問題,
這些問題沒有處理好,輕則降低系統效能,重則整個系統產生不穩定或是無法 控制,這些問題都是網路控制上的重要課題。
在本章我們主要探討時間延遲對系統造成的影響,4-2 節討論時間延遲對網