使用C#开发OPC Server服务器源码解析
作者:讯蜂
OPC Server服务器服务器的开发比较繁琐,本示例采用C#提供了一种简单快速实现OPCServer的方法,已经在工程项目中应用,希望对大家有用。
1、需要的DLL
首选将需要dll放置您的开发目录下,本示例放在工程目录下的bin\x86\debug目录下
需要的dll如下图:
2、添加引用
在VS的项目中添加对FKOPCSrvApi的引用
然后在源码文件中添加 using FKOPCSrvApi;
3、OPC Server 接口开发
(1)注册OPC服务器
OPCSvrHelper.RegisterOPCSrv(string path,string UUID,
string OPCServerName)
此函数为静态函数,只注册一次即可,不用每次启动软件都注册。
参数含义如下:
l path – 为本exe的路径
l UUID – OPC服务器的唯一识别码,可自行设定
l OPCServerName – OPC服务器的名称
(2)启动OPC服务器
InitOPCServer(string UUID)
(3)创建OPC 组及OPC Tag
CreateTag(string groupName,string tagName,object defaultVal,bool isWriteable)
l groupName – OPC组名
l tagName – OPC Tag名
l defaultVal – OPC Tag的默认值
l isWriteable – 是否可写
(4)更新OPC Tag的值
UpDateTagVal(string groupName,string tagName,object val)
本函数可以实现对指定组名和Tag的值进行更新
l groupName – OPC组名
l tagName – OPC Tag名
l val – 更新的值
注意:若指定的groupName和tagName不存在,则会触发异常
(5)注销OPC服务器
OPCSvrHelper.UnRegisterOPCSrv(UUID, string OPCServerName)
静态函数
l UUID – OPC服务器的唯一识别码,可自行设定
l OPCServerName – OPC服务器的名称
(6)读取OPC Tag值
object ReadTag(string groupName,string tagName)
l groupName – OPC组名
l tagName – OPC Tag名
返回:object类型的值
注意:若指定的groupName和tagName不存在,则会触发异常
(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 – 信号质量
4、注意事项
(1)用VS新建的项目必须为x86,否则在64位计算机会出现异常
(2)在测试时,若您的计算机没有安装组态软件,可能需要首先安装OPC国际组态提供的“OPC Core Components Redistributable”,本安装包在源码文件中附带。
5、测试
可以用组态软件直接测试,组态软件新建OPC客户端,搜索OPC服务器。若没有组态软件,可以用我们免费提供的OPC客户端测试软件,测试您新建的OPC服务器是否正确。
下图为OPC客户端软件截图:
OPC客户端测试软件使用方法:
(1)在“服务器”列表中找到您的新建的OPC服务器名,这里名称为“MyOPCServer”;
(2)然后点击“连接”按钮;
(3)若成功的后,会在右侧出现OPC组及OPCTag,双击Opc Tag,会将Tag添加到右侧的监测窗口内,并且数据会实时变化。
(4)可以在此软件的左下侧写OPCTag的值进行测试
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服务器名称 string UUID = "F61323FD-77CE-4AB6-930F-E3E6DFF8BBED"; //OPC服务器的唯一ID public Form1() { InitializeComponent(); timer.Interval = 2000; timer.Tick += new EventHandler(timer_Tick); timer.Start(); } /// <summary> /// 注册并启动OPC服务器,然后添加OPC组及OPC项 /// </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);//注册OPC服务器 _myOPCSvrHelper = new OPCSvrHelper(); _myOPCSvrHelper.InitOPCServer(UUID); //初始化启动OPC服务器 //注册OPC 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); //创建OPC Tag } opcStart = true; } /// <summary> /// 客户端写OPC Tag值更新事件 /// </summary> /// <param name="TagName">OPC组名.OPCTag名</param> /// <param name="Value">更新的值</param> /// <param name="ResultCode">信号质量</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> /// 定时更新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服务器 /// </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); } } } }
到此这篇关于使用C#开发OPC Server服务器源码示例的文章就介绍到这了,更多相关C#开发OPC Server服务器内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!