Flexism 任务序列

概念

任务序列是Flexism仿真软件的核心机制。各种复杂仿真的实现很大程度取决于怎样实现任务序列。任务序列是由任务执行器执行的一组命令序列。这里的任务执行如操作员、叉车等。

代码学习

dispather:获取当前中间端口的任务执行器。

TaskSequence类

create(操作员,优先级,是否抢占)方法:

为任务序列的类,调用里边的create(任务执行器,优先级,是否抢占),这样就创建了一个空的任务序列,任务的执行者是任务执行器(这里看作操作员)。

addtask()方法:

任务分类标签

TASKTYPE_TRAVEL

操作员移动到的目的地

ts.addtask(TASKTYPE_TRAVEL,移动到的目的地,NULL);
TASKTYPE_LOAD

操作员进行装载任务

taskSequence.addTask(TASKTYPE_LOAD, item, current(装载地点), port(输出端口));

port参数可以不要

TASKTYPE_DELAY

延迟任务:操作员进入给定状态,然后简单地等待指定的时间。

taskSequence.addTask(TASKTYPE_DELAY,NULL,NULL,延迟时间,STATE_BUSY);

第一、二个参数使用不到,设为NULL

TASKTYPE_UTILIZE

此任务操作员进入被应用状态,然后等待使用freeoperators()命令将其从该状态释放。当您希望操作员在工作站“做某事”时,经常使用此任务,但在创建任务序列时,您不知道完成操作员正在做的任何事情需要多长时间。在这种情况下,使用此任务类型使运算符进入您指定的状态,然后在完成后使用freeoperators()命令释放他。这可以通过OnProcessFinish或OnSetupFinish等触发器完成。如果你从一开始就知道操作员需要“做某事”多长时间,那么你就可以使用延迟任务。

taskSequence.addTask(TASKTYPE_UTILIZE,item,current.outObjects[1],STATE_UTILIZE);

参数1:加工的临时实体item;

参数2:应用操作员的工序;

参数3:如果设为0,则表示将进入加载状态。

最后这个得在处理器中释放操作人员:如果加过结束触发中释放:则不管后续得暂存区满不满都过去;而在使用运输工具中释放,则当下方暂存区可用时才进行释放。

TASKTYPE_UNLOAD

操作员进行卸载任务

taskSequence.addTask(TASKTYPE_UNLOAD,item, destination, opipno(current,port));

参数1:卸载的临时实体对象;

参数2:卸载的目的地;

参数3:这是对象进入工作站的输入端口。通常,0是可以的,除非您要卸载到组合器或分离器。组合器需要知道项目通过哪个输入端口才能更新其输入表。分离器只需要一个大于0的值。

opipno(current,port):返回的是当前第一个输出端口连接到的输入端口的编号。

TASKTYPE_FRLOAD/TASKTYPE_FRUNLOAD

与上述类似,只不过这个是对于固定资源类的装载与卸载。

Object current = ownerobject(c);
Object item = param(1);
int port = param(2);
Object destination = param(3);
double priority = param(4);
int preempt = param(5);

Dispatcher dispatcher = current.centerObjects[1]; // the dispatcher or task executer
treenode downQueue = current.outObjects[1].outObjects[1];
TaskSequence taskSequence = TaskSequence.create(dispatcher, priority, preempt);

taskSequence.addTask(TASKTYPE_TRAVEL, current, NULL);
taskSequence.addTask(TASKTYPE_LOAD, item, current, port);

taskSequence.addTask(TASKTYPE_TRAVEL,centerobject(current,2),NULL);
taskSequence.addTask(TASKTYPE_DELAY,NULL,NULL,10,STATE_BUSY);
taskSequence.addTask(TASKTYPE_TRAVEL, destination, NULL);
taskSequence.addTask(TASKTYPE_UNLOAD,item, destination, opipno(current,port));
taskSequence.addTask(TASKTYPE_UTILIZE,item,current.outObjects[1],STATE_UTILIZE);
taskSequence.addTask(TASKTYPE_FRLOAD,item,current.outObjects[1]);
taskSequence.addTask(TASKTYPE_TRAVEL,downQueue,NULL);
taskSequence.addTask(TASKTYPE_FRUNLOAD,item,downQueue,1);

taskSequence.dispatch();
// return a 0 so this object will know that you made your own task sequence and it doesn't need 
//to make the standard task sequence automatically
return 0;  

实例

重置并运行模型。操作员应该会行走到暂存区,装载临时实体,行走到BasicFR,延迟10秒钟之冠行走到处理器,卸载临时实体,在处理器停留一段时间(加工时间),装载临时史行走到下一个暂存区,卸载临时实体。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值