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

下載本文檔

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

文檔簡介

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

2、自己的先進控制控件,實施先進控制 .5.1 對一個設備上的數(shù)據(jù)定義不同的采集周期如果一臺設備上有1000 個實時數(shù)據(jù)需要采集 ,而在這1000 個數(shù)據(jù)中只有10 個是經(jīng)常刷新且需要密切監(jiān)視的 ,其余 990個全部是輔助數(shù)據(jù) ,但是也需要時常查看.如果把這 1000個數(shù)據(jù)同等地對待,采用統(tǒng)一的掃描周期進行采集,就會嚴重影響 10個重要數(shù)據(jù)的刷新速度.怎樣既保證1000 個數(shù)據(jù)都能夠采集,又確保這10 個重要數(shù)據(jù)的采集速度呢有兩種辦法 :辦法 1:為一個設備定義兩個邏輯設備,使其具有不同的采集周期,如圖 5-1 所示 .但是這種方法定義的最長掃描周期為10 分鐘 .辦法 2:不用上面的辦法 ,一臺

3、設備只定義一個設備名稱也可以達到要求.因為力控的 I/O驅(qū)動對畫面中不顯示而且沒有組態(tài)歷史趨勢和報警的數(shù)據(jù)是不采集的,僅當畫面中顯示這個數(shù)據(jù)時才進行采集.因此將不常用的數(shù)據(jù)單獨組態(tài)在一個或幾個畫面中,使用完畢馬上關閉就不會影響整個采集速度 .這種方法適用于存在有大量不需要快速更新的數(shù)據(jù)的情況.圖 5-15.2 合理設置掃描周期 ,避免引起設備死機有些 I/O 設備內(nèi)部只有一個CPU, 同時負責數(shù)據(jù)通訊和計算 ,如果在力控上設置的數(shù)據(jù)掃描周期太快容易使設備死機,因此在設置這一參數(shù)時應該慎重,最好通過多次試驗確定一個合適的掃描周期.一般的串口設備的掃描周期可設在10-100 毫秒之間 .5.3 通

4、過撥號方式與I/O 設備通訊力控 的所有串口 I/O 驅(qū)動程序都支持通過 MODEM以撥號方式與設備通訊 .只要正確設置電話號碼即可 ,如圖 5-2 所示 .15.4 通訊狀態(tài)監(jiān)視 ,設備狀態(tài)數(shù)據(jù)的讀取力控 為每一個 I/O設備自動定義了一個系統(tǒng)變量,假如系統(tǒng)中有一個設備PLC1,則每當 PLC1 不能與力控 正常通訊時 ,系統(tǒng)變量 $IO PLC1 的值就會被置為 1.I/O 設備故障屬于系統(tǒng)報警.計算機通訊口故障 ,電纜 ,PLC 端通訊口的故障 ,PLC 通訊口與計算機通訊口的參數(shù)設置不一致都會造成這種結(jié)果.還有一種可能 ,就是數(shù)據(jù)連接項錯誤,如果計算機的命令發(fā)給 PLC 的只讀參數(shù) ,

5、PLC 是不會予以理睬的 .5.5 怎樣用 I/O 驅(qū)動程序調(diào)試 I/O設備力控 的 I/O 驅(qū)動程序有數(shù)百個,針對每一種設備都有一個獨立的程序.當力控實時數(shù)據(jù)庫 DB 沒有啟動時 ,單獨啟動 I/O 驅(qū)動可以作為本地 I/O 設備調(diào)試工具使用.此時可以測試計算機與I/O 設備的通訊情況,摸索最佳.的掃描周期 .菜單 設置 S/ 參數(shù) 用來規(guī)定I/O 通訊過程中是否顯示計算機發(fā)出和設備響應的通訊信息 .如圖 5-3 所示 .菜單 工具 T/ 工具 用來在不啟動實時數(shù)據(jù)庫及其數(shù)據(jù)連接項的情況下執(zhí)行與I/O設備的通訊 .彈出對話框如圖5-5 上部所示 .此時可以按 參數(shù)設置 按鈕設置通訊參數(shù),如圖

