关于OPC Client 编写
昨天又有人问我 OPC Client 编写,实际是他们不了解OPC 客户端的工作原理,要想写客户端程序,必须知道OPC对象, OPC逻辑对象模型包括3类对象:OPC server对象、OPC group对象、OPC item对象,每类对象都包括一系列接口。
OPC Server对象
主要功能为:1、创建和管理OPC Group对象;
2、管理服务器内部的状态信息;
OPC Group对象
主要功能为:1、管理OPC Group对象的内部状态信息;
2、创建和管理Items对象。
3、OPC服务器内部的实时数据存取服务(同步与异步方式)。
OPC组中有以下几个主要属性:Name :组的名字 ;Active:组的激活状态标志 ;Update Rate OPC:服务器向客户程序提交数据变化的刷新速率;Percent Dead band:数据死区,即能引起数据变化的最小数值百分比。
OPC ITEM 是非COM对象,在OPC标准中用来描述实时数据,是客户端不可见的对象。代表了与服务器中的数据的连接,它并不是数据源,而仅仅是与数据源的连接。每个项都有以下主要属性: Active项的激活状态、Value项的数值、类型为VARIANT、Quality项的品质,代表数值的可信度,类型为SHORT、TimeStamp时间戳,代表数据的存取时间。
你不管用什么开发语言只要了解上面几个对象,就会写程序了
下面举个VC的例子
HRESULT r1;
CLSID clsid;
LONG TimeBias = 0;
FLOAT PercentDeadband = 0.0;
DWORD RevisedUpdateRate;
LPWSTR ErrorStr;
char str[100];
CString szErrorText;
m_pItemResult = NULL;
客户端程序必须对DCOM进行初始化设置,以保证OPC服务器端回调函数不会被堵塞。
r1 = CoInitialize(NULL);
if (r1 != S_OK)
{ if (r1 == S_FALSE)
{ MessageBox("COM Library already initialized",
"Error CoInitialize()", MB_OK+MB_ICONEXCLAMATION);
}
else
{ szErrorText.Format("Initialisation of COM Library failed. Error Code= %4x", r1);
MessageBox(szErrorText,"Error CoInitialize()", MB_OK+MB_ICONERROR);
SendMessage(WM_CLOSE);
return;
}
}
通过OPC服务器的ProgID查询注册表中相关CLSID。每个COM服务器都有一个字符串型的ProgID,通过ProgID可以得到全球惟一的CLSID,使用CLSIDFromProgID( )函数实现ProgID到CLSID的转换。 r1 = CLSIDFromProgID(L"OPC.SimaticNET", &clsid);
if (r1 != S_OK)
{ MessageBox("Retrival of CLSID failed",
"Error CLSIDFromProgID()", MB_OK+MB_ICONERROR);
CoUninitialize();
SendMessage(WM_CLOSE);
return;
}
连接OPC服务器,查询对象的IID_IOPCServer接口。在连接OPC服务器前,OPC客户端需要事先指定计算机名和OPC数据访问服务器名,建立连接后,创建OPC组并添加OPC数据项。
r1 = CoCreateInstance (clsid, NULL, CLSCTX_LOCAL_SERVER ,IID_IOPCServer, (void**)&m_pIOPCServer);
if (r1 != S_OK)
{ MessageBox("Creation of IOPCServer-Object failed",
"Error CoCreateInstance()", MB_OK+MB_ICONERROR);
m_pIOPCServer = NULL;
CoUninitialize();
SendMessage(WM_CLOSE);
return;
}
创建OPC组,查询IOPCItemMgt接口。IOPCServer接口的AddGroup()方法可以创建一个有指定名称和属性的OPC组。
r1=m_pIOPCServer->AddGroup(L"grp1", // [in] group name
TRUE, // [in] active
500, // [in] request this Update Rate from Server
1, // [in] Client handle
&TimeBias, // [in] no time interval to system UTC time
&PercentDeadband, // [in] no deadband, so all data changes are reported
LOCALE_ID, // [in] Server uses English language for text values
&m_GrpSrvHandle, // [out] Server handle to identify this group in later calls
&RevisedUpdateRate, // [out] the answer form the Server to the requested update rate
IID_IOPCItemMgt, // [in] requested interface type of the group object
(LPUNKNOWN*)&m_pIOPCItemMgt); // [out] pointer to the requested interface
if (r1 == OPC_S_UNSUPPORTEDRATE)
{
szErrorText.Format ("Revised Update Rate %d is different from Requested Update Rate 500",RevisedUpdateRate );
AfxMessageBox(szErrorText);
}
else
if (FAILED(r1)){
MessageBox("Can't add Group to Server!", "Error AddGroup()", MB_OK+MB_ICONERROR);
m_pIOPCServer->Release();
m_pIOPCServer = NULL;
CoUninitialize();
SendMessage(WM_CLOSE);
return;
}
添加OPC数据项。使用IOPCItemMgt接口的AddItem()方法可以添加具有特殊属性的指定数量的数据项。
// define an item table with one item as in-paramter for AddItem
m_Items[0].szAccessPath = L"";
m_Items[0].szItemID = szItemID; // 影响数据类型
m_Items[0].bActive = TRUE;
m_Items[0].hClient = 1;
m_Items[0].dwBlobSize = 0;
m_Items[0].pBlob = NULL;
m_Items[0].vtRequestedDataType = 0;
// defined by the item itself
r1 = m_pIOPCItemMgt->AddItems(1, // [in] add one item
m_Items, // [in] see above
&m_pItemResult, // [out] array with additional information about the item
&m_pErrors); // [out] tells which of the items was successfully added.
// For any item which failed it provides a reason
程序退出时
OPC连接断开,释放接口指针。当程序退出或停止服务器时,依次删除Item(RemoveItems)、Group(RemoveGroups),释放资源。
关于OPC Client 编写相关推荐
- php取FBOX数据,云平台制作(1)-OPC Client取数模块的制作
近来由于工程需要,基于OPC DA 2.0搭建通用的取数模块,与远程webscoket服务端连接,并传输数据.在网上找了些资料,修改相应网友公开的源代码,基本达到要求,特供大家参考. 1.实体类 us ...
- (OPC Client .NET 开发类库)网上很多网友都有提过,.NET开发OPC Client不外乎下面三种方法...
1. 背景 OPC Data Access 规范是基于COM/DCOM定义的,因此大多数的OPC DA Server和client都是基于C++开发的,因为C++对COM/DCOM有最好的支持.现在, ...
- websocket server client 编写
websocket server client 编写 根据RFC文档编写 网络七层简单介绍 websocket 的好处 传输层 websocket应用层协议 根据RFC文档编写 从网络七层开始,写出一 ...
- opc client for php,使用vb/vba作为OPC client
使用vba/vb做client可以使opc的访问变得简单,以下是基于excel的简单opc client代码: Option Explicit Public WithEvents MyOPCSvr A ...
- OPC UA客户端工具Softing OPC Client使用_推荐使用
OPC UA客户端工具Softing OPC Client使用_推荐使用 Softing OPC Client工具介绍 Softing OPC Client工具是德国Softing公司出品的标准OPC ...
- OPC是什么意思?OPC Server 和OPC Client又有什么区别呢?
自从OPC标准出现之后,很多人都在使用,但是对于一些刚接触的人来说还是比较懵的.本篇文章主要介绍OPC Server 和OPC Client的区别.现在就跟着小编来了解一下文章内容吧~ 说到OPC S ...
- opc服务器不稳定的原因,OPC Client和OPC Server容易出现通讯故障,原因是什么?
OPC Server是一套利用微软的COM/DCOM技术实现工业自动化资料获取的架构.OPC Server提供OPC接口,它将与之相连的物理设备(PLC)的信息值通过接口返回到客户端应用程序.也就是说 ...
- Prosys OPC Client连接OPC DA
Prosys OPC Client连接OPC DA Prosys OPC 客户端将帮助排除 OPC 连接故障并测试 OPC 服务器. 您可以读写数据.浏览服务器以及导出和导入地址空间. OPC 客户端 ...
- 分别在MS-DOS和MySQL Command Line Client编写sql语句
一.MS-DOS编写sql语句 1.打开cmd,启动mysql net start mysql(关闭 是net stop mysql) 2.到达mysql的安装目录(比如我的安装目录是F盘),登录m ...
最新文章
- 取名字_公司起名起名免费建筑公司取名字大全
- 深圳.NET俱乐部7月活动小结及照片
- BZOJ2738 矩阵乘法 【整体二分 + BIT】
- MPEG1 Audio介绍
- ftp连接 java.net.ConnectException: Connection refused
- Java并发——Synchronized关键字和锁升级,详细分析偏向锁和轻量级锁的升级
- C++之std::bind()用法
- neoterm如何安装python_NeoTerm官方版v2.1.0下载_NeoTerm(21世纪的终端)下载-刷机之家
- Spring AOP(五)之Around增强处理
- AC日记——【模板】二分图匹配 洛谷 P3386
- easyExcel导出数据并设置单元格下拉数据
- 趋势线的拐点突破交易
- Protobuf解包组包
- 集成百度ORC 识别报 Fatal signal 11 (SIGSEGV) (RenderThread) 错误(已解决)
- Graylog Syslog 输入无法在端口 514 上启动问题处理
- 虚拟机内存交换学习个人摘录总结
- 文献解读|利用Biolog EcoPlates 和PICRUSt2分析后期虾池细菌群落功能多样性
- 高一英语计算机课文,人教版高中英语课文(完整版)
- mysql 国密_Centos7 编译安装 Openssl 1.1.1 支持国密标准-1002682
- Unity-动作系统-案例学习(1)人物移动和转向