DCS數(shù)據(jù)采集技術(shù)_第1頁(yè)
DCS數(shù)據(jù)采集技術(shù)_第2頁(yè)
DCS數(shù)據(jù)采集技術(shù)_第3頁(yè)
DCS數(shù)據(jù)采集技術(shù)_第4頁(yè)
DCS數(shù)據(jù)采集技術(shù)_第5頁(yè)
已閱讀5頁(yè),還剩27頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、.第五章 DCS數(shù)據(jù)采集技術(shù) 10頁(yè) 1.6萬(wàn)字 目前各種I/O設(shè)備提供的對(duì)外數(shù)據(jù)接口可分為以下幾類(lèi): 1, 數(shù)字通訊接口,包括串口類(lèi),以太網(wǎng)(TCP/IP協(xié)議)類(lèi),現(xiàn)場(chǎng)總線類(lèi),儀器總線類(lèi)通訊接口(如GPIB等). 2, 模擬量通道輸出,設(shè)備直接提供4-20mA,1-5V或繼電器接點(diǎn)信號(hào)等. 力控 具有世界上大部分主流設(shè)備的I/O接口程序,對(duì)GPIB總線以及Honeywell,Yokogawa,Foxboro,Fisher-Rosemount等廠家的DCS也能夠支持. 除通常意義上的數(shù)據(jù)采集外,力控 可以利用采集到的實(shí)時(shí)數(shù)據(jù)對(duì)裝置進(jìn)行實(shí)時(shí)建模,插入力控 自己的先進(jìn)控制控件,實(shí)施先進(jìn)控制. 5.

2、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è)備名稱(chēng)也可以達(dá)到要求.因?yàn)榱?的I/O驅(qū)動(dòng)對(duì)畫(huà)面中不顯

3、示而且沒(méi)有組態(tài)歷史趨勢(shì)和報(bào)警的數(shù)據(jù)是不采集的,僅當(dāng)畫(huà)面中顯示這個(gè)數(shù)據(jù)時(shí)才進(jìn)行采集.因此將不常用的數(shù)據(jù)單獨(dú)組態(tài)在一個(gè)或幾個(gè)畫(huà)面中,使用完畢馬上關(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)該慎重,最好通過(guò)多次試驗(yàn)確定一個(gè)合適的掃描周期.一般的串口設(shè)備的掃描周期可設(shè)在10-100毫秒之間. 5.3 通過(guò)撥號(hào)方式與I/O設(shè)備通訊 力控 的所有串口I/O驅(qū)動(dòng)程序都支持通過(guò)MODEM以

4、撥號(hào)方式與設(shè)備通訊.只要正確設(shè)置電話號(hào)碼即可,如圖5-2所示. 15.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)變量$IO PLC1的值就會(huì)被置為1.I/O 設(shè)備故障屬于系統(tǒng)報(bào)警.計(jì)算機(jī)通訊口故障,電纜,PLC端通訊口的故障,PLC通訊口與計(jì)算機(jī)通訊口的參數(shù)設(shè)置不一致都會(huì)造成這種結(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ú)

