没有合适的资源?快使用搜索试试~ 我知道了~
OPC UA SDK(C++)源码分析
5星 · 超过95%的资源 需积分: 50 392 下载量 129 浏览量
2017-12-28
09:48:06
上传
评论 13
收藏 755KB PDF 举报
温馨提示
试读
22页
分析 OPC UA SDK (C++ )源码,总结 OPC UA SDK 的代码架构 及重要部分代 码实现细节
资源推荐
资源详情
资源评论
OPC UA SDK(C++)源码分析
1 文档目的
分析 OPC UA SDK(C++)源码,总结 OPC UA SDK 的代码架构及重要部分代
码实现细节。
2 总体分析
OPC UA 服务描述了一个抽象的,由服务器提供、客户端调用的远程过程调
用(RPC)集合。所有 OPC UA 客户端和服务器的交互都通过这些服务实现。
OPC UA SDK(C++)的目的是方便 OPC UA 服务器和客户端的开发,主要目标
也就是封装、实现这些 OPC UA 服务接口。
OPC UA 规范将服务组织成服务集,每个服务集定义了一组相关的服务。所
有的 OPC UA 服务被组织成发现服务集、安全通道服务集、会话服务集、节点管
理服务集、视图服务集、属性服务集、查询服务集、方法服务集、监视项服务
集和订阅服务集。
OPC UA SDK(C++)服务端主要通过 UaServer、SessionManager、
UaSubscriptionManager、UaTransactionManager、NodeManagerRoot 共 5 个类
来实现 OPC UA 的服务集。
UaServer 定义了服务器需要提供的所有服务接口,是整个服务器的入口,
并根据服务的不同分别指派给
SessionManager,UaSubscriptionManager,UaTransactionManager 和
NodeManangerRoot 进行处理。
SessionManager 负责实现会话和安全通道管理服务集中的服务,包括创建
会话(CreateSession)、激活会话(ActiveSession)、关闭会话
(CloseSession)、打开安全通道(OpenSecureChannel)和关闭安全通道
(CloseSecureChannel)。注意 OPC UA 规范中将取消服务(Cancel)定义到了会话
服务集中,但是 OPC UA SDK(C++)却没有在 SessionManager 中实现取消服务
(Cancel),而是在 UaTransactionManager 中实现。
UaSubscriptionManager 负责实现订阅和监视项服务集中的服务,包括创建
订阅(CreateSubscription)、修改订阅(ModifySubscription)、设置发布模式
(SetPublishingMode)、发布(Publish)、重新发布(Republish)、转移订阅
(TransferSubscriptions)、删除订阅(DeleteSbuscriptions)、创建监视项
(CreateMonitoredItems)、修改监视项(ModifyMonitoredItems)、设置监视模
式(SetMonitoringMode)、删除监视项(DeleteMonitoredItems)和设置触发
(SetTriggering)。
NodeManagerRoot 负责节点管理服务集中的服务,包括添加节点
(AddNodes)、添加参考(AddReferences)、删除节点(DeleteNodes)和删除参考
(DeleteReferences)。
UaTransactionManager 负责实现视图、查询、属性、方法服务集中的服
务,包括浏览(Browse)、浏览下一个(BrowseNext)、转换浏览路径到
NodeId(TranslateBrowsePathsNodeIds)、注册节点(RegisterNodes)、取消注
册节点(UnRegisterNodes),查询第一个(QueryFirst)、查询下一个
(QuerNext),读数据(Read)、读历史数据(HistoryRead)、写数据(Write)、更
新历史数据(HistoryUpdate),方法调用(Call)。注意 OPC UA 规范中将取消服
务(Cancel)定义到了会话服务集中,但是 OPC UA SDK 却没有在
SessionManager 中实现取消服务(Cancel),而是在 UaTransactionManager 中
实现。
参考示意图如下:
3 单项分析
3.1 线程模型
OPC UA SDK 中大量采用了异步执行的模式,异步执行的基础是 OPC UA SDK
(C++)针对线程池、线程和任务的抽象,主要包括下图所示的四个类。
UaThreadPool:线程池实现。
主要负责线程的创建和将任务(UaThreadPoolJob)分配给线程。当线程池
sd 总体
服务端SDK
client
(from
分析
)
UaServer
NodeManagerRoot
UaSubscriptionManager
UaTransactionManager
SessionManager
stack
alt 根据请求不同进行转发
客户端请求()
栈将请求导向到UaServer()
会话和安全通道相关服务请求()
节点管理相关服务请求()
订阅和监视项相关服务请求()
视图、查询、属性和方法相关服务请求()
class Thread类图
UaThread
+ run() : void
+ sleep() : void
+ wait() : void
UaThreadPool
+ addJob(UaThreadPoolJob) : void
+ UaThreadPool(OpcUa_UInt32, OpcUa_UInt32) : void
UaThreadPoolJob
+ execute() : void
UaJobThread
+ startJob(UaThreadPoolJob) : void
启动时根据线程池的最小容量,初始线程;在添加任务时,如果当前无空闲线
程,并且未达到线程池最大容量时,创建新的线程。这个线程池的实现有一个
缺点,就是线程只能增加不能回收。
UaThread:线程基类。
线程基类,实现了线程的基本操作,包括启动、休眠、等待等线程通用的
功能。
UaJobThread:用于执行 Job 的线程(SDK 主要基于此类扩展)。
UaJobThread 继承自 UaThread,并增加了启动任务(startJob)方法,用
于启动 UaThreadPoolJob。
UaThreadPoolJob:所有用于异步执行的 Job 的基类。
UaThreadPoolJob 负责实现具体的任务功能,线程执行时调用
UaThreadPoolJob 的 execute 方法来完成具体的任务功能。
3.1.1 异步执行任务
1) 客户代码创建一个 UaThreadPoolJob 对象。
2) 客户代码将创建的 UaThreadPoolJob 对象通过 UaThreadPool 的 addJob 方
法添加到线程池。
3) UaThreadPool 选择一个空闲 UaJobThread 线程,并调用 UaJobThread 的
startJob 方法启动任务。
4) 系统定期执行 UaJobThread 的 run 方法。
5) UaJobThread 在 run 方法中调用 UaThreadPoolJob 的 execute 方法执行具体
任务,执行结束删除 UaThreadPoolJob 对象回收内存。
3.2 服务器管理
在总体分析部分我们已经指出,OPC UA SDK(C++)的主要目标就是封装、
实现 OPC UA 服务接口,服务端主要通过 UaServer、SessionManager、
UaSubscriptionManager、UaTransactionManager、NodeManagerRoot 共 5 个类
来实现 OPC UA 的服务接口。所以服务器启动的主要目的也就是创建、初始化和
启动 UaServer、SessionManager、UaSubscriptionManager、
UaTransactionManager、NodeManagerRoot 等核心管理组件。
服务器启动涉及的主要类如下:
sd Thread运行图
UaThreadPool
UaThreadPoolJob
client
(from
分析
)
Timer
(from
分析
)
UaJobThread
创建()
addJob(UaThreadPoolJob)
startJob(UaThreadPoolJob)
run()
execute()
UaServerApplication:OPC UA 服务器基类。
UaServerApplication 是一个工具类,管理一个通用 OPC UA 服务器使用的
所有 OPC UA SDK(C++)模块。用户通过扩展这个类,来扩展或者修改 OPC UA
SDK(C++)功能。
OpcServer:自定义的 OPC 服务器类。
OPC UA SDK(C++)自带样例自定义的 UaServerApplication。
UaServerApplicationCallback:UaServerApplication 回调对象。
如果应用程序要实现用户验证,需要实现这个类。
UaServer:OPC UA 服务器的主要入口类。
这个类继承了 UaThread,在应用程序中作为独立线程启动。UaServer 定义
了所有服务器对外提供的服务接口,所有外部请求都会集中由 UaServe 接
收,并转发给其他相关组件进行处理。
ServerConfig:OPC UA 服务器配置类
主要有两个功能,一个是启动和停止服务器;一个是封装所有必要的配置
参数。
ServerManager:OPC UA 服务器管理接口
OPC UA 服务器启动需要此类,此类保存着服务器需要的 ServerConfig、
class Serv er类图
Logical View ::OpcServer
Logical View ::
UaServerApplication
+ afterInitialize() : UaStatus
+ afterStartUp() : void
+ start() : int
Logical View ::ServerConfig
+ createSession() : void
+ getSerializerConfiguration() : UaStatus
+ getServerInstanceInfo(UaString*, UaLocalizedTextArray*) : void
+ getSessionSettings() : void
+ getSubscriptionSettings() : UaStatus
+ getThreadPoolSettings(OpcUa_UInt32*, OpcUa_UInt32*) : void
+ loadConfiguration() : UaStatus
+ logonSessionUser(Session, UaUserIdentityToken) : UaStatus
+ startUp(ServerManager) : void
Logical View ::CoreModule
+ getServerManager() : void
+ initialize() : void
+ startUp(ServerConfig) : void
Logical View ::ServerManager
+ createNodeManagerNS1(UaString) : NodeManager
+ createSessionManager() : SessionManager
+ getNodeManagerNS1() : NodeManagerNS1
+ getNodeManagerRoot() : NodeManagerRoot
+ getSessionManager() : SessionManager
+ startUp(ServerConfig) : void
IOManagerUaNode
NodeManagerList
NodeManagerUaNode
Logical View ::NodeManagerRoot
+ browse() : void
+ CreateRootNodeManager() : NodeManagerRoot
+ getHistoryVariableHandle(Session, HistoryVariableHandle::ServiceType, OpcUa_NodeId, UaStatus*) : HistoryVariableHandle
+ getNodeManagerByNamespace(OpcUa_UInt16) : NodeManager
+ getVariableHandle(Session*, VariableHandle::ServiceType, OpcUa_NodeId*, OpcUa_Int32) : VariableHandle*
+ sessionActivated(Session) : UaStatus
Logical View ::CoreTransactions
+ CoreTransactions(NodeManagerRoot) : void
Logical View::NodeManager
+ addNode() : void
+ browse() : void
+ getHistoryVariableHandle(Session, HistoryVariableHandle::ServiceType, OpcUa_NodeId, UaStatus) : HistoryVariableHandle
+ startUp(ServerManager) : void
Logical View ::
UaServerApplicationModule
Logical View ::UaModule
+ initialize() : void
+ startUp(CoreModule) : void
UaThread
Logical View ::UaServ er
+ addNodes() : void
+ Browse() : OpcUa_StatusCode
+ createUaSubscriptionManager(ServerManager) : UaSubscriptionManager
+ createUaTransactionManager(ServerManager, UaSubscriptionManager) : void
+ getSession(OpcUa_NodeId, OpcUa_Boolean) : UaSession
+ HistoryRead() : OpcUa_StatusCode
+ initStackSettings() : void
+ openEndpoint(UaEndpoint) : UaStatus
+ Read() : OpcUa_StatusCode
+ sendResponse() : void
+ startUp(ServerManager) : UaStatus
Logical View ::
UaServerApplicationCallback
NodeManagerBase
Logical View ::
CustomNodeManager
Logical View ::SessionManager
+ activateSession() : UaStatus
+ createSession() : UaStatus
+ getNewSessionId() : OpcUa_Int32
+ getSession(OpcUa_NodeId, OpcUa_Boolean) : Session
+ sessionActivated(Session) : UaStatus
+ sessionOpened(Session) : void
+ startUp(ServerConfig, NodeManagerRoot) : void
UaThread
Logical View ::UaSubscriptionManager
+ addSubscription(UaSubscription) : OpcUa_UInt32
+ beginCreateMonitoredItems(UaCreateMonitoredItemsContext) : UaStatus
+ createSubscription() : UaStatus
+ createUaSubscription() : UaSubscription
+ findSubscription(OpcUa_UInt32) : UaSubscription
+ startUp() : UaStatus
+ subscriptionCreated(UaSubscription) : void
HistoryManagerCallback
IOManagerCallback
Logical View ::UaTransactionManager
+ addNodes() : void
+ beginBrowse(UaBrowseContext) : UaStatus
+ beginHistoryRead(UaHistoryReadContext) : UaStatus
+ beginRead(UaReadContext) : UaStatus
+ sendResponse() : void
+ startUp() : UaStatus
SessionManager、NodeManagerRoot、自定义 NodeManager 等核心对象,并
提供了一些服务器内部调用的 OPC UA 方法。
CoreModule:服务器核心模块管理接口
负责初始化、启动和停止服务器的核心模块,用于将核心模块集成到服务
器中。
UaModule:服务器模块管理接口
负责初始化、启动和停止服务器模块。
UaServerApplicationModule:服务器应用模块管理接口
负责启动和停止服务器应用模块。
注意:CoreModule、UaModule、UaServerApplicationModule 这三个类的功
能基本一致,但它们的作用不同,CoreModule 主要负责核心模块,
UaModule 用于 Unified Automation 在 OPC UA SDK(C++)中定义的模块,
UaServerApplicationModule 因样例中未使用,不能明确其使用场景,但个
人猜测它应该是用于基于 OPC UA SDK(C++)进行二次开发时自定义的模
块。
3.2.1 服务器启动
服务器启动主要包括两步,一步是初始化(initialize),一步是真正的启
动(startup)。并且提供了 afterInitialize 和 afterStartup 接口,可以进行
初始化或启动后的进一步处理工作。
服务器的启动主要是通过 CoreModule 和 UaModule 来实现,其中
CoreModule 是负责服务器核心模块的管理(通过 ServerManager),包括
NodeManagerRoot、自定义的 NodeManager 和 SessionManager;UaModule 负责
其他模块的管理(通过 UaServer),包括 UaTransactionManager 和
UaSubscriptionManager;UaServerApplicationModule 应该是负责自定义模
块的管理。具体的请参照以下序列图。
1) 主启动图
剩余21页未读,继续阅读
adaiadai0019
- 粉丝: 5
- 资源: 6
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- mosquitto-2.018-install-windows-x64
- FTPServer FTP 服务器,绿色免安装,单文件
- 梦畅语音点名软件,上课点名
- 利用ADNI数据集和标签,在tensorflow框架上使用tensorlayer接口,通过架构u-net实现海马体的分割
- Kutools for Word v9.0 office word 插件
- 修复Windows 10 LTSC 2021资源占用率高
- Hash工具,小巧绿色hash校验工具,免费hash工具
- 重启进行BIOS快捷方式,不需要开机按BIOS键
- 鸭子开车记(儿童绘本)
- 威纶通触摸屏编程软件Easy builder pro V6.09.01.556安装包(2024.04).txt
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功
- 1
- 2
- 3
前往页