登录
首页 现场总线
回帖 发帖
正文

主题:如何用.NET获取控制系统的数据(含示例代码)

点击:1146 回复:0


  在工厂信息化的发展趋势下,很多信息系统需要从自动化的生产设备或者生产线上获取实时数据,本文介绍几种方式供大家参考。
  最直接的方式是直接从控制系统的通信接口取得,比如PLC的通信端口,这需要对控制设备的通信机制非常清楚,并且需要非常丰富的C语言开发经验。
  间接的情况是通过自控系统中的一些支持OPC接口的软件比如西门子的Wincc、Citect的HMI/SCADA等获得,这种情况占大多数,这种方式的前提是要获取的数据在都存在于这些软件系统中。而且开发人员需要非常熟悉OPC的接口标准,要想开发出高效的接口也必须通过OPC的Customer接口使用C/C++来实现,通过Automation接口虽然可以比较方便地通过VB等快速开发工具来实现,但是功能和效率会差一些。另外如果采用.NET来开发因为.NET是一种托管的代码模式,和COM技术有一定的隔阂,需要做较多的封送处理,显然也不是很方便。但是可以使用不安全代码,抛弃.NET的托管代码的优点来实现,这样显然也不理想。
  还有一种方式有些特别,但是有个要求,就是直接采集数据的组态软件使用Fameview。这个软件提供了一种网络服务器的技术,以它本身作为服务器端,通过Socket将其采集到的变量公开出来。由于Socket是一个非常成熟和标准的接口,无论采用哪种开发语言都对Socket又非常好的支持,使用.NET平台下System.Net.Sockets命名空间中的各种类可以非常方便地完成接口程序的开发,开发的模式基本上是问答方式的。Fameview作为服务器监听客户端的请求,根据请求的类型返回给客户端需要的控制变量的实际值。客户端可以请求的变量类别相当多,包括设备数据表的组态的变量、内部变量、模拟变量包、开关变量包等等,我做的测试是请求模拟变量包中的数据,使用C#写的一段程序,让Fameview返回的数据显示在窗体上的一个文本框中。文本的名称是txtReceive。代码如下:
  1 ///
  2 /// 发送请求
  3 ///

  4 ///
  5 ///
  6 private void btnSend_Click(object sender, System.EventArgs e)
  7 {
  8 byte[] send=new byte[7];
  9 send[0]=System.Convert.ToByte('>');
  10 send[1]=System.Convert.ToByte('*');
  11 send[2]=201;
  12 send[3]=0;
  13 send[4]=0;
  14 send[5]=0;
  15 send[6]=20;
  16
  17 NetworkStream ns;
  18 try
  19 {
  20 ns= client.GetStream();
  21 }
  22 catch(InvalidOperationException IOErr)
  23 {
  24 MessageBox.Show(IOErr.Message);
  25 return;
  26 }
  27 ns.Write(send,0,send.Length);
  28
  29 if(ns.CanRead)
  30 {
  31 IAsyncResult ar=ns.BeginRead(receive,0,receive.Length,new 32AsyncCallback(this.readCallback),ns);
  33 }
  34 }
  35 ///
  36 /// 这是一个回调委托的实现,主要用于实现异步调用
  37 ///

  38 ///
  39 private void readCallback(IAsyncResult ar)
  40 {
  41 NetworkStream nss=(NetworkStream)ar.AsyncState;
  42 int ReceiveNum=nss.EndRead(ar);
  43 if(ar.IsCompleted)
  44 {
  45
  46 this.txtReceive.Text=receive[0].ToString()+":"+receive[1].ToString()+
  47 ":"+receive[2].ToString()+":"+receive[3].ToString()+
  48 ":"+receive[4].ToString()+":"+receive[5].ToString()+
  49 ":"+receive[6].ToString()+":"+receive[7].ToString()+
  50 ":"+receive[8].ToString()+":";
  51 this.txtSend.Text=ReceiveNum.ToString();
  52 }
  53 }
  
  代码说明,这是一段示例代码,总体思想是利用.NET的内值特性,采用异步调用方式,当数据接收完成后,方法向窗体上的文本框显示数据,在此之前如果在接收数据的时候不会封锁当前的主线程。包括2个方法,第一个方法按照Fameview公开的格式准备了一个请求数据的字节数组,然后按照异步调用的格式发送,第二个方法是一个异步调用要求的回调方法。在这个方法中,将获得的数据显示在窗体的文本框中。
  欢迎对这种技术感兴趣的同行与我交流:acson1972@163.com
05-01-06 16:31

工控新闻

更多新闻资讯