主要内容

构建一个具有多个存储的自定义块

这个例子展示了如何创建具有多个存储的自定义块,以及如何使用离散事件System object™方法管理存储行为。

假设您管理一个为客户订单生产产品的设施。为了为重复订单做准备,工厂在订单到达之前就生产了一批产品。当新订单到达时,会检查库存的可用性。

  • 如果物品在仓库中被发现,它就会离开工厂去完成订单。

  • 如果存储中没有找到该项目,则生成一个新项目,生成的项目将离开设备以完成订单。

方法创建的离散事件System对象可操作多个存储以生成此自定义行为matlab。DiscreteEventSystem方法。若要观察自定义块的行为,请参见CustomEntityStorageBlockWithTwoStoragesExample

创建离散事件系统对象

生成具有两个输入、一个输出和两个存储元素的自定义实体存储块。

自定义块的理想行为是基于引用实体选择和输出实体。

  1. 输入端口1接受类型为存储1

  2. 输入端口2接受带有类型的引用实体订单存储2

  3. 当引用订单到达仓库2时,将其属性数据记录为参考值,并销毁该实体。

  4. 订单到达调用存储中的迭代事件1寻找一个携带与参考值相等的数据。

  5. 如果匹配,则将匹配项转发到输出端口1迭代结束。

  6. 如果没有找到匹配项,则创建一个新的在存储中生成1带有匹配的属性值并转发到输出端口1

参见生成多个存储的自定义存储块的代码

自定义块行为

  1. 离散状态变量InputKey的记录参考值订单,用于选择对应的

    InputKey;结束
  2. 该块有两个具有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 = {“秩序”};结束函数[storageSpecs, I, O] = getEntityStorageImpl(obj) storageSpecs = [obj. queuefifo (“项目”obj.capacity)...obj.queueFIFO (“秩序”obj.capacity)];I = [1 2];O = 1;结束
  3. 指定离散状态并重置状态InputKey.有关离散事件系统中状态的更多信息,请参见自定义实体发生器块与信号输入和信号输出

    函数[sz, dt, cp] = getDiscreteStateSpecificationImpl(obj, name) sz = 1;dt =“双”;Cp = false;结束函数resetImpl (obj) obj。InputKey = 0;结束
  4. 订单到达存储2,它的数据关键记录在离散状态变量中Obj。InputKey.此条目还调用存储中的迭代事件1又一个要破坏的事件订单

    函数[Order, events] = OrderEntry(obj, storage, Order, source)一个关键实体已经到达;记录Inputkey值。obj。InputKey = Order.data.Key;计划对存储1中的实体进行迭代。销毁输入键实体。events = [obj.eventIterate(1,''...obj.eventDestroy ()];coder.extrinsic (“流”);流(命令键值:%f\n, Order.data.Key);结束
  5. 迭代的目的是找到具有匹配数据的项InputKey

    函数[Item,events,continueIter] = ItemIterate(obj,...存储,物品,标签,cur)查找具有匹配键的实体。events = obj.initEventArray;continueIter = true;如果(Item.data。Attribute1== obj.InputKey) events = obj.eventForward(“输出”, 1, 0.0);%如果找到匹配,则迭代结束并重置状态。continueIter = false;elseifcurt .size == curt .position如果没有找到匹配项,则调用一个实体生成事件。事件= obj.eventGenerate(1,“mygen”0.0,100);结束结束

  6. 生成具有类型的实体entity1和一个匹配的关键价值。然后将生成的实体转发到输出端口1

    函数[Item,events] = ItemGenerate(obj,storage,Item,tag)在存储中生成实体时指定事件操作。Item.data。Attribute1= obj.InputKey; events = obj.eventForward(“输出”1、0.0);结束

实现自定义块

  1. 保存.m文件CustomBlockTwoEntityStorages.将System对象链接到一个SimEvents®使用MATLAB离散事件系统块。有关链接的更多信息,请参见使用MATLAB离散事件系统块创建自定义块

  2. 创建一个SimEvents模型MATLAB离散事件系统块,两个实体发电机块和一个实体终结者块。如模型中所示连接块。

  3. 实体发电机布洛克:

    1. 实体的一代选项卡,设置在模拟开始时生成实体

    2. 实体类型选项卡,设置实体类型名称作为

    3. 事件动作选项卡,在生成动作字段输入:

      实体。Attribute1 = randi([1 3]);

      默认情况下,生成实体时使用代际时间1和他们的Attribute1值之间的随机整数1而且3.

    4. 统计数据选项卡,输出离开的实体数量d统计并将其连接到范围。

  4. 实体Generator1布洛克:

    1. 实体的一代选项卡,设置在模拟开始时生成实体,并设置5

    2. 实体类型选项卡,设置实体类型名称作为订单而且属性名称作为关键

    3. 事件动作选项卡,在生成动作字段输入:

      实体。关键= randi([1 4]);

    具有类型的实体订单是用代际时间生成的5,以及关键属性接受之间的整数值1而且4

    两者之间不可能匹配关键而且Attribute1关键值是4因为Attribute1可以取值12,或3.

  5. 实体终结者块,输出到达实体数量,a统计并将其连接到范围。

  6. 中右键单击实体路径MATLAB离散事件系统块到实体终结者块和选择日志选择信号

  7. 增加模拟时间50并对模型进行仿真。观察到:

    1. 50具有类型的实体Entity1在块中输入存储1。

    2. 在诊断查看器中,观察传入的关键所携带的参考值10进入存储2并随后销毁的实体。

    3. 模拟数据检查器显示离开的项及其Attribute1值。值匹配关键在诊断查看器中显示的值。

      也观察到5Attribute1价值4.这些实体是在存储2中生成的,因为Attribute1不能有值4方法生成的实体实体发电机块。

另请参阅

||||||

相关的话题

Baidu
map