DCS數據采集技術_第1頁
DCS數據采集技術_第2頁
DCS數據采集技術_第3頁
DCS數據采集技術_第4頁
DCS數據采集技術_第5頁
已閱讀5頁,還剩56頁未讀 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

第五章DCS數據采集技術10頁1.6萬字

目前各種I/O設備提供的對外數據接口可分為以下幾類:

1,數字通訊接口,涉及串口類,以太網(TCP/IP協議)類,現場總線類,儀器總線類

通訊接口(如GPIB等).

2,模擬量通道輸出,設備直接提供4-20mA,1-5V或繼電器接點信號等.

力控具有世界上大部分主流設備的I/O接口程序,對GPIB總線以及Honeywell,

Yokogawa,Foxboro,Fisher-Rosemount等廠家的DCS也可以支持.

除通常意義上的數據采集外,力控可以運用采集到的實時數據對裝置進行實時建模,

插入力控自己的先進控制控件,實行先進控制.

5.1對一個設備上的數據定義不同的采集周期

假如一臺設備上有1000個實時數據需要采集,而在這1000個數據中只有10個是經常

刷新且需要密切監(jiān)視的,其余990個所有是輔助數據,但是也需要時常查看.假如把這1000

個數據同等地對待,采用統(tǒng)一的掃描周期進行采集,就會嚴重影響10個重要數據的刷新速

度.如何既保證1000個數據都可以采集,又保證這10個重要數據的采集速度呢有兩種

辦法:辦法1:為一個設備定義兩個邏輯設備,使其具有不同的采集周期,如圖5-1所示.

但是這種方法定義的最長掃描周期為10分鐘.

辦法2:不用上面的辦法,一臺設備只定義一個設備名稱也可以達成規(guī)定.由于力控的I/O

驅動對畫面中不顯示并且沒有組態(tài)歷史趨勢和報警的數據是不采集的,僅當畫面中顯示這個

數據時才進行采集.因此將不常用的數據單獨組態(tài)在一個或幾個畫面中,使用完畢立即關閉

就不會影響整個采集速度.這種方法合用于存在有大量不需要快速更新的數據的情況.

圖5-1

5.2合理設立掃描周期,避免引起設備死機

有些I/O設備內部只有一個CPU,同時負責數據通訊和計算,假如在力控上設立的數

據掃描周期太快容易使設備死機,因此在設立這一參數時應當慎重,最佳通過多次實驗擬定

一個合適的掃描周期.一般的串口設備的掃描周期可設在10-100毫秒之間.

5.3通過撥號方式與I/O設備通訊

力控的所有串口I/O驅動程序都支持通過MODEM以撥號方式與設備通訊.只要對的設

置電話號碼即可,如圖5-2所示.

1

5.4通訊狀態(tài)監(jiān)視,設備狀態(tài)數據的讀取

力控為每一個I/O設備自動定義了一個系統(tǒng)變

量,假如系統(tǒng)中有一個設備PLC1,則每當PLC1不能

與力控正常通訊時,系統(tǒng)變量$IOPLC1的值就會被

置為1.I/O設備故障屬于系統(tǒng)報警.計算機通訊口

故障,電纜,PLC端通訊口的故障,PLC通訊口與計

算機通訊口的參數設立不一致都會導致這種結果.還

有一種也許,就是數據連接項錯誤,假如計算機的命

令發(fā)給PLC的只讀參數,PLC是不會予以理睬的.

5.5如何用I/O驅動程序調試I/O設備

力控的I/O驅動程序有數百個,針對每

一種設備都有一個獨立的程序.當力控實時

數據庫DB沒有啟動時,單獨啟動I/O驅動可

以作為本地I/O設備調試工具使用.此時可以

測試計算機與I/O設備的通訊情況,摸索最佳

的掃描周期.

菜單"設立[S]/參數"用來規(guī)定I/O通訊

過程中是否顯示計算機發(fā)出和設備響應的通

訊信息.如圖5-3所示.

菜單"工具[T]/工具"用來在不啟動實時

數據庫及其數據連接項的情況下執(zhí)行與I/O

設備的通訊.彈出對話框如圖5-5上部所示.此

時可以按"參數設立"按鈕設立通訊參數,如

圖5-6和5-7所示,重要是設立串口的DCB參

數,IP地址等.

圖5-2

圖5-3圖5-4

對的設立參數后,按"連接設備"按鈕,如

果成功的話,"連接設備"按鈕的標

題變成"斷開連接",表達可以收發(fā)

數據了.假如在"參數設立"中設立

"周期性發(fā)送周期"不為0,則在"連

接設備"后會出現"周期發(fā)送"按鈕,

否則出現"手動發(fā)送"按鈕.使用"

周期發(fā)送"或"手動發(fā)送"按鈕,可以

周期性或一次性地發(fā)送編輯框中

的數據了.

編輯框中數據的格式缺省是

混合方式的,假如你想發(fā)送編輯框

中的數據,這也是唯一的數據類型,

它的形成規(guī)則如下:任何ASCII碼

(除'[')可以直接輸入,'['可以使用

"[[]"來輸入;"[]"內是由''(空格)分隔的轉意字符,它們的意義為:

圖5-5

'[':用來輸入'[';

2

'*':在發(fā)送數據是表達延時1毫秒

圖5-6

'#':在發(fā)送數據是表達延時10毫秒

'$':在發(fā)送數據是表達延時100毫秒

'!':在發(fā)送數據是表達延時1000毫秒

'\':表達它后面的數據是十進制的(缺省是16進

制)

''(空格):作為分隔符,任何未定義的字符都可以

作為分隔符,最佳使用空格.

0~9:可以用來輸入10進制或16進制數據.

A~F/a~f:可以用來輸入16進制數據.

例子:abcv[[30*#$!]345相應的16進制數據

串為:

61H,62H,63H,76H,5BH,30H,33H,34H,35H;而

且在30H之后有1111毫秒的延時.

當用在其它情況(不是用來發(fā)送數據)時,唯一

的差別是沒有了延時的概念.

"其它工具":校驗使用混合格式的數據,計算常

用的校驗碼,ASCII碼表顯示使用16進制和

10進制顯示的ASCII碼表,各種數據轉換把混合格式,16/32位整數,32位浮點數等轉換位十

幾種常用數據格式,除混合格式外,其它數據格式為直接用空格分隔的數據串

圖5-7

5.6如何開發(fā)I/O設備驅動程序

在力控中有一個SDK工具包,叫做FIOSSDK,可以開發(fā)硬件設備與計算機的通訊接

口程序.最簡樸的只需要編寫幾個函數就可以可以做自己的I/O驅動,現在支持的硬件類型

有串口(RS485/232/422),網絡,板卡,硬件廠家提供DLL等多種方式的通訊類型.在該SDK

中開發(fā)自己的通訊接口,不需要關心硬件和計算機通訊的細節(jié),只需要了解通訊協議就可以

了.

假如通訊協議很復雜,該SDK中提供了足夠靈活的手段滿足不同層次的需要.例如:

在設備初始化時發(fā)什么命令或做其他解決,動態(tài)改變硬件通訊參數等等.

5.6.1FIOS開發(fā)包簡介

FIOS負責完畢與各種I/O設備進行數據互換.一方面,它把從I/O設備采集到的實時

過程數據發(fā)送給數據庫DB,另一方面,從DB發(fā)出的下置數據也通過FIOS發(fā)送給I/O設備.

根據監(jiān)控PC與I/O設備之間通信機制的不同,FIOS重要支持兩種工作方式:同步方式

與異步方式.

異步方式合用以下一類I/O設備:這類I/O設備一般可以獨立運營,與監(jiān)控計算機之間

通過串口,網絡或MODEM連接.與監(jiān)控計算機之間通過明確的消息傳送(文本或二進制

消息)完畢數據互換.數據互換過程為異步方式.

同步方式合用以下一類I/O設備:這類I/O設備或者依賴PC運營(如:插在PC插槽

內),或者獨立運營.但與監(jiān)控計算機之間重要通過直接訪問方式進行數據互換,具體形式

涉及:寄存器直接訪問(如:板卡),API函數調用,ActiveX控件訪問等.數據互換過程為

同步方式.

下面列舉了FIOS可實現的一些基本功能:

底層通信功能:1),串口通信,涉及:RS232/422/485.2),TCP/IP網絡通信.3),MODEM

