国产欧美日韩精品a在线观看-国产欧美日韩精品一区二区三区-国产欧美日韩精品综合-国产欧美中文字幕-一区二区三区精品国产-一区二区三区精品国产欧美

ACS880-07C
關注中國自動化產業發展的先行者!
CAIAC 2025
2024
工業智能邊緣計算2024年會
2023年工業安全大會
OICT公益講堂
當前位置:首頁 >> 案例 >> 案例首頁

案例頻道

使用Delphi7進行OPC服務器的開發
  • 企業:控制網     領域:工業以太網     行業:市政工程    
  • 點擊數:6105     發布時間:2005-05-10 14:23:04
  • 分享到:

 

1. 前言
    在企業"管控一體化"的信息系統建設中,實時信息系統起著非常重要的作用。它可以采集控制系統中的實時數據,使管理者在辦公室里就可以監測到生產現場的生產情況及報警信息;并可以對取得的實時數據進行優化、分析,從而為保證生產設備正常運轉、降低成本提供重要基礎。作為制造執行系統,MES必然要求與企業其它生產管理系統有密切關系,MES在其中起到了信息集線器(Information Hub)的作用,它相當于一個通訊工具為其它應用系統提供生產現場的實時數據。

    作為信息集線器的MES要將來自不同硬件生產廠商的控制系統的現場數據匯總在實時數據庫中,必須要和不同的設備,比如PLC,變頻器,現場總線的儀表等通訊,如果不同的設備廠家都遵守一個相同的程序接口標準的話,那么程序和不同設備的溝通將變得非常容易。OPC 就是這樣一種工業標準,它是OLE for process control 的英文縮寫。OPC 是基于微軟的COM(Component Object Model)和OLE(Object Linking and Embedding)技術之上的。和以前不同的是,現在設備廠家提供不同的OPC Server。OPC Server負責從設備中取數據和寫數據。用戶所要做的就是利用統一的COM 規范編寫OPC Client。客戶程序和OPC Server 打交道。OPC Server是一座在客戶和硬件設備之間的橋梁,通過它,我們可以很容易的取得現場的溫度,壓力,流量,位置等信號,以及控制現場的閥門開度,電機轉速等。注意客戶程序和服務器程序可以在同一臺計算機上,也可以在不同的計算機上,區別是使用COM 還是使用DCOM。

2. 項目背景
     我們開發的OPC服務器的項目背景是貴鋁熱電廠的數據上網項目。此項目中的一個子項目需要將現場的一些重要輔機的溫度值上傳至熱電廠的熱網之中。在數據的接口上我們選擇使用OPC作為統一的數據接口,因此我們在輔機溫度巡檢系統中需要實際開發其相應的數據訪問服務器,用于和實時數據庫服務器通訊以便于將數據上傳至熱電廠的熱網之中。以下我以此項目為例來介紹OPC數據訪問服務器的開發過程。服務器的開發工具通常是在VC6環境中使用MFC類庫搭配ATL,我選擇了Delphi7。因為Delphi是功能強大的應用程序開發工具。它具有功能強大,運行速度快,易于學習和使用以及開發效率高等特點。它是可視化應用編程環境,可重用性面向對象編程語言,快速編譯器和數據庫的完美組合。編寫OPC定制接口的客戶程序的本質就是編寫COM客戶程序,而使用Delphi進行COM開發時,我們會發現Object Pascal為COM提供了強大的語言支持。

圖表 1 輔機溫度巡檢網絡連接圖

3. OPC服務器的結構
    
    下面首先給出OPC服務器的內部結構。

                         圖表 2 OPC服務器的內部結構
   
    OPC規范提供了兩套接口方案,即COM接口和自動化。COM接口效率高,通過該接口,客戶能夠發揮OPC服務器的最佳性能,采用C++語言的客戶一般采用COM接口方案;自動化接口一般為采用VB語言的客戶所采用。自動化接口使解釋性語言和宏語言編寫客戶應用程序變得簡單,然而自動化客戶運行時需進行類型檢查,這一點則大大犧牲了程序的運行速度。OPC服務器必須實現COM接口,是否實現自動化接口則取決于供應商的主觀意愿。通常可以直接使用OPC基金會提供的OPC自動化包裝DLL(OPCDAAuto.DLL),將OPC定制接口變換成OPC自動化接口。當然也可以自己編制自動化包裝器。
 



