发表于:2005/1/6 16:31:00
#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 /// <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公开的格式准备了一个请求数据的字节数组,然后按照异步调用的格式发送,第二个方法是一个异步调用要求的回调方法。在这个方法中,将获得的数据显示在窗体的文本框中。
欢迎对这种技术感兴趣的同行与我交流:acson1972@163.com
优秀产品、全能专家、周到服务、速胜之道;
选择杰控,值得信赖,无后顾之忧!
选择杰控,值得信赖,无后顾之忧!