6、 5-6 和 5-7 所示 ,主要是設置串口的DCB 參數(shù),IP 地址等 .圖 5-2圖 5-3 圖 5-4正確設置參數(shù)后,按 連接設備 按鈕 ,如果成功的話 , 連接設備 按鈕的標題變成 斷開連接 , 表示可以收發(fā)數(shù)據(jù)了 .如果在 參數(shù)設置 中設置 周期性發(fā)送周期 不為 0,則在 連接設備 后會出現(xiàn) 周期發(fā)送 按鈕 ,否則出現(xiàn) 手動發(fā)送 按鈕 .使用 周期發(fā)送 或 手動發(fā)送 按鈕 ,可以周期性或一次性地發(fā)送編輯框中的數(shù)據(jù)了 .編輯框中數(shù)據(jù)的格式缺省是混合方式的 ,如果你想發(fā)送編輯框中的數(shù)據(jù) ,這也是唯一的數(shù)據(jù)類型,它的形成規(guī)則如下:任何 ASCII 碼(除 )可以直接輸入, 可以使用 來輸入

7、 ; 內(nèi)是由 (空格 )分隔的轉(zhuǎn)意字符,它們的意義為:圖 5-5:用來輸入 ;2*:在發(fā)送數(shù)據(jù)是表示延時1 毫秒圖 5-6#:在發(fā)送數(shù)據(jù)是表示延時10 毫秒$:在發(fā)送數(shù)據(jù)是表示延時100 毫秒!:在發(fā)送數(shù)據(jù)是表示延時1000 毫秒:表示它后面的數(shù)據(jù)是十進制的(缺省是 16 進制) (空格 ): 作為分隔符 ,任何未定義的字符都可以作為分隔符 ,最好使用空格 .09: 可以用來輸入10 進制或 16 進制數(shù)據(jù) .AF/af:可以用來輸入16 進制數(shù)據(jù) .例子 : abcv 30 *#$! 345對應的 16 進制數(shù)據(jù)串為 :.61H,62H,63H,76H,5BH,30H,33H,34H,35H

8、;而且在 30H 之后有 1111 毫秒的延時 .當用在其它情況(不是用來發(fā)送數(shù)據(jù))時,唯一的差別是沒有了延時的概念. 其它工具 : 校驗使用混合格式的數(shù)據(jù) ,計算常用的校驗碼 ,ASCII 碼表顯示使用 16 進制和10 進制顯示的 ASCII 碼表 ,各種數(shù)據(jù)轉(zhuǎn)換把混合格式 ,16/32 位整數(shù) ,32 位浮點數(shù)等轉(zhuǎn)換位十幾種常用數(shù)據(jù)格式 ,除混合格式外 ,其它數(shù)據(jù)格式為直接用空格分隔的數(shù)據(jù)串圖 5-75.6 如何開發(fā)I/O 設備驅(qū)動程序在力控中有一個SDK 工具包 ,叫做 FIOS SDK, 可以開發(fā)硬件設備與計算機的通訊接口程序 .最簡單的只需要編寫幾個函數(shù)就可以可以做自己的I/O 驅(qū)

9、動 ,現(xiàn)在支持的硬件類型有串口 (RS485/232/422), 網(wǎng)絡 ,板卡 ,硬件廠家提供 DLL 等多種方式的通訊類型.在該 SDK中開發(fā)自己的通訊接口,不需要關心硬件和計算機通訊的細節(jié),只需要了解通訊協(xié)議就可以了.如果通訊協(xié)議很復雜,該 SDK 中提供了足夠靈活的手段滿足不同層次的需要.例如 :在設備初始化時發(fā)什么命令或做其他處理,動態(tài)改變硬件通訊參數(shù)等等 .5.6.1 FIOS 開發(fā)包簡介FIOS 負責完成與各種I/O 設備進行數(shù)據(jù)交換 .一方面 ,它把從 I/O 設備采集到的實時過程數(shù)據(jù)發(fā)送給數(shù)據(jù)庫DB, 另一方面 ,從 DB 發(fā)出的下置數(shù)據(jù)也通過FIOS 發(fā)送給 I/O 設備 .

10、根據(jù)監(jiān)控 PC 與 I/O 設備之間通信機制的不同 ,FIOS 主要支持兩種工作方式: 同步方式與異步方式 .異步方式適用以下一類I/O 設備 :這類 I/O 設備一般可以獨立運行,與監(jiān)控計算機之間通過串口 ,網(wǎng)絡或 MODEM 連接 .與監(jiān)控計算機之間通過明確的消息傳送(文本或二進制消息 )完成數(shù)據(jù)交換 .數(shù)據(jù)交換過程為異步方式 .同步方式適用以下一類I/O 設備 :這類 I/O 設備或者依賴 PC 運行 (如 :插在 PC 插槽內(nèi)), 或者獨立運行 .但與監(jiān)控計算機之間主要通過直接訪問方式進行數(shù)據(jù)交換,具體形式包括 :寄存器直接訪問 (如 :板卡 ),API 函數(shù)調(diào)用 ,ActiveX 控

