构建一个具有多个存储的自定义块
这个例子展示了如何创建具有多个存储的自定义块,并使用离散事件系统对象™方法管理存储行为。
假设您管理一个为客户订单生产产品的设施。为了准备重复订单,工厂在订单到达之前生产了一批产品。当新订单到达时,将检查库存的可用性。
如果在仓库中发现了物品,它就会离开仓库去完成订单。
如果在存储中没有找到该项目,则生产一个新项目,生成的项目将离开设备以完成订单。
方法创建的离散事件System对象可以操作多个存储matlab。DiscreteEventSystem
方法。要观察自定义块的行为,请参见CustomEntityStorageBlockWithTwoStoragesExample
.
创建离散事件系统对象
生成一个具有两个输入、一个输出和两个存储元素的自定义实体存储块。
定制块的预期行为是根据引用实体选择和输出实体。
输入端口
1
接受具有类型的实体项
存储1
.输入端口
2
接受具有类型的引用实体订单
存储2
.当一个参考
订单
到达存储2
,将其属性数据记录为参考值,并销毁实体。的
订单
到达调用存储处的迭代事件1
搜寻一个项
携带等于参考值的数据。如果匹配,则将匹配项转发到输出端口
1
迭代结束。如果没有找到匹配,则一个新的
项
在存储时生成1
具有匹配的属性值并转发到输出端口1
.
自定义块的行为
离散状态变量
InputKey
表示记录的参考值订单
,用于选择对应的项
.属性(DiscreteState) InputKey;结束
该块有两个具有FIFO行为的存储。存储
1
支持具有类型的实体项
和存储2
支持具有类型的实体订单
.该块有两个输入端口和一个输出端口。输入端口1
和输出端口1
连接到存储1
.输入端口2
连接到存储2
.有关声明端口和存储的更多信息,请参见用MATLAB离散事件系统块实现一个离散事件系统对象.函数num = getNumInputsImpl(~) num = 2;结束函数num = getNumOutputsImpl(~) num = 1;结束函数[entityTypes] = getEntityTypesImpl(obj) entityTypes = [obj. entitytype (obj)“项目”),...obj.entityType (“秩序”));结束函数[inputTypes, outputTypes] = getEntityPortsImpl(~) inputTypes = {“项目”“秩序”};outputTypes = {“秩序”};结束函数[storagesops, I, O] = getEntityStorageImpl(obj) storagesops = [obj. queuefifo (obj)]“项目”obj.capacity)...obj.queueFIFO (“秩序”obj.capacity)];I = [1 2];O = 1;结束
指定离散状态并重置状态
InputKey
.有关离散事件系统中状态的更多信息,请参见具有信号输入和信号输出的自定义实体生成器块.函数[sz, dt, cp] = getdiscrete testatespecificationimpl (obj, name) sz = 1;dt =“双”;cp = false;结束函数resetImpl (obj) obj。InputKey = 0;结束
当
订单
到达存储2,它的数据关键
是在离散状态变量中记录的Obj。InputKey
.此条目还在存储处调用迭代事件1
又一个要摧毁的事件订单
.函数[Order, events] = OrderEntry(obj, storage, Order, source)一个关键实体已经到达;记录Inputkey值。obj。InputKey = Order.data.Key;计划对存储1中的实体进行迭代。%销毁输入键实体。事件= [obj.eventIterate (1,'')...obj.eventDestroy ()];coder.extrinsic (“流”);流('订购键值:%f\n', Order.data.Key);结束
迭代的目的是找到具有匹配数据的项
InputKey
.函数(物品、事件continueIter) = ItemIterate (obj,...存储,项目,标签,cur)查找具有匹配键的实体。事件= obj.initEventArray;continueIter = true;如果(Item.data。Attribute1== obj.InputKey) events = obj.eventForward(“输出”1、0.0);如果找到匹配项,迭代结束并重置状态。continueIter = false;elseifcur.size = = cur.position如果没有找到匹配项,则调用实体生成事件。事件= obj.eventGenerate (1,“mygen”0.0,100);结束结束
生成具有类型的实体
entity1
和一个匹配的关键
价值。然后将生成的实体转发到输出端口1
.函数(物品、事件)= ItemGenerate (obj、存储项目,标记)指定实体在存储中生成时的事件操作。Item.data。Attribute1= obj.InputKey; events = obj.eventForward(“输出”1、0.0);结束
实现自定义块
保存
.m
文件CustomBlockTwoEntityStorages
.将System对象链接到SimEvents®模型使用一个MATLAB离散事件系统块。有关链接的更多信息,请参见使用MATLAB离散事件系统块创建自定义块.创建一个SimEvents模型,包括MATLAB离散事件系统块,两个实体发电机块,和一个实体终结者块。如模型所示连接块。
在实体发电机布洛克:
在实体的一代选项卡,设置在模拟开始时生成实体来
从
.在实体类型选项卡,设置实体类型名称作为
项
.在事件动作选项卡,生成的行动领域输入:
实体。Attribute1 = randi([1 3]);
默认情况下,实体的生成与生成间隔时间一致
1
和他们的Attribute1
取值为之间的随机整数1
而且3.
.在统计数据选项卡中,输出离开的实体数量,d统计并将其连接到一个作用域。
在实体Generator1布洛克:
在实体的一代选项卡,设置在模拟开始时生成实体来
从
,并设置期来5
.在实体类型选项卡,设置实体类型名称作为
订单
而且属性名称作为关键
.在事件动作选项卡,生成的行动领域输入:
实体。关键= randi([1 4]);
实体型
订单
是否与代间时间一起生成5
,关键
属性接受之间的整数值1
而且4
.两者之间不可能匹配
关键
而且Attribute1
当关键
值是4
因为Attribute1
可以取值1
,2
,或3.
.在实体终结者块,输出到达的实体数量,a统计并将其连接到一个作用域。
控件中的实体路径右键单击MATLAB离散事件系统块的实体终结者块,并选择日志选择信号.
将模拟时间增加到
50
并对模型进行仿真。观察到:50
实体型Entity1
输入块中的存储1。在“诊断查看器”中,观察传入信息
关键
携带的参考值10
进入存储2并随后被销毁的实体。模拟数据检查器显示离开的项目及其
Attribute1
值。值与关键
在诊断查看器中显示的值。也观察到
5
实体出发,Attribute1
价值4
.这些实体是在存储2中生成的,因为Attribute1
不能有值4
方法生成的实体实体发电机块。
另请参阅
matlab。DiscreteEventSystem
|条目
|matlab。系统
|getEntityStorageImpl
|getEntityPortsImpl
|生成
|迭代