3

通信,通過模擬MODEM在電話網上通信.4),寄存器訪問,如:各種DAS板卡.5),其

它.

鏈路控制功能:用M代表Master,即上位機(監(jiān)控PC工作站);S代表Slaver,即下

位機(各種I/O設備).對于異步方式,FIOS支持多種鏈路控制方式.鏈路控制方式支持以

下幾種方式:1),M請求,S應答方式.2),M請求,S無應答方式.3),S積極發(fā)送,M

被動等待.此外,對一次完整數據解決(讀或寫)過程,支持以下方式:1),1次請求,0

次應答方式.2),1次請求,1次應答方式.3),1次請求,多次應答方式.4),0次請求,1

次應答方式.5),多次請求,多次應答方式.

冗余功能:FIOS支持的冗余方式涉及:1),單監(jiān)控站,雙I/O冗余.2),雙監(jiān)控站,單

I/O冗余.3),雙監(jiān)控站,雙I/O冗余.4),對于總線型設備(如RS485),提供總線監(jiān)測功

能,可實現對冗余通信網絡的保護和監(jiān)測.

前端機功能:DB與IOServer不在同一工作站上,IOServer運營在前端機上,前端機

與操作站之間通過串口,TCP/IP網絡或MODEM進行通信.

硬件測試與遠程調試功能:使用FIOS可完畢對I/O設備的簡樸測試功能.此外可實現

遠程調試.

故障診斷與恢復功能:FIOS提供診斷機制,在較短的采集周期內報告故障的發(fā)生,診

斷出下位機故障情況.當下位機更換或恢復后,不需要對FIOS及相關程序進行任何人工干

預,而在較短時間自動恢復通信.當某一臺,幾臺或部分通道發(fā)生故障,FIOS要自動優(yōu)化

通信鏈,使其與其他下位機或通道之間的通信不受影響,保證通信效率.

界面顯示功能:為測試,調試,運營維護方便,FIOS提供顯示界面,可顯示涉及:發(fā)

送,應答,狀態(tài)信息,啟動時間,分包數,分包信息,成功通信次數(發(fā)送次數,成功應答

次),故障次數等信息.

歷史數據解決功能:對于某些能保存歷史數據的設備(如:無紙記錄儀等),FIOS能將

采集到的歷史數據恢復到數據庫DB中.

5.6.2FIOSSDK編程方式

FIOSSDK提供了一種簡潔的,面向對象的編程方式以縮短開發(fā)時間,減少開發(fā)難度.

FIOSSDK提供標準的開發(fā)接口和程序模板,程序員僅需要根據I/O設備的具體通信協

議或驅動接口說明,填寫幾個掃描函數的實現代碼,進行必要的調試與測試,即可完畢一種

FIOS的開發(fā).

FIOS提供的開發(fā)工具封裝了大部分程序員不必關心的技術環(huán)節(jié),如:底層通信功能(串

口通信,網絡通信等),設備超時解決,設備故障診斷等.同時FIOS提供各種調試工具,

方便程序員進行系統(tǒng)測試.

FIOS開發(fā)環(huán)境完全基于32位Windows平臺.它使用動態(tài)鏈接庫(DLL)技術將程序

員開發(fā)的代碼整合到力控系統(tǒng)中.FIOS提供應程序員的開發(fā)接口為API函數和C++類庫.

5.6.3FIOSSDK組件及示例程序

FIOSSDK重要由4部分組成:設備組態(tài)接口(Iodevui),數據連接組態(tài)接口(Ioitemui),

編程接口Ioapi和描掃程序Ioscan.Iodevui:負責管理設備組態(tài)過程.Ioitemui:負責管理數據

連接組態(tài)過程.Ioapi:負責完畢與I/O設備間的數據互換,涉及:對通信協議的解析,數據

格式的轉換等.Ioscan:重要完畢對Ioapi部分的dll代碼進行周期性地掃描.同時完畢與I/O

設備的底層通信(串口通信,網絡通信等),以及設備超時解決,設備故障診斷等.Ioscan

還負責與數據庫DB之間的通信與協作.它把從I/O設備采集到的數據經Ioapi解析轉換后

提交給DB,或將DB下置給I/O設備的數據經Ioapi解析轉換后寫入I/O設備.Ioscan是FIOS

SDK提供的一個標準軟件工具.程序員僅需要開發(fā)Iodevui,Ioitemui,Ioapi三部分的代碼.

示例程序

4

FIOSSDK提供了兩個示例:DemoController與DemoModbus.

DemoController是一個初級編程示例,它能引導初學者快速掌握開發(fā)FIOS的基本概念

和方法.DemoModbus是一個實用編程示例,它采用標準MODBUS通信協議,通過該示例,

可以掌握在力控平臺上開發(fā)標準MODBUS設備I/O驅動程序的方法.

FIOSSDK的所有內容都是在安裝在力控自動安裝的,在力控目錄下的子目錄Fiossdk

中.FIOSSDK重要包含以下幾部分內容:Examples,程序示例,仿真程序.Include,頭文

件.Manual,文檔說明.Utility,調試工具.

這2個示例具有一定的代表性,它們體現了FIOSSDK的重要功能.FIOSSDK提供了

這2個示例的所有源代碼,在它們的基礎上,稍做改動,就可以開發(fā)出新的FIOS.我們把

象這2個示例源程序同樣具有模板作用的程序稱為I/O模板程序.為了提高開發(fā)效率,我們

建議盡量使用I/O模板程序,這在一定限度上,也減少,減少了編程錯誤的發(fā)生.

常用術語

我們把FIOSDK中經常涉及的一些概念給出定義,有些術語雖然是通用名詞,但在

FIOSDK中有特定含義.這些術語有一些在前文給出了解釋,有一些會在后文中陸續(xù)給出解

釋.

FIOSForceControlI/OServer,即力控I/O驅動程序

FIOSSDKFIOS軟件開發(fā)工具包

