使用C#开发OPC Server服务器源码解析

 更新时间:2022年06月28日 10:36:44   作者:讯蜂  
OPC Server服务器服务器的开发比较繁琐,本示例采用C#提供了一种简单快速实现OPCServer的方法,已经在工程项目中应用,本文对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服务器内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • C#实现线段树的示例代码

    C#实现线段树的示例代码

    线段树是一种常用来维护区间信息的数据结构,本文主要介绍了C#实现线段树的示例代码,具有一定的参考价值,感兴趣的可以了解一下
    2023-11-11
  • C#中Abstract 、Virtual和Override的使用及区别

    C#中Abstract 、Virtual和Override的使用及区别

    C#中virtual,abstract,override用于方法重载,子类覆盖了父类的相同方法,父类中的实现不可能再被外面调用。本文给大家重点介绍C#中Abstract 、Virtual和Override的使用及区别,需要的朋友参考下吧
    2021-06-06
  • C#使用DateAndTime.DateDiff实现计算年龄

    C#使用DateAndTime.DateDiff实现计算年龄

    这篇文章主要为大家详细介绍了C#如何使用DateAndTime.DateDiff实现根据生日计算年龄,文中的示例代码讲解详细,感兴趣的小伙伴可以了解一下
    2024-01-01
  • 通过VS中的数据源选择对话框简单实现数据库连接配置[图]

    通过VS中的数据源选择对话框简单实现数据库连接配置[图]

    通过VS中的数据源选择对话框简单实现数据库连接配置[图]...
    2007-03-03
  • C#实现串口通信的示例详解

    C#实现串口通信的示例详解

    这篇文章主要为大家详细介绍了C#实现简单串口通信的相关知识,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2023-03-03
  • C#枚举类型与结构类型实例解析

    C#枚举类型与结构类型实例解析

    这篇文章主要介绍了C#枚举类型与结构类型实例,需要的朋友可以参考下
    2014-07-07
  • C#强制转换和尝试转换的方法

    C#强制转换和尝试转换的方法

    这篇文章主要为大家详细介绍了C#强制转换和尝试转换的方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-09-09
  • Winform实现调用asp.net数据接口实例

    Winform实现调用asp.net数据接口实例

    这篇文章主要介绍了Winform实现调用asp.net数据接口的方法,以实例的形式讲述了数据接口及反射辨别响应的实现方法,具有一定的参考借鉴价值,需要的朋友可以参考下
    2014-10-10
  • C#使用JArray和JObject封装JSON对象

    C#使用JArray和JObject封装JSON对象

    这篇文章介绍了C#使用JArray和JObject封装JSON对象的方法,文中通过示例代码介绍的非常详细。对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-07-07
  • C#单例模式(Singleton Pattern)实例教程

    C#单例模式(Singleton Pattern)实例教程

    这篇文章主要介绍了C#单例模式(Singleton Pattern)的实现方法,主要讲述了即时加载的单例模式、延迟加载的单例模式与线程安全的单例模式,需要的朋友可以参考下
    2014-09-09

最新评论