主要内容

本页采用了机器翻译。点击此处可查看最新英文版本。

传感器之间面向服务的通信建模

此示例展示了如何从 System Composer™ 软件架构开始,使用 Simulink® 实现组件行为,从而对面向服务的通信进行建模。从架构层面建模面向服务的通信,您可以设计服务接口和组件,而无需考虑其功能的实现。有关详细信息,请参阅服务接口概述

在此示例中,模型 slexServiceInterfaceExample 由一个控制器组件 Controller 和两个传感器组件 Sensor1Sensor2 组成。将两个传感器组件建模为同一引用模型 scSensorModelRef 的两个不同实例。两个引用的传感器模型都输出不同幅度的正弦波。引用模型定义了两个服务:reset,用于重置传感器随时间漂移的值;fetchData,用于读取最新的传感器值。您在控制器和两个传感器实例之间指定一个服务接口,这样控制器就可以调用 resetfetchData 来访问引用传感器组件的特定实例。

打开模型。

model = systemcomposer.openModel('scServiceInterfaceExample.slx');

A software architecture with 3 components, Sensor1, Sensor2, and Controller.

通过客户端和服务器端口进行组件与组件交互

控制器组件使用服务器端口和客户端端口与传感器组件进行交互。球形和插座图标分别代表服务器和客户端端口。

定义服务接口

服务接口定义客户端和服务器组件之间的功能接口。您可以通过接口编辑器定义服务接口 sensorCmd。要访问接口编辑器,请转到建模选项卡,在设计部分中,选择接口编辑器。服务接口 sensorCmd 在所有引用的模型中使用,并存储在数据字典 slexServiceInterfaceExample.sldd 中。

sensorCmd 服务接口包含两个函数元素:resetfetchData。在接口编辑器中,您可以指定函数原型来定义输入和输出参量。函数 reset 的函数原型为 reset(resetData),它指定了一个输入函数参量 resetData。函数 fetchData 的函数原型为 data = fetchData(),它指定了一个输出函数参量 data。对于每个函数参量,您可以在 Type Dimensions UnitsComplexityMinimumMaximumDescription 列中指定一个值。

The Interface Editor open with the scServiceInterfaceSensorExampleDD data dictionary expanded. The sensorCmd service interface is expanded to show the reset and fetch data function elements.

在 Simulink 中实现函数行为

服务接口中指定的函数的行为在引用的模型中定义。在面向服务的架构中,您可以在基于速率或导出函数的模型中实现这些函数行为模型。

服务器组件模型

scSensorMdlRef 模型是一个导出函数模型,代表传感器的行为。在 scSensorMdlRef 中,您在相应的 Simulink 函数模块中定义了两个函数 resetfetchData。函数 reset 有一个布尔输入参量 resetData。默认情况下,resetData 为假,因此,在控制器将 resetData 设置为 true 之前,reset 函数不会重置传感器。

A Simulink model with two Simulink Function blocks to represent the definition of the reset and fetchData functions.

客户端组件模型

scControllerMdlRef 模型是一个基于导出的模型,代表控制器的行为。在 scControllerMdlRef 中,每个传感器都有一个 requestResetrequestFetchData 函数调用子系统。

A Simulink model with 4 Function-Call Subsystem blocks to represent two calls per function.

有关服务器和客户端模型的结构和功能的详细信息,请参阅Model Client and Server Components Using Function Ports

调度函数和仿真

要运行模型,请使用函数 sim

sim('scServiceInterfaceExample');

要查看模型仿真过程中函数调用的顺序,请打开“序列查看器”。

转到仿真选项卡,在查看结果部分中,选择序列查看器

The Sequence Viewer tool open with 3 components, Controller, Sensor1, and Sensor2. The sequence of interactions between the components are displayed in sequential order.

Controller 组件的测试服务接口

创建测试框架需要获得 Simulink® Test™ 许可。要为 Controller 组件创建测试框架,右键点击 Controller 组件,点击 Test Harness,然后选择为 'Controller' 创建。在创建测试框架对话框中,点击确定

当您创建测试框架时,Simulink Test 会生成一个测试框架模型和一个模拟架构模型。

  • 测试框架模型 scServiceInterfaceExample_HarnessN 提供了一个模型,用于在 Simulink 函数调度器模块中配置测试场景。

  • 模拟架构模型 scServiceInterfaceExample_MockArchitecture1 包含模拟组件 scServiceInterfaceExample_MockServers1,用于实现与被测组件 Controller 通信的服务。

A Simulink model containing the test harness. In this model, there are Signal Spec. and routing subsystems, a Model block referencing the mock architecture model, two outputs for sensor data, and a Simulink Function scheduler block.

要打开模拟架构模型,请双击测试框架模型中的 scServiceInterfaceExample_MockArchitecture1 模块。

A software architecture model representing the mock architecture. The architecture contains a reference component referencing the Controller component and another reference component referencing the new mock servers model.

实现模拟组件的行为

双击 scServiceInterfaceExample_MockArchitecture1 架构模型中的 MockServers 组件,打开模拟服务器模型。

控制器调用 reset 函数和 fetchData 函数。为了使模拟服务器组件的测试输出符合预期,您必须向模拟服务器提供测试输入和输出。

reset 函数

要实现函数 reset 的模拟行为,可以添加一个 Outport 模块来记录 resetData 的值。

scServiceInterfaceExample_MockServers_reset.png

fetchData 函数

要实现函数 fetchData 的模拟行为,可以添加一个 Switch 模块来控制该函数的输出。您可以将 resetData 端口连接到控制输入信号,并添加两个 Constant 模块用于数据输入信号。

scServiceInterfaceExample_MockServers_fetchData.png

仿真测试框架

在测试框架模型中,有两个 Outport 模块,它们记录 Sensor1Sensor2 的信号。

要仿真测试,必须添加一个步骤转移。打开测试框架模型中的 Test Sequence (Simulink Test) 模块,在 Run 步骤的转移列中,添加 true 作为进入下一步的条件。

  1. 点击仿真选项卡中的运行,以仿真框架。

  2. 打开 仿真数据检查器 以观察 Sensor1Sensor2 组件的记录输出。

scServiceInterfaceExample_Data.png

在此示例中,被测组件为 Controller,因此在仿真数据检查器中,您可以观察来自传感器的信号,以确保 Controller 能够按照预期调用 resetfetchData 函数。

  1. 检查选项卡中,选择并取消选择 sensor1Data:1Output Conversion Subsystem:1 信号,以观察信号是否匹配。

  2. 同样地,选择并取消选择 sensor2DataOutput Conversion Subsystem:2 信号,以观察这些信号是否匹配。

scServiceInterfaceExample_Signals.png

如果传感器和客户端组件之间的信号匹配,则测试完成。有关测试服务接口的更多信息,请参阅使用 Simulink Test 测试您的服务接口

生成代码

生成代码需要 Embedded Coder® 许可证。

要生成包含服务接口 sensorCmd 的模型代码,请使用以下命令。

slbuild('scServiceInterfaceExample');

生成的代码包括服务接口 sensorCmd 作为抽象类,从而使实现与接口分离。此外,组件的每个函数都有一个入口点。

另请参阅

| | | | | | |

主题