主要内容

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

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

此示例展示了如何从 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。对于每个函数参量,您可以在 TypeDimensionsUnitsComplexityMinimumMaximumDescription 列中指定一个值。

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 作为抽象类,从而使实现与接口分离。此外,组件的每个函数都有一个入口点。

另请参阅

| | | | | | |

主题