11、件訪問等 .數(shù)據(jù)交換過程為同步方式 .下面列舉了 FIOS 可實現(xiàn)的一些基本功能:底層通信功能 :1), 串口通信 ,包括 :RS232/422/485.2),TCP/IP網(wǎng)絡通信 .3),MODEM3通信 ,通過模擬 MODEM 在電話網(wǎng)上通信 .4),寄存器訪問 ,如 : 各種 DAS板卡 .5),其它.鏈路控制功能 : 用 M 代表 Master,即上位機 (監(jiān)控 PC 工作站 );S 代表 Slaver,即下位機 (各種 I/O 設備 ).對于異步方式,FIOS 支持多種鏈路控制方式.鏈路控制方式支持以下幾種方式 :1),M 請求 ,S 應答方式 .2),M 請求 ,S 無應答方式 .

12、3),S 主動發(fā)送 ,M被動等待 .另外 ,對一次完整數(shù)據(jù)處理(讀或?qū)?)過程 ,支持以下方式: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)測功能,可實現(xiàn)對冗余通信網(wǎng)絡的保護和監(jiān)測.前端機功能 :DB 與 IO Server 不在同一工作站上,IO Serv

13、er 運行在前端機上,前端機.與操作站之間通過串口,TCP/IP 網(wǎng)絡或 MODEM 進行通信 .硬件測試與遠程調(diào)試功能:使用 FIOS 可完成對 I/O 設備的簡單測試功能.另外可實現(xiàn)遠程調(diào)試 .故障診斷與恢復功能:FIOS 提供診斷機制 ,在較短的采集周期內(nèi)報告故障的發(fā)生,診斷出下位機故障情況.當下位機更換或恢復后,不需要對FIOS 及相關程序進行任何人工干預 ,而在較短時間自動恢復通信 .當某一臺 ,幾臺或部分通道發(fā)生故障 ,FIOS 要自動優(yōu)化通信鏈 ,使其與其他下位機或通道之間的通信不受影響,保證通信效率 .界面顯示功能 : 為測試 ,調(diào)試 ,運行維護方便,FIOS 提供顯示界面 ,

14、可顯示包括 :發(fā)送 ,應答 ,狀態(tài)信息 ,啟動時間 ,分包數(shù) ,分包信息 ,成功通信次數(shù) (發(fā)送次數(shù) ,成功應答次), 故障次數(shù)等信息 .歷史數(shù)據(jù)處理功能 :對于某些能保存歷史數(shù)據(jù)的設備(如 :無紙記錄儀等 ),FIOS 能將采集到的歷史數(shù)據(jù)恢復到數(shù)據(jù)庫DB 中 .5.6.2 FIOS SDK 編程方式FIOS SDK 提供了一種簡潔的,面向?qū)ο蟮木幊谭绞揭钥s短開發(fā)時間,降低開發(fā)難度 .FIOS SDK 提供標準的開發(fā)接口和程序模板,程序員僅需要根據(jù)I/O 設備的具體通信協(xié)議或驅(qū)動接口說明 ,填寫幾個掃描函數(shù)的實現(xiàn)代碼,進行必要的調(diào)試與測試 ,即可完成一種FIOS 的開發(fā) .FIOS 提供的開

15、發(fā)工具封裝了大部分程序員不必關心的技術環(huán)節(jié),如: 底層通信功能 (串口通信 ,網(wǎng)絡通信等 ),設備超時處理 ,設備故障診斷等 .同時 FIOS 提供各種調(diào)試工具 ,方便程序員進行系統(tǒng)測試 .FIOS 開發(fā)環(huán)境完全基于32 位 Windows平臺 .它使用動態(tài)鏈接庫(DLL) 技術將程序員開發(fā)的代碼整合到力控系統(tǒng)中 .FIOS提供給程序員的開發(fā)接口為API 函數(shù)和 C+ 類庫 .5.6.3 FIOS SDK 組件及示例程序FIOS SDK 主要由 4 部分組成 :設備組態(tài)接口 (Iodevui), 數(shù)據(jù)連接組態(tài)接口(Ioitemui),編程接口 Ioapi 和描掃程序 Ioscan.Iodevu