圖表 3 OPC服務器通過自動化包裝器提供OPC自動化接口

4. OPC服務器對象模型
    OPC服務器由三類對象組成,相當于三種層次上的接口:服務器(Server)、組(Group) 和數據項(Item)。

1) 服務器對象(Server)
    擁有服務器的所有信息,同時也是組對象(Group)的容器,一個服務器對應于一個OPC Server,即一種設備的驅動程序。在一個Server中,可以有若干個組。

2) 組對象(Group)
    擁有本組的所有信息,同時包容并邏輯組織OPC數據項(Item)。

    OPC組對象(Group)提供了客戶組織數據的一種方法,組是應用程序組織數據的一個單位。客戶可對之進行讀寫,還可設置客戶端的數據更新速率。當服務器緩沖區內數據發生改變時,OPC將向客戶發出通知,客戶得到通知后再進行必要的處理,而無需浪費大量的時間進行查詢。OPC規范定義了兩種組對象:公共組(或稱:全局組,public)和局部組(或稱:局域組、私有組,Local)。公共組由多個客戶共有,局部組只隸屬于一個OPC客戶。全局組對所有連接在服務器上的應用程序都有效,而局域組只能對建立它的Client有效。一般說來,客戶和服務器的一對連接只需要定義一個組對象。在一個組中,可以有若干個項。

3) 項
    項是讀寫數據的最小邏輯單位。一個項與一個具體的位號相連。項不能獨立于組存在,必須隸屬于某一個組。在每個組對象中,客戶可以加入多個OPC數據項(Item)。OPC數據項是服務器端定義的對象,通常指向設備的一個寄存器單元。OPC客戶對設備寄存器的操作都是通過其數據項來完成的,通過定義數據項,OPC規范盡可能的隱藏了設備的特殊信息,也使OPC服務器的通用性大大增強。OPC數據項并不提供對外接口,客戶不能直接對之進行操作,所有操作都是通過組對象進行的。每個數據項的數據結構包括三個成員變量:數據值、數據質量和時間戳。數據值是以VARIANT形式表示的。應當注意,數據項表示同數據源的連接而不等同于數據源,無論客戶是否定義數據項,數據源都是客觀存在的。可以把數據項看作數據源的地址,即數據源的引用,而不應看作數據源本身。組與項的關系如下圖所示:

圖表 4 OPC服務器的對象模型

    應用程序作為OPC接口中的Client方,硬件驅動程序作為OPC接口中的Server方。每一個OPC Client應用程序都可以接若干個OPC Server,每一個硬件驅動程序可以為若干個應用程序提供數據。

5. OPC服務器對象接口
    OPC服務器是通過接口向客戶提供服務的,接口實際上是一組相關函數的集合。

(1) OPCServer對象接口
OPCServer對象是OPC中的首要對象,它提供了如下接口:
IUnknown接口是COM的標準接口
IOPCServer接口可對OPCGroup對象進行有關操作
IOPCServerPublicGroups接口為客戶和服務器提供了管理公共組的功能
IOPCBrowseServerAddressSpace接口提供了客戶瀏覽服務器數據項的功能
IOPCItemProperties接口讓客戶能夠瀏覽與ItemID相關的可訪問屬性
IOPCCommon接口提供了設置和詢問LocaleID的功能
IPersistFile接口允許客戶裝載和保存服務器的配置信息
IConnectionPointContainer接口允許用戶探查發現連接點

                         圖表 5 OPCServer對象接口圖
  
