硅谷杂志:基于opc的c#与rslinx通信程序设计 |
2014-01-28 20:55 作者:李长安 来源:硅谷网 HV: 编辑: 【搜索试试】
|
|
硅谷网9月9日消息 《硅谷》杂志2012年第14期刊文称,OPC(OLEforProcessControl,用于过程控制的OLE)是一个工业标准,它定义一个开放的接口,在这个接口上,基于PC的软件组件能交换数据。在工控软件开发过程中,经常遇到需要和plc进行数据交换的情况,以罗克韦尔plc的数据枢纽软件rslinx为opc服务器,通过c#编程语言,利用opc接口开发一套可以与rslinx进行数据交换的通信程序,从而可以实现软件与plc之间的数据交换。
1opc及编程工具技术介绍
1.1opc技术介绍
OPC(OLEforProcessControl)是根据Microsoft的OLE(现在Active)、COM(部件对象模型)和DCOM(分布式部件对象模型)技术所要求的功能制定的一个开放和互用式的用户界面标准,它保证了控制应用程序和设备之间的数据通信。它以OLE/COM的机制作为应用程序级的通讯标准,采用了CS架构模式。OPC规范提供两套接口方案,即自动化接口和定制接口。自动化接口使用解释性语言和宏语言访问OPC服务器,一般采用VB等语言的客户会编写自动化接口进行访问;定制接口效率很高,通过定制接口可以发挥OPC服务器的最佳性能,通常采用C++或c#语言的客户会编写定制接口进行访问;OPC的数据存取服务器包含三类对象:服务器(Server)、组(Group)、数据项(Item)。所有对OPC数据项的操作都是通过包含此项的OPC组对象进行的[1]。每个数据项都有数值(Value)、品质(Quality)和时间戳(TimeStamp)三个属性。数值代表数据项的值,品质代表数值的可信度,时间戳代表数据的存取时间。OPC的数据传输机制主要分为同步读写和异步读写两种。同步数据传输,指客户端直接调用OPC服务器的IOPCSyncIO接口的同步读写函数,在发出读取数据请求后一直等待,直到数据返回。这种方法简单可靠,但当OPC服务器采集数据的时间较长时,客户端等待的时间就会较长,有点影响客户程序的效率,适合较少数据量的读写,本程序采用的就是同步读写方式。异步数据传输,指客户端在发出读写数据请求后,可立即返回进行其它数据处理,OPC服务器在收到数据请求后,访问现场设备,读写数据后主动把采集的结果通知客户端。这种传输机制的优点是可以避免空等待,提高了客户程序的效率,缺点是编程复杂。
1.2c#技术介绍
C#(CSharp)是微软(Microsoft)为.NETFramework量身订做的程序语言,是微软公司在2000年6月发布的一种面向对象编程语言。C#是一种安全的、稳定的、简单的,由C和C++衍生出来的面向对象的编程语言。它在继承C++强大功能的同时去除了一些它们的复杂特性(例如不允许多重继承,限制了指针使用等等)。C#综合了VB简单的可视化操作和C++的高运行效率,以其强大的操作能力、创新的语言特性、优雅的语法风格和便捷的面向组件编程的支持成为.NET开发的首选语言。
c#内存管理提供了与java一样的自动内存管理功能,让程序员从繁重的内存管理中摆脱出来,内存管理提高了代码的质量和提高了开发效率。c#限制了着指针的使用,免除了程序员对内存泄漏的烦恼,但是不是意味着向java程序员一样c#程序员再也不能使用指针代来的好处。微软在设计C#语言时考虑到这个问题,在一方面抛弃指针的同时,另一方面采用折衷的办法,通过unsafe标志来使程序引入指针[2]。
2具体设计步骤
2.1新建项目
打开vs2008主界面,点击文件菜单新建项目visualc#windows应用程序,并在名称里面输入OPCTEST项目名称。如图1所示:
图1新建项目
点击确定后,会出现默认的Form1窗口程序。
2.2添加控件
在Form1窗口上面增加连接按钮,读取按钮,写入按钮,以及读取写入的文字编辑输入框,最后再添加方便测试用的当前值组合框,里面有tag值、品质、时间戳等数值显示框。窗体编辑完毕后如图2:
图2新建项目的窗体
2.3引用命名空间并添加私有变量
窗体编辑完毕后,右击窗体,点击查看代码,打开Form1.cs,首先要添加命名空间代码如下:
usingSystem.Collections.Generic;
usingSystem.Windows.Forms;
usingSystem.ComponentModel;
usingSystem.Data;
usingSystem;
usingRsiOPCAuto;
usingSystem.Net;
usingSystem.Collections;
usingSystem.Text;
然后在引用里面添加对RsiOPCAuto.dll的引用。以rslinx软件安装在C盘为例,RsiOPCAuto.dll文件通常在“C:\ProgramFiles\CommonFiles\Rockwell”目录下,引用时右击解决方案的引用菜单->添加引用->浏览,然后找到相应文件点击确定即可。
在Form1.cs文件里面添加如下私有变量:
OPCServerKepServer;//服务器
OPCGroupsKepGroups;//组集
OPCGroupKepGroup;//组
OPCItemsKepItems;//标签集
OPCItemKepItem;//标签
stringstrHostIP="";//主机IP
stringstrHostName="";//主机名称
boolopc_connected=false;//连接状态
intitmHandleClient=0;//客户端句柄
intitmHandleServer=0;//服务端句柄
2.4增加关键方法
2.4.1获取OPC服务器信息
privatevoidGetServerInfo()
{
tsslServerStartTime.Text="开始时间:"+KepServer.StartTime.ToString()+"";
tsslversion.Text="版本:"+KepServer.MajorVersion.ToString()+"."+KepServer.MinorVersion.ToString()+"."+KepServer.BuildNumber.ToString();
}
2.4.2创建组
本方法主要功能是创建组
privateboolCreateGroup()
{try
{
KepGroups=KepServer.OPCGroups;
KepGroup=KepGroups.Add("OPCFIRSTGROUP");//此处组名可以随意写
SetGroupProperty();
returntrue;
}
catch(Exceptionerr)
{
MessageBox.Show("创建组出现错误:"+err.Message,"提示信息",MessageBoxButtons.OK,MessageBoxIcon.Warning);
returnfalse;
}
}
2.4.3设置组信息
privatevoidSetGroupProperty()
{
KepServer.OPCGroups.DefaultGroupIsActive=true;
KepServer.OPCGroups.DefaultGroupDeadband=0;
KepGroup.UpdateRate=500;
KepGroup.TimeBias=0;
KepGroup.DeadBand=0.01F;
KepGroup.IsActive=true;
KepGroup.IsSubscribed=true;
}
2.4.4连接OPC服务器
本方法主要功能为连接OPC服务器,本方法有两个输入参数,第一个为IP地址,第二个为服务器名称,如果IP地址省略,并且第二个参数填写“RSLinxOPCServer”,则表示连接本机rslinx服务器;如果填写IP地址,并且第二个参数填写“RSLinxRemoteOPCServer”,则表示连接远程rslinx服务器。
privateboolConnectServer(stringremoteServerIP,stringremoteServerName)
{
Try
{
KepServer=newOPCServer();
KepServer.Connect(remoteServerName,remoteServerIP);
if(KepServer.ServerState==(int)OPCServerState.OPCRunning)
{
tsslServerState.Text="已连接到-"+KepServer.ServerName+"";
}
else
{
//这里你可以根据返回的状态来自定义显示信息,请查看自动化接口API文档
tsslServerState.Text="状态:"+KepServer.ServerState.ToString()+"";
}
}
catch(Exceptionerr)
{
MessageBox.Show("连接远程服务器出现错误:"+err.Message,"提示信息",MessageBoxButtons.OK,MessageBoxIcon.Warning);
returnfalse;
}
returntrue;
}
2.4.5断开OPC服务器
privatevoidDisConnectOPCServer()
{
try
{
if(!opc_connected)
{
return;
}
if(KepServer!=null)
{
KepServer.Disconnect();
KepServer=null;
}
opc_connected=false;
}
catch(Exceptionerr)
{
MessageBox.Show("初始化出错:"+err.Message,"提示信息",MessageBoxButtons.OK,MessageBoxIcon.Warning);
}
}
2.4.6读取标签值
本方法主要作用为同步读取标签值,包括数值、品质、时间戳。
privatevoidReadTagValue(stringtagName)
{
try
{
this.txtTagValue.Text="";
this.txtQualities.Text="";
this.txtTimeStamps.Text="";
itmHandleClient=1234;
KepItem=KepItems.AddItem(textBoxTagName.Text,itmHandleClient);
objectvalue,quality,timeStamp;
//同步读,第一个参数只能为1或2
KepItem.Read(1,outvalue,outquality,outtimeStamp);
itmHandleServer=KepItem.ServerHandle;
this.txtTagValue.Text=value.ToString();
this.txtQualities.Text=quality.ToString();
this.txtTimeStamps.Text=timeStamp.ToString();
}
catch(Exceptionex)
{
this.txtTagValue.Text="";
this.txtQualities.Text="";
this.txtTimeStamps.Text="";
MessageBox.Show(ex.Message);
return;
}
}
2.5连接按钮代码
在服务器IP地址输入框不填写内容,点击连接按钮,可以导航到按钮的click事件代码,可以实现服务器连接功能和创建组功能,具体编程代码:
privatevoidButton_Connect_Click(objectsender,EventArgse)
{
try
{
if(!opc_connected)
{
opc_connected=ConnectServer(textBoxRemoteOPCServerIP.Text,"RSLinxOPCServer");//此处代表连接本机rslinxopc服务器
}
GetServerInfo();//获取opc服务器信息
if(!CreateGroup())//创建组
{
return;
}
}
catch(Exceptionerr)
{
MessageBox.Show("初始化出错:"+err.Message,"提示信息",MessageBoxButtons.OK,MessageBoxIcon.Warning);
}
}
2.6读按钮代码
在TagName栏填写[S3]N7:0,点击读按钮可以导航到click事件代码,可以实现PLC标签值、品质、时间戳的读取并且在相应位置显示,具体编程代码:
privatevoidButton_Read_Click(objectsender,EventArgse)
{
ReadTagValue(textBoxTagName.Text);
}
2.7写按钮代码
在TagValue栏填写数值,点击写按钮可以导航到该按钮的click事件代码,可以实现PLC标签值的写入,具体编程代码:
privatevoidButton_Write_Click(objectsender,EventArgse)
{
KepItem.Write(textBoxTagvalue.Text);
}
2.8程序退出代码
点击Form1窗口关闭时,执行本代码,主要功能为断开OPC服务器:
privatevoidFrmRSLinxOPCClient_FormClosing(objectsender,FormClosingEventArgse)
{
DisConnectOPCServer();
}
3系统测试效果
3.1Rockwell软件准备
1)运行RSlogixEmulate5软件,并打开测试plc程序,本文中以“S3程序2012-2-22.X5”为例,并点击run命令,如图3:
图3RSlogixEmulate5软件
2)运行rslinx软件,在ConfigureDrivers对话框里组态仿真驱动,选择PLC-5(DH+)EmulatorDriver驱动->AddNew,StationName填写3,点击确定,如图4
图4组态仿真驱动
3.2读取plc标签值测试
首先打开rslogix5编程软件,选择仿真在线plc并上线,然后打开相应的数据表,在N7:0的地址栏中写入测试数值39,如图5:
图5PLC数据表数值
然后打开本文设计的窗口程序,在TagName栏填写[S3]N7:0,然后点击读按钮,会将plc的N7:0数值读出,并且显示数值、品质和时间戳,效果如图6:
图6读取plc数值测试窗口
3.3写入plc标签值测试
在本设计的窗口程序中,在TagValue栏里面填写65,然后点击写按钮,会将plc的N7:0数值改写为65,如图7所示:
图7写入plc数值测试结果
4结论
本文以RSLinx软件作为OPC服务器,利用c#语言开发了一套OPC客户端通信程序,根据测试证明本程序可以实现定制软件与plc之间的数据交换,可以灵活方便的进行各种工业应用,突破了plc厂家自身HMI软件的局限性,值得大力推广。
参考文献:
作者简介:
李长安(1982-),工程师,2000年毕业于上海港湾学校,现任神华黄骅港务有限责任公司设备维修中心技术员。(原文载于《硅谷》杂志2012年第14期,硅谷网及《硅谷》杂志版权所有,未经允许禁止转载)
|
|
|
|
【对“硅谷杂志:基于opc的c#与rslinx通信程序设计”发布评论】 |
版权及免责声明:
① 本网站部分投稿来源于“网友”,涉及投资、理财、消费等内容,请亲们反复甄别,切勿轻信。本网站部分由赞助商提供的内容属于【广告】性质,仅供阅读,不构成具体实施建议,请谨慎对待。据此操作,风险自担。
② 内容来源注明“硅谷网”及其相关称谓的文字、图片和音视频,版权均属本网站所有,任何媒体、网站或个人需经本网站许可方可复制或转载,并在使用时必须注明来源【硅谷网】或对应来源,违者本网站将依法追究责任。
③ 注明来源为各大报纸、杂志、网站及其他媒体的文章,文章原作者享有著作权,本网站转载其他媒体稿件是为传播更多的信息,并不代表赞同其观点和对其真实性负责,本网站不承担此类稿件侵权行为的连带责任。
④ 本网站不对非自身发布内容的真实性、合法性、准确性作担保。若硅谷网因为自身和转载内容,涉及到侵权、违法等问题,请有关单位或个人速与本网站取得联系(联系电话:01057255600),我们将第一时间核实处理。
|
|
|
|