ITBaby宝宝

ITBaby Like Hero

原创 C#的OPC工控应用的B/S开发收藏

1:项目前提:上海市污染源监测,需要通过OPC对现场设备进行数据采集与控制,故使用OPC的方式来完成整个项目,但由于客户要求在B/S系统中写OPC数据,读OPC数据,不能使用C/S系统进行开发.整个项目使用 "设备" - OPCSERVER - OPCClient - 中间件 - WEB 这样一个架构.(该项目已通过上海市副市长杨雄的汇报确认)

2:特点,主要完成OPClient,与中间件服务业务功能.而中间件的服务主要是将数据提供给B/S

OPC思路:
OPC客户端启动时,连接OPC服务,连接数据库,将参数配置信息表中的记录在内存中实现一个数据集合(Xml DataSet),其中记录Items的OPC参数客户端句柄,单位,可否读写,OPC参数的最新变化数据,站点信息等其它各个数据项。并将这些OPC参数(Items)放置在整个OPC Group对象下。

当OPC服务中的数据发生变化,引发OPC客户端中Group对象的“数据变化事件”,通过Items的客户端句柄,找到内存数据集合中的一条记录,随之更改该数据行的OPC参数值。

//OPC的参数值发生变化
下面的CODE,主要是一个事件,开发人员可以在OPCGroup对象中触发该事件
  private static void wGroup_DataChange(int TransactionID, int NumItems, ref System.Array ClientHandles, ref System.Array ItemValues, ref System.Array Qualities, ref System.Array TimeStamps)
  {

   int iLenght = ClientHandles.Length;
   for(int i=1;i<=iLenght;i++)
   {
    int Chandle = Convert.ToInt32( ClientHandles.GetValue(i) );

    object oValue = ItemValues.GetValue(i);
    string sValue = Convert.ToString(oValue);

    
    try
    {
     //记录下监控参数的值
     DataRow[] dRows = StaParamsDS.opcparams.Select("clientid="+Chandle.ToString());
     DataRow dRow = dRows[0];
     dRow[StaParamsDS.opcparams.opcvalueColumn] = sValue;

    }
    catch(Exception ex)
    {
     Debug.WriteLine(ex.StackTrace);
    }
   }
  }


3:中间件服务的实现思路:
从WEB应用程序出发,发出请求,通过HTTP连接接口服务程序,透过接口,调用在接口服务上的方法,并得到调用的结果,显示给浏览器用户。对于开发人员来说,接口是透明的,开发过程是简单的,只需要简单的调用,并处理返回结果。
整个中间件服务由作者自己开发完成

实现接口的CODE,(省去很多判断)

public ArrayList getOneStaData(string StaIndexPoint) //StaIndexPoint站点编号
  {
   ArrayList al = new ArrayList();

   string sWhere = "",sAsc = "";
   sWhere = "stationid=" + StaIndexPoint+" And dataarea=3";
   sAsc = "clientid ASC";

   DataRow[] dRows = OpclientLib.ObjStation.StaParamsDS.opcparams.Select(sWhere,sAsc);//OpclientLib定义的OPC客户端组件中的数据集合

   foreach(DataRow dRow in dRows)
   {
    string sElemValue = dRow["opcvalue"].ToString(); //OPC的值
    string sElemName = dRow["cname"].ToString(); //OPC标识的中文
    al.Add(sElemName+"<::>"+sElemValue);
   }

   return al;
  }


4:WEB端的调用
定义一个PAGE,在PAGE_LOAD中添加
 string sRmiURL = System.Configuration.ConfigurationSettings.AppSettings["RmiServerURL"];
   CHblProxyFactory factory = new CHblProxyFactory(); //作者自己完成的中间件服务,有兴趣的朋友可以问我购买,RMB:500,便宜吧(联系邮件:zerodj@163.com)!
   opcAccess.IopcData opcData = (opcAccess.IopcData)factory.Create(typeof(opcAccess.IopcData),sRmiURL);

   ArrayList al = opcData.getOneStaData(sID);

   string sOpcDataResult = "";
   string sOpcDataName = "";
   foreach(object obj in al)
   {
    string sObj = obj.ToString();
    string[] sArray = Regex.Split(sObj,"<::>",RegexOptions.IgnoreCase);//<::>通过该字符串分隔
    string sElName = sArray[0];
    string sElValue= sArray[1];
    if(sOpcDataResult.Length ==0)sOpcDataResult = sElValue;
    else sOpcDataResult =   sOpcDataResult + "||" +sElValue; 
    if(sOpcDataName.Length==0)sOpcDataName = sElName;
    else sOpcDataName = sOpcDataName + "||" + sElName;
   }
   
   if(sOpcDataResult.Length == 0)sOpcDataResult = "OPClientIsStoped";
   else sOpcDataResult = sOpcDataName +"<>"+ sOpcDataResult;
   
   Response.Write(sOpcDataResult);

WEB端使用一个PAGE,每6秒调用上面的PAGE,并使用JAVASCRIPT将数据填入,使用无刷新技术,这样一来用户就看不到刷新进度条,数据自动更新

5:与柏元工控的WEBAccess开发的B/S比较,速度快.而且是0安装

6:图片

作者:itbaby

邮件:zerodj@163.com

发表于 @ 2006年01月25日 15:34:00|评论(loading...)

新一篇: C# 让自己的类属性,能够提供动态改变数据的功能 | 旧一篇: C#使用Hessian调用JAVA的函数

Csdn Blog version 3.1a
Copyright © javasuki