16、i: 負責管理設備組態(tài)過程.Ioitemui: 負責管理數(shù)據(jù)連接組態(tài)過程 .Ioapi: 負責完成與 I/O 設備間的數(shù)據(jù)交換 ,包括 :對通信協(xié)議的解析 ,數(shù)據(jù)格式的轉(zhuǎn)換等 .Ioscan:主要完成對 Ioapi部分的 dll 代碼進行周期性地掃描.同時完成與 I/O設備的底層通信 (串口通信 ,網(wǎng)絡通信等 ),以及設備超時處理 ,設備故障診斷等 .Ioscan還負責與數(shù)據(jù)庫 DB 之間的通信與協(xié)作.它把從 I/O 設備采集到的數(shù)據(jù)經(jīng)Ioapi 解析轉(zhuǎn)換后提交給 DB, 或?qū)?DB 下置給 I/O 設備的數(shù)據(jù)經(jīng) Ioapi 解析轉(zhuǎn)換后寫入 I/O設備 .Ioscan 是 FIOSSDK 提供

17、的一個標準軟件工具 . 程序員僅需要開發(fā) Iodevui,Ioitemui,Ioapi三部分的代碼 .示例程序4FIOS SDK 提供了兩個示例 :DemoController 與 DemoModbus.DemoController 是一個初級編程示例 ,它能引導初學者快速掌握開發(fā)FIOS 的基本概念和方法 .DemoModbus 是一個實用編程示例 ,它采用標準 MODBUS通信協(xié)議 ,通過該示例 ,可以掌握在力控 平臺上開發(fā)標準 MODBUS 設備 I/O 驅(qū)動程序的方法 .FIOS SDK 的全部內(nèi)容都是在安裝在力控自動安裝的 ,在力控 目錄下的子目錄 Fiossdk中 .FIOS SD

18、K 主要包含以下幾部分內(nèi)容 :Examples,程序示例 ,仿真程序 .Include, 頭文件.Manual, 文檔說明 .Utility, 調(diào)試工具 .這 2 個示例具有一定的代表性 ,它們體現(xiàn)了 FIOS SDK 的主要功能 .FIOS SDK 提供了這 2 個示例的全部源代碼 ,在它們的基礎上 ,稍做改動 ,就可以開發(fā)出新的 FIOS. 我們把象這 2 個示例源程序一樣具有模板作用的程序稱為I/O 模板程序 .為了提高開發(fā)效率,我們建議盡量使用I/O 模板程序 ,這在一定程度上,也減少 ,降低了編程錯誤的發(fā)生.常用術語我們把 FIO SDK 中經(jīng)常涉及的一些概念給出定義,有些術語雖然是

19、通用名詞,但在FIOSDK 中有特定含義 .這些術語有一些在前文給出了解釋 ,有一些會在后文中陸續(xù)給出解釋.FIOS ForceControl I/O Server, 即力控I/O 驅(qū)動程序FIOS SDK FIOS 軟件開發(fā)工具包FCINSTDIR力控軟件系統(tǒng)的安裝目錄FCAPPINSTDIR用力控創(chuàng)建的工程應用的目錄IOID唯一區(qū)別各個I/O 驅(qū)動程序的I/O 標志Iodevui 設備組態(tài)接口Ioitemui數(shù)據(jù)連接組態(tài)接口Ioapi 編程接口Ioscan 掃描程序I/O 模板程序FIOS 工 SDK 附帶示例的源程序I/O 配置文件設備組態(tài)時的缺省參數(shù)設置保存文件連接項結(jié)構(gòu)保存數(shù)據(jù)連接信

20、息的數(shù)據(jù)結(jié)構(gòu)IOITEMDEFI/O 描述文件定義設備的類別 ,廠商 ,型號 ,通信方式等參數(shù)的文本文件Iodesc.txt程序員 在本文檔范圍內(nèi)專指用FIOS SDK 進行開發(fā)的技術人員掃描函數(shù) 包含在 Ioapi 中的 API 函數(shù) ,它們由掃描程序周期掃描.掃描函數(shù)完成對設備數(shù)據(jù)解析及格式轉(zhuǎn)換IOC Input Output Class( 輸入輸出類庫)的縮寫 .5.6.4 設備組態(tài)接口IODEVUI.DLLI/O 描述文件在使用力控進行組態(tài)時 ,一般均涉及定義I/O 設備的過程 .在定義設備時 ,要選擇設備的類別 (PLC, 智能儀表等 ), 廠商 ,設備型號或通信協(xié)議,然后根據(jù)設備通

