志在指尖
用双手敲打未来

C#开发OPC客户端

第一个随笔,运用了OPENLiveWrite,作为客户端.最近运用c#开发一个小软件,首要功用是OPC客户端.以后会开发各类别的协议,作为,协议的转发栈.
由于我本人是搞自动化的,所以搞自动化小伙伴像我这样喜爱编程的可能有,但是一般是逻辑思维强,但是根柢相对还是弱的.
1,C#开发OPC的准备工作
软件:VS2019;
DLL:C:\ProgramFiles(x86)\CommonFiles\MatrikonOPC\Common\OPCDAAuto.dll
而且将其拷贝到C:\Windows\SysWOW64中,而且运用DLL注册.(记得注册有必要在这个文件夹中)
然后在,VS2019的引证增加引证
image
2,检查OPC手册,不过是英文的VB版本的,以上资料能够在我的百度网盘里边下载.或者私信我.
image
3,如何查询opc服务器数量和衔接服务器
privatevoidBtGetList_Click(objectsender,EventArgse)
{
KepServer=newOPCServer();
MessageBox.Show(Environment.MachineName);objectserverList=KepServer.GetOPCServers();//枚举网络一切OPC服务器并写入ComboBox控件foreach(stringturnin(Array)serverList)
{
cmbServerName.Items.Add(turn);
}
}C#
4,衔接服务器(能够去下载一个MatrikonOPCSimulation)
privatevoidForm1_Load(objectsender,EventArgse)
{
KepServer=newOPCServer();
KepServer.Connect(“Matrikon.OPC.Simulation.1”);if(KepServer.ServerState==(int)OPCServerState.OPCRunning)
{
tsslServerState.Text=”已衔接到-“+KepServer.ServerName+””;
opcBrowser=KepServer.CreateBrowser();
}
TreeNodeRoot=treeView1.Nodes.Add(KepServer.ServerName);
Root.Tag=KepServer;
opcBrowser.MoveToRoot();
ShowInTreeView(opcBrowser,Root);
}
其中首要函数阐明:
image
其一起支持IP或者核算机名的方式
image
本地核算机第二个参数.第一个参数是服务器称号.
5,关于OPCBrower目标.
从上面能够看到OPCBrowser来自OpcServer.CreateBrower(),其首要用来检查服务器相关信息.
其本身是一个调集(collection),但是,这个时分,其items=0;
ShowBranchs():该函数用于将当时节点的称号调集写入到Collection中.
ShowLeafs():该函数用于将当时节点的Tags写入到Collection中.
ShowLeafs(True):将显现该节点下面一切的itemsID————–很重要,在增加ITEM时能够用到.
privatevoidShowInTreeView(OPCBrowserbrower,TreeNodenode)
{
TreeNodechildNode=null;
brower.ShowBranches();intBranchCount=brower.Count;
List<string>lst=null;if(brower.Count>0)//回溯的增加branch{
lst=newList<string>();foreach(stringtinbrower)
lst.Add(t);foreach(stringbranchinlst)
{
childNode=newTreeNode(branch);
childNode.Tag=brower.GetItemID(branch);
node.Nodes.Add(childNode);
brower.MoveDown(branch);
ShowInTreeView(brower,childNode);
brower.MoveUp();
}
}
brower.ShowLeafs();intLeafsCount=brower.Count;foreach(stringleafinbrower)
{
childNode=newTreeNode(brower.GetItemID(leaf));
childNode.Tag=brower.GetItemID(leaf);
node.Nodes.Add(childNode);
}
}
这样就能够把服务器的信息读取到树里边了.
brower目标首要作用便是能够知道服务器里边的信息了.
6,Group目标及Item目标.
首要:需求创立Group目标:
privatevoidButton3_Click(objectsender,EventArgse)
{
KepGroups=KepServer.OPCGroups;
KepGroups.DefaultGroupIsActive=true;
KepGroups.DefaultGroupUpdateRate=200;
KepGroups.DefaultGroupDeadband=0;
KepGroup=KepGroups.Add(“mxb”);
KepGroup.IsSubscribed=true;
KepGroup.DataChange+=newDIOPCGroupEvent_DataChangeEventHandler(DataChangeHandlerFunc);
KepItems=KepGroup.OPCItems;//KepItem=KepItems.AddItem(“Random.ArrayOfReal8″,1);
textBox1.Text=KepItem.ServerHandle+”:”+KepItem.RequestedDataType;
}
阐明:
假如该参数是IsSubscribed=True;则其支持订阅功用:也便是当改组中的参数有改变的时分,其会触发DataChange事情.
其中:ItemID是一个要害的参数,能够经过OpcBrower.ShowLeafs(true)检查.
AddItem(stringItemID,intClientHandle):其中ClientHandle是客户端自行填写的.
一个Item有一个ServerHandle,由服务器供给,ItemID:由服务器供给;ClientHandle:由客户端供给.
事情处理函数
privatevoidDataChangeHandlerFunc(intTransactionID,intNumItems,refArrayClientHandles,refArrayItemValues,refArrayQualities,refArrayTimeStamps)
{//for(inti=1;i<=NumItems;i++)
{if((int)ClientHandles.GetValue(i)==KepItem.ClientHandle)
{
dynamict=ItemValues.GetValue(i);object[]ary;
ary=Array.ConvertAll<double,object>(t,newConverter<double,object>((x)=>x));
listBox1.Items.Clear();
listBox1.Items.AddRange(ary);
}
}
}
运用该函数能够快速定位数据变更的Item.留意:一切的Array都是1最初的,所以不能直接转化成int[]或者double[];需求编写一个转化
的函数,转化成object[].另外,需求留意到ClientHandles虽然是一个int数组,但是是无法直接转化到int[]的,由于首要,其开始index=1.
其他还有一些异步写入啊,什么的,能够参考手册.

未经允许不得转载:IT技术网站 » C#开发OPC客户端
分享到: 更多 (0)

评论 抢沙发

评论前必须登录!

 

志在指尖 用双手敲打未来

登录/注册IT技术大全

热门IT技术

C#基础入门   SQL server数据库   系统SEO学习教程   WordPress小技巧   WordPress插件   脚本与源码下载