<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta charset="utf-8">
<meta name="generator" content="pdf2htmlEX">
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
<link rel="stylesheet" href="https://static.pudn.com/base/css/base.min.css">
<link rel="stylesheet" href="https://static.pudn.com/base/css/fancy.min.css">
<link rel="stylesheet" href="https://static.pudn.com/prod/directory_preview_static/627268070f6c4f4c786c9479/raw.css">
<script src="https://static.pudn.com/base/js/compatibility.min.js"></script>
<script src="https://static.pudn.com/base/js/pdf2htmlEX.min.js"></script>
<script>
try{
pdf2htmlEX.defaultViewer = new pdf2htmlEX.Viewer({});
}catch(e){}
</script>
<title></title>
</head>
<body>
<div id="sidebar" style="display: none">
<div id="outline">
</div>
</div>
<div id="pf1" class="pf w0 h0" data-page-no="1"><div class="pc pc1 w0 h0"><img class="bi x0 y0 w1 h1" alt="" src="https://static.pudn.com/prod/directory_preview_static/627268070f6c4f4c786c9479/bg1.jpg"><div class="c x0 y1 w2 h2"><div class="t m0 x1 h3 y2 ff1 fs0 fc0 sc0 ls0 ws0">关于<span class="_ _0"> </span><span class="ff2 sc1">OPC Client </span>编写</div><div class="t m0 x1 h4 y3 ff1 fs1 fc1 sc1 ls0 ws0">昨天又有人问我 <span class="ff3">OPC Client </span>编写,实际是他们不了解<span class="_ _0"> </span><span class="ff3">OPC </span>客户端的工作原理,要想写客户端</div><div class="t m0 x1 h4 y4 ff1 fs1 fc1 sc1 ls0 ws0">程序,必须知道<span class="_ _0"> </span><span class="ff3">OPC<span class="_ _0"> </span></span>对象, <span class="ff3">OPC<span class="_ _1"> </span></span>逻辑对象模型包括3类对象:<span class="ff3">OPC server<span class="_ _1"> </span></span>对象、<span class="ff3">OPC </span></div><div class="t m0 x1 h4 y5 ff3 fs1 fc1 sc1 ls0 ws0">group<span class="_ _1"> </span><span class="ff1">对象、</span>OPC item<span class="_ _0"> </span><span class="ff1">对象,每类对象都包括一系列接口。</span></div><div class="t m0 x1 h4 y6 ff3 fs1 fc1 sc1 ls0 ws0"> OPC Server<span class="_ _0"> </span><span class="ff1">对象</span></div><div class="t m0 x1 h4 y7 ff3 fs1 fc1 sc1 ls0 ws0"> <span class="ff1">主要功能为:</span>1<span class="ff1">、创建和管理<span class="_ _0"> </span></span>OPC Group<span class="_ _1"> </span><span class="ff1">对象;</span></div><div class="t m0 x1 h4 y8 ff3 fs1 fc1 sc1 ls0 ws0"><span class="_ _2"></span> 2<span class="ff1">、管理服务器内部的状态信息;</span></div><div class="t m0 x1 h4 y9 ff3 fs1 fc1 sc1 ls0 ws0"> OPC Group<span class="_ _0"> </span><span class="ff1">对象</span></div><div class="t m0 x1 h4 ya ff3 fs1 fc1 sc1 ls0 ws0"> <span class="ff1">主要功能为:</span>1<span class="ff1">、管理<span class="_ _0"> </span></span>OPC Group<span class="_ _1"> </span><span class="ff1">对象的内部状态信息;</span></div><div class="t m0 x1 h4 yb ff3 fs1 fc1 sc1 ls0 ws0"><span class="_ _2"></span> 2<span class="ff1">、创建和管理<span class="_ _0"> </span></span>Items<span class="_ _0"> </span><span class="ff1">对象。</span></div><div class="t m0 x1 h4 yc ff3 fs1 fc1 sc1 ls0 ws0"><span class="_ _2"></span> 3<span class="ff1">、</span>O<span class="_ _2"></span>PC<span class="_ _1"> </span><span class="ff1">服务器内部的实时数据存取服务(同步与异步方式)。</span></div><div class="t m0 x1 h4 yd ff3 fs1 fc1 sc1 ls0 ws0"> OPC<span class="_ _0"> </span><span class="ff1">组中有以下几个主要属性:</span>Name <span class="ff1">:组的名字 ;</span>Active<span class="ff1">:组的激活状态标志 ;</span></div><div class="t m0 x1 h4 ye ff3 fs1 fc1 sc1 ls0 ws0">Update Rate OPC<span class="ff1">:服务器向客户程序提交数据变化的刷新速率;</span>Percent Dead band<span class="ff1">:数</span></div><div class="t m0 x1 h4 yf ff1 fs1 fc1 sc1 ls0 ws0">据死区,即能引起数据变化的最小数值百分比。</div><div class="t m0 x1 h4 y10 ff3 fs1 fc1 sc1 ls0 ws0"> OPC ITEM <span class="ff1">是非<span class="_ _0"> </span></span>COM<span class="_ _1"> </span><span class="ff1">对象,在<span class="_ _0"> </span></span>OPC<span class="_ _0"> </span><span class="ff1">标准中用来描述实时数据,是客户端不可见的对象。</span></div><div class="t m0 x1 h4 y11 ff1 fs1 fc1 sc1 ls0 ws0">代表了与服务器中的数据的连接,它并不是数据源,而仅仅是与数据源的连接。每个项都有以</div><div class="t m0 x1 h4 y12 ff1 fs1 fc1 sc1 ls0 ws0">下主要属性: <span class="ff3">Active<span class="_ _1"> </span></span>项的激活状态、<span class="ff3">Value<span class="_ _0"> </span></span>项的数值、类型为<span class="_ _0"> </span><span class="ff3">VARIANT</span>、<span class="ff3">Quality<span class="_ _1"> </span></span>项的品质,</div><div class="t m0 x1 h4 y13 ff1 fs1 fc1 sc1 ls0 ws0">代表数值的可信度,类型为<span class="_ _1"> </span><span class="ff3">SHORT</span>、<span class="ff3">TimeStamp<span class="_ _0"> </span></span>时间戳,代表数据的存取时间。</div><div class="t m0 x1 h4 y14 ff3 fs1 fc1 sc1 ls0 ws0"> <span class="ff1">你不管用什么开发语言只要了解上面几个对象,就会写程序了</span></div><div class="t m0 x1 h4 y15 ff3 fs1 fc1 sc1 ls0 ws0"> <span class="ff1">下面举个<span class="_ _0"> </span></span>VC<span class="_ _0"> </span><span class="ff1">的例子</span></div><div class="t m0 x1 h5 y16 ff3 fs1 fc1 sc1 ls0 ws0"> HRESULTr1;</div><div class="t m0 x1 h5 y17 ff3 fs1 fc1 sc1 ls0 ws0">CLSIDclsid;</div><div class="t m0 x1 h5 y18 ff3 fs1 fc1 sc1 ls0 ws0">LONGTimeBias = 0;</div><div class="t m0 x1 h5 y19 ff3 fs1 fc1 sc1 ls0 ws0">FLOATPercentDeadband = 0.0;</div><div class="t m0 x1 h5 y1a ff3 fs1 fc1 sc1 ls0 ws0">DWORDRevisedUpdateRate;</div><div class="t m0 x1 h5 y1b ff3 fs1 fc1 sc1 ls0 ws0">LPWSTRErrorStr;</div><div class="t m0 x1 h5 y1c ff3 fs1 fc1 sc1 ls0 ws0">charstr[100];</div><div class="t m0 x1 h5 y1d ff3 fs1 fc1 sc1 ls0 ws0">CStringszErrorText;</div><div class="t m0 x1 h5 y1e ff3 fs1 fc1 sc1 ls0 ws0">m_pItemResult = NULL;</div><div class="t m0 x1 h4 y1f ff3 fs1 fc1 sc1 ls0 ws0"><span class="ff1">客户端程序必须对<span class="_ _1"> </span></span>DCOM<span class="_ _0"> </span><span class="ff1">进行初始化设置,以保证<span class="_ _0"> </span></span>OPC<span class="_ _1"> </span><span class="ff1">服务器端<span class="_ _3"> </span>回调函数不会被堵塞。</span></div><div class="t m0 x1 h4 y20 ff1 fs1 fc1 sc1 ls0 ws0"> </div><div class="t m0 x1 h5 y21 ff3 fs1 fc1 sc1 ls0 ws0">r1 = CoInitialize(NULL);</div><div class="t m0 x1 h5 y22 ff3 fs1 fc1 sc1 ls0 ws0">if (r1 != S_OK)</div><div class="t m0 x1 h5 y23 ff3 fs1 fc1 sc1 ls0 ws0">{if (r1 == S_FALSE)</div><div class="t m0 x1 h5 y24 ff3 fs1 fc1 sc1 ls0 ws0">{MessageBox("COM Library already initialized",</div></div></div><div class="pi" data-data='{"ctm":[1.611850,0.000000,0.000000,1.611850,0.000000,0.000000]}'></div></div>
</body>
</html>