FCINSTDIR力控軟件系統(tǒng)的安裝目錄

FCAPPINSTDIR用力控創(chuàng)建的工程應用的目錄

IOID唯一區(qū)別各個I/O驅動程序的I/O標志

Iodevui設備組態(tài)接口

Ioitemui數據連接組態(tài)接口

Ioapi編程接口

Ioscan掃描程序

I/O模板程序FIOS工SDK附帶示例的源程序

I/O配置文獻設備組態(tài)時的缺省參數設立保存文獻

連接項結構保存數據連接信息的數據結構IOITEMDEF

I/O描述文獻定義設備的類別,廠商,型號,通信方式等參數的文本文獻Iodesc.txt

程序員在本文檔范圍內專指用FIOSSDK進行開發(fā)的技術人員

掃描函數包含在Ioapi中的API函數,它們由掃描程序周期掃描.掃描函數完畢

對設備數據解析及格式轉換

IOCInputOutputClass(輸入輸出類庫)的縮寫.

5.6.4設備組態(tài)接口IODEVUI.DLL

I/O描述文獻

在使用力控進行組態(tài)時,一般均涉及定義I/O設備的過程.在定義設備時,要選擇設

備的類別(PLC,智能儀表等),廠商,設備型號或通信協議,然后根據設備通信方式(串

口方式,網絡方式,其它方式等)設立參數.以上關于一種設備的信息(類別,廠商,型號,

通信方式等)完全是由I/O描述文獻決定的.I/O描述文獻是一個標準文本文獻,根據其規(guī)

定的填寫格式,由程序員根據具體設備自行填寫.下面介紹I/O描述文獻的填寫格式.

I/O描述文獻的文獻名為IODESC.TXT,安裝目錄為:"FCINSTDIR\IOServers\IOID\".

IO文獻說明格式為:類別;廠商或IO程序描述;執(zhí)行文獻名稱

5

子類型1;類型號;資源標志;提供設備地址

子類型2;類型號;資源標志;提供設備地址

......

注意,子類型號不能反復.表達回車換行.最上面一行是驅動程序的總體描述,

涉及三項.各項之間必須以分號";"分隔.各項內容不能具有分號";".

各項含義如下:類別,驅動程序所屬類別,現分為以下幾類:PLC,智能儀表,智能模

塊,變頻器.程序員也可以自行擴展.廠商或IO程序描述,I/O設備生產廠商名稱,協議

名稱,如西門子.執(zhí)行文獻名稱,I/O驅動程序(運營程序)的名稱,如opto_drv.exe

接下來幾行為驅動程序所包含的設備類型的描述,如西門子涉及S5,S7等,每一子類別一

行,每行涉及三項,各項之間必須以分號";"分隔.各項內容不能具有分號";".各項含義

如下:子類型,設備類型描述.如S5.類型號,設備類型編號,類型號不能反復.合法的

值為0,1,2,3等.使用計算機資源,使用計算機何種通信資源通信,合法的值為0,1,

2等.含義如下:0,同步通信方式;1,串口通信方式;2,TCP/IP網絡通信方式;3,MODEM

通信方式;4,板卡方式;5,并口通信方式.提供設備地址:1表達需要指定設備地址,否則

表達不需要設備地址.

管理程序會自動將相同廠商或IO程序描述相同的驅動程序歸為同一樹下.

開發(fā)Iodevui

力控組態(tài)環(huán)境DRAW中的設備管理功能提供了一個根據I/O描述文獻可靈活配置的標

準設備組態(tài)接口.這個組態(tài)接口提供了一些對常用設備參數進行設立的方法.如:設備名稱,

設備地址,通信端口,端口參數等.如下圖所示:

對于很多設備,假如標準設備組態(tài)接口可以滿足規(guī)定,就不再需要自己編寫Iodevui接

口程序了.比如示例DemoController采用的就是標準設備組態(tài)接口.而示例DemoModbus

由于涉及一些特殊的參數設立,就需要自己編寫Iodevui接口程序了.

因此,Iodevui接口程序事實上就是對標準設備組態(tài)接口的一個補充和擴展,并可由程

序員靈活控制.Iodevui要以DLL形式提供.該DLL必須是MFC擴展DLL.該DLL的缺

省文獻名稱為IODEVUI.DLL,該文獻必須安裝在目錄"FCINSTDIR\IOServers\IOID\"下.

在進行設備組態(tài)時,力控的I/O設備管理程序會自動檢查在目錄"FCINSTDIR\IO

Servers\IOID\"下是否存在IODEVUI.DLL文獻.假如存在,則一方面根據I/O描述文獻的格式,

調出標準設備組態(tài)接口界面,當用戶確認后,再調出Iodevui組態(tài)接口界面;若不存在該文

件,則只調出標準設備組態(tài)接口界面.

示例DemoModbus的Iodevui接口程序可以做為開發(fā)Iodevui的模板程序.我們結合示

例DemoModbus的Iodevui模板程序具體解釋實現過程.查看頭文獻Iodevui.h可以發(fā)現,

Iodevui.dll重要實現3個輸出函數:

6

extern"C"AFX_EXT_APIlongAddIoDev(constchar*szDeviceName,intnType);

extern"C"AFX_EXT_APIlongModIoDev(constchar*szDeviceName);

extern"C"AFX_EXT_APIlongDelIoDev(constchar*szDeviceName);

在進行設備組態(tài)時,當增長一個設備時,力控設備管理程序會自動調用AddIoDev()函

數;當修改一個已創(chuàng)建設備時會調用ModIoDev()函數;當刪除一個設備時會調用DelIoDev()

函數.

其中,參數szDeviceName為I/O設備名稱(輸入值,組態(tài)時由用戶指定).nType為設

備子類型號,由程序員在I/O描述文獻中指定.返回值為0表達操作成功;其它表達操作失

敗.為了較好地實現程序結構化,本模板程序提供了一個CDevMan類對設備及組態(tài)操作過

程進行管理.Iodevui.dll的3個輸出函數AddIoDev(),ModIoDev()DelIoDev()的具體實現過

程是在CDevMan的三個成員函數Add(),Mod()和Del()中實現的.

一方面看一下Add()的實現代碼:

//**********************************************************************

//添加I/O設備

//szDeviceName,設備名稱(輸入值)

//nType,設備子類型(用于一個驅動程序驅動多種類型設備)(輸入值)

//返回值說明:0,操作成功;其它,操作失敗

//**********************************************************************

longCDevMan::Add(constchar*szDeviceName,intnType)

{

if(Find(szDeviceName))

{

AfxMessageBox("該數據源名已經存在!");

return-1;

}

CDevice*pDev=newCDevice(szDeviceName,nType);

if(CallDialog(pDev))

{

m_list.AddTail(pDev);

Store();

return0;

}

else

deletepDev;

return-1;

}

程序的一開始,調用Find()函數來查找是否已有相同的設備名存在,假如有給出提醒并

返回-1表達操作失敗,否則生成一個CDevice對象并調用CallDialog函數來顯示一個對話框,

讓用戶做進一步的選擇,假如用戶進行確認,操作成功,它把此CDevice對象加入設備鏈表

