您现在所在的是:

现场总线

回帖:0个,阅读:1097 [上一页] [1] [下一页]
1646
fameview
文章数:23
年度积分:50
历史总积分:1646
注册时间:2003/8/18
发站内信
发表于: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
优秀产品、全能专家、周到服务、速胜之道;
选择杰控,值得信赖,无后顾之忧!

关于我们 | 联系我们 | 广告服务 | 本站动态 | 友情链接 | 法律声明 | 非法和不良信息举报

工控网客服热线:0755-86369299
版权所有 工控网 Copyright©2024 Gkong.com, All Rights Reserved

46.8003