1、概述
Virtual CAN Interface (VCI) 函數(shù)庫(kù)是專門為ZLGCAN 設(shè)備在PC 上使用而提供的應(yīng)用程序接口。庫(kù)里的函數(shù)從ControlCAN.dll 中導(dǎo)出,在LabVIEW7.0 中可以直接使用這些庫(kù)函數(shù)而無(wú)需額外的操作。VCI 函數(shù)的使用流程如圖 1.1 所示。
[align=center]
圖 1.1 VCI 函數(shù)使用流程[/align]
2、使用VCI 函數(shù)
2.1 數(shù)據(jù)結(jié)構(gòu)
VCI 函數(shù)庫(kù)中定義了一些數(shù)據(jù)結(jié)構(gòu)用于數(shù)據(jù)交換,在使用VCI 函數(shù)前應(yīng)該先創(chuàng)建這些數(shù)據(jù)結(jié)構(gòu)。在LabVIEW 中創(chuàng)建這些結(jié)構(gòu)時(shí)應(yīng)該使用簇——Cluster。一個(gè)簇就是一個(gè)由若干不同的數(shù)據(jù)類型的成員組成的集合體,類似于C 語(yǔ)言中的結(jié)構(gòu)。其成員可以是任意的數(shù)據(jù)類型,但必須都是控件或都是顯示件。成員的邏輯順序是由它們被放入簇的先后順序決定的。
2.1.1 VCI_BOARD_INFO 結(jié)構(gòu)
VCI_BOARD_INFO 結(jié)構(gòu)體包含ZLGCAN 系列接口卡的設(shè)備信息。結(jié)構(gòu)體將在VCI_ReadBoardInfo 函數(shù)中被填充。
typedef struct _VCI_BOARD_INFO {
USHORT hw_Version;
USHORT fw_Version;
USHORT dr_Version;
USHORT in_Version;
USHORT irq_Num;
BYTE can_Num;
CHAR str_Serial_Num[20];
CHAR str_hw_Type[40];
USHORT Reserved[4];
} VCI_BOARD_INFO, *PVCI_BOARD_INFO;
[align=center]
圖 2.1 VCI_BOARD_INFO 結(jié)構(gòu)[/align]
2.1.2 VCI_CAN_OBJ 結(jié)構(gòu)
VCI_CAN_OBJ 結(jié)構(gòu)體在VCI_Transmit 和VCI_Receive 函數(shù)中被用來(lái)傳送CAN信息幀。
typedef struct _VCI_CAN_OBJ {
UINT ID;
UINT TimeStamp;
BYTE TimeFlag;
BYTE SendType;
BYTE RemoteFlag;
BYTE ExternFlag;
BYTE DataLen;
BYTE Data[8];
BYTE Reserved[3];
} VCI_CAN_OBJ, *PVCI_CAN_OBJ;
[align=center]
圖 2.2 VCI_CAN_OBJ 結(jié)構(gòu)[/align]
2.1.3 VCI_CAN_STATUS 結(jié)構(gòu)
VCI_CAN_STATUS 結(jié)構(gòu)體包含CAN 控制器狀態(tài)信息。結(jié)構(gòu)體將在VCI_ReadCanStatus函數(shù)中被填充。
typedef struct _VCI_CAN_STATUS {
UCHAR ErrInterrupt;
UCHAR regMode;
UCHAR regStatus;
UCHAR regALCapture;
UCHAR regECCapture;
UCHAR regEWLimit;
UCHAR regRECounter;
UCHAR regTECounter;
DWORD Reserved;
} VCI_CAN_STATUS, *PVCI_CAN_STATUS;
[align=center]
圖 2.3 VCI_CAN_STATUS 結(jié)構(gòu)[/align]
2.1.4 VCI_ERR_INFO 結(jié)構(gòu)
VCI_ERR_INFO結(jié)構(gòu)體用于裝載VCI庫(kù)運(yùn)行時(shí)產(chǎn)生的錯(cuò)誤信息。結(jié)構(gòu)體將在VCI_ReadErrInfo函數(shù)中被填充。
typedef struct _ERR_INFO {
UINT ErrCode;
BYTE Passive_ErrData[3];
BYTE ArLost_ErrData;
} VCI_ERR_INFO, *PVCI_ERR_INFO;
[align=center]
圖 2.4 VCI_ERR_INFO 結(jié)構(gòu)[/align]
2.1.5 VCI_INIT_CONFIG 結(jié)構(gòu)
VCI_INIT_CONFIG 結(jié)構(gòu)體定義了初始化CAN 的配置。結(jié)構(gòu)體將在VCI_InitCan 函數(shù)中被填充。
typedef struct _INIT_CONFIG {
DWORD AccCode;
DWORD AccMask;
DWORD Reserved;
UCHAR Filter;
UCHAR Timing0;
UCHAR Timing1;
UCHAR Mode;
} VCI_INIT_CONFIG, *PVCI_INIT_CONFIG;
[align=center]
圖 2.5 VCI_INIT_CONFIG 結(jié)構(gòu)[/align]
下面以VCI_CAN_OBJ 結(jié)構(gòu)為例,在LabVIEW7.0 中創(chuàng)建VCI_CAN_OBJ 結(jié)構(gòu)。先在Array&Cluster 控件子模板選擇一個(gè)簇的空殼放到前面板上,將其命名為VCI_CAN_OBJ,然后根據(jù)需要放置的控件多少用定位工具調(diào)整簇空殼的大?。话凑誚CI_CAN_OBJ 結(jié)構(gòu)成員的順序,從Numeric 控件子模板中取Numeric Indicator 控件或從前面板上移動(dòng)控件到簇的空殼中,并按圖 2.6 將各Numeric Indicator 控件重命名。
[align=center]
圖 2.6 在前面板上創(chuàng)建VCI_CAN_OBJ 結(jié)構(gòu)的簇[/align]
此時(shí),簇殼內(nèi)的成員的數(shù)據(jù)類型都為默認(rèn)的Double 類型。在簇殼內(nèi)的邊框上彈出快捷菜單,選擇Representation。在下一級(jí)子菜單中選擇與VCI_CAN_OBJ 結(jié)構(gòu)成員類型一致的類型。
[align=center]
圖 2.7 設(shè)置成員類型[/align]
2.2 調(diào)用VCI 庫(kù)函數(shù)
在LabVIEW 中調(diào)用VCI 庫(kù)函數(shù)的過(guò)程比較簡(jiǎn)單。LabVIEW 在Advanced 函數(shù)子模板中提供了Calling Library Function Node,只要知道動(dòng)態(tài)連接庫(kù)里被導(dǎo)出的函數(shù)名稱及其參數(shù),就可以通過(guò)Calling Library Function Node 調(diào)用。ZLG VCI 函數(shù)庫(kù)已經(jīng)提供了庫(kù)里的函數(shù)聲明,因此,在LabVIEW 中使用VCI 函數(shù)庫(kù)將通過(guò)Calling Library Function Node 來(lái)實(shí)現(xiàn)。
以調(diào)用VCI_OpenDevice 函數(shù)為例。在LabVIEW 圖形代碼窗口中放上調(diào)用庫(kù)函數(shù)節(jié)點(diǎn),用鼠標(biāo)雙擊節(jié)點(diǎn)或使用快捷菜單命令Configure 彈出如圖 2.8 所示的對(duì)話框。
[align=center]
圖 2.8 調(diào)用庫(kù)函數(shù)1[/align]
單擊Browse…按鈕,打開一個(gè)文件對(duì)話框,找到ControlCAN.dll 文件?;蛘咧苯虞斎霂?kù)文件路徑和名稱。
在Function Name 下拉列表框中照到VCI_OpenDevice 函數(shù)。或直接輸入函數(shù)名。
[align=center]
圖 2.9 調(diào)用庫(kù)函數(shù)2[/align]
在Calling Conventions 下拉列表框中選中stdcall(WINAPI),因?yàn)閂CI 庫(kù)函數(shù)使用的是stdcall 調(diào)用約定。
Parameter 框中的return type 不變。Type 框中選Numeric。Data Type 框中選Unsigned 32-bitInterger。即指定返回32 位整形數(shù)。
單擊Add a Parameter After 按鈕,Parameter 框中的選項(xiàng)變?yōu)閳D 2.10 所示。將缺省值agr1改為DevType,因?yàn)樵赩CI_OpenDevice 函數(shù)聲明中定義了參數(shù)DevType。
[align=center]
圖 2.10 調(diào)用庫(kù)函數(shù)3[/align]
Type 框中選Numeric,并在Data Type 框中選Unsigned 32-bit Integer。表示將編程時(shí)指定的LabVIEW 數(shù)據(jù)類型為32 位無(wú)符號(hào)整型。Pass 框中選擇Value。
同樣,按以上步驟添加DevIndex、Reserved 參數(shù)。
單擊OK 按鈕退出這個(gè)對(duì)話框。調(diào)用庫(kù)函數(shù)節(jié)點(diǎn)變?yōu)閳D 2.11 所示中的情況。圖中的參數(shù)端口由上到下分別為return type、DevType、DevIndex 和Reserved。每個(gè)端口均有一個(gè)輸入端和一個(gè)輸出端,左邊的端口為輸入端,右邊的端口位輸出端。因?yàn)榈谝粋€(gè)端口是函數(shù)的返回值,所以沒有輸入端,在圖中可以看到其輸入端為填充的藍(lán)色。其他端口則是函數(shù)的參數(shù),如果參數(shù)的類型是指針的話,可以通過(guò)參數(shù)的輸出端輸出數(shù)據(jù)。在其他情況下,不需要使用參數(shù)的輸出端。
[align=center]
圖 2.11 調(diào)用庫(kù)函數(shù)程序框圖[/align]
2.3 應(yīng)用示例
應(yīng)用示例Demo 演示了在LabVIEW7.0 下如何使用VCI 庫(kù)函數(shù)。其界面如圖 2.12 所示。
[align=center]
圖 2.12 demo 界面[/align]
在Demo 中實(shí)現(xiàn)了數(shù)據(jù)的收發(fā),并將在CAN總線上收發(fā)的數(shù)據(jù)在列表示圖中顯示。Demo程序當(dāng)中有3 個(gè)主要的While 循環(huán):主循環(huán)、發(fā)送數(shù)據(jù)循環(huán)和接收數(shù)據(jù)循環(huán)。這三個(gè)循環(huán)是并行運(yùn)行的。其中,主循環(huán)處理與用戶交互的界面,并通過(guò)用戶事件TREvent 與發(fā)送數(shù)據(jù)循環(huán)和接收數(shù)據(jù)循環(huán)通信。
在主循環(huán)中使用事件驅(qū)動(dòng)機(jī)制處理用戶在前面板的操作。打開設(shè)備的程序框圖如圖2.13 所示。在圖中調(diào)用VCI_OpenDevice 函數(shù)打開設(shè)備,如果打開成功,則調(diào)用VCI_InitCAN函數(shù)初始化設(shè)備,成功的話就處理一下前面板控件的狀態(tài)。
[align=center]
圖 2.13 打開設(shè)備框圖[/align]
圖 2.14 所示是接收數(shù)據(jù)的程序框圖。接收數(shù)據(jù)的過(guò)程是在一個(gè)while 循環(huán)中,這個(gè)循環(huán)在程序已開始時(shí)就一直運(yùn)行,直到前面板上的stop 按鈕被按下并在其Value Change 事件中使stop2 的值變?yōu)镕alse 時(shí)才停止。在循環(huán)當(dāng)中,只有設(shè)備已經(jīng)啟動(dòng)時(shí)才會(huì)進(jìn)行讀操作。在Demo 中VCI_Reveive 函數(shù)一次只讀取一幀,輸出的數(shù)據(jù)保存到VCI_CAN_OBJ_R 結(jié)構(gòu)中,如果VCI_Reveive 函數(shù)執(zhí)行成功的話,就把接收到的數(shù)據(jù)通過(guò)事件傳遞給主循環(huán)處理。
[align=center]
圖 2.14 接收數(shù)據(jù)[/align]
發(fā)送數(shù)據(jù)的過(guò)程與接收數(shù)據(jù)的過(guò)程相似。當(dāng)前面板上的Transmit 按鈕被按下時(shí),才會(huì)把VCI_CAN_OBJ_T 結(jié)構(gòu)中的數(shù)據(jù)通過(guò)VCI_Transmit 函數(shù)發(fā)送到CAN 總線上。發(fā)送成功后,生成一個(gè)TREvent 事件,并通過(guò)這個(gè)事件把VCI_CAN_OBJ_T 結(jié)構(gòu)的內(nèi)容傳遞給主循環(huán)顯示。
[align=center]
圖 2.15 發(fā)送數(shù)據(jù)[/align]
3、VCI 函數(shù)調(diào)用參考
在LabVIEW 中使用Calling Library Function Node 調(diào)用VCI 庫(kù)函數(shù)的配置如下各表所示。
3.1 VCI_OpenDevice
3.2 VCI_CloseDevice
3.3 VCI_InitCan
[align=center]
[/align]
3.4 VCI_ReadBoardInfo
3.5 VCI_ReadErrInfo
[align=center]
[/align]
3.6 VCI_ReadCanStatus
3.7 VCI_GetReference
[align=center]
[/align]
3.8 VCI_SetReference
3.9 VCI_GetReceiveNum
3.10 VCI_ClearBuffer
3.11 VCI_StartCAN
3.12 VCI_ResetCAN
[align=center]
[/align]
3.13 VCI_Transmit
3.14 VCI_Receive
[align=center]
[/align]