中,并調用Store函數來保存設備信息.此外兩個函數和它類似.

Store()函數如下:

voidCDevMan::Store()

{

CFilefile;

7

if(file.Open((constchar*)("ddeacc.dat"),CFile::modeReadWrite|CFile::modeCreate))

{

CArchivear(&file,CArchive::store);

Serialize(ar);

ar.Close();

file.Close();

}

}

該函數它先打開ddeacc.dat文獻,假如不存在,就建立此文獻.然后調用序列化函數對

它進行保存,最后關閉此文獻.再看一看序列化函數:

voidCDevMan::Serialize(CArchive&ar)

{

TRY

{

CObject::Serialize(ar);

m_list.Serialize(ar);

}

CATCH(CFileException,e)

{

AfxMessageBox("文獻版本不匹配!");

}

END_CATCH

}

該函數對m_list(由CDevice類實例組成)進行序列化.在調用各個CDevice類實例的

序列化函數時,假如是讀取操作,會依次創(chuàng)建CDevice實例,并調用CDevice的序列化函數,

隨后把CDevice實例加入m_list鏈表.具體保存和讀取的變量數據在CDevice類中控制,也

就是說程序員針對不同的設備可以改寫CDevice類,定義不同的成員變量,記錄設備的不同

的屬性,對CDevice類重載Serialize即可實現設備的保存,加載,增長,刪除和修改等功能.

我們再看一下CDevice類序列化的實現過程:

voidCDevice::Serialize(CArchive&ar)

{

if(ar.IsStoring())

{

ar<<m_csName;//設備名稱

ar<>m_csName;

ar>>m_dwData;

}

}

假如是保存操作,序列化函數會將參數自動存盤;假如是讀取操作,序列化函數會從磁

盤上讀取參數值.

8

察看CallDialog函數可以發(fā)現,它生成了一個對話框,讓用戶做相應的選擇,然后把用

戶選擇的信息保存在CDevice類的成員函數中,以便于儲存.

整個程序框架使用CDevice類來保存設備的信息.在CallDialog函數中使用一個對話框,

來讓用戶進行選擇設備的屬性,并且在CallDialog函數中把它保存在CDevice類中.所以對

于一個新的設備,程序員所要做的工作就是,分析設備的協議查看是否僅使用描述文獻就可

以完畢設備的定義,假如不能,那么應當編制IoDevUi.dll.這時應分析應當增長哪一些屬

性,定義哪一些CDevice類的成員變量,以及顯示什么樣的對話框,讓用戶做什么樣的選擇.

所以程序員的工作重點在于修改CDevice類,增長成選變量,并重載它的Serialize函數,然

后修改對話框,讓用戶做不同的選擇,并把選擇保存在CDevice類的成員變量中即可.

在該示例中,我們定義了2個設備參數:

CStringm_csName;//設備的名稱

DWORDm_dwData;//用于保存數據

這樣只需在對話框中對m_csName和m_dwData賦值即可.

//***********************************************************//

//調用對話框定義數據源

//pDev數據源指針

//返回值true成功

//***********************************************************//

boolCDevMan::CallDialog(CDevice*pDev)

