網(wǎng)站首頁(yè) 編程語(yǔ)言 正文
OPC Server服務(wù)器服務(wù)器的開(kāi)發(fā)比較繁瑣,本示例采用C#提供了一種簡(jiǎn)單快速實(shí)現(xiàn)OPCServer的方法,已經(jīng)在工程項(xiàng)目中應(yīng)用,希望對(duì)大家有用。
1、需要的DLL
首選將需要dll放置您的開(kāi)發(fā)目錄下,本示例放在工程目錄下的bin\x86\debug目錄下
需要的dll如下圖:
2、添加引用
在VS的項(xiàng)目中添加對(duì)FKOPCSrvApi的引用
然后在源碼文件中添加 using FKOPCSrvApi;
3、OPC Server 接口開(kāi)發(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ù)器的名稱(chēng)
(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 – 是否可寫(xiě)
(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)注銷(xiāo)OPC服務(wù)器
OPCSvrHelper.UnRegisterOPCSrv(UUID, string OPCServerName)
靜態(tài)函數(shù)
l UUID – OPC服務(wù)器的唯一識(shí)別碼,可自行設(shè)定
l OPCServerName – OPC服務(wù)器的名稱(chēng)
(6)讀取OPC Tag值
object ReadTag(string groupName,string tagName)
l groupName – OPC組名
l tagName – OPC Tag名
返回:object類(lèi)型的值
注意:若指定的groupName和tagName不存在,則會(huì)觸發(fā)異常
(7)刪除OPC Tag
RemvoeTag(string groupName,string tagName)
l groupName – OPC組名
l tagName – OPC Tag名
(8)客戶(hù)端寫(xiě)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)在測(cè)試時(shí),若您的計(jì)算機(jī)沒(méi)有安裝組態(tài)軟件,可能需要首先安裝OPC國(guó)際組態(tài)提供的“OPC Core Components Redistributable”,本安裝包在源碼文件中附帶。
5、測(cè)試
可以用組態(tài)軟件直接測(cè)試,組態(tài)軟件新建OPC客戶(hù)端,搜索OPC服務(wù)器。若沒(méi)有組態(tài)軟件,可以用我們免費(fèi)提供的OPC客戶(hù)端測(cè)試軟件,測(cè)試您新建的OPC服務(wù)器是否正確。
下圖為OPC客戶(hù)端軟件截圖:
OPC客戶(hù)端測(cè)試軟件使用方法:
(1)在“服務(wù)器”列表中找到您的新建的OPC服務(wù)器名,這里名稱(chēng)為“MyOPCServer”;
(2)然后點(diǎn)擊“連接”按鈕;
(3)若成功的后,會(huì)在右側(cè)出現(xiàn)OPC組及OPCTag,雙擊Opc Tag,會(huì)將Tag添加到右側(cè)的監(jiān)測(cè)窗口內(nèi),并且數(shù)據(jù)會(huì)實(shí)時(shí)變化。
(4)可以在此軟件的左下側(cè)寫(xiě)OPCTag的值進(jìn)行測(cè)試
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ù)器名稱(chēng)
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值更新事件(由客戶(hù)端寫(xiě)入)
_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>
/// 客戶(hù)端寫(xiě)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>
/// 注銷(xiāo)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);
}
}
}
}
原文鏈接:https://www.cnblogs.com/suifing/articles/6025382.html
相關(guān)推薦
- 2022-12-06 c++入門(mén)必學(xué)算法之快速冪思想及實(shí)現(xiàn)_C 語(yǔ)言
- 2023-07-28 el-table 合并單元格(合并行)
- 2022-11-17 C#實(shí)現(xiàn)表格數(shù)據(jù)轉(zhuǎn)實(shí)體的示例代碼_C#教程
- 2022-01-16 ES6箭頭函數(shù)、rest參數(shù)、擴(kuò)展運(yùn)算符、Symbol的使用
- 2022-01-27 SpringBoot成功啟動(dòng)后自動(dòng)關(guān)閉
- 2022-04-25 C#實(shí)戰(zhàn)之備忘錄的制作詳解_C#教程
- 2024-02-01 mybatis plus 分頁(yè)查詢(xún)出現(xiàn)count()
- 2023-03-26 WPF實(shí)現(xiàn)頁(yè)面的切換的示例代碼_C#教程
- 最近更新
-
- window11 系統(tǒng)安裝 yarn
- 超詳細(xì)win安裝深度學(xué)習(xí)環(huán)境2025年最新版(
- Linux 中運(yùn)行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲(chǔ)小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎(chǔ)操作-- 運(yùn)算符,流程控制 Flo
- 1. Int 和Integer 的區(qū)別,Jav
- spring @retryable不生效的一種
- Spring Security之認(rèn)證信息的處理
- Spring Security之認(rèn)證過(guò)濾器
- Spring Security概述快速入門(mén)
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權(quán)
- redisson分布式鎖中waittime的設(shè)
- maven:解決release錯(cuò)誤:Artif
- restTemplate使用總結(jié)
- Spring Security之安全異常處理
- MybatisPlus優(yōu)雅實(shí)現(xiàn)加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務(wù)發(fā)現(xiàn)-Nac
- Spring Security之基于HttpR
- Redis 底層數(shù)據(jù)結(jié)構(gòu)-簡(jiǎn)單動(dòng)態(tài)字符串(SD
- arthas操作spring被代理目標(biāo)對(duì)象命令
- Spring中的單例模式應(yīng)用詳解
- 聊聊消息隊(duì)列,發(fā)送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠(yuǎn)程分支