在有限自动机中处理数据
有限状态机 AnyMath 是一个控制逻辑、转换和状态的独立实体,但它本身与熟悉的实体隔离开来 区块图书馆 AnyMath
而且,作为一个结果,建立经典模型的可能性。
为了使状态机与外部块交换数据,使用块数据。 Chart 及其对应的端口。 例如:
在块中创建输出数据时 *Chart 自动出现一个输出端口,它可以连接到模型的其他元素。 同样,在创建输入数据时,出现用于从外部接收信息的输入端口。 *本地数据只存在于状态机内部(块内部 *Chart)并且不创建端口。
因此,数据充当有限自动机和模型其余部分之间的连接接口:没有它们,自动机模型仍然是一个独立的实体,但有了它们,它就成为系统的完整部分。
使用有限状态机数据 AnyMath 窗口正在使用中 « 信号 » -它允许您集中管理有限状态机模型的所有数据。 在它的帮助下,它们结合在一起:

*所有状态机数据列表; *数据类别(输入,输出,参数); *数据类型、维度和复杂性的设置。
数据类别
在窗口 « 信号 » 支持以下数据类别:

-
输入 --从外部模型进入状态机的数据。
-
输出 --状态机导出到外部的数据。
-
本地 --仅在状态机内部(块内部)可用的数据 Chart). 它们用于存储中间计算并控制状态和转换的逻辑。
-
本地事件 --这是一个信号(触发器),在状态机内部(块内部)专门处理 Chart). 与数据不同,事件不存储值,而只传达条件已发生的事实。
-
参数数据 -在模拟启动时从同名工作区变量复制的固定值(参数数据),并且在模拟期间不会更改。
创建数据
创建新数据:
-
打开窗户 « 信号 »;
-
点击按钮
; -
在打开的窗口中输入数据的名称和特征,然后单击 « 添加 »:

窗口中数据的名称 « 信号 » 它们必须与有限状态机模型中这些数据的名称相匹配。
符号助手
运行模拟时
或汇编
AnyMath 验证有限状态机模型的正确性。 如果其中有未定义的数据,则打开 « 符号向导 ». 在里面,你可以:
*查看找到的未定义名称; *为它们分配类别(例如, «出口;出口»); *确认添加到*信号*列表中。

设置数据类型
所有数据都必须按类型指定,这决定了在仿真过程中如何存储和使用数据。 支持与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 :
+

模型 *AnyMath (街区外 Chart):
+

维度和复杂性
除了数据类型之外,您还可以设置维度(标量、矢量或数组)和复杂性。
*尺寸-在窗口中指示 « 信号 » 作为用逗号分隔的整数序列:
-
−1(默认值)-尺寸不是固定的,是自动确定的: 对于输入/输出,取自外部模型的连接端口; *对于参数,它取自同名的工作区变量(工作区,外部 *Chart); ***对于本地数据,它取自图表代码中实际分配的值。如果形状可以改变,这种模式很方便。
**显式表单-输入以逗号分隔的数字:
+
* n -来自 n 元素;
* n,m -矩阵 n×m;
* n,m,k -三维阵列 n×m×k.
+
序列 n[,m[,k…]] 在*Dimension*字段中,它对应于Julia数组构造函数的数值参数。 例如, n,m → Matrix{Float32}(undef,n,m) (= Array{Float32,2}(undef,n,m)).
-
复杂度 --确定数据是否可以包含复杂值:
Inherit:auto--值从外部模型中的关联变量或信号自动继承。 例如,如果在工作区或输入块中使用复杂类型,那么状态机中的数据将是复杂的。 Off--继承被禁用,数据始终是真实的。 **On--禁用继承,数据总是复杂的。