{

ASSERT(pDev);

CDevDefdlg;

dlg.m_name=pDev->m_csName;

dlg.m_nProtocol=(pDev->m_dwData&0x01);

dlg.m_inPackLong=((pDev->m_dwData)>>8)&0xff;

if(IDOK==dlg.DoModal())

{

pDev->m_csName=dlg.m_name;

pDev->m_dwData=(dlg.m_nProtocol&0x01);

//m_dwData的第0位為1表達是RTU方式0表達ASCII方式

pDev->m_dwData=(pDev->m_dwData)|(dlg.m_inPackLongcsPath+="\\ddeacc.dat";//數據保存在了工程目錄的ddeacc.dat中

DWORDdata;

CStringstrtemp;

9

shorttemp;

CFilefile;

if(file.Open((constchar*)csPath,CFile::modeRead))//打開該文獻

{

CArchivear(&file,CArchive::load);

//讀取的第一個數據是定義的設備的個數,

//但是由于可以通過GetDeviceCount函數得到設備的個數,

//所以這里把讀到的數據簡樸的丟掉.

ar>>temp;

intnDevCnt=pManager->GetDeviceCount();

for(inti=0;iGetDevice(i);

ar>>strtemp;//讀取設備的名字

ar>>data;//讀取數據

//這兩句在講到Ioapi.dll時再進行介紹

pDevice->SetPrivateData(1,long(data&1));

pDevice->SetPrivateData(2,long((data>>8)&0xff));

DCBdcb;

pDevice->GetDCB(dcb);

dcb.fBinary=TRUE;

dcb.fOutxCtsFlow=FALSE;

dcb.fOutxDsrFlow=FALSE;

dcb.fDtrControl=DTR_CONTROL_DISABLE;

dcb.fNull=FALSE;

dcb.fRtsControl=RTS_CONTROL_DISABLE;

pDevice->SetDCB(dcb);

}

ar.Close();

file.Close();//關閉文獻

}

else

{

strtemp="對不起,沒有找到";

strtemp+=csPath;

strtemp+="程序不能運營!!!";

AfxMessageBox(strtemp);

PostQuitMessage(0);//沒有找到文獻,給出提醒,并終止程序的運營.

}

}

注意序列化的內容和順序必須和IoDevUi.dll一致,否則會導致程序運營時產生錯誤.

5.6.5Ioitemui介紹及編程示例

在用力控進行組態(tài)時,把數據庫DB中的點參數與某種設備的具體通道建立連接的過

10

程被為數據連接過程.在進行數據連接時,一般還要指定數據轉換格式,數據長度等參數.

數據連接過程對于不同的I/O設備,其形式和內容也許完全不同.因此必須針對不同的

I/O設備,設計相應的數據連接形式,保存各種參數信息.

Ioitemui接口重要完畢的兩部分功能,一是為用戶進行數據連接組態(tài)時提供一個界面;

此外就是將用戶組態(tài)的設備參數信息用某種格式保存起來,以便在開發(fā)編程接口Ioapi時使

用.我們定義了一個數據結構來保存設備參數信息,這就是數據連接項結構(下面簡稱連接

項結構)IOITEMDEF.

IOITEMDEF定義在Ioitemui.h中:

typedefstructIoItemDefStru

{

charstr[64];

longn[8];

}IOITEMDEF;

這個結構是一個通用結構,由程序員自己賦值,自己解釋.Ioitemui要以DLL形式提

供.該DLL必須是MFC擴展DLL.該DLL的缺省文獻名稱為IOITEMUI.DLL,該文獻必

須安裝在目錄"FCINSTDIR\IOServers\IOID\"下.

Ioitemui的工作過程如下:

在進行數據連接組態(tài)時,力控的DBMAN管理程序會自動檢查在目錄"FCINSTDIR\IO

Servers\IOID\"下是否存在IOITEMUI.DLL文獻.假如存在,則調出數據連接組態(tài)接口界面.

下面介紹如何編寫Ioitemui接口程序.

Ioitemui.dll重要實現1個輸出函數:extern"C"AFX_EXT_APIlongDoItemDlg(constchar

*szDeviceName,intnType,IOITEMDEF&item,char*szDesc,intnFlag);

其參數說明如下:

szDeviceName,設備名稱(輸入值).假如在力控中定義了一個設備Device1,那么在給

該設備組點時,傳給DoItemDlg的szDeviceName值就是字符串"Device1".

nType,設備子類型(用于一個驅動程序驅動多種類型設備)(輸入值).它的值在

IODESC.TXT中指定(參見上一章對I/O描述文獻的介紹).

item,數據連接項結構(返回值).需要注意的是,item除了是輸出值外,也是輸入值,

DBMAN管理程序每次調用DoItemDlg()時,將上一次操作賦給item的值傳遞過來.

szDesc,數據連接項描述,用于DBMAN程序顯示的提醒信息.

nFlag,1表達增長數據連接項,2表達修改,0表達刪除(輸入值).其返回值0表達操作成

功.其它,操作失敗.

Ioitemui.dll的工作過程如下:

當用戶打開數據組點連接對話框時,選中了一個點,并按下增長,修改或刪除鍵,這時

就會調用Ioitemui.dll的DoItemDlg函數.程序員應當在此函數中,彈出一個對話框讓用戶

進行選擇,在用戶按下了OK鍵之后,把用戶的選擇保存在item中,以后編制Ioapi.dll時

可以運用這些信息.

編程示例

我們先結合示例DemoController介紹如何開發(fā)Ioitemui.

仿真器SimController的內部有數字區(qū)(DIO)和模擬區(qū)(AIO).DIO和AIO區(qū)通道范圍為:

0~255.每個DIO通道的數據的數值范圍為:0或1.每個AIO通道數據的數值范圍為:0~4095.

所以我們應當在DoItemDlg函數中彈出一個對話框,用戶可以在此對話框中選擇輸入通道

和內存地址.輸入通道有兩個選項DIO通道和AIO通道供用戶選擇,內存地址可以讓用戶

輸入0~255之間的數據.

11

我們介紹一下假如不使用I/O模板,如何自己生成一個新的Ioitemui工程:

在VC++環(huán)境下,選擇菜單命令new,選擇新建工程,工程名為Ioitemui,選擇"MFC

Appwizard(dll)"選項,在下一步DLL類型中選擇"MFCExtensionDLL"型,然后按下"Finish"

鍵.即可創(chuàng)建一個新的Ioitemui工程.

打開Ioitemui.cpp文獻,在文獻的開頭加入#include"Ioitemui.h",把Ioitemui.h拷入本工

程,然后在文獻的最后鍵入:

longDoItemDlg(constchar*strDataSour,intnType,IOITEMDEF&item,char*szDesc,intnFlag)

{

}

這就加入了dll的輸出函數.

打開示例DemoController的Ioitemui模板程序,它的DoItemDlg()函數實現過程如下:

longDoItemDlg(constchar*szDeviceName,

intnType,IOITEMDEF&item,char*szDesc,intnFlag)

{

CLinkDlgdlg;

dlg.item_n[0]=item.n[0];

dlg.item_n[1]=item.n[1];

switch(nFlag)

{

case0://刪除操作

return0;

//增長或修改操作

case1:

case2:

if(dlg.DoModal()==IDOK)

{

item.n[0]=dlg.item_n[0];

item.n[1]=dlg.item_n[1];

sprintf(szDesc,"%s",(LPCSTR)dlg.m_desc);

sprintf(item.str,"%s",(LPCSTR)dlg.m_desc);

return0;

}

break;

}

return1;

}

在這個模板程序里,還涉及一個對話框類CLinkDlg.這個對話框為用戶進行數據連接

組態(tài)時提供一個界面,其形式如下:

12

CLinkDlg類有2個成員變量:

CStringm_desc;//保存連接項描述

intitem_n[2];//item_n[0]保存數據區(qū)類型,0表達DIO,1表達AIO;

//item_n[1]保存地址

在CLinkDlg的WM_INITDIALOG消息函數中進行如下解決:

BOOLCLinkDlg::OnInitDialog()

{

CDialog::OnInitDialog();

//在此處設立值使對話框的顯示和是一次選擇相同,以利于執(zhí)行和上一次相近的操作

m_CtrlChannel.SetCurSel(item_n[0]);//設立操作選項為上一次的操作

m_nAddr=item_n[1];//設立地址為上一次的值

UpdateData(FALSE);

returnTRUE;

}

這些解決為了使對話框的顯示和上一次選擇相同,以利于執(zhí)行和上一次相近的操作.在

ONOK消息函數進行如下解決:

voidCLinkDlg::OnOK()

{

UpdateData(TRUE);//得到各個選項得值

CStringstring;

item_n[0]=m_CtrlChannel.GetCurSel();//保存操作選項

m_CtrlChannel.GetWindowText(m_desc);

item_n[1]=m_nAddr;//保存輸入的地址

m_desc+="起始地址:";

string.Format("%d",m_nAddr);

m_desc+=string;

CDialog::OnOK();

}

在這個函數里,把用戶組態(tài)的內容(數據區(qū)的選擇,地址的指定)保存在item_n,并根

據這些內容生成連接項描述.

5.6.6掃描程序IOSCAN

IOSCAN是FIOS的一個重要程序模塊.它負責完畢對IOAPI部分的DLL代碼進行周

期性地掃描.同時完畢與I/O設備的底層通信(串口通信,網絡通信等),以及設備超時處

理,設備故障診斷等.IOSCAN還負責與數據庫DB之間的通信與協作.它把從I/O設備采

集到的數據經IOAPI解析轉換后提交給DB,或將DB下置給I/O設備的數據經IOAPI解析

轉換后寫入I/O設備.

IOSCAN是FIOSSDK提供的一個標準軟件工具供程序員在調試和運營時直接使用.

13

FIOS開發(fā)工具包里提供了debug和release版本的IOSCAN程序,在目錄

"FCINSTDIR\Fiossdk\Utility"下可以找到它們.Debug版本的IOSCAN程序重要供程序員在

調試時使用,它能提供更為豐富的調試信息.在使用時,需要把IOSCAN.EXE以及配套的

幾個DLL文獻(即目錄"FCINSTDIR\Fiossdk\Utility\Debug"下的DLL文獻)拷貝到生成的

debug版本的IOAPI.DLL文獻的同一目錄下(注意:debug版本的IOAPI.DLL文獻必須配

合debug版本的IOSCAN程序,release版本的IOAPI.DLL文獻必須配合release版本的

IOSCAN程序).同時不要忘掉將IOSCAN.EXE的文獻名更改為要開發(fā)的I/O驅動的IOID

名稱.debug版本的IOSCAN需要程序員手工啟動或用VC++調試啟動.

5.6.7編程接口IOAPI.DLL

IOAPI是FIOS提供的最重要的一個編程接口.程序員的重要工作就是開發(fā)IOAPI部分

的程序代碼.

IOAPI提供了一組API函數和一些C++類庫.這組API函數規(guī)定了名稱,參數及返回

值,函數內容由程序員根據具有的I/O設備編程實現.C++類庫則為程序員提供各種獲取力

控I/O組態(tài)信息,參數設立信息,與數據庫DB進行數據互換等數據解決的方法.我們把這

組API函數稱為掃描函數,把這些C++類庫稱為IOC,IOC是InputOutputClass(輸入輸出

類庫)的縮寫.

程序員編寫的Ioapi最后要形成MFC的擴展動態(tài)鏈接庫(MFCExtensionDLL),掃描

函數是這個DLL的輸出函數.當力控系統(tǒng)運營時,力控FIOS的掃描程序Ioscan對Ioapi

中掃描函數部分的dll代碼進行周期性地掃描,它把從I/O設備采集到的數據經掃描函數解

析轉換后提交給DB,或將DB下置給I/O設備的數據經掃描函數解析轉換后寫入I/O設備.

歸結起來,開發(fā)Ioapi的重要內容就是用IOC編寫掃描函數.

IOC中的所有類庫所有以純虛類的形式提供,并且只有成員函數,沒有成員變量.目

前IOC中重要涉及4個類:CItem,CPacket,CDevice,CManager.

CItem,數據項類.

CPacket,數據包類.

CDevice,設備類.

CManager,管理器類.

一個FIOS實例創(chuàng)建一個CManager實例.用戶在組態(tài)時每定義一個設備,則創(chuàng)建一個

CDevice實例.CManager對所有的CDevice進行管理.一個CDevice實例,由一個或多個

CPacket實例組成,而每個CPacket實例又由一個或多個CItem實例組成.每個CItem實例,

相應數據庫DB中的一個點參數,也就是相應I/O設備的一個"點"(如:設備的一個通道,

一個參數等).

IOC提供的這4個類庫,事實上就是對以上所述的這幾種數據對象提供了一組操作方

法,以供程序員更加靈活的控制程序.

Citem類

CItem類提供了對數據項對象的一組操作方法.一個數據項對象包含的是數據庫DB中

的一個點參數與I/O設備中一個物理通道的映射關系.CItem使用的基本數據結構是

IOITEMDEF.一個CItem實例保存一個IOITEMDEF實例.IOITEMDEF的定義如下:

typedefstructIoItemDefStru

{

charstr[64];

longn[8];

}IOITEMDEF;

14

CItem類的定義如下:

classCItem:publicCObject

{

public:

virtualIOITEMDEF*GetItemStru()=0;//取得數據連接項結構指針

//設立連接項的可寫屬性,缺省時可寫的,bAttribute為TRUE設立為不可寫.

virtualvoidSetReadOnly(BOOLbAttribute=TRUE)=0;

//設立連接項的可讀屬性,缺省時可讀的,bAttribute為TRUE設立為不可讀.

virtualvoidSetWriteOnly(BOOLbAttribute=TRUE)=0;

virtualvoidSetData(shortsData)=0;//按短整型格式設立采集數據

virtualvoidSetData(longlData)=0;//按長整型格式設立采集數據

virtualvoidSetData(doublefData)=0;//按浮點型格式設立采集數據

virtualvoidSetData(char*szData)=0;//按字符串格式設立采集數據

//按字符串格式取得上一次用SetData()設立的采集數據

virtualvoidGetData(char*szData)=0;

//設立私有數據,offset范圍:0~3

virtualvoidSetPrivateData(unsignedshortoffset,longlPrivateData)=0;

virtuallongGetPrivateData(unsignedshortoffset)=0;//取得私有數據,offset范圍:0~3

virtualCPacket*GetPacket()=0;//取得本連接項類所歸屬的數據包指針

virtualCDevice*GetDevice()=0;//取得本連接項所歸屬的設備指針

virtualCManager*GetManager()=0;//取得IoScan管理器指針

//按浮點型格式設立歷史數據

virtualvoidSetHisData(HisInsDatStru*pHisInsDatStru,intnCount)=0;

};

各個函數的解釋如下:

1.IOITEMDEF*GetItemStru()

功能:取得數據連接項結構指針.

參數:無.

返回值:數據項結構指針.

舉例:

IOITEMDEF*pItemStru=pItem->GetItemStru();

longnCmdType=pItemStru->n[3];

2.voidSetReadOnly(BOOLbAttribute=TRUE)

功能:設立連接項的寫屬性,缺省時連接項是可寫的.

參數:TRUE:設立為不可寫;FALSE:設立為可寫.

返回值:無.

舉例:

for(inti=0;iGetItemCount();i++)

{

CItem*pItem=pPacket->GetItem(i);

pItem->SetReadOnly();

}

3.voidSetWriteOnly(BOOLbAttribute=TRUE)

功能:設立連接項的讀屬性,缺省時連接項是可讀的.

15

參數:TRUE:設立為不可讀;FALSE:設立為可讀.

返回值:無.

舉例:

for(inti=0;iGetItemCount();i++)

{

CItem*pItem=pPacket->GetItem(i);

pItem->SetWriteOnly();

}

4.voidSetData(shortsData)

功能:按短整型格式設立采集數據.

參數:短整形數據值.

返回值:無.

5.voidSetData(longlData)

功能:按長整型格式設立采集數據.

參數:長整型數據值.

返回值:無.

6.voidSetData(doublefData)

功能:按浮點格式設立采集數據.

參數:浮點數據值.

返回值:無.

7.voidSetData(char*szData)

功能:按字符串格式設立采集數據.

參數:字符串數據值.

返回值:無.

8.voidGetData(char*szData)

功能:按字符串格式取得上一次用SetData()設立的采集數據.

參數:存放最近一次設立的采集數據(字符串型數值)的字符串指針.緩沖區(qū)長度應不

小于32.

返回值:無.

舉例:

charszData[32];

pItem->GetData(szData);

9.voidSetPrivateData(unsignedshortoffset,longlPrivateData);

功能:設立私有數據.

參數:offset,私有數據的偏置,0~3;lPrivateData,長整型私有數據.

返回值:無.

備注:Ioscan自動為每個CItem實例分派了一塊由4個整型數(32位)組成的程序員

私有數據空間供程序員使用.程序員除了用這部分私有數據區(qū)保存數值外,也可以分派新的

內存空間,然后將內存指針保存在私有數據區(qū)內,但不要忘掉,在程序退出前,對的釋放新

分派的內存空間.

舉例:

char*pBuf=newchar[MAXCMDLEN];

pItem->SetPrivateData(3,(long)pBuf);

10.longGetPrivateData(unsignedshortoffset)

16

功能:取得私有數據.

參數:offset,私有數據的偏置,0~3;lPrivateData,長整型私有數據.

返回值:整型私有數據.備注:Ioscan自動為每個CItem實例分派了一塊由4個整型數

(32位)組成的程序員私有數據空間供程序員使用.程序員除了用這部分私有數據區(qū)

保存數值外,也可以分派新的內存空間,然后將內存指針保存在私有數據區(qū)內,但不要

忘掉,在程序退出前,對的釋放新分派的內存空間.

11.CPacket*GetPacket()

功能:取得本連接項類所歸屬的數據包指針.

參數:無

返回值:本數據項所歸屬的數據包指針.

舉例:CPacket*pPacket=pItem->GetPacket();

12.CDevice*GetDevice()

功能:取得本連接項所歸屬的設備指針.

參數:無

返回值:本連接項所歸屬的設備指針.

13.CManager*GetManager()

功能:取得Ioscan管理器指針.

參數:無

返回值:Ioscan管理器指針.

14.voidSetHisData(HisInsDatStru*pHisInsDatStru,intnCount)

功能:按浮點型格式設立歷史數據

參數:無

返回值:無

Cpacket類

CPacket類提供了對數據包對象的一組操作方法.一個數據包對象包含一個或多個數據

項對象.CPacket類的聲明如下:

classCPacket:publicCObject

{

public:

virtualintGetItemCount()=0;//取得包中數據連接項個數

virtualintAddItem(CItem*pItem)=0;//按先后順序加入數據連接項

virtualvoidInsertItem(unsignedshortnIndex,CItem*pItem)=0;//按索引插入連接項

virtualCItem*GetItem(intnIndex)=0;//按索引取得數據連接項指針

//設立包的可寫屬性,缺省時可寫的,bAttribute為TRUE設立為不可寫.

virtualvoidSetReadOnly(BOOLbAttribute=TRUE)=0;

//設立包的可讀屬性,缺省時可讀的,bAttribute為TRUE設立為不可讀.

virtualvoidSetWriteOnly(BOOLbAttribute=TRUE)=0;

//設立私有數據,offset范圍:0~15

virtualvoidSetPrivateData(unsignedshortoffset,longlPrivateData)=0;

virtuallongGetPrivateData(unsignedshortoffset)=0;//取得私有數據,offset范圍:0~15};

virtualvoidRepeatScan()=0;//反復掃描當前數據包

virtualCDevice*GetDevice()=0;//取得本數據包所歸屬的設備指針

virtualCManager*GetManager()=0;//取得IoScan管理器指針

};

17

下面詳述CPacket類的各個函數:

1.intGetItemCount()

功能:取得本數據包內數據項的個數.

參數:無.

返回值:本數據包內數據項的個數.

舉例:intnItemCnt=pPacket->GetItemCount();

2.intAddItem(CItem*pItem);

功能:按先后順序加入數據連接項.參數:加入數據包的數據項指針.

返回值:本數據包內數據項的個數.

舉例:

if(pPacket->GetItemCount()==0)

pPacket->AddItem(pItem);

3.voidInsertItem(CItem*pItem,unsignedshortnIndex)

功能:按指定位置加入數據連接項.

參數:pItem,加入數據包的數據項指針.nIndex,加入的數據項在數據包內的序號(從

0開始).

返回值:本數據包內數據項的個數.

4.CItem*GetItem(intnIndex);

功能:按序號取得數據連接項.

參數:nIndex,數據項在數據包內的序號(從0開始).

返回值:數據項指針.

舉例:

for(inti=0;iGetItemCount();i++)

{

CItem*pItem=pPacket->GetItem(i);

......

}

5..voidSetReadOnly(BOOLbAttribute=TRUE)

功能:設立數據包的寫屬性,缺省時數據包是可寫的.

參數:TRUE:設立為不可寫;FALSE:設立為可寫.

返回值:無.

舉例:

intnPacketCnt=0;

nPacketCnt=pDevice->GetPacketCount();

for(inti=0;iGetPacket(i);

pPacket->SetReadOnly();

}

6.voidSetWriteOnly(BOOLbAttribute=TRUE)

功能:設立數據包的讀屬性,缺省時數據包是可讀的.

參數:TRUE:設立為不可讀;FALSE:設立為可讀.

返回值:無.

7.voidSetPrivateData(unsignedshortoffset,longlPrivateData)

18

功能:設立私有數據.

參數:offset,私有數據的偏置,0~15;lPrivateData,長整型私有數據.

返回值:無.

備注:Ioscan自動為每個CPacket實例分派了一塊由16個整型數(32位)組成的程序

員私有數據空間供程序員使用.程序員除了用這部分私有數據區(qū)保存數值外,也可以分

配新的內存空間,然后將內存指針保存在私有數據區(qū)內,但不要忘掉,在程序退出前,

對的釋放新分派的內存空間.

舉例:

char*pBuf=newchar[MAXCMDLEN];

pPacket->SetPrivateData(3,(long)pBuf);

8.longGetPrivateData(unsignedshortoffset)

功能:取得私有數據.

參數:offset,私有數據的偏置,0~15;lPrivateData,長整型私有數據.

返回值:整型私有數據.

備注:Ioscan自動為每個CPacket實例分派了一塊由16個整型數(32位)組成的程序

員私有數據空間供程序員使用.程序員除了用這部分私有數據區(qū)保存數值外,也可以分

配新的內存空間,然后將內存指針保存在私有數據區(qū)內,但不要忘掉,在程序退出前,

對的釋放新分派的內存空間.

9.voidRepeatScan()

功能:反復掃描當前數據包.

參數:無

返回值:無

備注:對于異步工作方式,在采集數據時,一個數據包的采集數據也許需要多幀傳送,

或者一次采集過程需要多次請求棗應答過程.在這種情況下,在解析數據時,執(zhí)行該函

數,Ioscan將反復掃描當前數據包.

10.CDevice*GetDevice();

功能:取得本數據包所歸屬的設備指針.

參數:無

返回值:本數據包所歸屬的設備指針.

舉例:CDevice*pDevice=pPacket->GetDevice();

11.CManager*GetManager()

功能:取得Ioscan管理器指針.

參數:無

返回值:Ioscan管理器指針.

舉例:CManager*pManager=pPacket->GetManager();

Cdevice類

CDevice類提供了對設備對象進行操作的一組方法.一個設備包對象包含一個或多個數

據包對象.下面是CDevice的定義:

classCDevice:publicCObject

{

public:

//取得設備名稱

virtualCStringGetName()=0;

virtualintGetType()=0;//取得設備類型(如:串口類,網絡類等)

19

virtualintGetModel()=0;//取得設備型號

virtualCStringGetAddr()=0;//取得設備地址

virtualCStringGetNetAddr()=0;//取得IP地址或主機名稱

virtualCStringGetPhoneNumber()=0;//取得電話號碼

virtualintGetPort()=0;//取得串口設備端標語或網絡設備端口

virtualintGetUpdateCycle()=0;//取得數據更新周期常數(毫秒)

virtualintGetTimeOut()=0;//取得超時時間常數(毫秒)

//取得通信空閑時間常數(毫秒),用于決定是否按字節(jié)發(fā)送和每個字節(jié)之間的延時

virtualintGetIdleTime()=0;

//設立通信空閑時間常數(毫秒),用于決定是否按字節(jié)發(fā)送和每個字節(jié)之間的延時

virtualvoidSetIdleTime(unsignedshortnTime)=0;

virtualvoidGetDCB(DCB&dcb)=0;//取得DCB參數

virtualvoidSetDCB(DCBdcb)=0;//設立DCB參數

//設立向設備寫入數據的結果狀態(tài)

virtualvoidSetWriteStatus(BOOLbSuccess=TRUE)=0;

//設立私有數據,offset范圍:0~15

virtualvoidSetPrivateData(unsignedshortoffset,longlPrivateData)=0;

virtuallongGetPrivateData(unsignedshortoffset)=0;//取得私有數據,offset范圍:0~15

virtualvoidRepeatScan()=0;//反復掃描當前設備

//按LPCSTR格式顯示過程信息

virtualvoidShowProcessMessage(LPCSTRszMsg)=0;

//按CString格式顯示過程信息

virtualvoidRecordProcessMessage(constCString&csMsg)=0;

//按LPCSTR格式顯示事件信息,bNotifyDB決定是否提交給DB

virtualvoidShowEventMessage(LPCSTRszEvent,BOOLbNotifyDB=FALSE)=0;

//按CString格式顯示事件信息,bNotifyDB決定是否提交給DB

virtualvoidRecordEventMessage(constCString&csEvent)=0;

virtualintGetPacketCount()=0;//取得設備包含的數據包個數

//按索引取得數據包指針

virtualCPacket*GetPacket(unsignedshortnIndex)=0;

virtualCManager*GetManager()=0;//取得IoScan管理器指針

virtualintSend(char*chCommand,intnCommandLen)=0;//向設備寫入數據

virtualintGetItemCount()=0;//取得設備中數據連接項個數

virtualCItem*GetItem(intnIndex)=0;//按索引取得數據連接項指針

virtualvoidSetUnPublicized(BOOLbUnPublicized=TRUE)=0;//設立協議為未公開

virtualvoidSetDCBAfterSend(DCBdcb)=0;//設立DCB參數

//設立接受緩沖區(qū)大小(字節(jié))

virtualintSetAcceptBufferLength(intnNewAcceptBufferLength=1024)=0;

//設立發(fā)送緩沖區(qū)大小(字節(jié))

virtualintSetSendBufferLength(intnNewSendBufferLength=1024)=0;

//設立一次從串口讀取的字符串塊大小(字節(jié))

virtualintSetReadDataBufferLength(intnNewReadDataBufferLength=128)=0;

};

下面詳述CDevice類的各個函數:

20

1.CStringGetName()

功能:取得設備的名稱.

參數:無.

返回值:設備的名稱.

備注:設備名即在"I/O設備定義"對話框"設備名稱"編輯框中輸入的字符串.

舉例:

CStringcsDeviceName=pDevice->GetName(););

2.intGetType();

功能:取得設備類型(如:串口類,網絡類等).

參數:無.

返回值:設備類型.目前該函數返回值及含義涉及如下幾種:

_SYNCH,同步通信類型設備

_SERIAL_PORT,串口通信類型設備

_NET,TCP/IP網絡通信類型設備

_MODEM,MODEM通信類型設備

_BOARD,板卡類型設備

_PARELLEL,并口通信類型設備

對于同步通信類型設備,板卡類型設備,Ioscan為同步工作方式.對于串口通信類型設

備,網絡通信類型設備,MODEM通信類型設備,并口通信類型設備,掃描程序Ioscan

為異步工作方式.

舉例:intnDeviceType=pDevice->GetType();

3.intGetModel()

功能:取得設備型號.

參數:無.

返回值:設備型號.

備注:設備型號在文獻iodesc.txt中指定.

舉例:intnDeviceModel=pDevice->GetModel();

4.CStringGetAddr()

功能:取得設備地址.

參數:無.

返回值:設備地址.

備注:設備地址指在"I/O設備定義"對話框中的"設備地址"編輯框中輸入的內容,并不

一定與物理設備地址相同.

舉例:intnDeviceAddr=pDevice->GetAddr();

5.CStringGetNetAddr()

功能:取得TCP/IP網絡結點的地址(IP地址或主機名稱).

參數:無.

返回值:TCP/IP網絡結點的地址(IP地址或主機名稱).

備注:TCP/IP網絡結點的地址在設備組態(tài)時指定.

舉例:CStringcsNetAddr=pDevice->GetNetAddr();

6.CStringGetPhoneNumber()

功能:取得電話號碼.

參數:無.

返回值:電話號碼.

21

備注:設備的電話號碼在設備組態(tài)時指定.

舉例:CStringcsPhoneNumber=pDevice->GetPhoneNumber();

7.intGetPort()

功能:取得串口設備端標語或網絡設備端口.

參數:無.

返回值:假如是串口類設備,該函數返回串口的端標語(1,2,3...);假如是TCP/IP

網絡設備,則返回的是網絡端標語.

備注:設備的串口端標語或TCP/IP網絡端標語在設備組態(tài)時指定.

舉例:intnPort=pDevice->GetPort();

8.intGetUpdateCycle()

功能:取得數據更新周期(毫秒).

參數:無.

返回值:數據更新周期(毫秒).

備注:數據更新周期在設備組態(tài)時指定.

舉例:intnUpdateCycle=pDevice->GetUpdateCycle();

9.intGetTimeOut()

功能:取得設備超時時間(毫秒).

參數:無.

返回值:設備超時時間(毫秒).

備注:設備超時時間在設備組態(tài)時指定.

舉例:intnTimeOut=pDevice->GetTimeOut();

10.intGetIdleTime()

功能:取得通信空閑時間(毫秒).

參數:無.

返回值:通信空閑時間(毫秒).

通信空閑時間由SetIdleTime函數設定,初始為0.當通信空閑時間設立為0時,向I/O

設備發(fā)送的每幀數據為一次性發(fā)送,若設立了通信空閑時間(大于0),每幀數據按字

節(jié)一個一個發(fā)送,每個字節(jié)之間讓通信信道空閑等待,等待的時間長度則為通信空閑時

間.

舉例:intnIdleTime=pDevice->GetIdleTime();

11.voidSetIdleTime(unsignedshortnTime)

功能:設立通信空閑時間(毫秒).

參數:通信空閑時間(毫秒).

返回值:無

備注:

通信空閑時間由SetIdleTime函數設定,初始為0.當通信空閑時間設立為0時,向I/O

設備發(fā)送的每幀數據為一次性發(fā)送,若設立了通信空閑時間(大于0),每幀數據按字

節(jié)一個一個發(fā)送,每個字節(jié)之間讓通信信道空閑等待,等待的時間長度則為通信空閑時

間.

舉例:pDevice->SetIdleTime(10);

12.voidGetDCB(DCB&dcb)

功能:取得DCB參數.

參數:返回DCB參數的結構指針.

返回值:無

22

舉例:

DCBdcb;

pDevice->GetDCB(dcb);

13.voidSetDCB(DCBdcb)

功能:設立DCB參數.

參數:DCB參數.

返回值:

備注:一般情況下,假如需要對系統(tǒng)缺省設立的DCB參數中的個別參數需要修改時,

必須先通過GetDCB()取得系統(tǒng)缺省設立的DCB參數,然后修改其中的參數后,再用本

函數設立回去.

舉例:

DCBdcb;

pDevice->GetDCB(dcb);

dcb.fBinary=TRUE;

dcb.fOutxCtsFlow=FALSE;

dcb.fOutxDsrFlow=FALSE;

dcb.fDtrControl=DTR_CONTRO

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論