16. Attribute 属性元素

16.1 元素定义

现实世界的对象都有着标志其存在的各种属性,比如人都有身高、体重、年龄、性别等属性。对这些属性的不同赋值就区别出人的不同个体。类似的,在BHTC simulation系统中,对任何活动的实体对象如Part元素对象,Vehicle运载对象,Labor员工对象等都赋予属性处理的功能。对这些对象,系统配置了两种类型的属性:

  • 固有属性

即系统已经事先定义好的,在模型构建时,用户可以直接拿来使用的属性,称之为“固有属性”。事实上,这些属性也是大多数活动的实体对象共有的属性信息。当前系统提供的固有属性有:

  1. Length:实体对象的长度
  1. Width:实体对象的宽度
  1. Height:实体对象的高度
  1. Weight:实体对象的重量
  1. Volume:实体对象的体积
  1. Density:实体对象的密度
  1. Quality:实体对象的品质
  1. Speed:实体对象的速度
  • 非固有属性

当用户开始一个仿真项目,需要对所模拟的生产对象建立除了上述固有属性之外更多其它的属性时,这时就需要使用系统提供的Attribute属性元素,创建新的属性对象来描述它们。比如对机加零件的建模,为进一步区分不同的零件,我们可能会对零件对象赋于物料号、材质、颜色、是否是合格品等属性。模型中,这些使用Attribute元素创建的属性,称之为“非固有属性”。

在系统中,属性元素是一种特殊类型的变量,按照其描述对象的信息性质不同,可分为三种类型的属性元素:整形属性元素、实型属性元素、字符型属性元素。定义属性元素时,需要指明该属性的类型,如下图所示:。

16.2 属性变量的使用

在BHTC simulation的模型系统中,任何活动的实体对象如Part元素实例、Vehicle运载工具元素实例、Labor员工元素实例等,被产生出来后,随着仿真时钟的推进,这些实例对象在模型流程的控制下,分布于模型系统的各个设备元素中,比如Part元素对象可能滞留在Buffer库存元素中,也可能待在Machine元素上进行加工处理,或者待在Conveyor元素上被运送到下一个目的地等等。因此,如果要在模型中使用属性变量,就要在这些模型元素的流程逻辑代码、行为逻辑代码中使用它们。

一般地,我们是在建模元素的行为逻辑代码(建模元素的各种Action代码)中,对它进行赋值或者访问引用它的值进行仿真计算,从而实时推演模型状态、各项KPI指标的变化;而在流程逻辑代码(建模元素的各种输入Pull from/输出Push to代码)中引用这些属性的值,控制模型流程的走向,从而形成复杂灵活的模型控制逻辑。

与模型变量(Variable元素)的使用不同,在这些代码中不能直接使用“=”号,而只能使用系统函数对属性变量进行赋值和引用。

  • 对属性变量赋值

使用系统属性赋值函数set_Attr(attName, Value)。其中形参变量attName是对当前活动实体对象要进行赋值的属性变量名,既可以是系统的“固有属性”名,也可是用户自定义的“非固有属性名”;Value为赋值标本量或者属性值。

  • 访问属性变量的值

使用系统属性访问函数get_Attr(attName, Value)。其中形参变量attName是要进行访问的属性变量名,既可以是系统的“固有属性”名,也可是用户自定义的“非固有属性名”;Value为访问取得的当前活动实体对象的属性名为attName的属性值。

16.3 当前焦点实体

在BHTC simulation的模型系统中,任何活动的实体对象产生、进入一个加工设备元素或者离开一个设备元素都是逐个进行的,并且在这些产生和进入、离开等时刻,会触发各个设备元素下“Action on Input”、“Action on output”、“Action on Join”、Action on Leave”、“Action On Create”按钮下的行为代码的执行。并且,在仿真进行的任一时刻,只会有一个这样的活动实体出现,因此我们把当前时刻出现的那一个活动实体称之为“当前焦点实体”。在这些按钮下的代码编写中,可直接引用系统的属性函数即模型结构树上“System”节点下属性函数:set_attr(attName) 和get_attr(attName)函数,来对“当前焦点”实体对象的属性进行设置或引用,其中形参“attName”是属性名。

而如果要对设备元素中的其它活动实体对象进行属性的设置和引用,就需要调用这些元素自身的属性函数,以Machine元素为例,其对自身的实体对象的属性设置函数为:Set_attr(macName, index, attName),属性引用函数为:Get_attr(macName, index, attName)。这里形参“macName”是Machine元素名称,“index”是索引号即要对该Machine元素上第几个实体对象进行设置和引用,“attName”是该实体对象的属性名称。

尤其是在“Push to”流程逻辑代码的编写中引用属性,就需要使用设备自身的属性函数而非系统属性函数。假如我们对Machine设备元素完成加工的零件,根据他们的属性值的不同来决定“Push to”不同的目的地,此时就需要调用其自身的属性值引用函数:Get_attr(macName, index, attName),并将其中的 index = 1,因为Machine元素向外输出零件遵循先进先出原则,总是先处理第一个实体(零件)。系统在执行“Push to”流程逻辑代码时,只是在预判应该是哪一个实体离开,而离开的动作(Action on output)还未发生,因此没有产生“当前焦点”实体,不能使用系统属性设置与引用函数。

16.4 属性变量的初始化

如同现实世界的任何对象一旦诞生出来都需要具像化,即每一个对象的实例化都要有具体的属性值。比如人都有明确身高、体重、年龄、性别等属性值一样。类似地,在BHTC simulation系统中,对任何活动的实体对象如Part元素对象,Vehicle运载对象,Labor员工对象等,一旦被产生出来,也需要给他们的属性赋值,即属性变量的初始化。这一属性赋值过程,一般是调用系统的属性赋值函数,将代码写到这些实体对象元素的“Action on Create”按钮中实现。