21、信方式(串口方式 ,網(wǎng)絡方式 ,其它方式等 )設置參數(shù) .以上關于一種設備的信息(類別 ,廠商 ,型號 ,通信方式等 )完全是由I/O 描述文件決定的.I/O 描述文件是一個標準文本文件,根據(jù)其規(guī)定的填寫格式 ,由程序員根據(jù)具體設備自行填寫.下面介紹I/O 描述文件的填寫格式.I/O 描述文件的文件名為IODESC.TXT, 安裝目錄為 :FCINSTDIRIO ServersIOID.IO 文件說明格式為: 類別 ;廠商或 IO 程序描述 ;執(zhí)行文件名稱5子類型 1;類型號 ; 資源標志 ;提供設備地址子類型 2;類型號 ; 資源標志 ;提供設備地址.注意 ,子類型號不能重復 .表示回車換行

22、 .最上面一行是驅(qū)動程序的總體描述 , 包括三項 .各項之間必須以分號 ; 分隔 .各項內(nèi)容不能含有分號 ;.各項含義如下 : 類別 ,驅(qū)動程序所屬類別,現(xiàn)分為以下幾類:PLC,智能儀表 ,智能模塊 ,變頻器 .程序員也可以自行擴展 .廠商或 IO 程序描述 ,I/O 設備生產(chǎn)廠商名稱 ,協(xié)議名稱 ,如西門子 .執(zhí)行文件名稱 ,I/O 驅(qū)動程序 ( 運行程序 )的名稱 ,如 opto_drv.exe接下來幾行為驅(qū)動程序所包含的設備類型的描述,如西門子包括S5,S7 等 ,每一子類別一行 ,每行包括三項 ,各項之間必須以分號 ; 分隔 .各項內(nèi)容不能含有分號 ;. 各項含義如下 :子類型 ,設備

23、類型描述 .如 S5.類型號 ,設備類型編號 ,類型號不能重復 .合法的值為 0,1,2,3 等 .使用計算機資源,使用計算機何種通信資源通信,合法的值為0,1,2 等 .含義如下 :0,同步通信方式;1,串口通信方式;2,TCP/IP 網(wǎng)絡通信方式; 3,MODEM.通信方式 ;4,板卡方式 ;5,并口通信方式 .提供設備地址:1 表示需要指定設備地址,否則表示不需要設備地址 .管理程序會自動將相同廠商或IO 程序描述相同的驅(qū)動程序歸為同一樹下.開發(fā) Iodevui力控 組態(tài)環(huán)境 DRAW 中的設備管理功能提供了一個根據(jù)I/O 描述文件可靈活配置的標準設備組態(tài)接口 .這個組態(tài)接口提供了一些對

24、常用設備參數(shù)進行設置的方法.如:設備名稱 ,設備地址 ,通信端口 ,端口參數(shù)等 .如下圖所示 :對于很多設備 ,如果標準設備組態(tài)接口能夠滿足要求,就不再需要自己編寫Iodevui接口程序了 .比如示例 DemoController 采用的就是標準設備組態(tài)接口.而示例 DemoModbus因為涉及一些特殊的參數(shù)設置,就需要自己編寫 Iodevui 接口程序了 .因此 ,Iodevui 接口程序?qū)嶋H上就是對標準設備組態(tài)接口的一個補充和擴展,并可由程序員靈活控制 .Iodevui 要以 DLL 形式提供 .該 DLL 必須是 MFC擴展 DLL. 該 DLL的缺省文件名稱為 IODEVUI.DLL,

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

26、Iodevui.h 可以發(fā)現(xiàn) ,Iodevui.dll 主要實現(xiàn) 3 個輸出函數(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);在進行設備組態(tài)時,當增加一個設備時,力控設備管理程序會自動調(diào)用AddIoDev() 函數(shù); 當修改一個已創(chuàng)建設備時會調(diào)用M

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