5、立的程序.當(dāng)力控 實(shí)時(shí)數(shù)據(jù)庫(kù)DB沒(méi)有啟動(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通訊過(guò)程中是否顯示計(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 正確設(shè)置參數(shù)后,按連接設(shè)備按鈕,如果成功的話,連接設(shè)備按鈕的標(biāo)題變成斷開(kāi)連接,表示可以收發(fā)數(shù)據(jù)

6、了.如果在參數(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ù)類(lèi)型,它的形成規(guī)則如下:任何ASCII碼(除)可以直接輸入,可以使用來(lái)輸入;內(nèi)是由 (空格)分隔的轉(zhuǎn)意字符,它們的意義為: 圖5-5 : 用來(lái)輸入; 2*: 在發(fā)送數(shù)據(jù)是表示延時(shí)1毫秒 圖5-6 #: 在發(fā)送數(shù)據(jù)是表示延時(shí)10毫秒 $: 在發(fā)送數(shù)據(jù)是表示延時(shí)100毫秒 !: 在發(fā)送數(shù)據(jù)是表示延時(shí)1000毫秒 : 表示它后面的數(shù)據(jù)是十進(jìn)制的(缺省

7、是16進(jìn)制) (空格): 作為分隔符,任何未定義的字符都可以作為分隔符,最好使用空格. 09: 可以用來(lái)輸入10進(jìn)制或16進(jìn)制數(shù)據(jù). AF/af: 可以用來(lái)輸入16進(jìn)制數(shù)據(jù). 例子: abcv 30 *#$! 345 對(duì)應(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í),唯一的差別是沒(méi)有了延時(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)換

8、位十幾種常用數(shù)據(jù)格式,除混合格式外,其它數(shù)據(jù)格式為直接用空格分隔的數(shù)據(jù)串 圖5-7 5.6 如何開(kāi)發(fā)I/O設(shè)備驅(qū)動(dòng)程序 在力控 中有一個(gè)SDK工具包,叫做FIOS SDK,可以開(kāi)發(fā)硬件設(shè)備與計(jì)算機(jī)的通訊接口程序.最簡(jiǎn)單的只需要編寫(xiě)幾個(gè)函數(shù)就可以可以做自己的I/O驅(qū)動(dòng),現(xiàn)在支持的硬件類(lèi)型有串口(RS485/232/422),網(wǎng)絡(luò),板卡,硬件廠家提供DLL等多種方式的通訊類(lèi)型.在該SDK中開(kāi)發(fā)自己的通訊接口,不需要關(guān)心硬件和計(jì)算機(jī)通訊的細(xì)節(jié),只需要了解通訊協(xié)議就可以了. 如果通訊協(xié)議很復(fù)雜,該SDK中提供了足夠靈活的手段滿足不同層次的需要.例如:在設(shè)備初始化時(shí)發(fā)什么命令或做其他處理,動(dòng)態(tài)改變硬件通

9、訊參數(shù)等等. 5.6.1 FIOS開(kāi)發(fā)包簡(jiǎn)介 FIOS負(fù)責(zé)完成與各種I/O設(shè)備進(jìn)行數(shù)據(jù)交換.一方面,它把從I/O設(shè)備采集到的實(shí)時(shí)過(guò)程數(shù)據(jù)發(fā)送給數(shù)據(jù)庫(kù)DB,另一方面,從DB發(fā)出的下置數(shù)據(jù)也通過(guò)FIOS發(fā)送給I/O設(shè)備. 根據(jù)監(jiān)控PC與I/O設(shè)備之間通信機(jī)制的不同,FIOS主要支持兩種工作方式:同步方式與異步方式. 異步方式適用以下一類(lèi)I/O設(shè)備:這類(lèi)I/O設(shè)備一般可以獨(dú)立運(yùn)行,與監(jiān)控計(jì)算機(jī)之間通過(guò)串口,網(wǎng)絡(luò)或MODEM連接.與監(jiān)控計(jì)算機(jī)之間通過(guò)明確的消息傳送(文本或二進(jìn)制消息)完成數(shù)據(jù)交換.數(shù)據(jù)交換過(guò)程為異步方式. 同步方式適用以下一類(lèi)I/O設(shè)備:這類(lèi)I/O設(shè)備或者依賴(lài)PC運(yùn)行(如:插在PC插槽

10、內(nèi)),或者獨(dú)立運(yùn)行.但與監(jiān)控計(jì)算機(jī)之間主要通過(guò)直接訪問(wèn)方式進(jìn)行數(shù)據(jù)交換,具體形式包括:寄存器直接訪問(wèn)(如:板卡),API函數(shù)調(diào)用,ActiveX控件訪問(wèn)等.數(shù)據(jù)交換過(guò)程為同步方式. 下面列舉了FIOS可實(shí)現(xiàn)的一些基本功能: 底層通信功能:1),串口通信,包括:RS232/422/485.2),TCP/IP網(wǎng)絡(luò)通信.3),MODEM3通信,通過(guò)模擬MODEM在電話網(wǎng)上通信.4),寄存器訪問(wèn),如:各種DAS板卡.5),其它. 鏈路控制功能:用M代表Master,即上位機(jī)(監(jiān)控PC工作站);S代表Slaver,即下位機(jī)(各種I/O設(shè)備).對(duì)于異步方式,FIOS支持多種鏈路控制方式.鏈路控制方式支持以

11、下幾種方式:1),M請(qǐng)求,S應(yīng)答方式.2),M請(qǐng)求,S無(wú)應(yīng)答方式.3),S主動(dòng)發(fā)送,M被動(dòng)等待.另外,對(duì)一次完整數(shù)據(jù)處理(讀或?qū)?過(guò)程,支持以下方式: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與IO Server不在同一工作站上,IO Server運(yùn)行在

12、前端機(jī)上,前端機(jī)與操作站之間通過(guò)串口,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)行維護(hù)方便,FIOS提供顯示界面,可顯示包括:發(fā)送,應(yīng)答,狀態(tài)信息,啟動(dòng)時(shí)間,分包數(shù),分包信

13、息,成功通信次數(shù)(發(fā)送次數(shù),成功應(yīng)答次),故障次數(shù)等信息. 歷史數(shù)據(jù)處理功能:對(duì)于某些能保存歷史數(shù)據(jù)的設(shè)備(如:無(wú)紙記錄儀等),FIOS能將采集到的歷史數(shù)據(jù)恢復(fù)到數(shù)據(jù)庫(kù)DB中. 5.6.2 FIOS SDK編程方式 FIOS SDK提供了一種簡(jiǎn)潔的,面向?qū)ο蟮木幊谭绞揭钥s短開(kāi)發(fā)時(shí)間,降低開(kāi)發(fā)難度. FIOS SDK提供標(biāo)準(zhǔn)的開(kāi)發(fā)接口和程序模板,程序員僅需要根據(jù)I/O設(shè)備的具體通信協(xié)議或驅(qū)動(dòng)接口說(shuō)明,填寫(xiě)幾個(gè)掃描函數(shù)的實(shí)現(xiàn)代碼,進(jìn)行必要的調(diào)試與測(cè)試,即可完成一種FIOS 的開(kāi)發(fā). FIOS提供的開(kāi)發(fā)工具封裝了大部分程序員不必關(guān)心的技術(shù)環(huán)節(jié),如:底層通信功能(串口通信,網(wǎng)絡(luò)通信等),設(shè)備超時(shí)處理,

14、設(shè)備故障診斷等.同時(shí)FIOS提供各種調(diào)試工具,方便程序員進(jìn)行系統(tǒng)測(cè)試. FIOS開(kāi)發(fā)環(huán)境完全基于32位Windows平臺(tái).它使用動(dòng)態(tài)鏈接庫(kù)(DLL)技術(shù)將程序員開(kāi)發(fā)的代碼整合到力控 系統(tǒng)中.FIOS提供給程序員的開(kāi)發(fā)接口為API函數(shù)和C+類(lèi)庫(kù). 5.6.3 FIOS SDK組件及示例程序 FIOS SDK主要由4部分組成:設(shè)備組態(tài)接口(Iodevui),數(shù)據(jù)連接組態(tài)接口(Ioitemui),編程接口Ioapi和描掃程序Ioscan.Iodevui:負(fù)責(zé)管理設(shè)備組態(tài)過(guò)程.Ioitemui:負(fù)責(zé)管理數(shù)據(jù)連接組態(tài)過(guò)程.Ioapi:負(fù)責(zé)完成與I/O設(shè)備間的數(shù)據(jù)交換,包括:對(duì)通信協(xié)議的解析,數(shù)據(jù)格式的轉(zhuǎn)

