3 组件的IDL/CIDL定义
以HMI Server为例,对定义过程进行描述。
HMI Server的IDL定义如下:
component HMIServer supports
SystemService
{
provides RegisterService RegSrv;
provides NCCodeManager NCCodeMgr;
uses AuthenticationService AuthSrv;
publishes StartMotionControl StartMC;
publishes StopMotionControl StopMC;
publishes PauseMotionControl
PauseMC;
publishes NCCodeReady NCCodeRD;
publishes SystemInitiation SysInit;
};
home HMIServerHome manages
HMIServer{}。
其中,系统服务面向系统外部的HMI Client注册服务面向所有运动控制组件;NC代码管理器则面向MCK中的NC代码解释器组件;Home则是用于创建组件实例的工厂(Factory)。
允许系统使用者开发适合自身需要的HMIClient也是本系统的一个目标,所以应该让系统使用者自主选择HMI Client的开发技术,而不应该使HMI Client仅基于CCM,因此HMI Client只要遵循系统接口规范,可以使用任何技术实现。由于Provides/uses方式仅能用于组件之间连接的建立,因此HMI Server以支持(supports)的方式对外提供系统服务,而注册服务和NC代码管理器则以提供(provides)的方式与相应的使用者建立连接。
由于系统服务中的登录和注销功能只是对HMI Client提供了一个访问认证服务的接口,因此HMI Server需要与认证服务组件建立连接,以使用其提供的认证功能。对于HMI Server组件,由于其状态不需要在生存期以外进行保存,所以没有必要将组件定义为Entity或Process类型,并且一个组件的生存期需要超过一次客户请求,所以Service类型也不合适。因此,要使组件在整个系统运行期间保持激活状态,Session类型是最合适的选择。
HMI Server的CIDL定义如下:
composition session HMIServer_impl
{
home executor HMIServerHome_Exec
{
implements
CNC::HMISERVER_MODULE::H
MIServerHome;
manages HMIServer_Exec;
};
}。
4 IDL/CIDL到C++的映射
完成IDL和CIDL的定义后,首先,使用TAO/CIAO开发包中的Perl脚本来生成工程描述文件;然后,建立空白的实现文件,这样可以使整个工程通过编译,而具体的实现代码则可在随后逐步完善。编译完成后,将会在各组件的工程目录中生成映射到C++的客户端stub、服务器端skeleton、服务器端servant等文件。在生成了组件的C++框架文件后,就可以以此为基础进行组件的具体实现过程。