锁车规则组件
功能说明
该组件建立wbs/pbs锁车规则,出口规则并应用到指定场景或者流量控制,实现对于生产订单属性的输出控制。
锁车组件主页面如下:
输入桩
输入端口1
- 端口名称: 通信输入
- 输出类型: 对象
- 功能描述: 请求离散事件仿真请求的回复结果输入
输入端口2
- 端口名称: 规则导入
- 输出类型: 对象
- 功能描述: 导入还未在该组件上存储的锁车规则
- 其他: 暂不推荐使用该接口。该接口需传入锁车组件可读的格式,否则存储失效。
输出桩
输出端口1
- 端口名称: 通信输出
- 输出类型: 对象
- 功能描述: 对于离散事件仿真组件的请求发送
连接样式
该组件与离散事件仿真连接如下:
使用方法
一开始使用锁车组件时需要进行一下参数配置,后续使用锁车组件可以不再进行下面步骤的设置,除非离散事件仿真画布修改,或者离散事件仿真的表单接入组件传入的表表名或者列名进行了修改(表格数据修改无影响),才需再次进行数据同步和属性设置。
数据同步
点击“同步DES信息”,即可获取离散事件仿真的画布内组件信息和已经储存的表单接入的表格信息(还未进行表单接入的保存操作先去进行表单数据的保存)。
如成功,则提示信息:
属性设置:
属性设置分成四个栏目,设置,wbs设置,pbs设置和高级设置。
- 设置:选择离散事件仿真接入的表单,选择对应的属性名称。后来新建规则中所能选的属性名称来自该保存的属性名称。
- wbs设置:选择wbs的开始和结束的流量控制,选择wbs的存储和下线区名称,设置存储的最大容量。
- pbs设置:选择pbs的开始和结束的流量控制,选择pbs的下线区名称,设置下线区中的最大锁车数。
- 高级设置:当多个车道满足所有出车条件时的规则设置。
当上述步骤操作完成后,则可进行锁车/出口规则的建立。
新建规则
缺料锁车
选择缺料锁车后,
- 剩余数量代表从开始仿真的时间点开始计算,走过剩余数量满足条件的物料时,后续的满足条件的物料会被锁住,直到结束时间解锁。
- 锁车开始事件代表从开始时间起开始锁住物料,直到结束时间解锁。
特殊规则:属性值为生产工单号时不会有上述选项,从开始仿真时只要满足所选的属性值就被锁,直到结束时间解锁。
场景选择:选择该锁车规则作用于wbs还是pbs上。
出口规则
其余规则按照要求输入参数,最后选择应用的组件名称。
保存规则
最后点击保存规则将所建立的锁车规则保存至离散事件仿真组件中。
离散事件仿真画布改动
关于wbs/pbs锁车规则,离散事件仿真画布上也需要配合改动。
wbs区域
wbs区域示例如下,图中C_WBS_IN为开始的流量控制,C_WBS_OUT为结束的流量控制。
在wbs区域内,wbs的开始流量控制入口规则选择自定义,内容可以改为:
lastDest = None
if vars.globalSchedule:
lastDest = vars.globalSchedule.queryWbsStartFlowInName() #此为上面保存规则后调用的方法
else:
# 这边为如果没有上面的规则保存允许通过的上游节点,可以自行定义
if currentNode.node.pendingToPullQueue.items:
lastDest = currentNode.node.pendingToPullQueue.items[0]
开始流量控制的出口规则选择自定义,内容可以改为:
nextDest = None
if vars.globalSchedule:
nextDest = vars.globalSchedule.queryWbsStartFlowOutName(nextDestCal) #此为上面保存规则后调用的方法
else:
nextDest = nextDestCal()
# nextDestCal为在自定义中用户定义的函数,若是没有上述规则或者规则还未生效时物料的出口规则
结束的流量控制的入口规则选择自定义,内容可以改为:
lastDest = None
if vars.globalSchedule:
lastDest = vars.globalSchedule.queryWbsEndFlowInName(lastDestCal) #此为上面保存规则后调用的方法
else:
lastDest = lastDestCal()
# lastDestCal为在自定义中用户定义的函数,若是没有上述规则或者规则还未生效时物料的入口规则
结束的流量控制的出口规则选择自定义,内容可以改为:
nextDest = None
if vars.globalSchedule:
nextDest = vars.globalSchedule.queryWbsEndFlowOutName(nextDestCal) #此为上面保存规则后调用的方法
else:
nextDest = nextDestCal()
# nextDestCal在自定义中用户定义的函数,若是没有上述规则或者规则还未生效时物料的出口规则
wbs存储/下线区的自定义的afterInit中可以改为如下所示,目的是存储中有物料时发送给开始流量控制请求:
def putMu(node, vars):
def _putToFlowControl():
while True:
yield node.processingQueue.peek()
yield from vars.components[开始的流量控制名称].putPendingToPullQueue(node.name)
yield from node.unblockPending()
vars.components[开始的流量控制名称].lastNodes.append(node)
vars.components[开始的流量控制名称].nextNodes.append(node)
vars.components[结束的流量控制名称].nextNodes.append(node)
node.env.process(_putToFlowControl())
pbs区域
pbs区域示例如下,图中C_PBS_IN为开始的流量控制,C_PBS_OUT为结束的流量控制:
在pbs区域内,开始的流量控制入口规则改为自定义,内容可以改为:
lastDest = None # 流量控制入口指向节点名称
if vars.globalSchedule:
lastDest = vars.globalSchedule.queryPbsStartFLowInName() #此为上面保存规则后调用的方法
else:
# 这边为如果没有上面的规则保存允许通过的上游节点,可以自行定义下面俩行
if currentNode.node.pendingToPullQueue.items:
lastDest = currentNode.node.pendingToPullQueue.items[0]
开始的流量控制出口规则改为自定义,内容可以改为:
nextDest = None # 流量控制出口指向节点名称
if vars.globalSchedule:
#此为上面保存规则后调用的方法, currentOrder为可选传参,可以不传递该参数
nextDest = vars.globalSchedule.queryPbsStartFlowOutName(nextDestCal, currentOrder=currentOrder)
else:
nextDest = nextDestCal()
# nextDestCal在自定义中用户定义的函数,若是没有上述规则或者规则还未生效时物料的出口规则
开始的流量控制自定义的userdefine中需要定义两个全局变量,变量名称不可变:
# 全局变量,记录PBS各车道中所包含的全部工位。
# nextLanesName为各车道的信息,returnLanesName为回车道的信息
nextLanesName = [['LN1_BA', 'LN1_B9', 'LN1_B8', 'LN1_B7', 'LN1_B6', 'LN1_B5', 'LN1_B4', 'LN1_B3', 'LN1_B2', 'LN1_B1'],
['LN2_BA', 'LN2_B9', 'LN2_B8', 'LN2_B7', 'LN2_B6', 'LN2_B5', 'LN2_B4', 'LN2_B3', 'LN2_B2', 'LN2_B1'],
['LN3_BA', 'LN3_B9', 'LN3_B8', 'LN3_B7', 'LN3_B6', 'LN3_B5', 'LN3_B4', 'LN3_B3', 'LN3_B2', 'LN3_B1'],
['LN4_BA', 'LN4_B9', 'LN4_B8', 'LN4_B7', 'LN4_B6', 'LN4_B5', 'LN4_B4', 'LN4_B3', 'LN4_B2', 'LN4_B1'],
['LN6_BA', 'LN6_B9', 'LN6_B8', 'LN6_B7', 'LN6_B6', 'LN6_B5', 'LN6_B4', 'LN6_B3', 'LN6_B2', 'LN6_B1'],
['LN7_BA', 'LN7_B9', 'LN7_B8', 'LN7_B7', 'LN7_B6', 'LN7_B5', 'LN7_B4', 'LN7_B3', 'LN7_B2', 'LN7_B1']]
returnLanesName=['LN5_BA', 'LN5_B9', 'LN5_B8', 'LN5_B7','LN5_B6','LN5_B5','LN5_B4','LN5_B3','LN5_B2','LN5_B1']
结束的流量控制的入口规则选择自定义,内容可以改为:
lastDest = None
if vars.globalSchedule:
# 此为上面保存规则后调用的方法
lastDest = vars.globalSchedule.queryPbsEndFlowInName()
else:
# 这边为如果没有上面的规则保存允许通过的上游节点,可以自行定义
if currentNode.node.pendingToPullQueue.items:
lastDest = currentNode.node.pendingToPullQueue.items[0]
结束的流量控制的出口规则选择自定义,内容可以改为:
nextDest = None
if vars.globalSchedule:
# 此为上面保存规则后调用的方法
nextDest = vars.globalSchedule.queryPbsEndFlowOutName(nextDestCal)
else:
nextDest = nextDestCal()
# nextDestCal在自定义中用户定义的函数,若是没有上述规则或者规则还未生效时物料的出口规则
pbs下线区的自定义的afterInit中可以改为如下所示,目的是存储中有物料时发送给开始流量控制请求:
def putMu(node, vars):
def _putToFlowControl():
while True:
yield node.processingQueue.peek()
yield from vars.components[开始的流量控制].putPendingToPullQueue(node.name)
yield from node.unblockPending()
vars.components[开始的流量控制].lastNodes.append(node)
vars.components[开始的流量控制].nextNodes.append(node)
vars.components[结束的流量控制].nextNodes.append(node)
node.env.process(_putToFlowControl())