28、Add() 的實現(xiàn)代碼 :/*/ 添加 I/O 設備/ szDeviceName, 設備名稱 (輸入值 )/ nType, 設備子類型 (用于一個驅(qū)動程序驅(qū)動多種類型設備)(輸入值 )/ 返回值說明 :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)

29、m_list.AddTail(pDev);Store();return 0;elsedelete pDev;return -1;程序的一開始 ,調(diào)用 Find() 函數(shù)來查找是否已有相同的設備名存在,如果有給出提示并返回 -1 表示操作失敗 ,否則生成一個 CDevice 對象并調(diào)用 CallDialog 函數(shù)來顯示一個對話框 , 讓用戶做進一步的選擇 ,如果用戶進行確認 ,操作成功 ,它把此 CDevice 對象加入設備鏈表中 ,并調(diào)用 Store 函數(shù)來保存設備信息 .另外兩個函數(shù)和它類似 . Store()函數(shù)如下 :void CDevMan:Store()C;7if(const cha

30、r*)(ddeacc.dat),C)CArchive ar(&file, CArchive:store);Serialize(ar);ar.Close();();該函數(shù)它先打開 ddeacc.dat 文件 ,如果不存在 ,就建立此文件 .然后調(diào)用序列化函數(shù)對它進行保存 ,最后關閉此文件 .再看一看序列化函數(shù) :void CDevMan:Serialize(CArchive &ar)TRYCObject:Serialize(ar);m_list.Serialize(ar);CATCH(C)AfxMessageBox( 文件版本不匹配!);END_CATCH.該函數(shù)對m_list( 由 CDevi

31、ce 類實例組成 )進行序列化 .在調(diào)用各個CDevice 類實例的序列化函數(shù)時 ,如果是讀取操作 ,會依次創(chuàng)建 CDevice 實例 ,并調(diào)用 CDevice 的序列化函數(shù) , 隨后把 CDevice 實例加入 m_list 鏈表 .具體保存和讀取的變量數(shù)據(jù)在 CDevice 類中控制 ,也就是說程序員針對不同的設備可以改寫CDevice 類 ,定義不同的成員變量,記錄設備的不同的屬性 ,對 CDevice 類重載 Serialize 即可實現(xiàn)設備的保存,加載 ,增加 ,刪除和修改等功能.我們再看一下CDevice 類序列化的實現(xiàn)過程:void CDevice:Serialize(CArch

32、ive& ar)if (ar.IsStoring()ar m_csName; / 設備名稱ar m_csName;ar m_dwData;如果是保存操作 ,序列化函數(shù)會將參數(shù)自動存盤 ;如果是讀取操作 ,序列化函數(shù)會從磁盤上讀取參數(shù)值 .8察看 CallDialog 函數(shù)可以發(fā)現(xiàn),它生成了一個對話框,讓用戶做相應的選擇,然后把用戶選擇的信息保存在CDevice 類的成員函數(shù)中,以便于儲存 .整個程序框架使用CDevice 類來保存設備的信息.在 CallDialog 函數(shù)中使用一個對話框,來讓用戶進行選擇設備的屬性,并且在 CallDialog 函數(shù)中把它保存在CDevice 類中 .所以對于

33、一個新的設備,程序員所要做的工作就是,分析設備的協(xié)議查看是否僅使用描述文件就可以完成設備的定義,如果不能 ,那么應該編制IoDevUi.dll. 這時應分析應該增加哪一些屬性,定義哪一些CDevice 類的成員變量,以及顯示什么樣的對話框,讓用戶做什么樣的選擇.所以程序員的工作重點在于修改CDevice 類 ,增加成選變量 ,并重載它的Serialize 函數(shù) ,然后修改對話框 ,讓用戶做不同的選擇,并把選擇保存在CDevice 類的成員變量中即可.在該示例中 ,我們定義了2 個設備參數(shù) :CString m_csName; / 設備的名稱DWORD m_dwData; / 用于保存數(shù)據(jù)這樣只

34、需在對話框中對m_csName 和 m_dwData 賦值即可 ./*/調(diào)用對話框定義數(shù)據(jù)源/ pDev 數(shù)據(jù)源指針/返回值true 成功/*/bool CDevMan: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

35、_dwData = (dlg.m_nProtocol&0x01);/m_dwData 的第 0 位為 1 表示是 RTU 方式0 表示 ASCII 方式pDev-m_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)/ 打開該文件CArchive ar(&file, CArchive:load);/讀取的第一個數(shù)據(jù)是定義的設備的個數(shù),/但是因為

36、可以通過 GetDeviceCount 函數(shù)得到設備的個數(shù) , /所以這里把讀到的數(shù)據(jù)簡單的丟掉 . artemp;int nDevCnt = pManager-GetDeviceCount();for (int i = 0; i GetDevice(i);arstrtemp;/ 讀取設備的名字ardata;/讀取數(shù)據(jù)/這兩句在講到Ioapi.dll 時再進行介紹pDevice-SetPrivateData(1,long(data&1);pDevice-SetPrivateData(2,long(data8)&0xff);DCB dcb;pDevice-GetDCB(dcb);dcb.fBin

37、ary = 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();();/ 關閉文件elsestrtemp= 對不起 ,沒有找到 ;strtemp+=csPath;strtemp+= 程序不能運行!;.AfxMessageBox(strtemp);PostQuitMessage(0);/ 沒有

38、找到文件,給出提示 ,并終止程序的運行.注意序列化的內(nèi)容和順序必須和IoDevUi.dll一致 ,否則會導致程序運行時產(chǎn)生錯誤.5.6.5 Ioitemui 介紹及編程示例在用力控進行組態(tài)時 ,把數(shù)據(jù)庫DB 中的點參數(shù)與某種設備的具體通道建立連接的過10程被為數(shù)據(jù)連接過程.在進行數(shù)據(jù)連接時,一般還要指定數(shù)據(jù)轉(zhuǎn)換格式,數(shù)據(jù)長度等參數(shù).數(shù)據(jù)連接過程對于不同的 I/O 設備 ,其形式和內(nèi)容可能完全不同 .因此必須針對不同的 I/O 設備 ,設計相應的數(shù)據(jù)連接形式 ,保存各種參數(shù)信息 .Ioitemui 接口主要完成的兩部分功能,一是為用戶進行數(shù)據(jù)連接組態(tài)時提供一個界面;另外就是將用戶組態(tài)的設備參數(shù)信

39、息用某種格式保存起來,以便在開發(fā)編程接口Ioapi 時使用 .我們定義了一個數(shù)據(jù)結(jié)構(gòu)來保存設備參數(shù)信息 ,這就是數(shù)據(jù)連接項結(jié)構(gòu) (下面簡稱連接項結(jié)構(gòu) )IOITEMDEF.IOITEMDEF 定義在 Ioitemui.h 中 : typedef struct IoItemDefStruchar str64; long n8;IOITEMDEF;這個結(jié)構(gòu)是一個通用結(jié)構(gòu),由程序員自己賦值,自己解釋 .Ioitemui 要以 DLL 形式提供.該 DLL 必須是 MFC 擴展 DLL. 該 DLL 的缺省文件名稱為 IOITEMUI.DLL, 該文件必須安裝在目錄 FCINSTDIRIO Serve

40、rsIOID 下 . Ioitemui 的工作過程如下 :在進行數(shù)據(jù)連接組態(tài)時,力控的 DBMAN管理程序會自動檢查在目錄FCINSTDIRIOServersIOID 下是否存在IOITEMUI.DLL文件 .如果存在 ,則調(diào)出數(shù)據(jù)連接組態(tài)接口界面.下面介紹如何編寫Ioitemui 接口程序 .Ioitemui.dll 主要實現(xiàn)1 個輸出函數(shù) :extern C AFX_EXT_API long DoItemDlg(const char* szDeviceName, int nType, IOITEMDEF &item, char * szDesc, int nFlag); 其參數(shù)說明如下 :

41、szDeviceName, 設備名稱 (輸入值 ).如果在力控 中定義了一個設備 Device1, 那么在給該設備組點時 ,傳給 DoItemDlg 的 szDeviceName 值就是字符串 Device1.nType, 設備子類型 (用于一個驅(qū)動程序驅(qū)動多種類型設備 )(輸入值 ).它的值在 IODESC.TXT 中指定 (參見上一章對 I/O 描述文件的介紹 ).item, 數(shù)據(jù)連接項結(jié)構(gòu) (返回值 ).需要注意的是 ,item 除了是輸出值外 ,也是輸入值 , DBMAN 管理程序每次調(diào)用 DoItemDlg() 時 ,將上一次操作賦給 item 的值傳遞過來 . szDesc, 數(shù)據(jù)

42、連接項描述 ,用于 DBMAN 程序顯示的提示信息 .nFlag, 1 表示增加數(shù)據(jù)連接項 ,2 表示修改 ,0 表示刪除 (輸入值 ).其返回值 0 表示操作成功.其它 , 操作失敗 .Ioitemui.dll 的工作過程如下:當用戶打開數(shù)據(jù)組點連接對話框時,選中了一個點,并按下增加 ,修改或刪除鍵,這時就會調(diào)用 Ioitemui.dll 的 DoItemDlg 函數(shù) .程序員應該在此函數(shù)中 ,彈出一個對話框讓用戶進行選擇 ,在用戶按下了 OK 鍵之后 ,把用戶的選擇保存在 item 中 ,以后編制 Ioapi.dll 時.可以利用這些信息.編程示例我們先結(jié)合示例DemoController

43、 介紹如何開發(fā)Ioitemui.仿真器 SimController 的內(nèi)部有數(shù)字區(qū)(DIO) 和模擬區(qū) (AIO).DIO和 AIO 區(qū)通道范圍為 :0255. 每個 DIO 通道的數(shù)據(jù)的數(shù)值范圍為 :0 或 1.每個 AIO 通道數(shù)據(jù)的數(shù)值范圍為 :04095. 所以我們應該在 DoItemDlg 函數(shù)中彈出一個對話框 ,用戶可以在此對話框中選擇輸入通道和內(nèi)存地址 .輸入通道有兩個選項 DIO 通道和 AIO 通道供用戶選擇 ,內(nèi)存地址可以讓用戶輸入 0255 之間的數(shù)據(jù) .11我們介紹一下如果不使用I/O 模板 ,如何自己生成一個新的Ioitemui 工程 :在 VC+ 環(huán)境下 ,選擇菜單

44、命令new,選擇新建工程 ,工程名為Ioitemui, 選擇 MFCAppwizard (dll) 選項 ,在下一步DLL 類型中選擇 MFC Extension DLL型 ,然后按下 Finish鍵 .即可創(chuàng)建一個新的 Ioitemui 工程 .打開 Ioitemui.cpp 文件 ,在文件的開頭加入 #include Ioitemui.h, 把 Ioitemui.h 拷入本工程,然后在文件的最后鍵入 :long DoItemDlg(const char * strDataSour,int nType,IOITEMDEF &item,char * szDesc,int nFlag)這就加入了

45、dll 的輸出函數(shù) .打開示例 DemoController 的 Ioitemui 模板程序 ,它的 DoItemDlg() 函數(shù)實現(xiàn)過程如下:long DoItemDlg(const char * szDeviceName,int nType,IOITEMDEF &item,char * szDesc,int nFlag)CLinkDlg dlg;dlg.item_n0 = item.n0;dlg.item_n1 = item.n1;switch(nFlag)case 0:/刪除操作return 0;/增加或修改操作case 1:case 2:if(dlg.DoModal()=IDOK)it

46、em.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;.在這個模板程序里 ,還涉及一個對話框類 CLinkDlg . 這個對話框為用戶進行數(shù)據(jù)連接組態(tài)時提供一個界面 ,其形式如下 :12CLinkDlg類有 2 個成員變量 :CString m_desc;/ 保存連接項描述int item_n2;/item_n0 保存數(shù)據(jù)區(qū)類型 ,0 表示 DIO,1 表示 AIO; /

47、item_n1 保存地址在 CLinkDlg 的 WM_INITDIALOG 消息函數(shù)中進行如下處理 :BOOL CLinkDlg:OnInitDialog()CDialog:OnInitDialog();/在此處設置值使對話框的顯示和是一次選擇相同 ,以利于執(zhí)行和上一次相近的操作 m_CtrlChannel.SetCurSel(item_n0); / 設置操作選項為上一次的操作m_nAddr = item_n1; /設置地址為上一次的值UpdateData(FALSE);return TRUE;這些處理為了使對話框的顯示和上一次選擇相同,以利于執(zhí)行和上一次相近的操作.在ONOK 消息函數(shù)進行如下處理:void CLinkDlg:OnOK()UpdateData(TRUE);/ 得到各個選項得值CString string;item_n0 = m_CtrlChannel.GetCurSel();/保存操作選項m_CtrlChannel.GetWindowText(m_desc);item_n1 = m_nAddr;/ 保存輸入的地址m_desc+= 起始地址 :;string.Format(%d,m_nAddr);m_desc+=string;CDialog:OnOK();在這個函數(shù)里

溫馨提示

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

最新文檔

評論

0/150

提交評論