使用工程以编程方式生成代码和仿真模型
以下示例说明如何使用工程 API 创建新工程,并自动执行工程任务来操作文件。它讲述如何以编程方式创建空白工程、添加文件和文件夹、设置工程路径、定义工程快捷方式、生成代码以及对框架模型进行仿真。
通过工程,您可以管理和共享文件与设置、查找必需文件以及与源代码管理进行交互,从而有助于您组织大型工程设计。
管理基于模型的设计工程
示例模型提供了一个控制器,它将相机固定到跟踪绿色球的直流电机上。
MBD 方法旨在对控制器操作进行建模:
被控对象建模:被控对象是一台直流电机,它通过旋转重新定位相机。
控制器建模:该设计使用具有角位置反馈的 PID 控制器来定位直流电机。
高级球跟踪调度器建模:调度器检查绿色球位置的有效性和基准角的饱和度。调度器处理屏幕上无球可跟踪的实例。
该设计和工程包含以下几个文件夹。
被控对象 - 被控对象提供:
包含使用基本 Simulink® 模块的连续时间动态系统的模型。
包含使用 LTI 系统模块的线性时不变 (LTI) 系统的模型。
在工作区中导入和导出仿真数据
将参数加载到使用数据字典和模型回调的基础工作区。
控制器 - 控制器提供:
包含离散时间动态系统并使用基本 Simulink 模块的模型。
包含使用 PID Controller 模块的离散时间动态系统的模型。
强制执行使用 PWM Conversion 子系统的信号饱和。
球跟踪 - 球跟踪提供:
基本球跟踪算法。
作为占位符的 Terminator 和 Ground 模块。
使用 Stateflow® 生成电机基准角的混合控制器。
框架 - 框架提供整个系统的顶层仿真。
创建空白工程并添加文件
1.创建一个空白工程。在主页选项卡上,点击新建 > 工程 > 空白工程。
或者,从命令行窗口创建此工程并使用 currentProject 获取工程对象来操作工程:
matlab.project.createProject('modelBasedDesignCodeGenProject');
proj_modelBasedDesignCodeGen = currentProject
proj_modelBasedDesignCodeGen = Project with properties: Name: "modelBasedDesignCodeGenProject" SourceControlIntegration: "" RepositoryLocation: "" SourceControlMessages: [1×0 string] ReadOnly: 0 TopLevel: 1 Dependencies: [1×1 digraph] Categories: [1×1 matlab.project.Category] Files: [1×0 matlab.project.ProjectFile] Shortcuts: [1×0 matlab.project.Shortcut] ProjectPath: [1×0 matlab.project.PathFolder] ProjectReferences: [1×0 matlab.project.ProjectReference] StartupFiles: [1×0 string] ShutdownFiles: [1×0 string] DefinitionFilesType: FixedPathMultiFile Description: "" RootFolder: "C:\Users\ktripp\MATLAB\Projects\modelBasedDesignCodeGenProject1" DependencyCacheFile: "" SimulinkCodeGenFolder: "" ProjectStartupFolder: "C:\Users\ktripp\MATLAB\Projects\modelBasedDesignCodeGenProject1" SimulinkCacheFolder: ""
2.将示例文件复制到工程内的文件夹中。
或者,在命令行窗口中,键入:
copyfile(fullfile(matlabroot,'toolbox','rtw','rtwdemos','slproject_codegen_demo'), ... fullfile(pwd),'f');
3.将现有文件添加到工程中:
点击工程文件视图按钮并选择所有文件视图。
选择文件夹
ball_tracking
、controller
、harnesses
、plant
和utilities
,右键点击其中一个文件夹的图标,然后选择将文件夹添加到工程(包括子文件)。
或者,从命令行窗口以编程方式将这些文件添加到工程中:
addFolderIncludingChildFiles(proj_modelBasedDesignCodeGen,'ball_tracking'); addPath(proj_modelBasedDesignCodeGen,'ball_tracking'); addFolderIncludingChildFiles(proj_modelBasedDesignCodeGen,'controller'); addPath(proj_modelBasedDesignCodeGen,'controller'); addFolderIncludingChildFiles(proj_modelBasedDesignCodeGen,'harnesses'); addPath(proj_modelBasedDesignCodeGen,'harnesses'); addFolderIncludingChildFiles(proj_modelBasedDesignCodeGen,'plant'); addPath(proj_modelBasedDesignCodeGen,'plant'); addFolderIncludingChildFiles(proj_modelBasedDesignCodeGen,'utilities'); addPath(proj_modelBasedDesignCodeGen,'utilities');
4.选择 work
文件夹,右键点击其中一个文件夹的图标,然后选择工程路径 > 添加到工程路径(包括子文件夹)。如果选择将此文件夹添加到该路径中,则可以在工程路径中找到仿真和代码生成时生成的文件(工件)。如果选择不在工程中包含生成的文件,则依存关系图不显示这些文件。
或者,从命令行窗口将此文件夹添加到工程路径中:
addPath(proj_modelBasedDesignCodeGen,'work');
5.要使工程更容易访问,请定义工程快捷方式并为其设置属性。在文件视图中,选择工程选项卡。打开 utilities
文件夹节点。
6.选择文件 clean_up_project.m
、generate_controller_code.m
和 set_up_project.m
,右键点击其中一个文件的图标,然后选择创建快捷方式。
7.要在打开工程时设置当前工作文件夹、设置仿真缓存文件夹并运行其他设置脚本:
选择
set_up_project.m
脚本。右键点击该文件。
选择启动时运行。
或者,从命令行窗口将此设置脚本添加到工程启动任务中:
addStartupFile(proj_modelBasedDesignCodeGen,fullfile(pwd,'/utilities/set_up_project.m'));
8.要在关闭工程时还原以前的设置并运行其他清理脚本:
选择
clean_up_project.m
脚本。右键点击该文件。
选择关闭时运行。
或者,从命令行窗口以编程方式将清理脚本添加到工程关闭任务中:
addShutdownFile(proj_modelBasedDesignCodeGen,fullfile(pwd,'/utilities/clean_up_project.m'));
9.重新打开工程以运行启动快捷方式。
或者,重新加载工程并从命令行窗口运行 set_up_project
:
reload(proj_modelBasedDesignCodeGen);
run('set_up_project');
从依存关系图中生成控制器的代码
1.在工程选项卡上,点击依存关系分析器以对工程中的所有文件运行依存关系分析。
依存关系图显示您的工程结构和文件依存关系。它显示文件之间的相互关系。图中的每个项目表示一个文件,每个箭头表示一种依存关系。
work
文件夹的内容不会显示在依存关系图中。此设置简化了视图,以指示模型文件和 .m
脚本文件中的依存关系。
a.检查右侧的属性窗格,了解有关您的工程的有用信息,如必需产品和问题文件。
b.使用放大按钮放大依赖项对应图。使用箭头键或者使用鼠标滚轮点击并拖动,在依赖项对应图上进行移动。
c.将鼠标悬停在依存关系箭头上,检查依存关系类型。例如,MATLAB® 脚本和函数正在由模型回调运行。
2.在依存关系图上选择 MBDController.slx
模型。右键点击该模型并选择打开。
3.当模型在 Simulink 中打开后,点击编译按钮为该模型生成代码。或者,使用工程中的 generate_controller_code
快捷方式生成代码。
或者,从命令行窗口为模型生成代码。为了演示此示例,请将写入权限设置为 MBDController.slxc
,然后为模型生成代码:
fileattrib('MBDController.slxc', '+w'); evalc('slbuild(''MBDController'')');
4.从工程窗口中关闭工程。
或者,关闭此工程并从命令行窗口运行 clean_up_project
:
run('clean_up_project');
close(proj_modelBasedDesignCodeGen);