Plant SimulationSimTalk基础教程(4) 匿名标识符,对象路径与引用 📅 2026/7/22 2:29:24 SimTalk 路径与引用一、匿名标识符概述匿名标识符Anonymous Identifiers是 SimTalk 中特殊的内置关键字它们使 Method 的编写更加灵活不依赖于具体的上下文和对象名称。通过匿名标识符可以在不硬编码对象路径的情况下引用当前执行上下文中的各种对象。SimTalk 提供以下匿名标识符标识符说明触发控制的 MU移动单元?调用 Method 的对象basis类库Class LibrarycurrentMethod 所在的 FramerootFrame 层级中的最顶层 Framerootfolder设置了 RootFolder 属性的类库文件夹self当前执行的 Method 自身二、各匿名标识符详解1. – 触发控制的 MU在入口控制Entrance Control或出口控制Exit Control中代表触发该控制的 MU移动单元。使用可以直接操作当前正在通过该控制点的物料对象。-- 将触发控制的 MU 移动到 ParallelStation 的第 3 个后继 .move(ParallelStation.succ(3))适用场景入口控制、出口控制、传感器控制等由 MU 触发的事件方法中。2. ? – 调用 Method 的对象在控制方法中?代表调用该方法的物料对象或控制。它指向触发当前 Method 执行的那个对象。-- 将调用方法的对象的 Cont 移动到 E2 ?.Cont.move(E2)注意?和的区别在于始终代表 MU而?代表调用方法的对象可能是一个 MU也可能是其他类型的对象。3. basis – 类库Class Librarybasis代表 SimTalk 的类库Class Library即模型对象的模板库。basis只能用于比较或/不能用于赋值或其他操作。if location basis -- 当前对象在类库中尚未插入到模型中 else -- 当前对象已经插入到某个 Frame 中 end4. current – Method 所在的 Framecurrent返回包含当前 Method 对象的 Frame。这在需要从 Method 内部访问其所在 Frame 的属性或对象时非常有用。-- 打印当前 Frame 的暂停状态 print Current pause , current.pause -- 将当前 Frame 的暂停状态复制到 MyStation MyStation.pause : current.pause -- 获取根 Frame 中的 ShiftCalendar 的当前班次 var shift : root.ShiftCalendar.GetCurrShift -- 使用 current 扩展路径 current.extendPath(Station)提示current在继承的 Method 中特别有用因为current始终指向实际包含 Method 的 Frame而不是类库。5. root – Frame 层级中的最顶层 Frameroot返回当前 Frame 层级中的最顶层 Frame。在嵌套的 Frame 结构中root提供了一种快速访问顶层模型对象的方式。-- 访问根 Frame 中的 Frame2 的 Method1 root.Frame2.Method1 -- 在指定时间8.5 秒后执行根 Frame 中的 Method1 Method1.executeIn(8.5) -- 调用根 Frame 中的 Variable 对象的 execute 方法 Variable.execute注意Frame 也可以通过设置 RootFolder 属性来成为根文件夹此时层级关系会相应变化。6. rootfolder – 设置了 RootFolder 属性的类库文件夹rootfolder指向类库中设置了RootFolder属性的文件夹。当使用rootfolder时可以快速定位到模型的根类库文件夹。-- 将 UserObjects 文件夹设置为根文件夹 .UserObjects.rootfolder : true说明RootFolder 属性使得该文件夹成为模型对象的根在保存模型或生成引用时会以此为起点。7. self – 当前执行的 Methodself返回当前执行的 Method 自身的路径。它是对自身的引用可以用于递归调用、延迟执行等场景。self– 返回 Method 自身的完整路径self.Name– 返回 Method 的名称self.~– 在自定义属性中访问所属对象~代表父对象-- 在 60 秒后再次执行当前 Method self.executeIn(60) -- 在自定义属性中暂停所属对象 self.~.pause : true使用场景递归调用、定时重新执行、获取自身名称等。三、对象路径1. 路径语法SimTalk 中的对象路径是由名称和句点组成的序列用于定位模型中的对象。语法格式[.name[.name.name[...]]]路径中的各部分含义语法元素说明Path指代对象路径(Parameter:string)表示 string 类型的参数[, Parameter:boolean]表示可选参数方括号表示该参数是可选的-表示返回值类型2. 绝对路径绝对路径以**句点.**开头代表从 Class Library类库根目录开始的完整路径。.Models.MyPlant.EngineAssembly MyTown.MyStation适用场景控制方法中的不变路径路径不会因对象位置变化而改变Source 对象中的 MU 引用需要引用类库中特定对象的场景插入方式在 SimTalk 编辑器中按住ShiftCtrl拖放对象到代码中即可插入绝对路径。3. 相对路径相对路径从当前命名空间开始不需要以句点开头。不同对象类型中相对路径的起始点不同对象类型相对路径起始点物流对象中的 object 属性包含该物流对象的 FrameMU 中的 object 属性包含该 MU 的父 FrameFrame 中的属性Frame 自身Method 源代码包含该 Method 的 FrameDataTable包含 DataTable 的 Frame 或父对象WorkerPoolWorker 所在的 Frame可以使用Location或~波浪号作为当前对象的缩写-- 使用 ~ 引用当前 Frame 中的 Station ~.Station -- 等价于 Location.Station插入方式在 SimTalk 编辑器中直接拖放对象到代码中默认插入相对路径。4. 对象引用对象引用以**星号***开头是一种特殊的引用方式。*.Models.Model.Station特点重命名安全即使目标对象被重命名对象引用仍然指向正确的对象基于内部 ID。删除不可恢复如果目标对象被删除对象引用将无法解析会导致运行时错误。访问速度更快相比文本路径对象引用的访问速度更快。路径 vs 引用对比特性路径Path对象引用Reference语法.Models.Frame.Station*.Models.Frame.Station重命名影响失效需手动更新不受影响删除影响运行时错误运行时错误访问速度较慢较快四、命名空间SimTalk 通过命名空间Namespace来组织和管理模型中的对象。规则唯一性同一个 Frame 中所有对象的名称必须唯一。跨命名空间不同的命名空间不同的 Frame 或 Class Library 文件夹可以使用相同的名称。路径区分Plant Simulation 通过完整的对象路径来区分同名对象。-- 即使两个 Frame 都有名为 Station1 的对象通过路径可以区分 .Frame1.Station1 .Frame2.Station1说明命名空间机制使得在大型模型中可以使用相同的对象名称而不会产生冲突只要它们位于不同的 Frame 中。五、forget 关键字forget关键字用于释放变量所占用的内存或重置变量的类型状态。适用类型forget可应用于以下类型的局部变量tablelistqueuestackany用途释放集合类型的内存对于table、list、queue、stack调用forget后释放其占用的内存之后可以重新调用create创建新的实例。重置 any 变量的类型对于any类型的变量调用forget后将重置其数据类型使其可以接受不同类型的赋值。代码示例-- 释放表格内存后重新创建 var t: table t.create t.forget t.create -- 重置 any 变量的类型 var a: any a : Test forget a a : 123 -- now a is of type integer注意forget只能用于局部变量。对于全局变量Variable 对象应使用其自身的forget方法。