如何用.NET获取控制系统的数据(含示例代码) 点击:751 | 回复:3



玄德

    
  • 精华:0帖
  • 求助:0帖
  • 帖子:1帖 | 8回
  • 年度积分:0
  • 历史总积分:15
  • 注册:2004年9月20日
发表于:2005-01-06 15:48:00
楼主
在工厂信息化的发展趋势下,很多信息系统需要从自动化的生产设备或者生产线上获取实时数据,本文介绍几种方式供大家参考。 最直接的方式是直接从控制系统的通信接口取得,比如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 /// <summary> 2 /// 发送请求 3 /// </summary> 4 /// <param name="sender"></param> 5 /// <param name="e"></param> 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 /// <summary> 36 /// 这是一个回调委托的实现,主要用于实现异步调用 37 /// </summary> 38 /// <param name="ar"></param> 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公开的格式准备了一个请求数据的字节数组,然后按照异步调用的格式发送,第二个方法是一个异步调用要求的回调方法。在这个方法中,将获得的数据显示在窗体的文本框中。 欢迎对这种技术感兴趣的同行与我交流:acson2000@163.com



玄德

  • 精华:0帖
  • 求助:0帖
  • 帖子:1帖 | 8回
  • 年度积分:0
  • 历史总积分:15
  • 注册:2004年9月20日
发表于:2005-01-06 15:55:00
1楼
更正,我的联系信箱是acson1972@163.com

玄德

  • 精华:0帖
  • 求助:0帖
  • 帖子:1帖 | 8回
  • 年度积分:0
  • 历史总积分:15
  • 注册:2004年9月20日
发表于:2005-01-07 16:47:00
2楼
欢迎交流啊。

gongkongedit

  • 精华:1099帖
  • 求助:0帖
  • 帖子:14392帖 | 54470回
  • 年度积分:0
  • 历史总积分:622
  • 注册:2008年9月08日
发表于:2005-01-11 11:14:00
3楼
欢迎你加入fameview(杰控)QQ群6840289,与群里的朋友共同交流。

热门招聘
相关主题

官方公众号

智造工程师