15、換等.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)換后寫(xiě)入I/O設(shè)備.Ioscan是FIOS SDK提供的一個(gè)標(biāo)準(zhǔn)軟件工具. 程序員僅需要開(kāi)發(fā)Iodevui,Ioitemui,Ioapi三部分的代碼. 示例程序 4FIOS SDK提供了兩個(gè)示例:DemoController與DemoModbus. DemoControlle

16、r是一個(gè)初級(jí)編程示例,它能引導(dǎo)初學(xué)者快速掌握開(kāi)發(fā)FIOS的基本概念和方法.DemoModbus是一個(gè)實(shí)用編程示例,它采用標(biāo)準(zhǔn)MODBUS通信協(xié)議,通過(guò)該示例,可以掌握在力控 平臺(tái)上開(kāi)發(fā)標(biāo)準(zhǔn)MODBUS設(shè)備I/O驅(qū)動(dòng)程序的方法. FIOS SDK的全部?jī)?nèi)容都是在安裝在力控 自動(dòng)安裝的,在力控 目錄下的子目錄Fiossdk中.FIOS SDK主要包含以下幾部分內(nèi)容:Examples,程序示例,仿真程序.Include,頭文件.Manual,文檔說(shuō)明.Utility,調(diào)試工具. 這2個(gè)示例具有一定的代表性,它們體現(xiàn)了FIOS SDK的主要功能.FIOS SDK提供了這2個(gè)示例的全部源代碼,在它們的基

17、礎(chǔ)上,稍做改動(dòng),就可以開(kāi)發(fā)出新的FIOS.我們把象這2個(gè)示例源程序一樣具有模板作用的程序稱(chēng)為I/O模板程序.為了提高開(kāi)發(fā)效率,我們建議盡量使用I/O模板程序,這在一定程度上,也減少,降低了編程錯(cuò)誤的發(fā)生. 常用術(shù)語(yǔ) 我們把FIO SDK中經(jīng)常涉及的一些概念給出定義,有些術(shù)語(yǔ)雖然是通用名詞,但在FIOSDK中有特定含義.這些術(shù)語(yǔ)有一些在前文給出了解釋,有一些會(huì)在后文中陸續(xù)給出解釋. FIOS ForceControl I/O Server,即力控 I/O驅(qū)動(dòng)程序 FIOS SDK FIOS軟件開(kāi)發(fā)工具包 FCINSTDIR 力控 軟件系統(tǒng)的安裝目錄 FCAPPINSTDIR 用力控 創(chuàng)建的工程應(yīng)

18、用的目錄 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配置文件 設(shè)備組態(tài)時(shí)的缺省參數(shù)設(shè)置保存文件 連接項(xiàng)結(jié)構(gòu) 保存數(shù)據(jù)連接信息的數(shù)據(jù)結(jié)構(gòu)IOITEMDEF I/O描述文件 定義設(shè)備的類(lèi)別,廠商,型號(hào),通信方式等參數(shù)的文本文件Iodesc.txt程序員 在本文檔范圍內(nèi)專(zhuān)指用FIOS SDK進(jìn)行開(kāi)發(fā)的技術(shù)人員 掃描函數(shù) 包含在Ioapi中的API函數(shù),它們由掃描程序周期掃描.掃描函數(shù)完成對(duì)設(shè)備數(shù)據(jù)解析及格式轉(zhuǎn)換 IOC Inp

19、ut Output Class(輸入輸出類(lèi)庫(kù))的縮寫(xiě). 5.6.4 設(shè)備組態(tài)接口IODEVUI.DLL I/O描述文件 在使用力控 進(jìn)行組態(tài)時(shí),一般均涉及定義I/O設(shè)備的過(guò)程.在定義設(shè)備時(shí),要選擇設(shè)備的類(lèi)別(PLC,智能儀表等),廠商,設(shè)備型號(hào)或通信協(xié)議,然后根據(jù)設(shè)備通信方式(串口方式,網(wǎng)絡(luò)方式,其它方式等)設(shè)置參數(shù).以上關(guān)于一種設(shè)備的信息(類(lèi)別,廠商,型號(hào),通信方式等)完全是由I/O描述文件決定的.I/O描述文件是一個(gè)標(biāo)準(zhǔn)文本文件,根據(jù)其規(guī)定的填寫(xiě)格式,由程序員根據(jù)具體設(shè)備自行填寫(xiě).下面介紹I/O描述文件的填寫(xiě)格式. I/O描述文件的文件名為IODESC.TXT,安裝目錄為:FCINSTDI

