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...)