使用C#開發(fā)OPC?Server服務(wù)器源碼解析
OPC Server服務(wù)器服務(wù)器的開發(fā)比較繁瑣,本示例采用C#提供了一種簡單快速實(shí)現(xiàn)OPCServer的方法,已經(jīng)在工程項(xiàng)目中應(yīng)用,希望對(duì)大家有用。
1、需要的DLL
首選將需要dll放置您的開發(fā)目錄下,本示例放在工程目錄下的bin\x86\debug目錄下
需要的dll如下圖:
2、添加引用
在VS的項(xiàng)目中添加對(duì)FKOPCSrvApi的引用
然后在源碼文件中添加 using FKOPCSrvApi;
3、OPC Server 接口開發(fā)
(1)注冊(cè)O(shè)PC服務(wù)器
OPCSvrHelper.RegisterOPCSrv(string path,string UUID,
string OPCServerName)
此函數(shù)為靜態(tài)函數(shù),只注冊(cè)一次即可,不用每次啟動(dòng)軟件都注冊(cè)。
參數(shù)含義如下:
l path – 為本exe的路徑
l UUID – OPC服務(wù)器的唯一識(shí)別碼,可自行設(shè)定
l OPCServerName – OPC服務(wù)器的名稱
(2)啟動(dòng)OPC服務(wù)器
InitOPCServer(string UUID)
(3)創(chuàng)建OPC 組及OPC Tag
CreateTag(string groupName,string tagName,object defaultVal,bool isWriteable)
l groupName – OPC組名
l tagName – OPC Tag名
l defaultVal – OPC Tag的默認(rèn)值
l isWriteable – 是否可寫
(4)更新OPC Tag的值
UpDateTagVal(string groupName,string tagName,object val)
本函數(shù)可以實(shí)現(xiàn)對(duì)指定組名和Tag的值進(jìn)行更新
l groupName – OPC組名
l tagName – OPC Tag名
l val – 更新的值
注意:若指定的groupName和tagName不存在,則會(huì)觸發(fā)異常
(5)注銷OPC服務(wù)器
OPCSvrHelper.UnRegisterOPCSrv(UUID, string OPCServerName)
靜態(tài)函數(shù)
l UUID – OPC服務(wù)器的唯一識(shí)別碼,可自行設(shè)定
l OPCServerName – OPC服務(wù)器的名稱
(6)讀取OPC Tag值
object ReadTag(string groupName,string tagName)
l groupName – OPC組名
l tagName – OPC Tag名
返回:object類型的值
注意:若指定的groupName和tagName不存在,則會(huì)觸發(fā)異常
(7)刪除OPC Tag
RemvoeTag(string groupName,string tagName)
l groupName – OPC組名
l tagName – OPC Tag名
(8)客戶端寫Tag值更新事件
事件名:TagWritedByClientEvt
事件原型:
delegate void TagWritedByClientDelegate(string TagName, Object Value, UInt32 ResultCode)
TagName -- OPC組名.OPCTag名
Value – 更新的值
ResultCode – 信號(hào)質(zhì)量
4、注意事項(xiàng)
(1)用VS新建的項(xiàng)目必須為x86,否則在64位計(jì)算機(jī)會(huì)出現(xiàn)異常
(2)在測試時(shí),若您的計(jì)算機(jī)沒有安裝組態(tài)軟件,可能需要首先安裝OPC國際組態(tài)提供的“OPC Core Components Redistributable”,本安裝包在源碼文件中附帶。
5、測試
可以用組態(tài)軟件直接測試,組態(tài)軟件新建OPC客戶端,搜索OPC服務(wù)器。若沒有組態(tài)軟件,可以用我們免費(fèi)提供的OPC客戶端測試軟件,測試您新建的OPC服務(wù)器是否正確。
下圖為OPC客戶端軟件截圖:
OPC客戶端測試軟件使用方法:
(1)在“服務(wù)器”列表中找到您的新建的OPC服務(wù)器名,這里名稱為“MyOPCServer”;
(2)然后點(diǎn)擊“連接”按鈕;
(3)若成功的后,會(huì)在右側(cè)出現(xiàn)OPC組及OPCTag,雙擊Opc Tag,會(huì)將Tag添加到右側(cè)的監(jiān)測窗口內(nèi),并且數(shù)據(jù)會(huì)實(shí)時(shí)變化。
(4)可以在此軟件的左下側(cè)寫OPCTag的值進(jìn)行測試
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms; using FKOPCSrvApi; namespace OPCSrvTest { public partial class Form1 : Form { OPCSvrHelper _myOPCSvrHelper = null; Timer timer = new Timer(); bool opcStart = false; string opcgroupname = "MyOPCSrvGroup"; //OPC組名 string opcServerName = "MyOPCServer2"; //OPC服務(wù)器名稱 string UUID = "F61323FD-77CE-4AB6-930F-E3E6DFF8BBED"; //OPC服務(wù)器的唯一ID public Form1() { InitializeComponent(); timer.Interval = 2000; timer.Tick += new EventHandler(timer_Tick); timer.Start(); } /// <summary> /// 注冊(cè)并啟動(dòng)OPC服務(wù)器,然后添加OPC組及OPC項(xiàng) /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void button_StartOPCSrv_Click(object sender, EventArgs e) { string path=System.Windows.Forms.Application.ExecutablePath; //exe的路徑 OPCSvrHelper.RegisterOPCSrv(path, UUID, opcServerName);//注冊(cè)O(shè)PC服務(wù)器 _myOPCSvrHelper = new OPCSvrHelper(); _myOPCSvrHelper.InitOPCServer(UUID); //初始化啟動(dòng)OPC服務(wù)器 //注冊(cè)O(shè)PC Tag值更新事件(由客戶端寫入) _myOPCSvrHelper.TagWritedByClientEvt += new TagWritedByClientDelegate(_myOPCSvrHelper_TagWritedByClientEvt); //添加OPC Tag for (int i = 0;i<10;i++) { string tagName = string.Format("MyTag{0}",i+1); _myOPCSvrHelper.CreateTag(opcgroupname, tagName, "", true); //創(chuàng)建OPC Tag } opcStart = true; } /// <summary> /// 客戶端寫OPC Tag值更新事件 /// </summary> /// <param name="TagName">OPC組名.OPCTag名</param> /// <param name="Value">更新的值</param> /// <param name="ResultCode">信號(hào)質(zhì)量</param> void _myOPCSvrHelper_TagWritedByClientEvt(string TagName, object Value, uint ResultCode) { //throw new NotImplementedException(); this.Invoke((EventHandler)(delegate { label_Info.Text = string.Format("{0}值更新為{1} {2}", TagName, Value,DateTime.Now); })); } /// <summary> /// 定時(shí)更新Tag /// </summary> /// <param name="sender"></param> /// <param name="e"></param> void timer_Tick(object sender, EventArgs e) { //throw new NotImplementedException(); if (opcStart && _myOPCSvrHelper != null) { for (int i = 0; i < 10; i++) { string tagName = string.Format("MyTag{0}", i + 1); Random rd = new Random(); object val = rd.Next(100); _myOPCSvrHelper.UpDateTagVal(opcgroupname, tagName, val); //更新OPC Tag } } } /// <summary> /// 注銷OPC服務(wù)器 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void button_RemoveOPCSrv_Click(object sender, EventArgs e) { if(_myOPCSvrHelper != null) { OPCSvrHelper.UnRegisterOPCSrv(UUID, opcServerName); } } /// <summary> /// 讀取Tag的值 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void button_Read_Click(object sender, EventArgs e) { try { if(_myOPCSvrHelper != null) { object val = _myOPCSvrHelper.ReadTag(textBox_OPCGroupName.Text,textBox_TagName.Text); MessageBox.Show(val.ToString()); } } catch (System.Exception err) { MessageBox.Show(err.Message); } } } }
到此這篇關(guān)于使用C#開發(fā)OPC Server服務(wù)器源碼示例的文章就介紹到這了,更多相關(guān)C#開發(fā)OPC Server服務(wù)器內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
C#中Abstract 、Virtual和Override的使用及區(qū)別
C#中virtual,abstract,override用于方法重載,子類覆蓋了父類的相同方法,父類中的實(shí)現(xiàn)不可能再被外面調(diào)用。本文給大家重點(diǎn)介紹C#中Abstract 、Virtual和Override的使用及區(qū)別,需要的朋友參考下吧2021-06-06C#使用DateAndTime.DateDiff實(shí)現(xiàn)計(jì)算年齡
這篇文章主要為大家詳細(xì)介紹了C#如何使用DateAndTime.DateDiff實(shí)現(xiàn)根據(jù)生日計(jì)算年齡,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以了解一下2024-01-01通過VS中的數(shù)據(jù)源選擇對(duì)話框簡單實(shí)現(xiàn)數(shù)據(jù)庫連接配置[圖]
通過VS中的數(shù)據(jù)源選擇對(duì)話框簡單實(shí)現(xiàn)數(shù)據(jù)庫連接配置[圖]...2007-03-03C#枚舉類型與結(jié)構(gòu)類型實(shí)例解析
這篇文章主要介紹了C#枚舉類型與結(jié)構(gòu)類型實(shí)例,需要的朋友可以參考下2014-07-07C#強(qiáng)制轉(zhuǎn)換和嘗試轉(zhuǎn)換的方法
這篇文章主要為大家詳細(xì)介紹了C#強(qiáng)制轉(zhuǎn)換和嘗試轉(zhuǎn)換的方法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-09-09Winform實(shí)現(xiàn)調(diào)用asp.net數(shù)據(jù)接口實(shí)例
這篇文章主要介紹了Winform實(shí)現(xiàn)調(diào)用asp.net數(shù)據(jù)接口的方法,以實(shí)例的形式講述了數(shù)據(jù)接口及反射辨別響應(yīng)的實(shí)現(xiàn)方法,具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2014-10-10C#使用JArray和JObject封裝JSON對(duì)象
這篇文章介紹了C#使用JArray和JObject封裝JSON對(duì)象的方法,文中通過示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-07-07C#單例模式(Singleton Pattern)實(shí)例教程
這篇文章主要介紹了C#單例模式(Singleton Pattern)的實(shí)現(xiàn)方法,主要講述了即時(shí)加載的單例模式、延遲加載的單例模式與線程安全的單例模式,需要的朋友可以參考下2014-09-09