20、RIO ServersIOID. IO文件說(shuō)明格式為: 類(lèi)別;廠商或IO程序描述;執(zhí)行文件名稱(chēng) 5子類(lèi)型1;類(lèi)型號(hào);資源標(biāo)志;提供設(shè)備地址 子類(lèi)型2;類(lèi)型號(hào);資源標(biāo)志;提供設(shè)備地址 . 注意,子類(lèi)型號(hào)不能重復(fù).表示回車(chē)換行.最上面一行是驅(qū)動(dòng)程序的總體描述,包括三項(xiàng).各項(xiàng)之間必須以分號(hào);分隔.各項(xiàng)內(nèi)容不能含有分號(hào);. 各項(xiàng)含義如下:類(lèi)別,驅(qū)動(dòng)程序所屬類(lèi)別,現(xiàn)分為以下幾類(lèi):PLC,智能儀表,智能模塊,變頻器.程序員也可以自行擴(kuò)展.廠商或IO程序描述,I/O設(shè)備生產(chǎn)廠商名稱(chēng),協(xié)議名稱(chēng),如西門(mén)子.執(zhí)行文件名稱(chēng),I/O驅(qū)動(dòng)程序(運(yùn)行程序)的名稱(chēng),如opto_drv.exe 接下來(lái)幾行為驅(qū)動(dòng)程序所包含的設(shè)

21、備類(lèi)型的描述,如西門(mén)子包括S5,S7等,每一子類(lèi)別一行,每行包括三項(xiàng),各項(xiàng)之間必須以分號(hào);分隔.各項(xiàng)內(nèi)容不能含有分號(hào);.各項(xiàng)含義如下:子類(lèi)型,設(shè)備類(lèi)型描述.如S5.類(lèi)型號(hào),設(shè)備類(lèi)型編號(hào),類(lèi)型號(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表示需要指定設(shè)備地址,否則表示不需要設(shè)備地址. 管理程序會(huì)自動(dòng)將相同廠商或IO程序描述相同的驅(qū)動(dòng)程序歸為同一樹(shù)下. 開(kāi)發(fā)Iodevui 力控 組態(tài)環(huán)境D

22、RAW中的設(shè)備管理功能提供了一個(gè)根據(jù)I/O描述文件可靈活配置的標(biāo)準(zhǔn)設(shè)備組態(tài)接口.這個(gè)組態(tài)接口提供了一些對(duì)常用設(shè)備參數(shù)進(jìn)行設(shè)置的方法.如:設(shè)備名稱(chēng),設(shè)備地址,通信端口,端口參數(shù)等.如下圖所示: 對(duì)于很多設(shè)備,如果標(biāo)準(zhǔn)設(shè)備組態(tài)接口能夠滿足要求,就不再需要自己編寫(xiě)Iodevui接口程序了.比如示例DemoController采用的就是標(biāo)準(zhǔn)設(shè)備組態(tài)接口.而示例DemoModbus因?yàn)樯婕耙恍┨厥獾膮?shù)設(shè)置,就需要自己編寫(xiě)Iodevui接口程序了. 因此,Iodevui接口程序?qū)嶋H上就是對(duì)標(biāo)準(zhǔn)設(shè)備組態(tài)接口的一個(gè)補(bǔ)充和擴(kuò)展,并可由程序員靈活控制.Iodevui要以DLL形式提供.該DLL必須是MFC 擴(kuò)展

23、DLL.該DLL的缺省文件名稱(chēng)為IODEVUI.DLL,該文件必須安裝在目錄FCINSTDIRIO ServersIOID下. 在進(jìn)行設(shè)備組態(tài)時(shí),力控 的I/O設(shè)備管理程序會(huì)自動(dòng)檢查在目錄FCINSTDIRIO ServersIOID下是否存在IODEVUI.DLL文件.如果存在,則首先根據(jù)I/O描述文件的格式,調(diào)出標(biāo)準(zhǔn)設(shè)備組態(tài)接口界面,當(dāng)用戶(hù)確認(rèn)后,再調(diào)出Iodevui組態(tài)接口界面;若不存在該文件,則只調(diào)出標(biāo)準(zhǔn)設(shè)備組態(tài)接口界面. 示例DemoModbus的Iodevui接口程序可以做為開(kāi)發(fā)Iodevui的模板程序.我們結(jié)合示例DemoModbus的Iodevui模板程序具體解釋實(shí)現(xiàn)過(guò)程.查看

24、頭文件Iodevui.h可以發(fā)現(xiàn),Iodevui.dll主要實(shí)現(xiàn)3個(gè)輸出函數(shù): 6extern C AFX_EXT_API long AddIoDev(const char* szDeviceName, int nType); extern C AFX_EXT_API long ModIoDev(const char* szDeviceName); extern C AFX_EXT_API long DelIoDev (const char* szDeviceName); 在進(jìn)行設(shè)備組態(tài)時(shí),當(dāng)增加一個(gè)設(shè)備時(shí),力控 設(shè)備管理程序會(huì)自動(dòng)調(diào)用AddIoDev()函數(shù);當(dāng)修改一個(gè)已創(chuàng)建設(shè)備時(shí)會(huì)調(diào)用Mo

