|
问题背景 在FlexSim建模场景中,常需要利用货架(Rack)或地面存储(Floor Storage)槽位上的标签(Labels,如SKU、Type等)来管理货物状态。然而,在当前使用代码进行调用的过程中,如果直接采用常规的点语法(如 return slot.slotSKU;)去获取槽位的标签值,FlexSim系统会直报错,无法正常读取或通过代码操作标签,导致后续基于标签逻辑的仿真控制失效。 本问题的核心需求为:寻找正确且高效的语法结构,准确查找或操作存储槽的标签名称及其数值,避免语法冲突。 解决办法 方法一:获取特定槽位的所有标签名称(树节点遍历法) 如果你需要查看某个槽位下到底有哪些标签,可以将其转化为底层树节点(treenode)进行遍历: Storage.Object rack = Model.find("Rack_A"); // 获取 Rack_A 的 第3个Bay, 第2层, 第1个Slot Storage.Slot testSlot = rack.getSlot(3,2,1); // 核心:转化为treenode,找到"slotLabels"节点,获取所有子节点 Array allSlotLabels = testSlot.as(treenode).find("slotLabels").subnodes.toArray(); print(allSlotLabels); 方法二:批量提取所有槽位标签并生成表格(SQL查询法) 如果你的模型中有大量货架,想将所有槽位的标签值“扁平化”汇总到一个表格中分析,可以使用 `Storage.system.querySlots` 结合 `Table.query`: // 获取模型中所有槽位 Array allSlots = Storage.system.querySlots("", 0); // 利用SQL跨表查询,把每个槽位的标签拉取出来生成到一个Table中 Table.query("SELECT $3 AS SLOTLABEL FROM $1x$2", allSlots.length, allSlots[$iter(1)].as(treenode).find("slotLabels"), $iter(2) ).cloneTo(Table("Dump1")); // 存入名为Dump1的全局表中 Array allNodes = Table("Dump1").clone(); print(allNodes); 方法三:根据标签值反向查找槽位 在业务场景中,我们往往需要“找到SKU为某值的槽位”。在 `querySlots` 的 SQL 查询字符串中,可以直接使用点语法访问标签: // 查找属于 'Rack_B',并且 SKU 标签值为 1 的所有槽位 Array allSlots = Storage.system.querySlots("WHERE slot.storageObject.name = 'Rack_B' AND slot.SKU = 1", 0); print(allSlots);
|