AnyMath 文档

在有限自动机中处理数据

有限状态机 AnyMath 是一个控制逻辑、转换和状态的独立实体,但它本身与熟悉的实体隔离开来 区块图书馆 AnyMath block library icon 而且,作为一个结果,建立经典模型的可能性。

为了使状态机与外部块交换数据,使用块数据。 Chart 及其对应的端口。 例如:

在块中创建输出数据时 *Chart 自动出现一个输出端口,它可以连接到模型的其他元素。 同样,在创建输入数据时,出现用于从外部接收信息的输入端口。 *本地数据只存在于状态机内部(块内部 *Chart)并且不创建端口。

因此,数据充当有限自动机和模型其余部分之间的连接接口:没有它们,自动机模型仍然是一个独立的实体,但有了它们,它就成为系统的完整部分。

使用有限状态机数据 AnyMath 窗口正在使用中 « 信号 » -它允许您集中管理有限状态机模型的所有数据。 在它的帮助下,它们结合在一起:

state machines variables cn

*所有状态机数据列表; *数据类别(输入,输出,参数); *数据类型、维度和复杂性的设置。

所有状态机数据的单窗口方法简化了调试并使模型更加透明:所有定义都集中在一个地方,而不是分散在各地 国家 stateflow state过渡 stateflow default transition.

数据类别

在窗口 « 信号 » 支持以下数据类别:

state machines variables 1 cn

  • 输入 --从外部模型进入状态机的数据。

  • 输出 --状态机导出到外部的数据。

  • 本地 --仅在状态机内部(块内部)可用的数据 Chart). 它们用于存储中间计算并控制状态和转换的逻辑。

  • 本地事件 --这是一个信号(触发器),在状态机内部(块内部)专门处理 Chart). 与数据不同,事件不存储值,而只传达条件已发生的事实。

  • 参数数据 -在模拟启动时从同名工作区变量复制的固定值(参数数据),并且在模拟期间不会更改。

块中的数据 Chart 不显示在 可变窗口 variables article 2 1. 与此窗口的唯一连接是通过工作区变量,可以通过内部的*参数*引用 Chart :

例如,如果在 Chart a*参数*设置名称 [医]脚,而是一个变量 [医]脚 如果它不存在于工作区中(以及变量窗口中),则在编译/模拟模型时会发生错误。

如果给变量赋值 [医]脚 在工作区中(例如通过 命令提示符 img 41 1 2),则:

变量 [医]脚 它将出现在变量窗口中; *变量的值将在所有块的模拟期间可用。 *Chart ,在窗口中的位置 « 信号 » *参数*是指 [医]脚.

创建数据

创建新数据:

  1. 打开窗户 « 信号 »;

  2. 点击按钮 state machines variables icon;

  3. 在打开的窗口中输入数据的名称和特征,然后单击 « 添加 »:

    state machines variables panel cn

    窗口中数据的名称 « 信号 » 它们必须与有限状态机模型中这些数据的名称相匹配。

符号助手

运行模拟时 start button 或汇编 compile button 1 AnyMath 验证有限状态机模型的正确性。 如果其中有未定义的数据,则打开 « 符号向导 ». 在里面,你可以:

*查看找到的未定义名称; *为它们分配类别(例如, «出口;出口»); *确认添加到*信号*列表中。

state symbol wizard cn

设置数据类型

所有数据都必须按类型指定,这决定了在仿真过程中如何存储和使用数据。 支持与Julia语言类型系统一致的类型。:

  • 继承:自动 --数据类型继承;

  • Int8, Int16, Int32, Int64, Int128 --有符号整数;

  • UInt8, UInt16, UInt32, UInt64, UInt128 --无符号整数;

  • 漂浮物16, 漂浮物32, 漂浮64 --浮点数;

  • 布尔 --逻辑类型;

  • 定点 --固定点(以优化计算)。

假设在面板 « 信号 » 在街区 Chart 您已创建输出数据 , , , . 然后在状态里面你可以这样写:

# Код, выполняемый при активном состоянии (entry / during / exit)
s = [1, 2, 3, 4, 5]         # 向量 длины 5
a = [1, 2, 3, 4, 5, 6, 7]   # 向量 длины 7

# Назначаем части массивов в выходные порты
q = s[1:4]   # q == [1, 2, 3, 4]
w = a[1:4]   # w == [1, 2, 3, 4]

# Двумерный выход (2×3)
M = reshape(collect(1:6), 2, 3)   # 矩阵 2×3
# При желании можно привести тип:
# M = Float32.(reshape(collect(1:6), 2, 3))

如果要在没有初始化的情况下创建给定类型/大小的矩阵,则使用显式数组创建。:

B = Array{Float64,2}(undef, 3, 3)  # 3×3 矩阵 с неинициализированными значениями (произвольное содержимое памяти)
# Перед использованием обязательно присвойте значения, например:
B .= 0.0
# Или создайте сразу инициализированный массив:
# B = zeros(Float64, 3, 3)
# B = fill(1.0, 3, 3)
unef 不使用零填充数组。 内容取决于以前使用的内存,因此必须在读取其元素之前初始化这样的数组。

结果是有限状态机的以下模型:

在街区内 *Chart :

+ state machines variables example ru

模型 *AnyMath (街区外 Chart):

+ state machines variables example 2

维度和复杂性

除了数据类型之外,您还可以设置维度(标量、矢量或数组)和复杂性。

*尺寸-在窗口中指示 « 信号 » 作为用逗号分隔的整数序列:

  • −1 (默认值)-尺寸不是固定的,是自动确定的: 对于输入/输出,取自外部模型的连接端口; *对于参数,它取自同名的工作区变量(工作区,外部 *Chart); ***对于本地数据,它取自图表代码中实际分配的值。

    如果形状可以改变,这种模式很方便。

**显式表单-输入以逗号分隔的数字:

+ * n -来自 n 元素; * n,m -矩阵 n×m; * n,m,k -三维阵列 n×m×k.

+ 序列 n[,m[,k…​]] 在*Dimension*字段中,它对应于Julia数组构造函数的数值参数。 例如, n,mMatrix{Float32}(undef,n,m) (= Array{Float32,2}(undef,n,m)).

  • 复杂度 --确定数据是否可以包含复杂值:

    Inherit:auto--值从外部模型中的关联变量或信号自动继承。 例如,如果在工作区或输入块中使用复杂类型,那么状态机中的数据将是复杂的。 Off--继承被禁用,数据始终是真实的。 **On--禁用继承,数据总是复杂的。

使用建议

使用 « *输入 » 和 « 输出 » 将有限状态机连接到外部模型。 显式指定数据类型-这增加了状态机的可预测性,并有助于避免错误。 *申请 « *参数数据 » 为常数和系数,使模型更具可读性。 处理复数时,启用标志 « *复杂度 ».

有用的连结