主要内容

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

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

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

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

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

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

创建离散事件系统对象

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

定制块的预期行为是根据引用实体选择和输出实体。

  1. 输入端口1接受具有类型的实体存储1

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

  3. 当一个参考订单到达存储2,将其属性数据记录为参考值,并销毁实体。

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

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

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

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

自定义块的行为

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

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

    函数[sz, dt, cp] = getdiscrete testatespecificationimpl (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中的实体进行迭代。%销毁输入键实体。事件= [obj.eventIterate (1,''...obj.eventDestroy ()];coder.extrinsic (“流”);流('订购键值:%f\n', Order.data.Key);结束
  5. 迭代的目的是找到具有匹配数据的项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);结束结束

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

    函数(物品、事件)= ItemGenerate (obj、存储项目,标记)指定实体在存储中生成时的事件操作。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值。值与关键在诊断查看器中显示的值。

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

另请参阅

||||||

相关的话题

Baidu
map