使用定制轮胎 N.公共标志 在设备块中
建议您在使用自定义轮胎类型之前熟悉块。 Bus Creator 和 Bus Selector.
*Engee*通过类型提供对自定义结构化信号的支持 N.公共标志 (有关详细信息,请参阅 这里)。 此类型允许您将逻辑相关的信号组合到单个总线结构中,其中每个元素都具有名称,类型和维度(例如, 温度::Int, 位置:矢量{Float64}, 状态::Bool).
|
这样的结构在与之交互时很方便 返回或接受整组参数的 外部硬件。 所以,而不是作为非结构化集传输数据:
(10, 3.2, [1, 2, 3])
您可以使用具有显式指定名称的总线。:
(temperature = 10, pressure = 3.2, position = [1, 2, 3])
使用类型 N.公共标志 这样的结构可以在模型级被精确地描述和键入,这对于形式化硬件数据接口是重要的。
类型 N.公共标志 它写成如下:
BusSignal{Names, Types, Dimensions, :BusName}
哪里:
-
姓名-信号名称的元组((:a,:b,:c)); -
类别-相关类型(元组{Int,Float64,向量{Float64}); -
尺寸-每个元素的尺寸), (), (3,对于标量和长度为3的向量); -
总线名称--总线的名称(由用户设置)。
类型 N.公共标志 它由信号的名称参数化(姓名),基本类型(基本类型),尺寸(暗淡无光),以及总线的名称(总线名称). 例如,具有三个信号的总线可以被描述为:
bus_type = BusSignal{(:s1, :s2, :s3), Tuple{Int, Float64, Float64}, ((), (), (3,)), :MyBus}
在 基本类型 仅指定基本类型(例如, Int型, 漂浮64),而不是容器(例如, 向量{Int}).
数组的维度分别设置在 暗淡无光.
|
这里:
-
:s1,:s2,:s3-信号名称; -
元组{Int,Float64,Float64}-信号数据类型; -
(), (), (3,)-信号的尺寸(例如,s3-长度数组3). -
我的巴士--轮胎的名字。信号和总线的名称中允许使用引号以外的任何字符( ").
简单用法示例:
# 设置总线类型的值(没有数据的结构,所以括号)
bus_type = BusSignal((:a, :b), (Int, Float64), ((), ()), :MyBus)
# 创建此总线的对象,NamedTuple类型参数具有花括号。
bus1 = BusSignal{(:a, :b), Tuple{Int, Float64}, ((), ()), :MyBus}((a = 5, b = 6.4))
# 使用关键参数
bus2 = BusSignal{(:a, :b), Tuple{Int, Float64}, ((), ()), :MyBus}(a = 5, b = 6.4)
# 使用位置参数(varargs)
bus3 = BusSignal{(:a, :b), Tuple{Int, Float64}, ((), ()), :MyBus}(5, 6.4)
轮胎可以嵌套,例如:
Inner = BusSignal{(:x, :y), Tuple{Int, Int}, ((), ()), :InnerBus}
Outer = BusSignal{(:a, :b), Tuple{Float64, Inner}, ((), ()), :OuterBus}
- 以下函数可用于类型分析
get_names_types_dims(::Type{BusSignal{Names, Types, Dimensions, BusName}}) where {Names, Types, Dimensions, BusName} # 一次所有参数
get_bus_names(::Type{BusSignal{Names, Types, Dimensions, BusName}}) where {Names, Types, Dimensions, BusName} # 信号名称的元组
get_bus_types(::Type{BusSignal{Names, Types, Dimensions, BusName}}) where {Names, Types, Dimensions, BusName} # 基本类型的元组
get_bus_dimensions(::Type{BusSignal{Names, Types, Dimensions, BusName}}) where {Names, Types, Dimensions, BusName} # 维度元组
get_bus_name(::Type{BusSignal{Names, Types, Dimensions, BusName}}) where {Names, Types, Dimensions, BusName} # 巴士名称
get_bus_signal_type(x::NamedTuple)
功能 get_bus_signal_type 它特别方便:它允许您通过其值自动确定轮胎的类型,例如:
bus = (s1 = 5, s2 = [4.3, 5.4], s3 = (a = 4, b = 5.5))
bus_type = get_bus_signal_type(bus)
# bus_type等于:BusSignal{(:s1,:s2,:s3),Tuple{Int64,Float64,BusSignal{(:a,:b),Tuple{Int64,Float64}, ((), ())}}, ((), (2,), ())}
接下来,让我们看看这个方案是如何工作的:从掩码参数到自动生成。 N.公共标志 硬件块内。
硬件单元中的自定义总线
让我们举一个例子-轮胎类型的动态形成。 N.公共标志 使用*UM Cosimulation*硬件单元的示例。 此块具有以下参数:

为了自动生成总线类型,只通过掩码指定输入和输出信号的数量和名称,以及轮胎本身的名称就足够了。
要查看它的工作原理,请打开块掩码(PCM by block/Mask/以查看掩码),转到"代码编辑器"→全局选项卡并在回调中 blockChangedCallback找到如下代码:
engee.set_param!(engee.gcb(), "InputPort1BusType" => "BusSignal($(mask.parameters.m_input_signal_names.value), Tuple(fill(Float64, $(mask.parameters.m_num_input_signals.value))), ntuple(_ -> (), $(mask.parameters.m_num_input_signals.value)), $(mask.parameters.m_input_bus_name.value))")
engee.set_param!(engee.gcb(), "OutputPort1BusType" => "BusSignal($(mask.parameters.m_output_signal_names.value), Tuple(fill(Float64, $(mask.parameters.m_num_output_signals.value))), ntuple(_ -> (), $(mask.parameters.m_num_output_signals.value)), $(mask.parameters.m_output_bus_name.value))")
在此代码中:
-
m_num_input_signals-输入信号数; -
m_num_output_signals-输出信号数; -
m_input_signal_names-输入信号的名称(例如,(:a,:b,:c)); -
m_output_signal_names-输出信号的名称; -
m_input_bus_name-输入总线的名称(符号,例如,:输入总线); -
m_output_bus_name-输出总线的名称(符号,例如,:输出总线).
价值 m_input_bus_name 和 m_output_bus_name 它们必须以正确的朱莉娅文字的形式出现。 符号 也就是说,用冒号: :输入总线, :MyHwIn 等。
|
代码使用函数设置当前块的路径 gcb(),之后读取掩码参数的值 m_input_signal_names, m_num_input_signals, m_output_signal_names, m_num_output_signals,并且还 m_input_bus_name 和 m_output_bus_name. 这些值用于形成类型的字符串表示形式 N.公共标志 具有指定的信号名称,基本类型(漂浮64),尺寸 () 和总线的名称(类型的第四个参数 符号). 为了读取值,必须在*Engee函数*块中声明参数名称。 为此,请转到硬件单元设置并单击 看看面具下面 要打开*Engee函数*块的参数。 *Parameters*选项卡包含来自掩码的参数的程序名称。:

然后函数 恩吉。set_param!自动更新*输入端口1*(程序名称)的*输出总线类型*参数 输入端口1bustype)和*输出总线类型*(程序名称 输出端口1类型)对于*端口*选项卡上的*输出端口1*,将生成的总线类型替换为输入和输出端口:

因此,整个设置归结为填充掩码字段。 总线类型是自动生成的,无需手动编辑*端口*选项卡。 这使单位用户友好,适应性,并准备重用。