构建一个自定义与多个存储块
这个例子展示了如何创建一个自定义块使用离散事件系统与多个存储和管理存储行为对象™方法。
假设您管理工具,为客户订单生产项目。准备重复订单,工厂生产供应的物品在订单到达之前。当一个新订单到达时,股票是可用性检查。
如果发现物品的存储,它离开工厂完成订单。
如果没有找到项目的存储,一个新项目生产和生成的物品离开工厂完成订单。
生成这个自定义行为,通过离散事件系统操作多个存储对象,使用创建的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.entityType (“秩序”));结束函数[inputTypes, outputTypes] = getEntityPortsImpl (~) inputTypes = {“项目”“秩序”};outputTypes = {“秩序”};结束函数[storageSpecs, I, O] = getEntityStorageImpl (obj) storageSpecs = [obj.queueFIFO (“项目”obj.capacity)…obj.queueFIFO (“秩序”obj.capacity)];I = [1 - 2];O = 1;结束
指定离散状态和重置状态
InputKey
。在离散事件系统的更多信息,请参阅自定义实体发电机块信号输入和输出信号。函数(深圳,dt, cp) = getDiscreteStateSpecificationImpl (obj、名称)深圳= 1;dt =“双”;cp = false;结束函数resetImpl (obj) obj。InputKey = 0;结束
当
订单
到达存储其数据关键
记录在离散状态变量Obj.InputKey
。这个条目也迭代调用事件存储1
和另一个事件摧毁订单
。函数(顺序、事件)= OrderEntry (obj、存储、秩序、源)%的关键实体已经到来;记录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
。链接SimEvents的系统对象®模型使用一个MATLAB离散事件系统块。关于链接的更多信息,请参阅创建自定义模块使用MATLAB的离散事件系统。创建一个包括SimEvents模型MATLAB离散事件系统块,两个实体发电机块,和一个实体终结者块。连接块如图所示的模型。
在实体发电机布洛克:
在实体的一代选项卡,设置生成实体在仿真开始来
从
。在实体类型选项卡,设置实体类型名称作为
项
。在事件动作选项卡,生成的行动领域输入:
实体。Attribute1 =兰迪([1 3]);
默认情况下,生成的实体与相生
1
和他们的Attribute1
值之间的一个随机整数1
和3
。在统计数据选项卡中,输出数量的实体,d统计并连接到一个范围。
在实体Generator1布洛克:
在实体的一代选项卡,设置生成实体在仿真开始来
从
,并设置期来5
。在实体类型选项卡,设置实体类型名称作为
订单
和属性名称作为关键
。在事件动作选项卡,生成的行动领域输入:
实体。关键= randi([1 4]);
实体型
订单
生成与相生的时间吗5
,关键
属性之间的整数值1
和4
。之间没有可能的匹配
关键
和Attribute1
当关键
值是4
因为Attribute1
可以把价值1
,2
,或3
。在实体终结者块,输出数量的实体来了,统计并连接到一个范围。
右键单击该实体的路径MATLAB离散事件系统块的实体终结者块,并选择日志选择信号。
增加仿真时间
50
和模拟模型。观察到:50
实体型Entity1
输入存储1块。在诊断查看器,观察传入的
关键
引用值由10
实体进入存储2,之后被摧毁。仿真数据检查显示离开项目和它们
Attribute1
值。匹配的值关键
在诊断查看器显示值。也观察到
5
实体出发,Attribute1
价值4
。2,因为这些实体生成在存储Attribute1
不能有价值4
生成的实体实体发电机块。
另请参阅
matlab.DiscreteEventSystem
|条目
|matlab.System
|getEntityStorageImpl
|getEntityPortsImpl
|生成
|迭代