分析 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异步执行任务UaThreadPoalJobaddJobqUaThreadPoolJab)(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、 SessionmanagerUaSubscriptionManager、 Uatransactionmanager、 NodeManagerroot共5个类来实现 OPC UA的服务接口。所以服务器启动的主要日的也就是创建、初始化和启动 UaServer、 Session manager、 UaSubscriptionmanager、Uatransactionmanager、 NodeManagerRoot等核心管理组件服务器启动涉及的主要类如下:s server类图Logical View a Serv er Con fiyUaserverAppllcatloger(): voidafferStartUp(): voidstartUp(SorvcrConfig): voidceInfo(Ua String, UaLocalizedTextArray ): voidr0: intgical view: UaN odulehreadPoolSe: tings(pejA. Uln: 32, OpcUs Uln 32 ) voidt Inadcontigu ration(: I laStattngon senil lsfriSessieseridentityTckan:UlaStaft IsruP(CoreMcdule): voidsarUp(serverManager): volLogical View:Logical View: SorvcrManagerSesonM:Logical View a UaServerstartJoiServerconfig): voidBiuwse0. OpcUa S.atusCudeLogical view: Core TransactionsOpcUa Eoolean): UaSet CorearUpiserverManagen: Ua statuUaServerApplication CallbackLogical view: Node ManagerRootlscT ypo, OpcUn Noceid Ue Status): HsfocvanabloliardloLogical View: SeaaionManiypa OpcUa Nodeld OpdA ints2) wenabic Handadd Node(: vaidpalhistoryWarahle HandleiSession, Historyan ahlaHandIa SemvirrT ype, Ond ka Nnde lr IlaStahus) Historyu\'ariah eHandifLoglcal vIew:Uasubs criptionManagerManegorcal backaddsubscnipuon(uasubsioliun occu UInt8Logical VIew : UaTransactanM anageLogical Vlew itorediternsCunitext) WasaluCus k● UaServerApplication: OPC UA服务器基类。UaScrverApplication是一个工具类,管理一个通用 OPC UA服务器使用的所有 OPC UA SDK(C++)模块。用户通过扩展这个类,来扩展或者修改OCUASDK(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 ConfigSessionmanager、 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 UaseNerApplicatlontopIca: onitSe verOniiaadconigurato10 atatusinitia ize): intCuie TsallncLiunsNout Malaye F.aiterinzializeC\'-1laStatusc Ua Status具体实现璃李考序环加始化 Ua SarvorApplioafanModulcale SAiL具体实现诗梦考序列stEr Core2) Core module启动图asererhpplicatcn Uore w:servaLseverson制gLaThread PoclgelGsrverh stancelr fo(UeBring UeLDcalized T ex)Up(SsrvorMaafterStarLbt): UaStatu+srtllpISaMerMarayorlan化取样顾率相关3) aModule启动图ServerMMaragerIsossonManaetNode Ma lace RoDto: NodeManagerRcogotNodeManagerN S1(): NodeManagerNSsanupo: Uas3.3会话管理OPC UA SDK(C艹+)中会话管理包括创建会话、激活会话、关闭会话三个相关操作,打开安全通道、关闭安全通道属于底层操作,并未綦露。下图是会话管理相关的主要类图。class session美图ogical View: Sessionactivate(opcUa_UInt32, UaUserldentity Token, UaStrngAray): UaStatusOpcUa StatusCodcreatelaSubscriptionManager( SarverManager: Ua Subscription ManageressianActivatedD): voidcrealeUaTranIsacliunMallayerServeIManlayel, Ua Substripliur Ma lager): voidsubscription Created(Ua Subscri ption: UaStatusgetsessioniopcUa_ Nodeld, OpcUa_ Boolean): UasesslotHi storyRead(: OpcUa StatusCodeinitS: acksetti ngs(: voidpenEndpoint(eNdpoint): Ua StatusReac(): OpcUa StatusCodsendResponse0: vo dstartup(serverManager) Lla statiLogical View: UaScssionLogical view: sessionManageIdou islanding TIansadiu(OpcUa UInl32, OpcUa U nL32): vuicremoveOutstanding T ransactinnO:vCiaoalvaieSesson(: Uastatusstarting Service Processing(: voidOperaLogical View:: ServerCanfigcreatesSerial iza Configuration(: UaStatusget ServerinstanceInfo(aString, UaLocalizedTextAmay ) voidlelSessiun Sellings(). voidLogical VicwgetThreadPoolSettings( OpcUa UInt32 OpcUa UInt32*): voidload Configuration(): Uastatuslogon Sessionuser(session, Uauserldentity Token): UaSlatus+sarUp(ServeIManlage: ). voidMOManagertaNodNode ManagertistNodeManagertanodeLogical View: NodeM anagerRoottNode Manager: Node ManagerrnotaHandle: Serv ce Type, OpcUa Nodald, Ua S:alas): HisioryVan ableHandleinActivated(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 orCallbaecreate Season减实到化 Session设置 SeNver冯 oplicaticnc\' allhacke lserverApplicaticnCallback文例oDen: Uasatus1) Laserver接收到创建会话请求( createsession)请求后,将请求转发给Sessionmanagero2) SessionManager向 ServerConfig获取关于会话的配置参数。3) Sessionmanager获取新的会话ID后,调用 ServerConfig的createSession操作来执行实际的会话创建工作4) Servercon\'ig判断是否存在自定义的 UaServerApplicationCallback,如果存在调用 UaServerApplicationCallback的创建 Session的方法,如果不存在调用 UaserverApplication的创建默认会话的方法来创建会话。5) Sessionmanager调用 Session的open方法,来打开 Session3.3.2会话激活会话激活是同步执行,具体序列图如下:sesaonge: Seesion(OpcUa_Noceld, Opcla_3polean;:SeeionSesaionUser( Season, Ua Jseriden ity Token): UaStatusalt回调函数a调用回调函数sesunAuivaleuo1) Eserver接收到激活公话请求( activesession)请求后,将请求转发给Sessionmanager。2) Sessionmanager根据会话ID获取会话。3) Sessionmanager向 ServerConfig发送验证用户并将用户和会话进行绑定的4) ServerConfig判断是否存在自定义的 UaServerApplicationCallback,如果存在调用 UaServerApplicationCallback的验证用户并将用户和会话进行绑定的请求5) Session manager调用 Session的 active方法,来激活Seession6) Session判断是否注册了 Sessioncallback,如果注册了回调sessionactived方法7) Sessionmanager通知 NodeManagerf oot已经激活 Session。3.4地址空间管理地址空间管理主要功能是维护地址空间中的节点及节点引用。NodeManagerroot是地址空间维护功能的主入口类,它根据命名空间将添加节点、删除节点、添加引用和维扩引用的操作转发给对应的自定义 Nodemanager类进行处理。 ...展开详情
本文链接: http://opcla.immuno-online.com/view-686208.html