实例介绍
分析 OPC UA SDK (C++ )源码,总结 OPC UA SDK 的代码架构 及重要部分代 码实现细节
启动时根据线程池的最小容量,初始线程;在添加任务时,如果当前无空闲线 程,并且未达到线程池最大容量时,创建新的线程。这个线程池的实现有一个 缺点,就是线程只能增加不能回收。 ● LaThread:线程基类。 线程基类,实现了线程的基本操作,包括启动、休眠、等待等线程通用的 功能。 UaJob Thread:用于执行Job的线程(SDK主要基于此类扩展) UaJobThread继承自 UnThread,并增加了启动任务( startJob)方法,用 于启动 Ua.ThreadPoolJob ● UaThreadPool Job:所有用于异步执行的Job的基类 UaThreadPooljob负责实现具体的任务功能,线程执行时调用 UaThreadPool Job的 execute方法来完成具体的任务功能 3.1.1异步执行任务 d运行图 创建0) UaThreadPoalJob addJobqUaThreadPoolJab) (mm分胡 (mm分胡 1)客户代码创建一个 UaThreadPooljob对象。 2)客户代码将创建的 UaThreadPooljob对象通过 Ua ThreadPool的 addJob方 法添加到线程池 3) LaThreadpoo选择一个空闲 LaJos Thread线程,并调用 UaJobThread的 start Job方法启动任务。 4)系统定期执行 UaJobthread的run方法。 5) laJos Thread在run方法中调用 UaThreadPoolJob的 execute方法执行具体 任务,执行结束删除 UaThreadPool Job对象回收内存 32服务器管理 在总体分析部分我们己经指出, OPC UA SDK(C++)的主要目标就是封装 实现 OPC UA服务接口,服务端主要通过 Uaserver、 Sessionmanager UaSubscriptionManager、 Uatransactionmanager、 NodeManagerroot共5个类 来实现 OPC UA的服务接口。所以服务器启动的主要日的也就是创建、初始化和 启动 UaServer、 Session manager、 UaSubscriptionmanager、 Uatransactionmanager、 NodeManagerRoot等核心管理组件 服务器启动涉及的主要类如下: s server类图 Logical View a Serv er Con fiy UaserverAppllcatlo ger(): void afferStartUp(): void startUp(SorvcrConfig): void ceInfo(Ua String, UaLocalizedTextArray"): void r0: int gical view: UaN odule hreadPoolSe: tings(pejA. Uln: 32, OpcUs Uln 32 ) void t Inadcontigu ration(: I laStatt ngon senil lsfriSessie seridentityTckan:UlaStaft Is ruP(CoreMcdule): void sarUp(serverManager): vol Logical View: Logical View: SorvcrManager loct SesonM: Logical View a UaServer startJoiServerconfig): void Biuwse0. OpcUa S.atusCude Logical view: Core Transactions OpcUa Eoolean): UaSe t Core arUpiserverManagen: Ua statu UaServerApplication Callback Logical view: Node ManagerRoot lscT ypo, OpcUn Noceid Ue Status): Hsfocvanabloliardlo Logical View: SeaaionMani ypa OpcUa Nodeld OpdA ints2) wenabic Hand add Node(: vaid palhistoryWarahle HandleiSession, Historyan ahlaHandIa SemvirrT ype, Ond ka Nnde lr IlaStahus) Historyu'ariah eHandif Loglcal vIew:Uasubs criptionManager Manegorcal back addsubscnipuon(uasubsioliun occu UInt8 Logical VIew : UaTransactanM anage Logical Vlew" itorediternsCunitext) Wasalu Cus k ● UaServerApplication: OPC UA服务器基类。 UaScrverApplication是一个工具类,管理一个通用 OPC UA服务器使用的 所有 OPC UA SDK(C++)模块。用户通过扩展这个类,来扩展或者修改OCUA SDK(C++)功能 ●0 pcServer:自定义的OPC服务器类。 OPC UA SDK(C+4)自带样例自定义的 UaServerApplication ● CaServerApplicationCallback: UaServerApplication回调对象。 如果应用程序要实现用户验证,需要实现这个类 ● Laserver: OPC UA服务器的主要入凵类。 这个类继了 Unthread,在应用程序中作为独立线程启动。 Easerver定义 了所有服务器对外提供的服务接口,所有外部请求都会集中由 Uaserve接 收,并转发给其他相关组件进行处理 ● ServerConfig: OPC UA服务器配置类 主要有两个功能,个是启动和停止服务器;个是封装所有必要的配置 参数。 ● Servermanager: OPC UA服务器管理接口 OPC UA服务器启动需要此类,此类保存着服务器需要的 Server Config Sessionmanager、 NodeManagerroot、自定义 Node manager等核心对象,并 提供了一些服务器内部调用的 OPC UA方法 ● Core Module:服务器核心模块管理接口 负责初始化、启动和停止服务器的核心模块,用于将核心模块集成到服务 器中。 ● Comodule:服务器模块管理接口 负责初始化、启动和停止服务器模块。 ● laServerApplicationModule:服务器应用模块管埋接口 负责启动和停止服务器应用模块。 注意: CoreModule、 UaModule、 UaServerApplicationModule这三个类的功 能基本一致,但它们的作用不同, CoreModule主要负责核心模块, UaModule用于 Unified Automation在 OPC UA SDK(C++)中定义的模块, UaServerApplicationModule因样例中未使用,不能明确其使用场景,但个 人猜测它应该是用于基于 OPC UA SDK(C++)进行二次开发时自定义的模 块 3.21服务器启动 服务器启动主要包括两步,一步是初始化( initialize),一步是真正的启 动( startup)。并且提供了 afterinitialize和 after Startup接口,可以进行 初始化或启动后的进一步处理工作。 服务器的启动主要是通过 CoreModule和 UaModule来实现,其中 CoreModule是负责服务器核心模块的管理(通过 Servermanager),包括 NodeManager root、自定义的 Nodemanager和 Session manager; UaModule负责 其他模块的管理(通过 UaServer),包括 CatransactionManager和 UaSubscription Manager; LaServerApplicationModule应该是负责自定义模 块的管理。具体的请参照以下序列图 1)主启动图 UaGerverApplication启动 NcdaManager UaseNerApplicatlonto pIca: onit Se verOnii aadconigurato10 atatus initia ize): int Cuie TsallncLiunsNout Malaye F. aiterinzializeC'-1laStatus c Ua Status 具体实现璃李考序 环加始化 Ua SarvorApplioafanModulc ale SAiL 具体实现诗梦考序列 stEr Core 火 2) Core module启动图 asererhpplicatcn Uore w: servaL severson制g LaThread Pocl gelGsrverh stancelr fo(UeBring" UeLDcalized T ex) Up(SsrvorMa afterStarLbt): UaStatu +srtllpISaMerMarayorl an化取样顾率相关 3) aModule启动图 ServerMMarager IsossonMana etNode Ma lace RoDto: NodeManagerRco gotNodeManagerN S1(): NodeManagerNS sanupo: Uas 3.3会话管理 OPC UA SDK(C艹+)中会话管理包括创建会话、激活会话、关闭会话三个相 关操作,打开安全通道、关闭安全通道属于底层操作,并未綦露。下图是会话 管理相关的主要类图。 class session美图 ogical View: Session activate(opcUa_UInt32, UaUserldentity Token, UaStrngAray): UaStatus OpcUa StatusCod createlaSubscriptionManager( SarverManager: Ua Subscription Manager essianActivatedD): void crealeUaTranIsacliunMallayerServeIManlayel, Ua Substripliur Ma lager): void subscription Created(Ua Subscri ption: UaStatus getsessioniopcUa_ Nodeld, OpcUa_ Boolean): Uasesslot Hi storyRead(: OpcUa StatusCode initS: acksetti ngs(: void penEndpoint(eNdpoint): Ua Status Reac(): OpcUa StatusCod sendResponse0: vo d startup(serverManager) Lla stati Logical View: UaScssion Logical view: sessionManage Idou islanding TIansadiu(OpcUa UInl32, OpcUa U nL32): vuic removeOutstanding T ransactinnO:vCi aoalvaieSesson(: Uastatus starting Service Processing(: void Opera Logical View:: ServerCanfig creates Serial iza Configuration(: UaStatus get ServerinstanceInfo(aString, UaLocalizedTextAmay ) void lelSessiun Sellings(). void Logical Vicw getThreadPoolSettings( OpcUa UInt32 OpcUa UInt32*): void load Configuration(): Uastatus logon Sessionuser(session, Uauserldentity Token): UaSlatus +sarUp(ServeIManlage: ). void MOManagertaNod Node Managertist NodeManagertanode Logical View: NodeM anagerRoot tNode Manager: Node Managerrnot aHandle: Serv ce Type, OpcUa Nodald, Ua S:alas): HisioryVan ableHandle inActivated(Sesco) asat (a Ulnt1 B). ac Type, OpcUa Nodeld, OpcUa nt32) VanableHandle' ● Eserver: OPC UA服务器的主要入口类。 外部关于 Session相关的请求,都由 UaServer进行接收,并转给 Sessionmanager进行处理。 ● ServerConfig: OPC UA服务器配置类。 保存服务器相关配置参数,当然包括 Session相关的配置参数, Sessionmanager通过 SeverConfig获取 Session相关的配置参数;同时负 责创建 session创建、用户验证等实际工作 ● Sessionmanager:会话管理 主要维护服务器会话统计信息、会话状态、创建、激活会话等活动,同时 也负责安全通道的创建、删除等相关操作 ● Session:会话接口。 定义了会话的方法接口,包括打开、激活、关闭会话,浏览、查询、历史 读等和会话相关的业务操作。 ● Assession:默认的会话实现 OPC UA SDK(C++)中默认提供的会话实现。 ● Sessioncallback:会话回调炎。 定义了会话打开、关闭、激活后的回调函数 3.3.1会话创建 会话创建是同步执行的,具体序列图如下: g JaScrvcrApplicat orCallbae create Season 减实到化 Session 设置 SeNver冯 oplicaticnc' allhacke l serverApplicaticnCallback文例 oDen: Uasatus 1) Laserver接收到创建会话请求( createsession)请求后,将请求转发给 Sessionmanagero 2) SessionManager向 ServerConfig获取关于会话的配置参数。 3) Sessionmanager获取新的会话ID后,调用 ServerConfig的 createSession操作来执行实际的会话创建工作 4) Servercon'ig判断是否存在自定义的 UaServerApplicationCallback,如 果存在调用 UaServerApplicationCallback的创建 Session的方法,如果 不存在调用 UaserverApplication的创建默认会话的方法来创建会话。 5) Sessionmanager调用 Session的open方法,来打开 Session 3.3.2会话激活 会话激活是同步执行,具体序列图如下: sesaon ge: Seesion(OpcUa_Noceld, Opcla_3polean;:Seeion SesaionUser( Season, Ua Jseriden ity Token): UaStatus alt回调函数 例 a调用回调函数 sesunAuivaleuo 1) Eserver接收到激活公话请求( activesession)请求后,将请求转发给 Sessionmanager。 2) Sessionmanager根据会话ID获取会话。 3) Sessionmanager向 ServerConfig发送验证用户并将用户和会话进行绑定的 请求。 4) ServerConfig判断是否存在自定义的 UaServerApplicationCallback,如 果存在调用 UaServerApplicationCallback的验证用户并将用户和会话进 行绑定的请求 5) Session manager调用 Session的 active方法,来激活Se ession 6) Session判断是否注册了 Sessioncallback,如果注册了回调 sessionactived方法 7) Sessionmanager通知 NodeManagerf&oot已经激活 Session。 3.4地址空间管理 地址空间管理主要功能是维护地址空间中的节点及节点引用。 NodeManagerroot是地址空间维护功能的主入口类,它根据命名空间将添加节 点、删除节点、添加引用和维扩引用的操作转发给对应的自定义 Nodemanager 类进行处理。 【实例截图】
【核心代码】
标签:
小贴士
感谢您为本站写下的评论,您的评论对其它用户来说具有重要的参考价值,所以请认真填写。
- 类似“顶”、“沙发”之类没有营养的文字,对勤劳贡献的楼主来说是令人沮丧的反馈信息。
- 相信您也不想看到一排文字/表情墙,所以请不要反馈意义不大的重复字符,也请尽量不要纯表情的回复。
- 提问之前请再仔细看一遍楼主的说明,或许是您遗漏了。
- 请勿到处挖坑绊人、招贴广告。既占空间让人厌烦,又没人会搭理,于人于己都无利。
关于好例子网
本站旨在为广大IT学习爱好者提供一个非营利性互相学习交流分享平台。本站所有资源都可以被免费获取学习研究。本站资源来自网友分享,对搜索内容的合法性不具有预见性、识别性、控制性,仅供学习研究,请务必在下载后24小时内给予删除,不得用于其他任何用途,否则后果自负。基于互联网的特殊性,平台无法对用户传输的作品、信息、内容的权属或合法性、安全性、合规性、真实性、科学性、完整权、有效性等进行实质审查;无论平台是否已进行审查,用户均应自行承担因其传输的作品、信息、内容而可能或已经产生的侵权或权属纠纷等法律责任。本站所有资源不代表本站的观点或立场,基于网友分享,根据中国法律《信息网络传播权保护条例》第二十二与二十三条之规定,若资源存在侵权或相关问题请联系本站客服人员,点此联系我们。关于更多版权及免责申明参见 版权及免责申明
网友评论
我要评论