版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
第五章DCS數(shù)據(jù)采集技術(shù)10頁(yè)1.6萬(wàn)字
目前各種I/O設(shè)備提供的對(duì)外數(shù)據(jù)接口可分為以下幾類:
1,數(shù)字通訊接口,涉及串口類,以太網(wǎng)(TCP/IP協(xié)議)類,現(xiàn)場(chǎng)總線類,儀器總線類
通訊接口(如GPIB等).
2,模擬量通道輸出,設(shè)備直接提供4-20mA,1-5V或繼電器接點(diǎn)信號(hào)等.
力控具有世界上大部分主流設(shè)備的I/O接口程序,對(duì)GPIB總線以及Honeywell,
Yokogawa,Foxboro,Fisher-Rosemount等廠家的DCS也可以支持.
除通常意義上的數(shù)據(jù)采集外,力控可以運(yùn)用采集到的實(shí)時(shí)數(shù)據(jù)對(duì)裝置進(jìn)行實(shí)時(shí)建模,
插入力控自己的先進(jìn)控制控件,實(shí)行先進(jìn)控制.
5.1對(duì)一個(gè)設(shè)備上的數(shù)據(jù)定義不同的采集周期
假如一臺(tái)設(shè)備上有1000個(gè)實(shí)時(shí)數(shù)據(jù)需要采集,而在這1000個(gè)數(shù)據(jù)中只有10個(gè)是經(jīng)常
刷新且需要密切監(jiān)視的,其余990個(gè)所有是輔助數(shù)據(jù),但是也需要時(shí)常查看.假如把這1000
個(gè)數(shù)據(jù)同等地對(duì)待,采用統(tǒng)一的掃描周期進(jìn)行采集,就會(huì)嚴(yán)重影響10個(gè)重要數(shù)據(jù)的刷新速
度.如何既保證1000個(gè)數(shù)據(jù)都可以采集,又保證這10個(gè)重要數(shù)據(jù)的采集速度呢有兩種
辦法:辦法1:為一個(gè)設(shè)備定義兩個(gè)邏輯設(shè)備,使其具有不同的采集周期,如圖5-1所示.
但是這種方法定義的最長(zhǎng)掃描周期為10分鐘.
辦法2:不用上面的辦法,一臺(tái)設(shè)備只定義一個(gè)設(shè)備名稱也可以達(dá)成規(guī)定.由于力控的I/O
驅(qū)動(dòng)對(duì)畫面中不顯示并且沒有組態(tài)歷史趨勢(shì)和報(bào)警的數(shù)據(jù)是不采集的,僅當(dāng)畫面中顯示這個(gè)
數(shù)據(jù)時(shí)才進(jìn)行采集.因此將不常用的數(shù)據(jù)單獨(dú)組態(tài)在一個(gè)或幾個(gè)畫面中,使用完畢立即關(guān)閉
就不會(huì)影響整個(gè)采集速度.這種方法合用于存在有大量不需要快速更新的數(shù)據(jù)的情況.
圖5-1
5.2合理設(shè)立掃描周期,避免引起設(shè)備死機(jī)
有些I/O設(shè)備內(nèi)部只有一個(gè)CPU,同時(shí)負(fù)責(zé)數(shù)據(jù)通訊和計(jì)算,假如在力控上設(shè)立的數(shù)
據(jù)掃描周期太快容易使設(shè)備死機(jī),因此在設(shè)立這一參數(shù)時(shí)應(yīng)當(dāng)慎重,最佳通過多次實(shí)驗(yàn)擬定
一個(gè)合適的掃描周期.一般的串口設(shè)備的掃描周期可設(shè)在10-100毫秒之間.
5.3通過撥號(hào)方式與I/O設(shè)備通訊
力控的所有串口I/O驅(qū)動(dòng)程序都支持通過MODEM以撥號(hào)方式與設(shè)備通訊.只要對(duì)的設(shè)
置電話號(hào)碼即可,如圖5-2所示.
1
5.4通訊狀態(tài)監(jiān)視,設(shè)備狀態(tài)數(shù)據(jù)的讀取
力控為每一個(gè)I/O設(shè)備自動(dòng)定義了一個(gè)系統(tǒng)變
量,假如系統(tǒng)中有一個(gè)設(shè)備PLC1,則每當(dāng)PLC1不能
與力控正常通訊時(shí),系統(tǒng)變量$IOPLC1的值就會(huì)被
置為1.I/O設(shè)備故障屬于系統(tǒng)報(bào)警.計(jì)算機(jī)通訊口
故障,電纜,PLC端通訊口的故障,PLC通訊口與計(jì)
算機(jī)通訊口的參數(shù)設(shè)立不一致都會(huì)導(dǎo)致這種結(jié)果.還
有一種也許,就是數(shù)據(jù)連接項(xiàng)錯(cuò)誤,假如計(jì)算機(jī)的命
令發(fā)給PLC的只讀參數(shù),PLC是不會(huì)予以理睬的.
5.5如何用I/O驅(qū)動(dòng)程序調(diào)試I/O設(shè)備
力控的I/O驅(qū)動(dòng)程序有數(shù)百個(gè),針對(duì)每
一種設(shè)備都有一個(gè)獨(dú)立的程序.當(dāng)力控實(shí)時(shí)
數(shù)據(jù)庫(kù)DB沒有啟動(dòng)時(shí),單獨(dú)啟動(dòng)I/O驅(qū)動(dòng)可
以作為本地I/O設(shè)備調(diào)試工具使用.此時(shí)可以
測(cè)試計(jì)算機(jī)與I/O設(shè)備的通訊情況,摸索最佳
的掃描周期.
菜單"設(shè)立[S]/參數(shù)"用來(lái)規(guī)定I/O通訊
過程中是否顯示計(jì)算機(jī)發(fā)出和設(shè)備響應(yīng)的通
訊信息.如圖5-3所示.
菜單"工具[T]/工具"用來(lái)在不啟動(dòng)實(shí)時(shí)
數(shù)據(jù)庫(kù)及其數(shù)據(jù)連接項(xiàng)的情況下執(zhí)行與I/O
設(shè)備的通訊.彈出對(duì)話框如圖5-5上部所示.此
時(shí)可以按"參數(shù)設(shè)立"按鈕設(shè)立通訊參數(shù),如
圖5-6和5-7所示,重要是設(shè)立串口的DCB參
數(shù),IP地址等.
圖5-2
圖5-3圖5-4
對(duì)的設(shè)立參數(shù)后,按"連接設(shè)備"按鈕,如
果成功的話,"連接設(shè)備"按鈕的標(biāo)
題變成"斷開連接",表達(dá)可以收發(fā)
數(shù)據(jù)了.假如在"參數(shù)設(shè)立"中設(shè)立
"周期性發(fā)送周期"不為0,則在"連
接設(shè)備"后會(huì)出現(xiàn)"周期發(fā)送"按鈕,
否則出現(xiàn)"手動(dòng)發(fā)送"按鈕.使用"
周期發(fā)送"或"手動(dòng)發(fā)送"按鈕,可以
周期性或一次性地發(fā)送編輯框中
的數(shù)據(jù)了.
編輯框中數(shù)據(jù)的格式缺省是
混合方式的,假如你想發(fā)送編輯框
中的數(shù)據(jù),這也是唯一的數(shù)據(jù)類型,
它的形成規(guī)則如下:任何ASCII碼
(除'[')可以直接輸入,'['可以使用
"[[]"來(lái)輸入;"[]"內(nèi)是由''(空格)分隔的轉(zhuǎn)意字符,它們的意義為:
圖5-5
'[':用來(lái)輸入'[';
2
'*':在發(fā)送數(shù)據(jù)是表達(dá)延時(shí)1毫秒
圖5-6
'#':在發(fā)送數(shù)據(jù)是表達(dá)延時(shí)10毫秒
'$':在發(fā)送數(shù)據(jù)是表達(dá)延時(shí)100毫秒
'!':在發(fā)送數(shù)據(jù)是表達(dá)延時(shí)1000毫秒
'\':表達(dá)它后面的數(shù)據(jù)是十進(jìn)制的(缺省是16進(jìn)
制)
''(空格):作為分隔符,任何未定義的字符都可以
作為分隔符,最佳使用空格.
0~9:可以用來(lái)輸入10進(jìn)制或16進(jìn)制數(shù)據(jù).
A~F/a~f:可以用來(lái)輸入16進(jìn)制數(shù)據(jù).
例子:abcv[[30*#$!]345相應(yīng)的16進(jìn)制數(shù)據(jù)
串為:
61H,62H,63H,76H,5BH,30H,33H,34H,35H;而
且在30H之后有1111毫秒的延時(shí).
當(dāng)用在其它情況(不是用來(lái)發(fā)送數(shù)據(jù))時(shí),唯一
的差別是沒有了延時(shí)的概念.
"其它工具":校驗(yàn)使用混合格式的數(shù)據(jù),計(jì)算常
用的校驗(yàn)碼,ASCII碼表顯示使用16進(jìn)制和
10進(jìn)制顯示的ASCII碼表,各種數(shù)據(jù)轉(zhuǎn)換把混合格式,16/32位整數(shù),32位浮點(diǎn)數(shù)等轉(zhuǎn)換位十
幾種常用數(shù)據(jù)格式,除混合格式外,其它數(shù)據(jù)格式為直接用空格分隔的數(shù)據(jù)串
圖5-7
5.6如何開發(fā)I/O設(shè)備驅(qū)動(dòng)程序
在力控中有一個(gè)SDK工具包,叫做FIOSSDK,可以開發(fā)硬件設(shè)備與計(jì)算機(jī)的通訊接
口程序.最簡(jiǎn)樸的只需要編寫幾個(gè)函數(shù)就可以可以做自己的I/O驅(qū)動(dòng),現(xiàn)在支持的硬件類型
有串口(RS485/232/422),網(wǎng)絡(luò),板卡,硬件廠家提供DLL等多種方式的通訊類型.在該SDK
中開發(fā)自己的通訊接口,不需要關(guān)心硬件和計(jì)算機(jī)通訊的細(xì)節(jié),只需要了解通訊協(xié)議就可以
了.
假如通訊協(xié)議很復(fù)雜,該SDK中提供了足夠靈活的手段滿足不同層次的需要.例如:
在設(shè)備初始化時(shí)發(fā)什么命令或做其他解決,動(dòng)態(tài)改變硬件通訊參數(shù)等等.
5.6.1FIOS開發(fā)包簡(jiǎn)介
FIOS負(fù)責(zé)完畢與各種I/O設(shè)備進(jìn)行數(shù)據(jù)互換.一方面,它把從I/O設(shè)備采集到的實(shí)時(shí)
過程數(shù)據(jù)發(fā)送給數(shù)據(jù)庫(kù)DB,另一方面,從DB發(fā)出的下置數(shù)據(jù)也通過FIOS發(fā)送給I/O設(shè)備.
根據(jù)監(jiān)控PC與I/O設(shè)備之間通信機(jī)制的不同,FIOS重要支持兩種工作方式:同步方式
與異步方式.
異步方式合用以下一類I/O設(shè)備:這類I/O設(shè)備一般可以獨(dú)立運(yùn)營(yíng),與監(jiān)控計(jì)算機(jī)之間
通過串口,網(wǎng)絡(luò)或MODEM連接.與監(jiān)控計(jì)算機(jī)之間通過明確的消息傳送(文本或二進(jìn)制
消息)完畢數(shù)據(jù)互換.數(shù)據(jù)互換過程為異步方式.
同步方式合用以下一類I/O設(shè)備:這類I/O設(shè)備或者依賴PC運(yùn)營(yíng)(如:插在PC插槽
內(nèi)),或者獨(dú)立運(yùn)營(yíng).但與監(jiān)控計(jì)算機(jī)之間重要通過直接訪問方式進(jìn)行數(shù)據(jù)互換,具體形式
涉及:寄存器直接訪問(如:板卡),API函數(shù)調(diào)用,ActiveX控件訪問等.數(shù)據(jù)互換過程為
同步方式.
下面列舉了FIOS可實(shí)現(xiàn)的一些基本功能:
底層通信功能:1),串口通信,涉及:RS232/422/485.2),TCP/IP網(wǎng)絡(luò)通信.3),MODEM
3
通信,通過模擬MODEM在電話網(wǎng)上通信.4),寄存器訪問,如:各種DAS板卡.5),其
它.
鏈路控制功能:用M代表Master,即上位機(jī)(監(jiān)控PC工作站);S代表Slaver,即下
位機(jī)(各種I/O設(shè)備).對(duì)于異步方式,FIOS支持多種鏈路控制方式.鏈路控制方式支持以
下幾種方式:1),M請(qǐng)求,S應(yīng)答方式.2),M請(qǐng)求,S無(wú)應(yīng)答方式.3),S積極發(fā)送,M
被動(dòng)等待.此外,對(duì)一次完整數(shù)據(jù)解決(讀或?qū)?過程,支持以下方式:1),1次請(qǐng)求,0
次應(yīng)答方式.2),1次請(qǐng)求,1次應(yīng)答方式.3),1次請(qǐng)求,多次應(yīng)答方式.4),0次請(qǐng)求,1
次應(yīng)答方式.5),多次請(qǐng)求,多次應(yīng)答方式.
冗余功能:FIOS支持的冗余方式涉及:1),單監(jiān)控站,雙I/O冗余.2),雙監(jiān)控站,單
I/O冗余.3),雙監(jiān)控站,雙I/O冗余.4),對(duì)于總線型設(shè)備(如RS485),提供總線監(jiān)測(cè)功
能,可實(shí)現(xiàn)對(duì)冗余通信網(wǎng)絡(luò)的保護(hù)和監(jiān)測(cè).
前端機(jī)功能:DB與IOServer不在同一工作站上,IOServer運(yùn)營(yíng)在前端機(jī)上,前端機(jī)
與操作站之間通過串口,TCP/IP網(wǎng)絡(luò)或MODEM進(jìn)行通信.
硬件測(cè)試與遠(yuǎn)程調(diào)試功能:使用FIOS可完畢對(duì)I/O設(shè)備的簡(jiǎn)樸測(cè)試功能.此外可實(shí)現(xiàn)
遠(yuǎn)程調(diào)試.
故障診斷與恢復(fù)功能:FIOS提供診斷機(jī)制,在較短的采集周期內(nèi)報(bào)告故障的發(fā)生,診
斷出下位機(jī)故障情況.當(dāng)下位機(jī)更換或恢復(fù)后,不需要對(duì)FIOS及相關(guān)程序進(jìn)行任何人工干
預(yù),而在較短時(shí)間自動(dòng)恢復(fù)通信.當(dāng)某一臺(tái),幾臺(tái)或部分通道發(fā)生故障,FIOS要自動(dòng)優(yōu)化
通信鏈,使其與其他下位機(jī)或通道之間的通信不受影響,保證通信效率.
界面顯示功能:為測(cè)試,調(diào)試,運(yùn)營(yíng)維護(hù)方便,FIOS提供顯示界面,可顯示涉及:發(fā)
送,應(yīng)答,狀態(tài)信息,啟動(dòng)時(shí)間,分包數(shù),分包信息,成功通信次數(shù)(發(fā)送次數(shù),成功應(yīng)答
次),故障次數(shù)等信息.
歷史數(shù)據(jù)解決功能:對(duì)于某些能保存歷史數(shù)據(jù)的設(shè)備(如:無(wú)紙記錄儀等),FIOS能將
采集到的歷史數(shù)據(jù)恢復(fù)到數(shù)據(jù)庫(kù)DB中.
5.6.2FIOSSDK編程方式
FIOSSDK提供了一種簡(jiǎn)潔的,面向?qū)ο蟮木幊谭绞揭钥s短開發(fā)時(shí)間,減少開發(fā)難度.
FIOSSDK提供標(biāo)準(zhǔn)的開發(fā)接口和程序模板,程序員僅需要根據(jù)I/O設(shè)備的具體通信協(xié)
議或驅(qū)動(dòng)接口說(shuō)明,填寫幾個(gè)掃描函數(shù)的實(shí)現(xiàn)代碼,進(jìn)行必要的調(diào)試與測(cè)試,即可完畢一種
FIOS的開發(fā).
FIOS提供的開發(fā)工具封裝了大部分程序員不必關(guān)心的技術(shù)環(huán)節(jié),如:底層通信功能(串
口通信,網(wǎng)絡(luò)通信等),設(shè)備超時(shí)解決,設(shè)備故障診斷等.同時(shí)FIOS提供各種調(diào)試工具,
方便程序員進(jìn)行系統(tǒng)測(cè)試.
FIOS開發(fā)環(huán)境完全基于32位Windows平臺(tái).它使用動(dòng)態(tài)鏈接庫(kù)(DLL)技術(shù)將程序
員開發(fā)的代碼整合到力控系統(tǒng)中.FIOS提供應(yīng)程序員的開發(fā)接口為API函數(shù)和C++類庫(kù).
5.6.3FIOSSDK組件及示例程序
FIOSSDK重要由4部分組成:設(shè)備組態(tài)接口(Iodevui),數(shù)據(jù)連接組態(tài)接口(Ioitemui),
編程接口Ioapi和描掃程序Ioscan.Iodevui:負(fù)責(zé)管理設(shè)備組態(tài)過程.Ioitemui:負(fù)責(zé)管理數(shù)據(jù)
連接組態(tài)過程.Ioapi:負(fù)責(zé)完畢與I/O設(shè)備間的數(shù)據(jù)互換,涉及:對(duì)通信協(xié)議的解析,數(shù)據(jù)
格式的轉(zhuǎn)換等.Ioscan:重要完畢對(duì)Ioapi部分的dll代碼進(jìn)行周期性地掃描.同時(shí)完畢與I/O
設(shè)備的底層通信(串口通信,網(wǎng)絡(luò)通信等),以及設(shè)備超時(shí)解決,設(shè)備故障診斷等.Ioscan
還負(fù)責(zé)與數(shù)據(jù)庫(kù)DB之間的通信與協(xié)作.它把從I/O設(shè)備采集到的數(shù)據(jù)經(jīng)Ioapi解析轉(zhuǎn)換后
提交給DB,或?qū)B下置給I/O設(shè)備的數(shù)據(jù)經(jīng)Ioapi解析轉(zhuǎn)換后寫入I/O設(shè)備.Ioscan是FIOS
SDK提供的一個(gè)標(biāo)準(zhǔn)軟件工具.程序員僅需要開發(fā)Iodevui,Ioitemui,Ioapi三部分的代碼.
示例程序
4
FIOSSDK提供了兩個(gè)示例:DemoController與DemoModbus.
DemoController是一個(gè)初級(jí)編程示例,它能引導(dǎo)初學(xué)者快速掌握開發(fā)FIOS的基本概念
和方法.DemoModbus是一個(gè)實(shí)用編程示例,它采用標(biāo)準(zhǔn)MODBUS通信協(xié)議,通過該示例,
可以掌握在力控平臺(tái)上開發(fā)標(biāo)準(zhǔn)MODBUS設(shè)備I/O驅(qū)動(dòng)程序的方法.
FIOSSDK的所有內(nèi)容都是在安裝在力控自動(dòng)安裝的,在力控目錄下的子目錄Fiossdk
中.FIOSSDK重要包含以下幾部分內(nèi)容:Examples,程序示例,仿真程序.Include,頭文
件.Manual,文檔說(shuō)明.Utility,調(diào)試工具.
這2個(gè)示例具有一定的代表性,它們體現(xiàn)了FIOSSDK的重要功能.FIOSSDK提供了
這2個(gè)示例的所有源代碼,在它們的基礎(chǔ)上,稍做改動(dòng),就可以開發(fā)出新的FIOS.我們把
象這2個(gè)示例源程序同樣具有模板作用的程序稱為I/O模板程序.為了提高開發(fā)效率,我們
建議盡量使用I/O模板程序,這在一定限度上,也減少,減少了編程錯(cuò)誤的發(fā)生.
常用術(shù)語(yǔ)
我們把FIOSDK中經(jīng)常涉及的一些概念給出定義,有些術(shù)語(yǔ)雖然是通用名詞,但在
FIOSDK中有特定含義.這些術(shù)語(yǔ)有一些在前文給出了解釋,有一些會(huì)在后文中陸續(xù)給出解
釋.
FIOSForceControlI/OServer,即力控I/O驅(qū)動(dòng)程序
FIOSSDKFIOS軟件開發(fā)工具包
FCINSTDIR力控軟件系統(tǒng)的安裝目錄
FCAPPINSTDIR用力控創(chuàng)建的工程應(yīng)用的目錄
IOID唯一區(qū)別各個(gè)I/O驅(qū)動(dòng)程序的I/O標(biāo)志
Iodevui設(shè)備組態(tài)接口
Ioitemui數(shù)據(jù)連接組態(tài)接口
Ioapi編程接口
Ioscan掃描程序
I/O模板程序FIOS工SDK附帶示例的源程序
I/O配置文獻(xiàn)設(shè)備組態(tài)時(shí)的缺省參數(shù)設(shè)立保存文獻(xiàn)
連接項(xiàng)結(jié)構(gòu)保存數(shù)據(jù)連接信息的數(shù)據(jù)結(jié)構(gòu)IOITEMDEF
I/O描述文獻(xiàn)定義設(shè)備的類別,廠商,型號(hào),通信方式等參數(shù)的文本文獻(xiàn)Iodesc.txt
程序員在本文檔范圍內(nèi)專指用FIOSSDK進(jìn)行開發(fā)的技術(shù)人員
掃描函數(shù)包含在Ioapi中的API函數(shù),它們由掃描程序周期掃描.掃描函數(shù)完畢
對(duì)設(shè)備數(shù)據(jù)解析及格式轉(zhuǎn)換
IOCInputOutputClass(輸入輸出類庫(kù))的縮寫.
5.6.4設(shè)備組態(tài)接口IODEVUI.DLL
I/O描述文獻(xiàn)
在使用力控進(jìn)行組態(tài)時(shí),一般均涉及定義I/O設(shè)備的過程.在定義設(shè)備時(shí),要選擇設(shè)
備的類別(PLC,智能儀表等),廠商,設(shè)備型號(hào)或通信協(xié)議,然后根據(jù)設(shè)備通信方式(串
口方式,網(wǎng)絡(luò)方式,其它方式等)設(shè)立參數(shù).以上關(guān)于一種設(shè)備的信息(類別,廠商,型號(hào),
通信方式等)完全是由I/O描述文獻(xiàn)決定的.I/O描述文獻(xiàn)是一個(gè)標(biāo)準(zhǔn)文本文獻(xiàn),根據(jù)其規(guī)
定的填寫格式,由程序員根據(jù)具體設(shè)備自行填寫.下面介紹I/O描述文獻(xiàn)的填寫格式.
I/O描述文獻(xiàn)的文獻(xiàn)名為IODESC.TXT,安裝目錄為:"FCINSTDIR\IOServers\IOID\".
IO文獻(xiàn)說(shuō)明格式為:類別;廠商或IO程序描述;執(zhí)行文獻(xiàn)名稱
5
子類型1;類型號(hào);資源標(biāo)志;提供設(shè)備地址
子類型2;類型號(hào);資源標(biāo)志;提供設(shè)備地址
......
注意,子類型號(hào)不能反復(fù).表達(dá)回車換行.最上面一行是驅(qū)動(dòng)程序的總體描述,
涉及三項(xiàng).各項(xiàng)之間必須以分號(hào)";"分隔.各項(xiàng)內(nèi)容不能具有分號(hào)";".
各項(xiàng)含義如下:類別,驅(qū)動(dòng)程序所屬類別,現(xiàn)分為以下幾類:PLC,智能儀表,智能模
塊,變頻器.程序員也可以自行擴(kuò)展.廠商或IO程序描述,I/O設(shè)備生產(chǎn)廠商名稱,協(xié)議
名稱,如西門子.執(zhí)行文獻(xiàn)名稱,I/O驅(qū)動(dòng)程序(運(yùn)營(yíng)程序)的名稱,如opto_drv.exe
接下來(lái)幾行為驅(qū)動(dòng)程序所包含的設(shè)備類型的描述,如西門子涉及S5,S7等,每一子類別一
行,每行涉及三項(xiàng),各項(xiàng)之間必須以分號(hào)";"分隔.各項(xiàng)內(nèi)容不能具有分號(hào)";".各項(xiàng)含義
如下:子類型,設(shè)備類型描述.如S5.類型號(hào),設(shè)備類型編號(hào),類型號(hào)不能反復(fù).合法的
值為0,1,2,3等.使用計(jì)算機(jī)資源,使用計(jì)算機(jī)何種通信資源通信,合法的值為0,1,
2等.含義如下:0,同步通信方式;1,串口通信方式;2,TCP/IP網(wǎng)絡(luò)通信方式;3,MODEM
通信方式;4,板卡方式;5,并口通信方式.提供設(shè)備地址:1表達(dá)需要指定設(shè)備地址,否則
表達(dá)不需要設(shè)備地址.
管理程序會(huì)自動(dòng)將相同廠商或IO程序描述相同的驅(qū)動(dòng)程序歸為同一樹下.
開發(fā)Iodevui
力控組態(tài)環(huán)境DRAW中的設(shè)備管理功能提供了一個(gè)根據(jù)I/O描述文獻(xiàn)可靈活配置的標(biāo)
準(zhǔn)設(shè)備組態(tài)接口.這個(gè)組態(tài)接口提供了一些對(duì)常用設(shè)備參數(shù)進(jìn)行設(shè)立的方法.如:設(shè)備名稱,
設(shè)備地址,通信端口,端口參數(shù)等.如下圖所示:
對(duì)于很多設(shè)備,假如標(biāo)準(zhǔn)設(shè)備組態(tài)接口可以滿足規(guī)定,就不再需要自己編寫Iodevui接
口程序了.比如示例DemoController采用的就是標(biāo)準(zhǔn)設(shè)備組態(tài)接口.而示例DemoModbus
由于涉及一些特殊的參數(shù)設(shè)立,就需要自己編寫Iodevui接口程序了.
因此,Iodevui接口程序事實(shí)上就是對(duì)標(biāo)準(zhǔn)設(shè)備組態(tài)接口的一個(gè)補(bǔ)充和擴(kuò)展,并可由程
序員靈活控制.Iodevui要以DLL形式提供.該DLL必須是MFC擴(kuò)展DLL.該DLL的缺
省文獻(xiàn)名稱為IODEVUI.DLL,該文獻(xiàn)必須安裝在目錄"FCINSTDIR\IOServers\IOID\"下.
在進(jìn)行設(shè)備組態(tài)時(shí),力控的I/O設(shè)備管理程序會(huì)自動(dòng)檢查在目錄"FCINSTDIR\IO
Servers\IOID\"下是否存在IODEVUI.DLL文獻(xiàn).假如存在,則一方面根據(jù)I/O描述文獻(xiàn)的格式,
調(diào)出標(biāo)準(zhǔn)設(shè)備組態(tài)接口界面,當(dāng)用戶確認(rèn)后,再調(diào)出Iodevui組態(tài)接口界面;若不存在該文
件,則只調(diào)出標(biāo)準(zhǔn)設(shè)備組態(tài)接口界面.
示例DemoModbus的Iodevui接口程序可以做為開發(fā)Iodevui的模板程序.我們結(jié)合示
例DemoModbus的Iodevui模板程序具體解釋實(shí)現(xiàn)過程.查看頭文獻(xiàn)Iodevui.h可以發(fā)現(xiàn),
Iodevui.dll重要實(shí)現(xiàn)3個(gè)輸出函數(shù):
6
extern"C"AFX_EXT_APIlongAddIoDev(constchar*szDeviceName,intnType);
extern"C"AFX_EXT_APIlongModIoDev(constchar*szDeviceName);
extern"C"AFX_EXT_APIlongDelIoDev(constchar*szDeviceName);
在進(jìn)行設(shè)備組態(tài)時(shí),當(dāng)增長(zhǎng)一個(gè)設(shè)備時(shí),力控設(shè)備管理程序會(huì)自動(dòng)調(diào)用AddIoDev()函
數(shù);當(dāng)修改一個(gè)已創(chuàng)建設(shè)備時(shí)會(huì)調(diào)用ModIoDev()函數(shù);當(dāng)刪除一個(gè)設(shè)備時(shí)會(huì)調(diào)用DelIoDev()
函數(shù).
其中,參數(shù)szDeviceName為I/O設(shè)備名稱(輸入值,組態(tài)時(shí)由用戶指定).nType為設(shè)
備子類型號(hào),由程序員在I/O描述文獻(xiàn)中指定.返回值為0表達(dá)操作成功;其它表達(dá)操作失
敗.為了較好地實(shí)現(xiàn)程序結(jié)構(gòu)化,本模板程序提供了一個(gè)CDevMan類對(duì)設(shè)備及組態(tài)操作過
程進(jìn)行管理.Iodevui.dll的3個(gè)輸出函數(shù)AddIoDev(),ModIoDev()DelIoDev()的具體實(shí)現(xiàn)過
程是在CDevMan的三個(gè)成員函數(shù)Add(),Mod()和Del()中實(shí)現(xiàn)的.
一方面看一下Add()的實(shí)現(xiàn)代碼:
//**********************************************************************
//添加I/O設(shè)備
//szDeviceName,設(shè)備名稱(輸入值)
//nType,設(shè)備子類型(用于一個(gè)驅(qū)動(dòng)程序驅(qū)動(dòng)多種類型設(shè)備)(輸入值)
//返回值說(shuō)明:0,操作成功;其它,操作失敗
//**********************************************************************
longCDevMan::Add(constchar*szDeviceName,intnType)
{
if(Find(szDeviceName))
{
AfxMessageBox("該數(shù)據(jù)源名已經(jīng)存在!");
return-1;
}
CDevice*pDev=newCDevice(szDeviceName,nType);
if(CallDialog(pDev))
{
m_list.AddTail(pDev);
Store();
return0;
}
else
deletepDev;
return-1;
}
程序的一開始,調(diào)用Find()函數(shù)來(lái)查找是否已有相同的設(shè)備名存在,假如有給出提醒并
返回-1表達(dá)操作失敗,否則生成一個(gè)CDevice對(duì)象并調(diào)用CallDialog函數(shù)來(lái)顯示一個(gè)對(duì)話框,
讓用戶做進(jìn)一步的選擇,假如用戶進(jìn)行確認(rèn),操作成功,它把此CDevice對(duì)象加入設(shè)備鏈表
中,并調(diào)用Store函數(shù)來(lái)保存設(shè)備信息.此外兩個(gè)函數(shù)和它類似.
Store()函數(shù)如下:
voidCDevMan::Store()
{
CFilefile;
7
if(file.Open((constchar*)("ddeacc.dat"),CFile::modeReadWrite|CFile::modeCreate))
{
CArchivear(&file,CArchive::store);
Serialize(ar);
ar.Close();
file.Close();
}
}
該函數(shù)它先打開ddeacc.dat文獻(xiàn),假如不存在,就建立此文獻(xiàn).然后調(diào)用序列化函數(shù)對(duì)
它進(jìn)行保存,最后關(guān)閉此文獻(xiàn).再看一看序列化函數(shù):
voidCDevMan::Serialize(CArchive&ar)
{
TRY
{
CObject::Serialize(ar);
m_list.Serialize(ar);
}
CATCH(CFileException,e)
{
AfxMessageBox("文獻(xiàn)版本不匹配!");
}
END_CATCH
}
該函數(shù)對(duì)m_list(由CDevice類實(shí)例組成)進(jìn)行序列化.在調(diào)用各個(gè)CDevice類實(shí)例的
序列化函數(shù)時(shí),假如是讀取操作,會(huì)依次創(chuàng)建CDevice實(shí)例,并調(diào)用CDevice的序列化函數(shù),
隨后把CDevice實(shí)例加入m_list鏈表.具體保存和讀取的變量數(shù)據(jù)在CDevice類中控制,也
就是說(shuō)程序員針對(duì)不同的設(shè)備可以改寫CDevice類,定義不同的成員變量,記錄設(shè)備的不同
的屬性,對(duì)CDevice類重載Serialize即可實(shí)現(xiàn)設(shè)備的保存,加載,增長(zhǎng),刪除和修改等功能.
我們?cè)倏匆幌翪Device類序列化的實(shí)現(xiàn)過程:
voidCDevice::Serialize(CArchive&ar)
{
if(ar.IsStoring())
{
ar<<m_csName;//設(shè)備名稱
ar<>m_csName;
ar>>m_dwData;
}
}
假如是保存操作,序列化函數(shù)會(huì)將參數(shù)自動(dòng)存盤;假如是讀取操作,序列化函數(shù)會(huì)從磁
盤上讀取參數(shù)值.
8
察看CallDialog函數(shù)可以發(fā)現(xiàn),它生成了一個(gè)對(duì)話框,讓用戶做相應(yīng)的選擇,然后把用
戶選擇的信息保存在CDevice類的成員函數(shù)中,以便于儲(chǔ)存.
整個(gè)程序框架使用CDevice類來(lái)保存設(shè)備的信息.在CallDialog函數(shù)中使用一個(gè)對(duì)話框,
來(lái)讓用戶進(jìn)行選擇設(shè)備的屬性,并且在CallDialog函數(shù)中把它保存在CDevice類中.所以對(duì)
于一個(gè)新的設(shè)備,程序員所要做的工作就是,分析設(shè)備的協(xié)議查看是否僅使用描述文獻(xiàn)就可
以完畢設(shè)備的定義,假如不能,那么應(yīng)當(dāng)編制IoDevUi.dll.這時(shí)應(yīng)分析應(yīng)當(dāng)增長(zhǎng)哪一些屬
性,定義哪一些CDevice類的成員變量,以及顯示什么樣的對(duì)話框,讓用戶做什么樣的選擇.
所以程序員的工作重點(diǎn)在于修改CDevice類,增長(zhǎng)成選變量,并重載它的Serialize函數(shù),然
后修改對(duì)話框,讓用戶做不同的選擇,并把選擇保存在CDevice類的成員變量中即可.
在該示例中,我們定義了2個(gè)設(shè)備參數(shù):
CStringm_csName;//設(shè)備的名稱
DWORDm_dwData;//用于保存數(shù)據(jù)
這樣只需在對(duì)話框中對(duì)m_csName和m_dwData賦值即可.
//***********************************************************//
//調(diào)用對(duì)話框定義數(shù)據(jù)源
//pDev數(shù)據(jù)源指針
//返回值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表達(dá)是RTU方式0表達(dá)ASCII方式
pDev->m_dwData=(pDev->m_dwData)|(dlg.m_inPackLongcsPath+="\\ddeacc.dat";//數(shù)據(jù)保存在了工程目錄的ddeacc.dat中
DWORDdata;
CStringstrtemp;
9
shorttemp;
CFilefile;
if(file.Open((constchar*)csPath,CFile::modeRead))//打開該文獻(xiàn)
{
CArchivear(&file,CArchive::load);
//讀取的第一個(gè)數(shù)據(jù)是定義的設(shè)備的個(gè)數(shù),
//但是由于可以通過GetDeviceCount函數(shù)得到設(shè)備的個(gè)數(shù),
//所以這里把讀到的數(shù)據(jù)簡(jiǎn)樸的丟掉.
ar>>temp;
intnDevCnt=pManager->GetDeviceCount();
for(inti=0;iGetDevice(i);
ar>>strtemp;//讀取設(shè)備的名字
ar>>data;//讀取數(shù)據(jù)
//這兩句在講到Ioapi.dll時(shí)再進(jìn)行介紹
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();//關(guān)閉文獻(xiàn)
}
else
{
strtemp="對(duì)不起,沒有找到";
strtemp+=csPath;
strtemp+="程序不能運(yùn)營(yíng)!!!";
AfxMessageBox(strtemp);
PostQuitMessage(0);//沒有找到文獻(xiàn),給出提醒,并終止程序的運(yùn)營(yíng).
}
}
注意序列化的內(nèi)容和順序必須和IoDevUi.dll一致,否則會(huì)導(dǎo)致程序運(yùn)營(yíng)時(shí)產(chǎn)生錯(cuò)誤.
5.6.5Ioitemui介紹及編程示例
在用力控進(jìn)行組態(tài)時(shí),把數(shù)據(jù)庫(kù)DB中的點(diǎn)參數(shù)與某種設(shè)備的具體通道建立連接的過
10
程被為數(shù)據(jù)連接過程.在進(jìn)行數(shù)據(jù)連接時(shí),一般還要指定數(shù)據(jù)轉(zhuǎn)換格式,數(shù)據(jù)長(zhǎng)度等參數(shù).
數(shù)據(jù)連接過程對(duì)于不同的I/O設(shè)備,其形式和內(nèi)容也許完全不同.因此必須針對(duì)不同的
I/O設(shè)備,設(shè)計(jì)相應(yīng)的數(shù)據(jù)連接形式,保存各種參數(shù)信息.
Ioitemui接口重要完畢的兩部分功能,一是為用戶進(jìn)行數(shù)據(jù)連接組態(tài)時(shí)提供一個(gè)界面;
此外就是將用戶組態(tài)的設(shè)備參數(shù)信息用某種格式保存起來(lái),以便在開發(fā)編程接口Ioapi時(shí)使
用.我們定義了一個(gè)數(shù)據(jù)結(jié)構(gòu)來(lái)保存設(shè)備參數(shù)信息,這就是數(shù)據(jù)連接項(xiàng)結(jié)構(gòu)(下面簡(jiǎn)稱連接
項(xiàng)結(jié)構(gòu))IOITEMDEF.
IOITEMDEF定義在Ioitemui.h中:
typedefstructIoItemDefStru
{
charstr[64];
longn[8];
}IOITEMDEF;
這個(gè)結(jié)構(gòu)是一個(gè)通用結(jié)構(gòu),由程序員自己賦值,自己解釋.Ioitemui要以DLL形式提
供.該DLL必須是MFC擴(kuò)展DLL.該DLL的缺省文獻(xiàn)名稱為IOITEMUI.DLL,該文獻(xiàn)必
須安裝在目錄"FCINSTDIR\IOServers\IOID\"下.
Ioitemui的工作過程如下:
在進(jìn)行數(shù)據(jù)連接組態(tài)時(shí),力控的DBMAN管理程序會(huì)自動(dòng)檢查在目錄"FCINSTDIR\IO
Servers\IOID\"下是否存在IOITEMUI.DLL文獻(xiàn).假如存在,則調(diào)出數(shù)據(jù)連接組態(tài)接口界面.
下面介紹如何編寫Ioitemui接口程序.
Ioitemui.dll重要實(shí)現(xiàn)1個(gè)輸出函數(shù):extern"C"AFX_EXT_APIlongDoItemDlg(constchar
*szDeviceName,intnType,IOITEMDEF&item,char*szDesc,intnFlag);
其參數(shù)說(shuō)明如下:
szDeviceName,設(shè)備名稱(輸入值).假如在力控中定義了一個(gè)設(shè)備Device1,那么在給
該設(shè)備組點(diǎn)時(shí),傳給DoItemDlg的szDeviceName值就是字符串"Device1".
nType,設(shè)備子類型(用于一個(gè)驅(qū)動(dòng)程序驅(qū)動(dòng)多種類型設(shè)備)(輸入值).它的值在
IODESC.TXT中指定(參見上一章對(duì)I/O描述文獻(xiàn)的介紹).
item,數(shù)據(jù)連接項(xiàng)結(jié)構(gòu)(返回值).需要注意的是,item除了是輸出值外,也是輸入值,
DBMAN管理程序每次調(diào)用DoItemDlg()時(shí),將上一次操作賦給item的值傳遞過來(lái).
szDesc,數(shù)據(jù)連接項(xiàng)描述,用于DBMAN程序顯示的提醒信息.
nFlag,1表達(dá)增長(zhǎng)數(shù)據(jù)連接項(xiàng),2表達(dá)修改,0表達(dá)刪除(輸入值).其返回值0表達(dá)操作成
功.其它,操作失敗.
Ioitemui.dll的工作過程如下:
當(dāng)用戶打開數(shù)據(jù)組點(diǎn)連接對(duì)話框時(shí),選中了一個(gè)點(diǎn),并按下增長(zhǎng),修改或刪除鍵,這時(shí)
就會(huì)調(diào)用Ioitemui.dll的DoItemDlg函數(shù).程序員應(yīng)當(dāng)在此函數(shù)中,彈出一個(gè)對(duì)話框讓用戶
進(jìn)行選擇,在用戶按下了OK鍵之后,把用戶的選擇保存在item中,以后編制Ioapi.dll時(shí)
可以運(yùn)用這些信息.
編程示例
我們先結(jié)合示例DemoController介紹如何開發(fā)Ioitemui.
仿真器SimController的內(nèi)部有數(shù)字區(qū)(DIO)和模擬區(qū)(AIO).DIO和AIO區(qū)通道范圍為:
0~255.每個(gè)DIO通道的數(shù)據(jù)的數(shù)值范圍為:0或1.每個(gè)AIO通道數(shù)據(jù)的數(shù)值范圍為:0~4095.
所以我們應(yīng)當(dāng)在DoItemDlg函數(shù)中彈出一個(gè)對(duì)話框,用戶可以在此對(duì)話框中選擇輸入通道
和內(nèi)存地址.輸入通道有兩個(gè)選項(xiàng)DIO通道和AIO通道供用戶選擇,內(nèi)存地址可以讓用戶
輸入0~255之間的數(shù)據(jù).
11
我們介紹一下假如不使用I/O模板,如何自己生成一個(gè)新的Ioitemui工程:
在VC++環(huán)境下,選擇菜單命令new,選擇新建工程,工程名為Ioitemui,選擇"MFC
Appwizard(dll)"選項(xiàng),在下一步DLL類型中選擇"MFCExtensionDLL"型,然后按下"Finish"
鍵.即可創(chuàng)建一個(gè)新的Ioitemui工程.
打開Ioitemui.cpp文獻(xiàn),在文獻(xiàn)的開頭加入#include"Ioitemui.h",把Ioitemui.h拷入本工
程,然后在文獻(xiàn)的最后鍵入:
longDoItemDlg(constchar*strDataSour,intnType,IOITEMDEF&item,char*szDesc,intnFlag)
{
}
這就加入了dll的輸出函數(shù).
打開示例DemoController的Ioitemui模板程序,它的DoItemDlg()函數(shù)實(shí)現(xiàn)過程如下:
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;
//增長(zhǎng)或修改操作
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;
}
在這個(gè)模板程序里,還涉及一個(gè)對(duì)話框類CLinkDlg.這個(gè)對(duì)話框?yàn)橛脩暨M(jìn)行數(shù)據(jù)連接
組態(tài)時(shí)提供一個(gè)界面,其形式如下:
12
CLinkDlg類有2個(gè)成員變量:
CStringm_desc;//保存連接項(xiàng)描述
intitem_n[2];//item_n[0]保存數(shù)據(jù)區(qū)類型,0表達(dá)DIO,1表達(dá)AIO;
//item_n[1]保存地址
在CLinkDlg的WM_INITDIALOG消息函數(shù)中進(jìn)行如下解決:
BOOLCLinkDlg::OnInitDialog()
{
CDialog::OnInitDialog();
//在此處設(shè)立值使對(duì)話框的顯示和是一次選擇相同,以利于執(zhí)行和上一次相近的操作
m_CtrlChannel.SetCurSel(item_n[0]);//設(shè)立操作選項(xiàng)為上一次的操作
m_nAddr=item_n[1];//設(shè)立地址為上一次的值
UpdateData(FALSE);
returnTRUE;
}
這些解決為了使對(duì)話框的顯示和上一次選擇相同,以利于執(zhí)行和上一次相近的操作.在
ONOK消息函數(shù)進(jìn)行如下解決:
voidCLinkDlg::OnOK()
{
UpdateData(TRUE);//得到各個(gè)選項(xiàng)得值
CStringstring;
item_n[0]=m_CtrlChannel.GetCurSel();//保存操作選項(xiàng)
m_CtrlChannel.GetWindowText(m_desc);
item_n[1]=m_nAddr;//保存輸入的地址
m_desc+="起始地址:";
string.Format("%d",m_nAddr);
m_desc+=string;
CDialog::OnOK();
}
在這個(gè)函數(shù)里,把用戶組態(tài)的內(nèi)容(數(shù)據(jù)區(qū)的選擇,地址的指定)保存在item_n,并根
據(jù)這些內(nèi)容生成連接項(xiàng)描述.
5.6.6掃描程序IOSCAN
IOSCAN是FIOS的一個(gè)重要程序模塊.它負(fù)責(zé)完畢對(duì)IOAPI部分的DLL代碼進(jìn)行周
期性地掃描.同時(shí)完畢與I/O設(shè)備的底層通信(串口通信,網(wǎng)絡(luò)通信等),以及設(shè)備超時(shí)處
理,設(shè)備故障診斷等.IOSCAN還負(fù)責(zé)與數(shù)據(jù)庫(kù)DB之間的通信與協(xié)作.它把從I/O設(shè)備采
集到的數(shù)據(jù)經(jīng)IOAPI解析轉(zhuǎn)換后提交給DB,或?qū)B下置給I/O設(shè)備的數(shù)據(jù)經(jīng)IOAPI解析
轉(zhuǎn)換后寫入I/O設(shè)備.
IOSCAN是FIOSSDK提供的一個(gè)標(biāo)準(zhǔn)軟件工具供程序員在調(diào)試和運(yùn)營(yíng)時(shí)直接使用.
13
FIOS開發(fā)工具包里提供了debug和release版本的IOSCAN程序,在目錄
"FCINSTDIR\Fiossdk\Utility"下可以找到它們.Debug版本的IOSCAN程序重要供程序員在
調(diào)試時(shí)使用,它能提供更為豐富的調(diào)試信息.在使用時(shí),需要把IOSCAN.EXE以及配套的
幾個(gè)DLL文獻(xiàn)(即目錄"FCINSTDIR\Fiossdk\Utility\Debug"下的DLL文獻(xiàn))拷貝到生成的
debug版本的IOAPI.DLL文獻(xiàn)的同一目錄下(注意:debug版本的IOAPI.DLL文獻(xiàn)必須配
合debug版本的IOSCAN程序,release版本的IOAPI.DLL文獻(xiàn)必須配合release版本的
IOSCAN程序).同時(shí)不要忘掉將IOSCAN.EXE的文獻(xiàn)名更改為要開發(fā)的I/O驅(qū)動(dòng)的IOID
名稱.debug版本的IOSCAN需要程序員手工啟動(dòng)或用VC++調(diào)試啟動(dòng).
5.6.7編程接口IOAPI.DLL
IOAPI是FIOS提供的最重要的一個(gè)編程接口.程序員的重要工作就是開發(fā)IOAPI部分
的程序代碼.
IOAPI提供了一組API函數(shù)和一些C++類庫(kù).這組API函數(shù)規(guī)定了名稱,參數(shù)及返回
值,函數(shù)內(nèi)容由程序員根據(jù)具有的I/O設(shè)備編程實(shí)現(xiàn).C++類庫(kù)則為程序員提供各種獲取力
控I/O組態(tài)信息,參數(shù)設(shè)立信息,與數(shù)據(jù)庫(kù)DB進(jìn)行數(shù)據(jù)互換等數(shù)據(jù)解決的方法.我們把這
組API函數(shù)稱為掃描函數(shù),把這些C++類庫(kù)稱為IOC,IOC是InputOutputClass(輸入輸出
類庫(kù))的縮寫.
程序員編寫的Ioapi最后要形成MFC的擴(kuò)展動(dòng)態(tài)鏈接庫(kù)(MFCExtensionDLL),掃描
函數(shù)是這個(gè)DLL的輸出函數(shù).當(dāng)力控系統(tǒng)運(yùn)營(yíng)時(shí),力控FIOS的掃描程序Ioscan對(duì)Ioapi
中掃描函數(shù)部分的dll代碼進(jìn)行周期性地掃描,它把從I/O設(shè)備采集到的數(shù)據(jù)經(jīng)掃描函數(shù)解
析轉(zhuǎn)換后提交給DB,或?qū)B下置給I/O設(shè)備的數(shù)據(jù)經(jīng)掃描函數(shù)解析轉(zhuǎn)換后寫入I/O設(shè)備.
歸結(jié)起來(lái),開發(fā)Ioapi的重要內(nèi)容就是用IOC編寫掃描函數(shù).
IOC中的所有類庫(kù)所有以純虛類的形式提供,并且只有成員函數(shù),沒有成員變量.目
前IOC中重要涉及4個(gè)類:CItem,CPacket,CDevice,CManager.
CItem,數(shù)據(jù)項(xiàng)類.
CPacket,數(shù)據(jù)包類.
CDevice,設(shè)備類.
CManager,管理器類.
一個(gè)FIOS實(shí)例創(chuàng)建一個(gè)CManager實(shí)例.用戶在組態(tài)時(shí)每定義一個(gè)設(shè)備,則創(chuàng)建一個(gè)
CDevice實(shí)例.CManager對(duì)所有的CDevice進(jìn)行管理.一個(gè)CDevice實(shí)例,由一個(gè)或多個(gè)
CPacket實(shí)例組成,而每個(gè)CPacket實(shí)例又由一個(gè)或多個(gè)CItem實(shí)例組成.每個(gè)CItem實(shí)例,
相應(yīng)數(shù)據(jù)庫(kù)DB中的一個(gè)點(diǎn)參數(shù),也就是相應(yīng)I/O設(shè)備的一個(gè)"點(diǎn)"(如:設(shè)備的一個(gè)通道,
一個(gè)參數(shù)等).
IOC提供的這4個(gè)類庫(kù),事實(shí)上就是對(duì)以上所述的這幾種數(shù)據(jù)對(duì)象提供了一組操作方
法,以供程序員更加靈活的控制程序.
Citem類
CItem類提供了對(duì)數(shù)據(jù)項(xiàng)對(duì)象的一組操作方法.一個(gè)數(shù)據(jù)項(xiàng)對(duì)象包含的是數(shù)據(jù)庫(kù)DB中
的一個(gè)點(diǎn)參數(shù)與I/O設(shè)備中一個(gè)物理通道的映射關(guān)系.CItem使用的基本數(shù)據(jù)結(jié)構(gòu)是
IOITEMDEF.一個(gè)CItem實(shí)例保存一個(gè)IOITEMDEF實(shí)例.IOITEMDEF的定義如下:
typedefstructIoItemDefStru
{
charstr[64];
longn[8];
}IOITEMDEF;
14
CItem類的定義如下:
classCItem:publicCObject
{
public:
virtualIOITEMDEF*GetItemStru()=0;//取得數(shù)據(jù)連接項(xiàng)結(jié)構(gòu)指針
//設(shè)立連接項(xiàng)的可寫屬性,缺省時(shí)可寫的,bAttribute為TRUE設(shè)立為不可寫.
virtualvoidSetReadOnly(BOOLbAttribute=TRUE)=0;
//設(shè)立連接項(xiàng)的可讀屬性,缺省時(shí)可讀的,bAttribute為TRUE設(shè)立為不可讀.
virtualvoidSetWriteOnly(BOOLbAttribute=TRUE)=0;
virtualvoidSetData(shortsData)=0;//按短整型格式設(shè)立采集數(shù)據(jù)
virtualvoidSetData(longlData)=0;//按長(zhǎng)整型格式設(shè)立采集數(shù)據(jù)
virtualvoidSetData(doublefData)=0;//按浮點(diǎn)型格式設(shè)立采集數(shù)據(jù)
virtualvoidSetData(char*szData)=0;//按字符串格式設(shè)立采集數(shù)據(jù)
//按字符串格式取得上一次用SetData()設(shè)立的采集數(shù)據(jù)
virtualvoidGetData(char*szData)=0;
//設(shè)立私有數(shù)據(jù),offset范圍:0~3
virtualvoidSetPrivateData(unsignedshortoffset,longlPrivateData)=0;
virtuallongGetPrivateData(unsignedshortoffset)=0;//取得私有數(shù)據(jù),offset范圍:0~3
virtualCPacket*GetPacket()=0;//取得本連接項(xiàng)類所歸屬的數(shù)據(jù)包指針
virtualCDevice*GetDevice()=0;//取得本連接項(xiàng)所歸屬的設(shè)備指針
virtualCManager*GetManager()=0;//取得IoScan管理器指針
//按浮點(diǎn)型格式設(shè)立歷史數(shù)據(jù)
virtualvoidSetHisData(HisInsDatStru*pHisInsDatStru,intnCount)=0;
};
各個(gè)函數(shù)的解釋如下:
1.IOITEMDEF*GetItemStru()
功能:取得數(shù)據(jù)連接項(xiàng)結(jié)構(gòu)指針.
參數(shù):無(wú).
返回值:數(shù)據(jù)項(xiàng)結(jié)構(gòu)指針.
舉例:
IOITEMDEF*pItemStru=pItem->GetItemStru();
longnCmdType=pItemStru->n[3];
2.voidSetReadOnly(BOOLbAttribute=TRUE)
功能:設(shè)立連接項(xiàng)的寫屬性,缺省時(shí)連接項(xiàng)是可寫的.
參數(shù):TRUE:設(shè)立為不可寫;FALSE:設(shè)立為可寫.
返回值:無(wú).
舉例:
for(inti=0;iGetItemCount();i++)
{
CItem*pItem=pPacket->GetItem(i);
pItem->SetReadOnly();
}
3.voidSetWriteOnly(BOOLbAttribute=TRUE)
功能:設(shè)立連接項(xiàng)的讀屬性,缺省時(shí)連接項(xiàng)是可讀的.
15
參數(shù):TRUE:設(shè)立為不可讀;FALSE:設(shè)立為可讀.
返回值:無(wú).
舉例:
for(inti=0;iGetItemCount();i++)
{
CItem*pItem=pPacket->GetItem(i);
pItem->SetWriteOnly();
}
4.voidSetData(shortsData)
功能:按短整型格式設(shè)立采集數(shù)據(jù).
參數(shù):短整形數(shù)據(jù)值.
返回值:無(wú).
5.voidSetData(longlData)
功能:按長(zhǎng)整型格式設(shè)立采集數(shù)據(jù).
參數(shù):長(zhǎng)整型數(shù)據(jù)值.
返回值:無(wú).
6.voidSetData(doublefData)
功能:按浮點(diǎn)格式設(shè)立采集數(shù)據(jù).
參數(shù):浮點(diǎn)數(shù)據(jù)值.
返回值:無(wú).
7.voidSetData(char*szData)
功能:按字符串格式設(shè)立采集數(shù)據(jù).
參數(shù):字符串?dāng)?shù)據(jù)值.
返回值:無(wú).
8.voidGetData(char*szData)
功能:按字符串格式取得上一次用SetData()設(shè)立的采集數(shù)據(jù).
參數(shù):存放最近一次設(shè)立的采集數(shù)據(jù)(字符串型數(shù)值)的字符串指針.緩沖區(qū)長(zhǎng)度應(yīng)不
小于32.
返回值:無(wú).
舉例:
charszData[32];
pItem->GetData(szData);
9.voidSetPrivateData(unsignedshortoffset,longlPrivateData);
功能:設(shè)立私有數(shù)據(jù).
參數(shù):offset,私有數(shù)據(jù)的偏置,0~3;lPrivateData,長(zhǎng)整型私有數(shù)據(jù).
返回值:無(wú).
備注:Ioscan自動(dòng)為每個(gè)CItem實(shí)例分派了一塊由4個(gè)整型數(shù)(32位)組成的程序員
私有數(shù)據(jù)空間供程序員使用.程序員除了用這部分私有數(shù)據(jù)區(qū)保存數(shù)值外,也可以分派新的
內(nèi)存空間,然后將內(nèi)存指針保存在私有數(shù)據(jù)區(qū)內(nèi),但不要忘掉,在程序退出前,對(duì)的釋放新
分派的內(nèi)存空間.
舉例:
char*pBuf=newchar[MAXCMDLEN];
pItem->SetPrivateData(3,(long)pBuf);
10.longGetPrivateData(unsignedshortoffset)
16
功能:取得私有數(shù)據(jù).
參數(shù):offset,私有數(shù)據(jù)的偏置,0~3;lPrivateData,長(zhǎng)整型私有數(shù)據(jù).
返回值:整型私有數(shù)據(jù).備注:Ioscan自動(dòng)為每個(gè)CItem實(shí)例分派了一塊由4個(gè)整型數(shù)
(32位)組成的程序員私有數(shù)據(jù)空間供程序員使用.程序員除了用這部分私有數(shù)據(jù)區(qū)
保存數(shù)值外,也可以分派新的內(nèi)存空間,然后將內(nèi)存指針保存在私有數(shù)據(jù)區(qū)內(nèi),但不要
忘掉,在程序退出前,對(duì)的釋放新分派的內(nèi)存空間.
11.CPacket*GetPacket()
功能:取得本連接項(xiàng)類所歸屬的數(shù)據(jù)包指針.
參數(shù):無(wú)
返回值:本數(shù)據(jù)項(xiàng)所歸屬的數(shù)據(jù)包指針.
舉例:CPacket*pPacket=pItem->GetPacket();
12.CDevice*GetDevice()
功能:取得本連接項(xiàng)所歸屬的設(shè)備指針.
參數(shù):無(wú)
返回值:本連接項(xiàng)所歸屬的設(shè)備指針.
13.CManager*GetManager()
功能:取得Ioscan管理器指針.
參數(shù):無(wú)
返回值:Ioscan管理器指針.
14.voidSetHisData(HisInsDatStru*pHisInsDatStru,intnCount)
功能:按浮點(diǎn)型格式設(shè)立歷史數(shù)據(jù)
參數(shù):無(wú)
返回值:無(wú)
Cpacket類
CPacket類提供了對(duì)數(shù)據(jù)包對(duì)象的一組操作方法.一個(gè)數(shù)據(jù)包對(duì)象包含一個(gè)或多個(gè)數(shù)據(jù)
項(xiàng)對(duì)象.CPacket類的聲明如下:
classCPacket:publicCObject
{
public:
virtualintGetItemCount()=0;//取得包中數(shù)據(jù)連接項(xiàng)個(gè)數(shù)
virtualintAddItem(CItem*pItem)=0;//按先后順序加入數(shù)據(jù)連接項(xiàng)
virtualvoidInsertItem(unsignedshortnIndex,CItem*pItem)=0;//按索引插入連接項(xiàng)
virtualCItem*GetItem(intnIndex)=0;//按索引取得數(shù)據(jù)連接項(xiàng)指針
//設(shè)立包的可寫屬性,缺省時(shí)可寫的,bAttribute為TRUE設(shè)立為不可寫.
virtualvoidSetReadOnly(BOOLbAttribute=TRUE)=0;
//設(shè)立包的可讀屬性,缺省時(shí)可讀的,bAttribute為TRUE設(shè)立為不可讀.
virtualvoidSetWriteOnly(BOOLbAttribute=TRUE)=0;
//設(shè)立私有數(shù)據(jù),offset范圍:0~15
virtualvoidSetPrivateData(unsignedshortoffset,longlPrivateData)=0;
virtuallongGetPrivateData(unsignedshortoffset)=0;//取得私有數(shù)據(jù),offset范圍:0~15};
virtualvoidRepeatScan()=0;//反復(fù)掃描當(dāng)前數(shù)據(jù)包
virtualCDevice*GetDevice()=0;//取得本數(shù)據(jù)包所歸屬的設(shè)備指針
virtualCManager*GetManager()=0;//取得IoScan管理器指針
};
17
下面詳述CPacket類的各個(gè)函數(shù):
1.intGetItemCount()
功能:取得本數(shù)據(jù)包內(nèi)數(shù)據(jù)項(xiàng)的個(gè)數(shù).
參數(shù):無(wú).
返回值:本數(shù)據(jù)包內(nèi)數(shù)據(jù)項(xiàng)的個(gè)數(shù).
舉例:intnItemCnt=pPacket->GetItemCount();
2.intAddItem(CItem*pItem);
功能:按先后順序加入數(shù)據(jù)連接項(xiàng).參數(shù):加入數(shù)據(jù)包的數(shù)據(jù)項(xiàng)指針.
返回值:本數(shù)據(jù)包內(nèi)數(shù)據(jù)項(xiàng)的個(gè)數(shù).
舉例:
if(pPacket->GetItemCount()==0)
pPacket->AddItem(pItem);
3.voidInsertItem(CItem*pItem,unsignedshortnIndex)
功能:按指定位置加入數(shù)據(jù)連接項(xiàng).
參數(shù):pItem,加入數(shù)據(jù)包的數(shù)據(jù)項(xiàng)指針.nIndex,加入的數(shù)據(jù)項(xiàng)在數(shù)據(jù)包內(nèi)的序號(hào)(從
0開始).
返回值:本數(shù)據(jù)包內(nèi)數(shù)據(jù)項(xiàng)的個(gè)數(shù).
4.CItem*GetItem(intnIndex);
功能:按序號(hào)取得數(shù)據(jù)連接項(xiàng).
參數(shù):nIndex,數(shù)據(jù)項(xiàng)在數(shù)據(jù)包內(nèi)的序號(hào)(從0開始).
返回值:數(shù)據(jù)項(xiàng)指針.
舉例:
for(inti=0;iGetItemCount();i++)
{
CItem*pItem=pPacket->GetItem(i);
......
}
5..voidSetReadOnly(BOOLbAttribute=TRUE)
功能:設(shè)立數(shù)據(jù)包的寫屬性,缺省時(shí)數(shù)據(jù)包是可寫的.
參數(shù):TRUE:設(shè)立為不可寫;FALSE:設(shè)立為可寫.
返回值:無(wú).
舉例:
intnPacketCnt=0;
nPacketCnt=pDevice->GetPacketCount();
for(inti=0;iGetPacket(i);
pPacket->SetReadOnly();
}
6.voidSetWriteOnly(BOOLbAttribute=TRUE)
功能:設(shè)立數(shù)據(jù)包的讀屬性,缺省時(shí)數(shù)據(jù)包是可讀的.
參數(shù):TRUE:設(shè)立為不可讀;FALSE:設(shè)立為可讀.
返回值:無(wú).
7.voidSetPrivateData(unsignedshortoffset,longlPrivateData)
18
功能:設(shè)立私有數(shù)據(jù).
參數(shù):offset,私有數(shù)據(jù)的偏置,0~15;lPrivateData,長(zhǎng)整型私有數(shù)據(jù).
返回值:無(wú).
備注:Ioscan自動(dòng)為每個(gè)CPacket實(shí)例分派了一塊由16個(gè)整型數(shù)(32位)組成的程序
員私有數(shù)據(jù)空間供程序員使用.程序員除了用這部分私有數(shù)據(jù)區(qū)保存數(shù)值外,也可以分
配新的內(nèi)存空間,然后將內(nèi)存指針保存在私有數(shù)據(jù)區(qū)內(nèi),但不要忘掉,在程序退出前,
對(duì)的釋放新分派的內(nèi)存空間.
舉例:
char*pBuf=newchar[MAXCMDLEN];
pPacket->SetPrivateData(3,(long)pBuf);
8.longGetPrivateData(unsignedshortoffset)
功能:取得私有數(shù)據(jù).
參數(shù):offset,私有數(shù)據(jù)的偏置,0~15;lPrivateData,長(zhǎng)整型私有數(shù)據(jù).
返回值:整型私有數(shù)據(jù).
備注:Ioscan自動(dòng)為每個(gè)CPacket實(shí)例分派了一塊由16個(gè)整型數(shù)(32位)組成的程序
員私有數(shù)據(jù)空間供程序員使用.程序員除了用這部分私有數(shù)據(jù)區(qū)保存數(shù)值外,也可以分
配新的內(nèi)存空間,然后將內(nèi)存指針保存在私有數(shù)據(jù)區(qū)內(nèi),但不要忘掉,在程序退出前,
對(duì)的釋放新分派的內(nèi)存空間.
9.voidRepeatScan()
功能:反復(fù)掃描當(dāng)前數(shù)據(jù)包.
參數(shù):無(wú)
返回值:無(wú)
備注:對(duì)于異步工作方式,在采集數(shù)據(jù)時(shí),一個(gè)數(shù)據(jù)包的采集數(shù)據(jù)也許需要多幀傳送,
或者一次采集過程需要多次請(qǐng)求棗應(yīng)答過程.在這種情況下,在解析數(shù)據(jù)時(shí),執(zhí)行該函
數(shù),Ioscan將反復(fù)掃描當(dāng)前數(shù)據(jù)包.
10.CDevice*GetDevice();
功能:取得本數(shù)據(jù)包所歸屬的設(shè)備指針.
參數(shù):無(wú)
返回值:本數(shù)據(jù)包所歸屬的設(shè)備指針.
舉例:CDevice*pDevice=pPacket->GetDevice();
11.CManager*GetManager()
功能:取得Ioscan管理器指針.
參數(shù):無(wú)
返回值:Ioscan管理器指針.
舉例:CManager*pManager=pPacket->GetManager();
Cdevice類
CDevice類提供了對(duì)設(shè)備對(duì)象進(jìn)行操作的一組方法.一個(gè)設(shè)備包對(duì)象包含一個(gè)或多個(gè)數(shù)
據(jù)包對(duì)象.下面是CDevice的定義:
classCDevice:publicCObject
{
public:
//取得設(shè)備名稱
virtualCStringGetName()=0;
virtualintGetType()=0;//取得設(shè)備類型(如:串口類,網(wǎng)絡(luò)類等)
19
virtualintGetModel()=0;//取得設(shè)備型號(hào)
virtualCStringGetAddr()=0;//取得設(shè)備地址
virtualCStringGetNetAddr()=0;//取得IP地址或主機(jī)名稱
virtualCStringGetPhoneNumber()=0;//取得電話號(hào)碼
virtualintGetPort()=0;//取得串口設(shè)備端標(biāo)語(yǔ)或網(wǎng)絡(luò)設(shè)備端口
virtualintGetUpdateCycle()=0;//取得數(shù)據(jù)更新周期常數(shù)(毫秒)
virtualintGetTimeOut()=0;//取得超時(shí)時(shí)間常數(shù)(毫秒)
//取得通信空閑時(shí)間常數(shù)(毫秒),用于決定是否按字節(jié)發(fā)送和每個(gè)字節(jié)之間的延時(shí)
virtualintGetIdleTime()=0;
//設(shè)立通信空閑時(shí)間常數(shù)(毫秒),用于決定是否按字節(jié)發(fā)送和每個(gè)字節(jié)之間的延時(shí)
virtualvoidSetIdleTime(unsignedshortnTime)=0;
virtualvoidGetDCB(DCB&dcb)=0;//取得DCB參數(shù)
virtualvoidSetDCB(DCBdcb)=0;//設(shè)立DCB參數(shù)
//設(shè)立向設(shè)備寫入數(shù)據(jù)的結(jié)果狀態(tài)
virtualvoidSetWriteStatus(BOOLbSuccess=TRUE)=0;
//設(shè)立私有數(shù)據(jù),offset范圍:0~15
virtualvoidSetPrivateData(unsignedshortoffset,longlPrivateData)=0;
virtuallongGetPrivateData(unsignedshortoffset)=0;//取得私有數(shù)據(jù),offset范圍:0~15
virtualvoidRepeatScan()=0;//反復(fù)掃描當(dāng)前設(shè)備
//按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;//取得設(shè)備包含的數(shù)據(jù)包個(gè)數(shù)
//按索引取得數(shù)據(jù)包指針
virtualCPacket*GetPacket(unsignedshortnIndex)=0;
virtualCManager*GetManager()=0;//取得IoScan管理器指針
virtualintSend(char*chCommand,intnCommandLen)=0;//向設(shè)備寫入數(shù)據(jù)
virtualintGetItemCount()=0;//取得設(shè)備中數(shù)據(jù)連接項(xiàng)個(gè)數(shù)
virtualCItem*GetItem(intnIndex)=0;//按索引取得數(shù)據(jù)連接項(xiàng)指針
virtualvoidSetUnPublicized(BOOLbUnPublicized=TRUE)=0;//設(shè)立協(xié)議為未公開
virtualvoidSetDCBAfterSend(DCBdcb)=0;//設(shè)立DCB參數(shù)
//設(shè)立接受緩沖區(qū)大小(字節(jié))
virtualintSetAcceptBufferLength(intnNewAcceptBufferLength=1024)=0;
//設(shè)立發(fā)送緩沖區(qū)大小(字節(jié))
virtualintSetSendBufferLength(intnNewSendBufferLength=1024)=0;
//設(shè)立一次從串口讀取的字符串塊大小(字節(jié))
virtualintSetReadDataBufferLength(intnNewReadDataBufferLength=128)=0;
};
下面詳述CDevice類的各個(gè)函數(shù):
20
1.CStringGetName()
功能:取得設(shè)備的名稱.
參數(shù):無(wú).
返回值:設(shè)備的名稱.
備注:設(shè)備名即在"I/O設(shè)備定義"對(duì)話框"設(shè)備名稱"編輯框中輸入的字符串.
舉例:
CStringcsDeviceName=pDevice->GetName(););
2.intGetType();
功能:取得設(shè)備類型(如:串口類,網(wǎng)絡(luò)類等).
參數(shù):無(wú).
返回值:設(shè)備類型.目前該函數(shù)返回值及含義涉及如下幾種:
_SYNCH,同步通信類型設(shè)備
_SERIAL_PORT,串口通信類型設(shè)備
_NET,TCP/IP網(wǎng)絡(luò)通信類型設(shè)備
_MODEM,MODEM通信類型設(shè)備
_BOARD,板卡類型設(shè)備
_PARELLEL,并口通信類型設(shè)備
對(duì)于同步通信類型設(shè)備,板卡類型設(shè)備,Ioscan為同步工作方式.對(duì)于串口通信類型設(shè)
備,網(wǎng)絡(luò)通信類型設(shè)備,MODEM通信類型設(shè)備,并口通信類型設(shè)備,掃描程序Ioscan
為異步工作方式.
舉例:intnDeviceType=pDevice->GetType();
3.intGetModel()
功能:取得設(shè)備型號(hào).
參數(shù):無(wú).
返回值:設(shè)備型號(hào).
備注:設(shè)備型號(hào)在文獻(xiàn)iodesc.txt中指定.
舉例:intnDeviceModel=pDevice->GetModel();
4.CStringGetAddr()
功能:取得設(shè)備地址.
參數(shù):無(wú).
返回值:設(shè)備地址.
備注:設(shè)備地址指在"I/O設(shè)備定義"對(duì)話框中的"設(shè)備地址"編輯框中輸入的內(nèi)容,并不
一定與物理設(shè)備地址相同.
舉例:intnDeviceAddr=pDevice->GetAddr();
5.CStringGetNetAddr()
功能:取得TCP/IP網(wǎng)絡(luò)結(jié)點(diǎn)的地址(IP地址或主機(jī)名稱).
參數(shù):無(wú).
返回值:TCP/IP網(wǎng)絡(luò)結(jié)點(diǎn)的地址(IP地址或主機(jī)名稱).
備注:TCP/IP網(wǎng)絡(luò)結(jié)點(diǎn)的地址在設(shè)備組態(tài)時(shí)指定.
舉例:CStringcsNetAddr=pDevice->GetNetAddr();
6.CStringGetPhoneNumber()
功能:取得電話號(hào)碼.
參數(shù):無(wú).
返回值:電話號(hào)碼.
21
備注:設(shè)備的電話號(hào)碼在設(shè)備組態(tài)時(shí)指定.
舉例:CStringcsPhoneNumber=pDevice->GetPhoneNumber();
7.intGetPort()
功能:取得串口設(shè)備端標(biāo)語(yǔ)或網(wǎng)絡(luò)設(shè)備端口.
參數(shù):無(wú).
返回值:假如是串口類設(shè)備,該函數(shù)返回串口的端標(biāo)語(yǔ)(1,2,3...);假如是TCP/IP
網(wǎng)絡(luò)設(shè)備,則返回的是網(wǎng)絡(luò)端標(biāo)語(yǔ).
備注:設(shè)備的串口端標(biāo)語(yǔ)或TCP/IP網(wǎng)絡(luò)端標(biāo)語(yǔ)在設(shè)備組態(tài)時(shí)指定.
舉例:intnPort=pDevice->GetPort();
8.intGetUpdateCycle()
功能:取得數(shù)據(jù)更新周期(毫秒).
參數(shù):無(wú).
返回值:數(shù)據(jù)更新周期(毫秒).
備注:數(shù)據(jù)更新周期在設(shè)備組態(tài)時(shí)指定.
舉例:intnUpdateCycle=pDevice->GetUpdateCycle();
9.intGetTimeOut()
功能:取得設(shè)備超時(shí)時(shí)間(毫秒).
參數(shù):無(wú).
返回值:設(shè)備超時(shí)時(shí)間(毫秒).
備注:設(shè)備超時(shí)時(shí)間在設(shè)備組態(tài)時(shí)指定.
舉例:intnTimeOut=pDevice->GetTimeOut();
10.intGetIdleTime()
功能:取得通信空閑時(shí)間(毫秒).
參數(shù):無(wú).
返回值:通信空閑時(shí)間(毫秒).
通信空閑時(shí)間由SetIdleTime函數(shù)設(shè)定,初始為0.當(dāng)通信空閑時(shí)間設(shè)立為0時(shí),向I/O
設(shè)備發(fā)送的每幀數(shù)據(jù)為一次性發(fā)送,若設(shè)立了通信空閑時(shí)間(大于0),每幀數(shù)據(jù)按字
節(jié)一個(gè)一個(gè)發(fā)送,每個(gè)字節(jié)之間讓通信信道空閑等待,等待的時(shí)間長(zhǎng)度則為通信空閑時(shí)
間.
舉例:intnIdleTime=pDevice->GetIdleTime();
11.voidSetIdleTime(unsignedshortnTime)
功能:設(shè)立通信空閑時(shí)間(毫秒).
參數(shù):通信空閑時(shí)間(毫秒).
返回值:無(wú)
備注:
通信空閑時(shí)間由SetIdleTime函數(shù)設(shè)定,初始為0.當(dāng)通信空閑時(shí)間設(shè)立為0時(shí),向I/O
設(shè)備發(fā)送的每幀數(shù)據(jù)為一次性發(fā)送,若設(shè)立了通信空閑時(shí)間(大于0),每幀數(shù)據(jù)按字
節(jié)一個(gè)一個(gè)發(fā)送,每個(gè)字節(jié)之間讓通信信道空閑等待,等待的時(shí)間長(zhǎng)度則為通信空閑時(shí)
間.
舉例:pDevice->SetIdleTime(10);
12.voidGetDCB(DCB&dcb)
功能:取得DCB參數(shù).
參數(shù):返回DCB參數(shù)的結(jié)構(gòu)指針.
返回值:無(wú)
22
舉例:
DCBdcb;
pDevice->GetDCB(dcb);
13.voidSetDCB(DCBdcb)
功能:設(shè)立DCB參數(shù).
參數(shù):DCB參數(shù).
返回值:
備注:一般情況下,假如需要對(duì)系統(tǒng)缺省設(shè)立的DCB參數(shù)中的個(gè)別參數(shù)需要修改時(shí),
必須先通過GetDCB()取得系統(tǒng)缺省設(shè)立的DCB參數(shù),然后修改其中的參數(shù)后,再用本
函數(shù)設(shè)立回去.
舉例:
DCBdcb;
pDevice->GetDCB(dcb);
dcb.fBinary=TRUE;
dcb.fOutxCtsFlow=FALSE;
dcb.fOutxDsrFlow=FALSE;
dcb.fDtrControl=DTR_CONTRO
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 教育科技在小學(xué)生寫作中的運(yùn)用
- 二零二五年度獼猴桃樹種子種植面積統(tǒng)計(jì)與數(shù)據(jù)分析合同4篇
- 二零二五年度離婚協(xié)議涉及房產(chǎn)過戶及購(gòu)房款補(bǔ)償范本3篇
- 2025年度門樓玻璃制品加工與安裝合同3篇
- 2025年度美容院美容院加盟店經(jīng)營(yíng)管理培訓(xùn)協(xié)議4篇
- 二零二五版農(nóng)業(yè)科技研發(fā)與成果轉(zhuǎn)化合作協(xié)議3篇
- 科技與心理輔導(dǎo)相結(jié)合的小學(xué)數(shù)學(xué)教育模式
- 二零二五年度研發(fā)合作服務(wù)合同2篇
- 2025年度高端咖啡廳飲品定制與銷售服務(wù)合同范本3篇
- 2025年銷售合同發(fā)票管理臺(tái)賬模板(精細(xì)管控)
- 數(shù)學(xué)-山東省2025年1月濟(jì)南市高三期末學(xué)習(xí)質(zhì)量檢測(cè)濟(jì)南期末試題和答案
- 中儲(chǔ)糧黑龍江分公司社招2025年學(xué)習(xí)資料
- 湖南省長(zhǎng)沙市2024-2025學(xué)年高一數(shù)學(xué)上學(xué)期期末考試試卷
- (完整版)小學(xué)生24點(diǎn)習(xí)題大全(含答案)
- 四川省2023年普通高等學(xué)校高職教育單獨(dú)招生文化考試(中職類)數(shù)學(xué)試題(原卷版)
- 2024年3月江蘇省考公務(wù)員面試題(B類)及參考答案
- 醫(yī)院科室考勤表
- 春節(jié)期間化工企業(yè)安全生產(chǎn)注意安全生產(chǎn)
- 數(shù)字的秘密生活:最有趣的50個(gè)數(shù)學(xué)故事
- 移動(dòng)商務(wù)內(nèi)容運(yùn)營(yíng)(吳洪貴)任務(wù)一 移動(dòng)商務(wù)內(nèi)容運(yùn)營(yíng)關(guān)鍵要素分解
- 基于ADAMS的汽車懸架系統(tǒng)建模與優(yōu)化
評(píng)論
0/150
提交評(píng)論