(2) OPCGroup對象接口
OPCGroup對象是管理數據項集合的對象,它提供的接口如下:
IUnknown接口是COM的標準接口
IOPCItemMgt接口為客戶提供了添加,刪除和控制組中數據項的功能
IOPCGroupStateMgt接口允許客戶管理組中的所有狀態信息
IOPCPublicGroupStateMgt接口用來將私有組轉換為公共組
IOPCSyncIO接口允許用戶對服務器執行同步讀寫操作
IOPCAsyncIO接口允許客戶對服務器執行異步讀寫操作
IOPCAsyncIO2接口用來替代IOPCAsyncIO接口
IConnectionPointContainer接口允許用戶探查發現連接點
IDataObject接口允許客戶和使用OPC數據流格式的組之間產生連接



圖表 6 OPCGroup對象接口圖

6. OPC服務器的Delphi實現
    本項目的輔機溫度巡檢OPC數據訪問服務器使用Delphi7開發,其遵守OPC Data Access 2.05規范。本服務器功能如下:
    服務器的注冊與反注冊
    定時讀取現場數據并更新數據緩沖池
    OPCServer對象的實現
    OPCGroup對象的實現
    服務器的界面顯示

     程序實現如下:
(1) 服務器的注冊與反注冊
OPC服務器必須按照規范要求正確注冊才能被OPC客戶訪問。OPC服務器按照組件模式可以劃分為進程內組件、進程外組件。不同模式的服務器注冊的方法稍有差異。
    通常OPC服務器要求的標識格式為:Vendor.Drivername.Version
    我的溫度巡檢OPC服務器的標識為:HUA.DA2.1
    按照OPC規范要求,我的OPC服務器在系統注冊表中建立如下注冊表項:
    1至6項對于不同模式的服務器均需要:
1. HKEY_CLASSES_ROOT\Vendor.Drivername.Version = A Description of your server
2. HKEY_CLASSES_ROOT\Vendor.Drivername.Version\CLSID = {Your Server's unique CLSID}
3. HKEY_CLASSES_ROOT\Vendor.Drivername.Version\OPC
4. HKEY_CLASSES_ROOT\Vendor.Drivername.Version\OPC\Vendor =Your vendor name
5. HKEY_CLASSES_ROOT\CLSID\{Your Server's unique CLSID} = A Description of your server
6. HKEY_CLASSES_ROOT\CLSID\{Your Server's unique CLSID}\ProgID = Vendor.Drivername.Version
7至8項根據服務器的模式進行選擇注冊:
7. HKEY_CLASSES_ROOT\CLSID\{Your Server's unique CLSID}\InprocServer32 = Full Path to DLL
8. HKEY_CLASSES_ROOT\CLSID\{YourServer's unique CLSID}\LocalServer32 = Full Path to EXE
9. HKEY_CLASSES_ROOT\CLSID\{YourServer's unique CLSID}\InprocHandler32 = Full Path to DLL
步驟1的代碼示例如下:
aReg:=nil;
 try
  aReg:=TRegistry.Create;
  aReg.RootKey:=HKEY_CLASSES_ROOT;
  aReg.OpenKey(HUA.DA2.1,true);
  aReg.WriteString('','HUA Data Access Server Version 2.0');
 finally
  aReg.CloseKey;
  aReg.Free;
 end;
    此外,還應根據規范創建組件的分類信息,以便與組件分類管理。對于數據訪問服務器規范提供的組件類別為:
"OPC Data Access Servers Version 1.0"
CATID_OPCDAServer10 = {63D5F430-CFE4-11d1-B2C8-0060083BA1FB}

"OPC Data Access Servers Version 2.0"
CATID_OPCDAServer20 = {63D5F432-CFE4-11d1-B2C8-0060083BA1FB}
    創建類別的程序代碼為:
CreateComponentCategory(CATID_OPCDAServer20,'HUA OPC Data Access');
RegisterCLSIDInCategory(CLASS_HUA_DA2,CATID_OPCDAServer20);

    實現服務器的反注冊就簡單了,逐一清除掉以上所建立的注冊表項即可:
aReg:=nil;
 try
  aReg:=TRegistry.Create;
  aReg.RootKey:=HKEY_CLASSES_ROOT;
  aReg.DeleteKey(name);
 finally
  aReg.CloseKey;
  aReg.Free;
 end;
    還應刪除自己組件類別信息
UnRegisterCLSIDInCategory(CLASS_HUA_DA2,CATID_OPCDAServer20);
UnCreateComponentCategory(CATID_OPCDAServer20,'HUA OPC Data Access');

(2) 定時讀取現場數據并更新數據緩沖池
    OPC服務器本身就是一個可執行程序,該程序以設定的速率不斷地同物理設備進行數據交互。服務器內有一個數據緩沖區,其中存有最新的數據值,數據質量戳和時間戳。時間戳表明服務器最近一次從設備讀取數據的時間。服務器對設備寄存器的讀取是不斷進行的,時間戳也在不斷更新。即使數據值和質量戳都沒有發生變化,時間戳也會進行更新。客戶既可從服務器緩沖區讀取數據,也可直接從設備讀取數據,從設備直接讀取數據速度會慢一些,一般只有在故障診斷或極特殊的情況下才會采用。

    OPC客戶和OPC服務器進行數據交互可以有兩種不同方式,即同步方式和異步方式。同步方式實現較為簡單,當客戶數目較少而且同服務器交互的數據量也比較少的時候可以采用這種方式;異步方式實現較為復雜,需要在客戶程序中實現服務器回調函數。然而當有大量客戶和大量數據交互時,異步方式能提供高效的性能,盡量避免阻塞客戶數據請求,并最大可能地節省CPU和網絡資源。

    本服務器的數據緩沖池的數據格式是按照OPC數據訪問規范中的     OPCITEMSTATE格式設計的。
type
  TOPCItem=record
    strID:string;//點的ID編號
    bActive:longbool;//點的激活狀態
    ItemState:OPCITEMSTATE;//點的客戶訪問項
end;

type 
OPCITEMSTATE = record
    hClient:              OPCHANDLE;//點的客戶句柄
    ftTimeStamp:          TFileTime;//點的時間戳
    wQuality:             Word;//點的品質
    wReserved:            Word;//保留
    vDataValue:           OleVariant;//點的值
  end;
    本溫度采集項目選用研華的亞當4000系列模塊,OPC服務器通過計算機串口與ADAM-4520模塊連接,這是一塊隔離RS232到RS422/485轉換器。現場模塊通過485總線與其連在一起。數據的采集方式如下圖所示

                        圖表 7 溫度巡檢系統配置圖

    對于服務器來說實現現場數據的采集,只需要對串口進行編程即可。串口編程的方法很多,例如:Windows API方式、在程序中嵌入匯編語言操作端口、使用控件等。我選擇了使用控件。不同公司開發的串口控件很多,我使用的是微軟的MSComm控件。編程時只需要參照研華的相關模塊操作命令表,然后使用MSComm控件發出相應的命令進行操作即可。例如根據如下命令表
 

圖表 8 ADAM-4015命令表摘錄  

    對于命令#AAN 意思是讀取地址為AA的模塊的第N通道數據。如果操作正確則模塊響應為>(data)(cr)
    如果在程序中發出如下命令:
    MSComm1.Output :='#021'+#13; //讀取2號模塊的第一通道數據
    2號模塊的響應為:>+1.4567(cr)

(3) OPCServer對象的實現
    必須嚴格按照規范要求,實現所要求的所有接口函數。但是這并不意味著所有的接口函數都必須自己編寫,我們可以充分利用COM的包容與聚合機制來復用一些常規的接口。在Delphi中有很多現成的類已經實現了眾多的接口,我們可以充分利用這一點來簡化我們的編程過程。例如在我的 OPCServer服務器對象中IUnknown接口是通過父類TAutoObject 實現的,IConnectionPointContainer 接口是通過創建一個Delphi的TConnectionPoints對象,然后將其接口暴露給客戶實現的; OPCServer的Delphi描述如下,限于篇幅具體實現過程從略:
type
  THUA_DA2 = class(TAutoObject,IHUA_DA2,
IOPCServer,IConnectionPointContainer,IOPCCommon,IOPCItemProperties,
      IOPCServerPublicGroups,IOPCBrowseServerAddressSpace,IPersist,IPersistFile)
  public
    ClientIUnknown:IUnknown;
    Grp:TOPCGroup;
   
    procedure Initialize; override;
    procedure ShutdownOnConnect(const Sink: IUnknown; Connecting: Boolean);
    destructor Destroy;override;
  private
   FIConnectionPoints:TConnectionPoints;
  protected
  property iFIConnectionPoints:TConnectionPoints read FIConnectionPoints
                          write FIConnectionPoints implements IConnectionPointContainer;
//IOPCServer 接口描述省略   
//IOPCCommon接口描述省略
//IOPCServerPublicGroups接口描述省略
//IOPCBrowseServerAddressSpace接口描述省略
//IPersistFile接口描述省略
//IOPCItemProperties接口描述省略
end;//end type

(4) OPCGroup對象的實現
    OPCGroup對象是由OPCServer對象創建的。當OPC客戶程序調用OPCServer對象的接口函數AddGroup時,在AddGroup函數體內生成OPCGroup對象。以后用戶依賴與指向這個OPCGroup接口的指針,便可以方便的創建和管理點項目,從而獲得現場的實時數據。OPCGroup對象的描述如下:

type
  TOPCGroup = class(TTypedComObject,IOPCGroup,IOPCItemMgt,IOPCGroupStateMgt,
                    IOPCPublicGroupStateMgt,IOPCSyncIO,
                    IConnectionPointContainer,IOPCAsyncIO2)
  private
   FIConnectionPoints:TConnectionPoints;
  protected
   property iFIConnectionPoints:TConnectionPoints read FIConnectionPoints
                          write FIConnectionPoints implements IConnectionPointContainer;
//IOPCItemMgt 接口描述省略
//IOPCGroupStateMgt接口描述省略
//IOPCPublicGroupStateMgt接口描述省略
//IOPCSyncIO接口描述省略
//IOPCAsyncIO2接口描述省略  
end;

(5) 服務器的界面顯示
    OPC服務器的主要功能在于數據的傳遞,它常常并不需要過多的人機交互過程。項目中的OPC服務器只是為了調試的方便,在界面中通過兩個按鈕向用戶提供了服務器的注冊與反注冊功能。在服務器中還顯示了所連接的OPC客戶數和OPC客戶創建的OPC組數目,以及數據緩沖池中的數據更新情況。

7. 結語
    總的來說,進行OPC服務器程序的開發就是嚴格按照OPC規范編寫各種接口函數來向客戶提供服務,在定時更新緩沖池中的數據的同時,還應對緩沖池中的數據提供較快的查詢服務從而減少系統延遲。

熱點新聞

推薦產品

x
  • 在線反饋
1.我有以下需求:



2.詳細的需求:
姓名:
單位:
電話:
郵件:
主站蜘蛛池模板: 日韩黄色一级毛片 | 黄色影院在线观看视频 | 久久综合狠狠综合久久97色 | 欧美视频在线观看一区二区 | 国内精品九一在线播放 | 精品国产高清久久久久久小说 | 手机看成人片 | 国产国产人免费人成成免视频 | 亚洲综合精品一区二区三区中文 | 黄色网址免费在线 | a欧美视频 | 国产成人a毛片 | 国产亚洲高清不卡在线观看 | 国产丝袜美女一区二区三区 | 亚洲欧美性视频 | 国产va精品网站精品网站精品 | 欧美成人自拍视频 | 国产精品自在自线亚洲 | 日韩无砖专区体验区 | 国产成人咱精品视频免费网站 | 免费福利入口在线观看 | 亚洲欧美另类色妞网站 | 免费一级美国片在线观看 | 最新久久免费视频 | 亚洲欧洲国产视频 | 国产乱码精品一区二区三区四川人 | 精品亚洲一区二区 | 私人玩物福利 | 性成人动作片在线看 | 美国毛片免费一级 | 香蕉久久久 | 成年午夜性爽快免费视频不卡 | 男人的天堂黄色 | 中文字幕99在线精品视频免费看 | 久久国产三级 | 国产欧美一区二区另类精品 | 欧美白人猛性xxxxx交69 | 亚洲一区区 | 成人久久影院 | 国产精品成人免费视频 | 高清波多野结衣一区二区三区 |