16.5 应用示例

下面结合案例1中的零件加工过程为例,说明属性变量的定义与使用。通过给零件添加属性,并使用属性变量控制模型的流程逻辑,可进一步增加模型表达的复杂度。

首先给Part1零件添加一个表示零件材质的字符类型的属性变量“materials”,初始化时给它赋值为“Steel”;另外给Part1零件的固有属性,表示密度的“density”属性变量赋值为“7.85”,同时在初始化时对Part1零件表示长度的固有属性“length”随机地进行赋值,长度范围在(12.5,65)之间随机取值。在part1零件完成加工后,将长度值少于35的零件放到临时库存区Buffer2中去。操作过程如下:

  • 建模步骤
  1. 启动BHTC Simulation软件,打开案例1模型。首先鼠标右键点击模型结构树上的“Model”节点,系统弹出“模型编辑”下拉菜单,选择“设置父节点”按钮。即设置“Model”节点为将要创建的“mterials”属性变量节点的父节点。如下图所示:
  1. 点击“设计模版”区域中的“属性”图标,系统弹出模型元素创建对话框,依次输入属性元素名称、并选择下面“变量类型”后点击“确定”后,完成“materials”属性变量的创建。如下图所示:

类似的,点击“设计模版”区域中的“库存”图标定义临时库存区Buffer2节点。

  1. 双击模型结构树上(或者屏幕布局区域上)的Part1节点,系统弹出Part1节点属性对话框如下:
  1. 鼠标点击“Action on Create”按钮,系统打开“行为代码”编辑框,鼠标左键单击代码框获得输入焦点,将输入光标移动至合适位置,然后在模型结构树上的“System”节点下,找到属性赋值函数“set_Attr”,鼠标双击该函数节点,则属性赋值函数信息自动录入到代码编辑框中,如下图所示:

鼠标双击属性赋值函数的形参字符串“attName”,该字符串被置黑选中,此时单击鼠标右键,系统弹出所有的属性变量列表如下图所示:

接着从列表中选“materials”属性变量,此时代码框中的“attName”字符串,便被属性变量“materials”的全称所替代,然后使用退格键,清除掉旁边的value字符,输入带双引号字符串“Steel”(即字符串常量),这样模型在仿真运行时,通过对这行语句的调用,就会给生成的Part1零件实例的“materials”属性赋值“Steel”。类似地,调用赋值函数给零件的固有属性“density”赋值7.85,如下图所示:

  1. 在代码框中继续给Part1零件的长度固有属性“length”赋值:鼠标双击模型结构树上“System”节点下的“set_Attr”函数节点,系统自动在代码框中录入:Call MM_System_set_Attr(attName, Value),, 鼠标双击选中字符串“attName”,单击鼠标右键,在弹出的下拉列表中,选择属性变量“Length”,然后鼠标双击选中字符串“Value”,然后在模型结构树的“System–>Math”节点下,找到均匀分布函数uniform节点,双击该节点,此函数节点全称:System_Math_uniform(min_A, max_A)自动替代掉代码框中的“Value”字符串,使用退格键,清除掉函数名中的形参min_A, max_A,分别用长度的变化范围12.5、65替代掉即可如下图所示:

随后点击代码框中的“确认”按钮,完成Part1零件属性初始化的赋值工作。

  1. 接下来,我们要在加工设备的流程逻辑代码中,加入引用零件属性的代码,访问每个完成加工操作的零件的“Length”属性值,将长度少于35的零件推送“Push to”到临时库存区Buffer2中去,大于35的零件推送到模型外面去。操作如下:鼠标双击模型结构树上的”Machine1″设备节点,打开设备属性对话框,鼠标点击“Push to”流程逻辑按钮,系统打开流程逻辑代码编辑窗口,在里面输入下面的代码,即可实现上述功能:

【提示1】

上面这段代码第一行,为使用VBS变量声明语句声明的一个局部变量:prt_Length用于接收当前完成加工的Part1零件的长度属性值。代码的第二行,就是给这个长度局部变量进行赋值:参考前面步骤4的操作,找到模型结构树上“System->Machine”节点下的“get_Attr”函数节点,并双击该节点,在代码框中自动录入零件属性值访问函数:

MM_System_Machine_Get_attr(macName, index, attName),然后鼠标双击选中“macName”字符串后,从模型结构树上找到Machine1节点,并双击该节点,系统自动用Machine1节点的全称字符串替代掉刚才选中的“macName”字符串;接着使用退格键清除掉“Index”字符串,并在该位置上输入1,然后鼠标双击选中“attName”字符串,然后单击鼠标右键,从弹出的属性变量下拉列表中,选择“Length”,从而使得系统在仿真运行时调用系统函数:

MM_System_Machine_Get_attr(“MM_Model_Machine1”, 1, “Length”),获得Machine1设备里加工零件队列的第一个零件的长度值,并把它赋值给局部变量prt_Length。Machine元素上完成加工操作的零件向外输出时,也是从第一个零件开始的,后面的代码就是根据当前加工完成的零件的不同长度取值,把它们送往不同地方去的程序逻辑。

  1. 为了检查上述模型逻辑的执行效果,我们在零件加工完成进入临时库存区Buffer2时,让系统打印报告,当前进来的零件的长度值。参考上面的步骤6,双击模型结构树上的Buffer2节点,在“Action on Input”代码框中输入如下代码:

完成后,点击确认即可。最后运行仿真模型200个仿真时间单位,观察运行后零件完成加工后的分流与长度数值报告效果。