人在仿真软件金宝app

金宝app基于Simulink和模型的设计

内燃机点火控制器实例-第2部分

在里面我以前的职位,我介绍了一个最近发表在MATLAB Central上的例子:四缸发动机点火控制仿真

在描述如何实现工厂模型的情况下,现在是时候描述了控制器的实现方式,以及如何模拟整体系统。

大局

让我们先回顾一下我们正在处理的整个系统:

SchedulerOverview

在此系统中,会发生以下情况:

  • 发动机曲轴配有齿轮。在这种情况下,牙齿每10度均匀地间隔开,牙齿缺失。
  • 当曲轴旋转时,齿在触发中断的传感器前方,在ECU上执行代码。
  • 该代码计算发动机的位置和速度,并确定下一个汽缸应何时点火。
  • 代码设置一个硬件定时器,将在适当的时间点燃适当的火花塞。

本项目的目标是设计一个由嵌入式控制单元(ECU)操作系统(OS)调度器执行的算法。该算法计算发动机的位置和速度,并确定下一个气缸何时点火。一旦确定,算法将调用ECU操作系统提供的计时器服务,该服务将负责在正确的时间点火。

遵循基于模型的设计理念,我们(当然!)希望模拟整个系统,以帮助设计和验证将部署在ECU上的控制算法。

重要的模型体系结构决策:导入代码与导出代码

在描述控制器及其实现之前,我想先介绍一下我为本例所做的一个重要设计选择。

在此博客上,在我的大多数涉及代码生成的帖子中,故事的结尾是:单击“构建”按钮生成代码,最终可执行文件会自动编译并在目标上执行并执行。这是搞怎样金宝app实时仿真软件以及我们对以下目金宝app标的支持包:覆盆子皮iPhone/iPad工作在这些情况下,如果最终的应用程序需要包含遗留的C/C++代码,则代码是进口在Si金宝appmulink中,通常使用薄层包装.看我关于a的博客推特覆盆子pi.乐高MINDSTORM的定制驱动程序为例子。

这是做事情的一种方式……我们称之为进口流程

现在,是时候去阅读文档页面了选择一个外部代码集成工作流学习另一种做事方式…的导出工作流程

下面是一个并排比较这两个工作流的示意图:

导入和导出

为什么我为此项目选择导出工作流程?

导出工作流处理的用例是您拥有一个由手写和遗留组件组成的现有大型C/ c++软件项目的地方。在这种情况下,如果您想在Simulink中开发一个新组件,您可以导出生成的代码并将其包含在现有的软件项目中。金宝app

这样,Simulink导出的代码既可以被遗留代码调用,也可以调金宝app用遗留代码。在下一节中,我们将看到:

  • 部署在嵌入式控制器上的最终应用程序是什么样子的
  • 整个系统的模拟是什么样子的
  • 如何模拟执行从Simulink导出的代码的传统计划程序金宝app
  • 如何设置模型的一部分,以生成与导出工作流兼容的代码
  • 如何仿真被Simulink导出的代码所利用的ECU提供的服务金宝app

部署在嵌入式控制器上的最终应用程序

下面的图片描述了最终部署的应用程序的外观。注意,为了使手写的遗留代码和simulink生成的代码之间的区别更加明显,我使用了另一个编辑器,即金宝appArduino IDE

控制器概述

在这张图片中,我们有:

  1. ECU调度程序注册了从Simulink导出的代码(金宝apptrigCrank)根据机械轴的运动执行。
  2. 从Simulink导出的代码(金宝apptrigCrank)确定下一次火花点火应该发生的时间。
  3. 从Simulink导出的代码调用ECU OS提金宝app供的服务(setIgnitionSchedule),它将使用硬件计时器在正确的时间产生火花点火。

模拟整个系统

下面是模拟整个系统的模型顶层的屏幕截图。我使用了与上图相同的编号来展示哪个子系统相当于部署的应用程序的哪个部分。这意味着标有“1”的状态流程图和标有“3”的子系统正在模拟ECU提供的传统功能。

控制器仿真概述

使用状态流模拟遗留调度程序

在已部署的应用程序中,OS调度程序调用函数。在Si金宝appmulink中,这意味着我们需要生成函数调用信号。对于定期事件,它很简单:我们可以使用函数调用生成器

为了在曲柄角度通过特定角度时生成函数调用信号,我使用了示例模型中的一个块sfcndemo_angle_events.slx,这是S函数示例.我只是必须把它连接到曲轴和凸轮轴,并指定齿模式在块对话。

异步S函数。

使用过零点检测,每次牙齿都会准确地生成功能呼叫事件。然后,我可以使用函数调用生成器块生成的周期性函数调用这些事件来触发调度图:

状态流调度器

然后,状态溢图表输出函数调用信号,该信号将执行我们想要导出代码的控制算法。

设置模型的一部分以生成与导出工作流兼容的代码

现在是时候讨论了我们想要导出生成的代码的控制算法了!

为了与导出工作流兼容,我们将算法放在一个单独的模型中,并使用模型

使之成为导出功能模型,控制算法必须放在内部函数呼叫子系统内,该子系统被标记为输出函数呼叫信号的根级Inport块触发。

当为该模型生成代码时,与“正常”模型相比,不会生成step函数。相反,每个根级别函数调用Inport将生成一个函数。

导出函数模型和代码

模拟ECU提供的服务

最后一块拼图…控制算法需要利用ECU提供的功能。换句话说,它需要调用外部函数——我们想要模拟这些函数。

为此,在出口函数模型中,我使用了函数调用者当计划下一个钢瓶需要点火时,块将被执行。

此函数调用程序块在生成的代码和模拟中的行为不同:

  • 为Function Caller块生成的代码将调用并链接ECU上可用的函数。
  • 当在我们的系统仿真模型中被引用时,Function Caller块将调用金宝appSimulink函数位于仿真模型的顶部。

    函数来电者

    对于此特定应用,需要仿真的OS服务是一个硬件计时器,它将在所需的时间内发射火花塞。为此,我决定使用Simevents.

    Simu金宝applink函数生成SimEvents消息或实体。该实体通过两个实体服务器块。第一个服务于它,直到它是充电火花塞。第二个服务于它是时候排出火花塞。每次实体退出两个服务器中的一个时,他们都会调用Simulink函数金宝app三环产生发送至发动机的点火信号。

    Simevents.

    现在循环结束了!

    模拟结果

    当您模拟模型时,您将看到发动机RPM如何演变,因为我们开始和关闭发动机,以及当我们接触传输时。

    结果1

    如果放大点火命令,您将看到曲轴旋转时每个气缸何时点火。

    结果2

    现在轮到你了

    请在评论中告诉我们您对该模型体系结构的看法,以及您是否希望看到此类示例的其他特性。

|

评论

要留下评论,请点击这里登录到您的MathWorks帐户或创建一个新帐户。