25、dIoDev()函數(shù);當(dāng)刪除一個(gè)設(shè)備時(shí)會(huì)調(diào)用DelIoDev ()函數(shù). 其中,參數(shù)szDeviceName為I/O設(shè)備名稱(chēng)(輸入值,組態(tài)時(shí)由用戶(hù)指定).nType 為設(shè)備子類(lèi)型號(hào),由程序員在I/O描述文件中指定.返回值為0表示操作成功;其它表示操作失敗.為了較好地實(shí)現(xiàn)程序結(jié)構(gòu)化,本模板程序提供了一個(gè)CDevMan類(lèi)對(duì)設(shè)備及組態(tài)操作過(guò)程進(jìn)行管理.Iodevui.dll的3個(gè)輸出函數(shù)AddIoDev(),ModIoDev()DelIoDev ()的具體實(shí)現(xiàn)過(guò)程是在CDevMan的三個(gè)成員函數(shù)Add(),Mod()和Del()中實(shí)現(xiàn)的. 首先看一下Add()的實(shí)現(xiàn)代碼: /* / 添加I/O設(shè)備

26、/ szDeviceName, 設(shè)備名稱(chēng)(輸入值) / nType, 設(shè)備子類(lèi)型(用于一個(gè)驅(qū)動(dòng)程序驅(qū)動(dòng)多種類(lèi)型設(shè)備)(輸入值) / 返回值說(shuō)明:0, 操作成功;其它, 操作失敗 /* long CDevMan:Add(const char* szDeviceName, int nType) if(Find(szDeviceName) AfxMessageBox(該數(shù)據(jù)源名已經(jīng)存在!); return -1; CDevice* pDev = new CDevice(szDeviceName,nType); if(CallDialog(pDev) m_list.AddTail(pDev); Sto

27、re(); return 0; else delete pDev; return -1; 程序的一開(kāi)始,調(diào)用Find()函數(shù)來(lái)查找是否已有相同的設(shè)備名存在,如果有給出提示并返回-1表示操作失敗,否則生成一個(gè)CDevice對(duì)象并調(diào)用CallDialog函數(shù)來(lái)顯示一個(gè)對(duì)話框,讓用戶(hù)做進(jìn)一步的選擇,如果用戶(hù)進(jìn)行確認(rèn),操作成功,它把此CDevice對(duì)象加入設(shè)備鏈表中,并調(diào)用Store函數(shù)來(lái)保存設(shè)備信息.另外兩個(gè)函數(shù)和它類(lèi)似. Store()函數(shù)如下: void CDevMan:Store() C; 7if(const char*)(ddeacc.dat),C) CArchive ar(&file, C

28、Archive:store); Serialize(ar); ar.Close(); (); 該函數(shù)它先打開(kāi)ddeacc.dat文件,如果不存在,就建立此文件.然后調(diào)用序列化函數(shù)對(duì)它進(jìn)行保存,最后關(guān)閉此文件.再看一看序列化函數(shù): void CDevMan:Serialize(CArchive &ar) TRY CObject:Serialize(ar); m_list.Serialize(ar); CATCH(C) AfxMessageBox(文件版本不匹配!); END_CATCH 該函數(shù)對(duì)m_list(由CDevice類(lèi)實(shí)例組成)進(jìn)行序列化.在調(diào)用各個(gè)CDevice類(lèi)實(shí)例的序列化函數(shù)時(shí),如

29、果是讀取操作,會(huì)依次創(chuàng)建CDevice實(shí)例,并調(diào)用CDevice的序列化函數(shù),隨后把CDevice實(shí)例加入m_list鏈表.具體保存和讀取的變量數(shù)據(jù)在CDevice類(lèi)中控制,也就是說(shuō)程序員針對(duì)不同的設(shè)備可以改寫(xiě)CDevice類(lèi),定義不同的成員變量,記錄設(shè)備的不同的屬性,對(duì)CDevice類(lèi)重載Serialize即可實(shí)現(xiàn)設(shè)備的保存,加載,增加,刪除和修改等功能. 我們?cè)倏匆幌翪Device類(lèi)序列化的實(shí)現(xiàn)過(guò)程: void CDevice:Serialize(CArchive& ar) if (ar.IsStoring() ar m_csName; /設(shè)備名稱(chēng) ar m_csName; ar m_dw

30、Data; 如果是保存操作,序列化函數(shù)會(huì)將參數(shù)自動(dòng)存盤(pán);如果是讀取操作,序列化函數(shù)會(huì)從磁盤(pán)上讀取參數(shù)值. 8察看CallDialog函數(shù)可以發(fā)現(xiàn),它生成了一個(gè)對(duì)話框,讓用戶(hù)做相應(yīng)的選擇,然后把用戶(hù)選擇的信息保存在CDevice類(lèi)的成員函數(shù)中,以便于儲(chǔ)存. 整個(gè)程序框架使用CDevice類(lèi)來(lái)保存設(shè)備的信息.在CallDialog函數(shù)中使用一個(gè)對(duì)話框,來(lái)讓用戶(hù)進(jìn)行選擇設(shè)備的屬性,并且在CallDialog函數(shù)中把它保存在CDevice類(lèi)中.所以對(duì)于一個(gè)新的設(shè)備,程序員所要做的工作就是,分析設(shè)備的協(xié)議查看是否僅使用描述文件就可以完成設(shè)備的定義,如果不能,那么應(yīng)該編制IoDevUi.dll.這時(shí)應(yīng)分析

31、應(yīng)該增加哪一些屬性,定義哪一些CDevice類(lèi)的成員變量,以及顯示什么樣的對(duì)話框,讓用戶(hù)做什么樣的選擇.所以程序員的工作重點(diǎn)在于修改CDevice類(lèi),增加成選變量,并重載它的Serialize函數(shù),然后修改對(duì)話框,讓用戶(hù)做不同的選擇,并把選擇保存在CDevice類(lèi)的成員變量中即可. 在該示例中,我們定義了2個(gè)設(shè)備參數(shù): CString m_csName; /設(shè)備的名稱(chēng) DWORD m_dwData; /用于保存數(shù)據(jù) 這樣只需在對(duì)話框中對(duì)m_csName和m_dwData賦值即可. /*/ /調(diào)用對(duì)話框定義數(shù)據(jù)源 / pDev 數(shù)據(jù)源指針 /返回值 true 成功 /*/ bool CDevMa

32、n:CallDialog(CDevice* pDev) ASSERT(pDev); CDevDef dlg; 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

33、_dwData = (pDev-m_dwData)|(dlg.m_inPackLongcsPath+=ddeacc.dat;/數(shù)據(jù)保存在了工程目錄的ddeacc.dat中 DWORD data; CString strtemp; 9short temp; C; if(const char*)csPath,C)/打開(kāi)該文件 CArchive ar(&file, CArchive:load); /讀取的第一個(gè)數(shù)據(jù)是定義的設(shè)備的個(gè)數(shù), /但是因?yàn)榭梢酝ㄟ^(guò)GetDeviceCount函數(shù)得到設(shè)備的個(gè)數(shù), /所以這里把讀到的數(shù)據(jù)簡(jiǎn)單的丟掉. artemp; int nDevCnt = pManager-

34、GetDeviceCount(); for (int i = 0; i GetDevice(i); arstrtemp;/讀取設(shè)備的名字 ardata;/讀取數(shù)據(jù) /這兩句在講到Ioapi.dll時(shí)再進(jìn)行介紹 pDevice-SetPrivateData(1,long(data&1); pDevice-SetPrivateData(2,long(data8)&0xff); DCB dcb; pDevice-GetDCB(dcb); dcb.fBinary = TRUE; dcb.fOutxCtsFlow = FALSE; dcb.fOutxDsrFlow = FALSE; dcb.fDtrCo

35、ntrol = DTR_CONTROL_DISABLE; dcb.fNull = FALSE; dcb.fRtsControl = RTS_CONTROL_DISABLE; pDevice-SetDCB(dcb); ar.Close(); ();/關(guān)閉文件 else strtemp=對(duì)不起,沒(méi)有找到; strtemp+=csPath; strtemp+=程序不能運(yùn)行!; AfxMessageBox(strtemp); PostQuitMessage(0);/沒(méi)有找到文件,給出提示,并終止程序的運(yùn)行. 注意序列化的內(nèi)容和順序必須和IoDevUi.dll一致,否則會(huì)導(dǎo)致程序運(yùn)行時(shí)產(chǎn)生錯(cuò)誤. 5.6

36、.5 Ioitemui介紹及編程示例 在用力控 進(jìn)行組態(tài)時(shí),把數(shù)據(jù)庫(kù)DB中的點(diǎn)參數(shù)與某種設(shè)備的具體通道建立連接的過(guò)10程被為數(shù)據(jù)連接過(guò)程.在進(jìn)行數(shù)據(jù)連接時(shí),一般還要指定數(shù)據(jù)轉(zhuǎn)換格式,數(shù)據(jù)長(zhǎng)度等參數(shù). 數(shù)據(jù)連接過(guò)程對(duì)于不同的I/O設(shè)備,其形式和內(nèi)容可能完全不同.因此必須針對(duì)不同的I/O設(shè)備,設(shè)計(jì)相應(yīng)的數(shù)據(jù)連接形式,保存各種參數(shù)信息. Ioitemui接口主要完成的兩部分功能,一是為用戶(hù)進(jìn)行數(shù)據(jù)連接組態(tài)時(shí)提供一個(gè)界面;另外就是將用戶(hù)組態(tài)的設(shè)備參數(shù)信息用某種格式保存起來(lái),以便在開(kāi)發(fā)編程接口Ioapi時(shí)使用.我們定義了一個(gè)數(shù)據(jù)結(jié)構(gòu)來(lái)保存設(shè)備參數(shù)信息,這就是數(shù)據(jù)連接項(xiàng)結(jié)構(gòu)(下面簡(jiǎn)稱(chēng)連接項(xiàng)結(jié)構(gòu))IOITE

37、MDEF. IOITEMDEF定義在Ioitemui.h中: typedef struct IoItemDefStru char str64; long n8; IOITEMDEF; 這個(gè)結(jié)構(gòu)是一個(gè)通用結(jié)構(gòu),由程序員自己賦值,自己解釋.Ioitemui要以DLL形式提供.該DLL必須是MFC 擴(kuò)展DLL.該DLL的缺省文件名稱(chēng)為IOITEMUI.DLL,該文件必須安裝在目錄FCINSTDIRIO ServersIOID下. Ioitemui的工作過(guò)程如下: 在進(jìn)行數(shù)據(jù)連接組態(tài)時(shí),力控 的DBMAN管理程序會(huì)自動(dòng)檢查在目錄FCINSTDIRIO ServersIOID下是否存在IOITEMUI.

38、DLL文件.如果存在,則調(diào)出數(shù)據(jù)連接組態(tài)接口界面. 下面介紹如何編寫(xiě)Ioitemui接口程序. Ioitemui.dll主要實(shí)現(xiàn)1個(gè)輸出函數(shù):extern C AFX_EXT_API long DoItemDlg(const char * szDeviceName, int nType, IOITEMDEF &item, char * szDesc, int nFlag); 其參數(shù)說(shuō)明如下: szDeviceName, 設(shè)備名稱(chēng)(輸入值).如果在力控 中定義了一個(gè)設(shè)備Device1,那么在給該設(shè)備組點(diǎn)時(shí),傳給DoItemDlg的szDeviceName值就是字符串Device1. nType,

39、 設(shè)備子類(lèi)型(用于一個(gè)驅(qū)動(dòng)程序驅(qū)動(dòng)多種類(lèi)型設(shè)備)(輸入值).它的值在IODESC.TXT中指定(參見(jiàn)上一章對(duì)I/O描述文件的介紹). item, 數(shù)據(jù)連接項(xiàng)結(jié)構(gòu)(返回值).需要注意的是,item除了是輸出值外,也是輸入值,DBMAN管理程序每次調(diào)用DoItemDlg()時(shí),將上一次操作賦給item的值傳遞過(guò)來(lái). szDesc, 數(shù)據(jù)連接項(xiàng)描述,用于DBMAN程序顯示的提示信息. nFlag, 1表示增加數(shù)據(jù)連接項(xiàng),2表示修改,0表示刪除(輸入值).其返回值0表示操作成功.其它, 操作失敗. Ioitemui.dll的工作過(guò)程如下: 當(dāng)用戶(hù)打開(kāi)數(shù)據(jù)組點(diǎn)連接對(duì)話框時(shí),選中了一個(gè)點(diǎn),并按下增加,修改

40、或刪除鍵,這時(shí)就會(huì)調(diào)用Ioitemui.dll的DoItemDlg函數(shù).程序員應(yīng)該在此函數(shù)中,彈出一個(gè)對(duì)話框讓用戶(hù)進(jìn)行選擇,在用戶(hù)按下了OK鍵之后,把用戶(hù)的選擇保存在item中,以后編制Ioapi.dll時(shí)可以利用這些信息. 編程示例 我們先結(jié)合示例DemoController介紹如何開(kāi)發(fā)Ioitemui. 仿真器SimController的內(nèi)部有數(shù)字區(qū)(DIO)和模擬區(qū)(AIO).DIO和AIO區(qū)通道范圍為:0255.每個(gè)DIO通道的數(shù)據(jù)的數(shù)值范圍為:0或1.每個(gè)AIO通道數(shù)據(jù)的數(shù)值范圍為:04095.所以我們應(yīng)該在DoItemDlg函數(shù)中彈出一個(gè)對(duì)話框,用戶(hù)可以在此對(duì)話框中選擇輸入通道和內(nèi)

41、存地址.輸入通道有兩個(gè)選項(xiàng)DIO通道和AIO通道供用戶(hù)選擇,內(nèi)存地址可以讓用戶(hù)輸入0255之間的數(shù)據(jù). 11我們介紹一下如果不使用I/O模板,如何自己生成一個(gè)新的Ioitemui工程: 在VC+環(huán)境下,選擇菜單命令new,選擇新建工程,工程名為Ioitemui,選擇MFC Appwizard (dll)選項(xiàng),在下一步DLL類(lèi)型中選擇MFC Extension DLL型,然后按下Finish鍵.即可創(chuàng)建一個(gè)新的Ioitemui工程. 打開(kāi)Ioitemui.cpp文件,在文件的開(kāi)頭加入#include Ioitemui.h,把Ioitemui.h拷入本工程,然后在文件的最后鍵入: long DoI

42、temDlg(const char * strDataSour,int nType,IOITEMDEF &item,char * szDesc,int nFlag) 這就加入了dll的輸出函數(shù). 打開(kāi)示例DemoController的Ioitemui模板程序,它的DoItemDlg()函數(shù)實(shí)現(xiàn)過(guò)程如下: long DoItemDlg(const char * szDeviceName, int nType,IOITEMDEF &item,char * szDesc,int nFlag) CLinkDlg dlg; dlg.item_n0 = item.n0; dlg.item_n1 = ite

43、m.n1; switch(nFlag) case 0:/刪除操作 return 0; /增加或修改操作 case 1: case 2: if(dlg.DoModal()=IDOK) item.n0=dlg.item_n0; item.n1=dlg.item_n1; sprintf(szDesc,%s,(LPCSTR)dlg.m_desc); sprintf(item.str,%s,(LPCSTR)dlg.m_desc); return 0; break; return 1; 在這個(gè)模板程序里,還涉及一個(gè)對(duì)話框類(lèi)CLinkDlg .這個(gè)對(duì)話框?yàn)橛脩?hù)進(jìn)行數(shù)據(jù)連接組態(tài)時(shí)提供一個(gè)界面,其形式如下: 1

44、2CLinkDlg 類(lèi)有2個(gè)成員變量: CString m_desc;/保存連接項(xiàng)描述 int item_n2;/item_n0保存數(shù)據(jù)區(qū)類(lèi)型,0表示DIO,1表示AIO; /item_n1保存地址 在CLinkDlg的WM_INITDIALOG消息函數(shù)中進(jìn)行如下處理: BOOL CLinkDlg:OnInitDialog() CDialog:OnInitDialog(); /在此處設(shè)置值使對(duì)話框的顯示和是一次選擇相同,以利于執(zhí)行和上一次相近的操作 m_CtrlChannel.SetCurSel(item_n0); /設(shè)置操作選項(xiàng)為上一次的操作 m_nAddr = item_n1; /設(shè)置地址

45、為上一次的值 UpdateData(FALSE); return TRUE; 這些處理為了使對(duì)話框的顯示和上一次選擇相同,以利于執(zhí)行和上一次相近的操作.在ONOK消息函數(shù)進(jìn)行如下處理: void CLinkDlg:OnOK() UpdateData(TRUE);/得到各個(gè)選項(xiàng)得值 CString string; item_n0 = m_CtrlChannel.GetCurSel();/保存操作選項(xiàng) m_CtrlChannel.GetWindowText(m_desc); item_n1 = m_nAddr;/保存輸入的地址 m_desc+= 起始地址:; string.Format(%d,m_

46、nAddr); m_desc+=string; CDialog:OnOK(); 在這個(gè)函數(shù)里,把用戶(hù)組態(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)換后寫(xiě)入I/O設(shè)備. IOS

47、CAN是FIOS SDK提供的一個(gè)標(biāo)準(zhǔn)軟件工具供程序員在調(diào)試和運(yùn)行時(shí)直接使用.13FIOS開(kāi)發(fā)工具包里提供了debug和release版本的IOSCAN程序,在目錄FCINSTDIRFiossdkUtility下可以找到它們.Debug版本的IOSCAN程序主要供程序員在調(diào)試時(shí)使用,它能提供更為豐富的調(diào)試信息.在使用時(shí),需要把IOSCAN.EXE以及配套的幾個(gè)DLL文件(即目錄FCINSTDIRFiossdkUtilityDebug下的DLL文件)拷貝到生成的debug版本的IOAPI.DLL文件的同一目錄下(注意:debug版本的IOAPI.DLL文件必須配合debug版本的IOSCAN程序

48、,release版本的IOAPI.DLL文件必須配合release版本的IOSCAN程序).同時(shí)不要忘記將IOSCAN.EXE的文件名更改為要開(kāi)發(fā)的I/O驅(qū)動(dòng)的IOID名稱(chēng).debug版本的IOSCAN需要程序員手工啟動(dòng)或用VC+調(diào)試啟動(dòng). 5.6.7 編程接口IOAPI.DLL IOAPI是FIOS提供的最主要的一個(gè)編程接口.程序員的主要工作就是開(kāi)發(fā)IOAPI部分的程序代碼. IOAPI提供了一組API函數(shù)和一些C+類(lèi)庫(kù).這組API函數(shù)規(guī)定了名稱(chēng),參數(shù)及返回值,函數(shù)內(nèi)容由程序員根據(jù)具備的I/O設(shè)備編程實(shí)現(xiàn).C+類(lèi)庫(kù)則為程序員提供各種獲取力控 I/O組態(tài)信息,參數(shù)設(shè)置信息,與數(shù)據(jù)庫(kù)DB進(jìn)行數(shù)據(jù)

49、交換等數(shù)據(jù)處理的方法.我們把這組API函數(shù)稱(chēng)為掃描函數(shù),把這些C+類(lèi)庫(kù)稱(chēng)為IOC,IOC是Input Output Class(輸入輸出類(lèi)庫(kù))的縮寫(xiě). 程序員編寫(xiě)的Ioapi最后要形成MFC的擴(kuò)展動(dòng)態(tài)鏈接庫(kù)(MFC Extension DLL),掃描函數(shù)是這個(gè)DLL的輸出函數(shù).當(dāng)力控 系統(tǒng)運(yùn)行時(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)換后寫(xiě)入I/O設(shè)備. 歸結(jié)起來(lái),開(kāi)發(fā)Ioapi的主要內(nèi)容就是用IOC編寫(xiě)掃描函數(shù). IOC中的所有類(lèi)庫(kù)全

50、部以純虛類(lèi)的形式提供,并且只有成員函數(shù),沒(méi)有成員變量. 目前IOC中主要包括4個(gè)類(lèi):CItem ,CPacket,CDevice,CManager. CItem,數(shù)據(jù)項(xiàng)類(lèi). CPacket,數(shù)據(jù)包類(lèi). CDevice,設(shè)備類(lèi). CManager,管理器類(lèi). 一個(gè)FIOS實(shí)例創(chuàng)建一個(gè)CManager實(shí)例.用戶(hù)在組態(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í)例,對(duì)應(yīng)數(shù)據(jù)庫(kù)DB中的一個(gè)點(diǎn)參數(shù),也就是對(duì)應(yīng)I/O設(shè)備的

51、一個(gè)點(diǎn)(如:設(shè)備的一個(gè)通道,一個(gè)參數(shù)等). IOC提供的這4個(gè)類(lèi)庫(kù),實(shí)際上就是對(duì)以上所述的這幾種數(shù)據(jù)對(duì)象提供了一組操作方法,以供程序員更加靈活的控制程序. Citem類(lèi) CItem類(lèi)提供了對(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的定義如下: typedef struct IoItemDefStru char str64; long n8; IOITEMDEF; 14CItem類(lèi)的定義如下: class CI

52、tem : public CObject public: virtual IOITEMDEF* GetItemStru()=0; /取得數(shù)據(jù)連接項(xiàng)結(jié)構(gòu)指針 /設(shè)置連接項(xiàng)的可寫(xiě)屬性,缺省時(shí)可寫(xiě)的,bAttribute 為T(mén)RUE設(shè)置為不可寫(xiě). virtual void SetReadOnly(BOOL bAttribute = TRUE)=0; /設(shè)置連接項(xiàng)的可讀屬性,缺省時(shí)可讀的,bAttribute 為T(mén)RUE設(shè)置為不可讀. virtual void SetWriteOnly(BOOL bAttribute = TRUE)=0; virtual void SetData(short sDat

53、a)=0; /按短整型格式設(shè)置采集數(shù)據(jù) virtual void SetData(long lData)=0; /按長(zhǎng)整型格式設(shè)置采集數(shù)據(jù) virtual void SetData(double fData)=0; /按浮點(diǎn)型格式設(shè)置采集數(shù)據(jù) virtual void SetData(char* szData)=0; /按字符串格式設(shè)置采集數(shù)據(jù) /按字符串格式取得上一次用SetData()設(shè)置的采集數(shù)據(jù) virtual void GetData(char* szData)=0; /設(shè)置私有數(shù)據(jù),offset范圍:03 virtual void SetPrivateData(unsigned short offset, long lPrivateData)=0; virtual long GetPrivateData(unsigned short offset)=0; /取得私有數(shù)據(jù),offset范圍:03 virtual CPacket* GetPacket()=0; /取得本連接項(xiàng)類(lèi)所歸屬的數(shù)據(jù)包指針 virtual CDevice* GetDevice()=0; /取得本連接項(xiàng)所歸屬的設(shè)備指針 virtual CManager* GetManager()=0; /取得IoScan管理器指針 /按浮點(diǎn)型

溫馨提示

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

評(píng)論

0/150

提交評(píng)論