保护模型以隐藏内容
当您要与第三方共享模型而又不能泄露知识产权时,请对模型进行保护。保护模型可以通过将原始模型编译到引用模型中来隐藏原始模型的实现细节。受保护模型包括派生文件,以支持您指定的可选功能。
在您通过使用 Simulink® Coder™ 保护模型时,可以允许受保护模型的用户执行以下操作:
在普通、加速、快速加速或外部模式下仿真一个包含受保护模型的模型。
打开模型的只读 Web 视图,包括模型内容和模块参数。创建模型的只读 Web 视图需要 Simulink Report Generator™ 许可证。
为包含受保护模型的模型生成 C 和 C++ 代码。
如果您有 HDL Coder™ 许可证,则为包含受保护模型的模型生成 HDL 代码。
如果您有 Embedded Coder® 许可证并为模型指定了基于 ERT 的系统目标文件,可通过独立接口为受保护模型生成代码。
您可以选择使用密码保护每个选项。如果您为其中一个选项选择了密码保护,软件将通过使用 AES-256 加密来保护支持文件。在创建受保护模型之前,请考虑第三方将如何使用该模型和这些Best Practices for Creating Protected Models。
创建受保护模型时:
Simulink Coder 以与源模型同名的文件创建并存储模型的受保护版本,但文件扩展名为
.slxp
。扩展名为
.slx
的原始模型文件不会更改。如果您通过 Model 模块保护模型,则 Model 模块不会更改。(可选)Simulink Coder 创建一个工程存档 (
.mlproj
),其中包含受保护模型、受保护模型的框架模型及其他支持文件。
此示例说明如何基于引用模型创建受保护模型,以进行只读查看、仿真或代码生成。
准备父模型
(可选)将父模型中的 Model 模块配置为引用原始的被引用模型。此步骤可防止 Model 模块在您创建受保护模型时成为受保护的引用。
打开引用要保护的模型的父模型。对于此示例,请打开名为
sldemo_mdlref_basic
的模型。对于每个 Model 模块,打开“模块参数”对话框,并在模型名称字段中指定扩展名
.slx
。如果该模型和受保护模型在同一个文件夹中,则
.slxp
优先于.slx
。如果未指定扩展名,原始 Model 模块将引用受保护模型,而不是原始模型。点击确定。
保护引用的模型
在 sldemo_mdlref_basic
模型中,点击三个 Model 模块中的任一个。在 Simulink 工具条上的模型模块选项卡上,点击保护。
受保护模型创建者将打开。
在常规选项卡上,指定要支持的功能。
选择仿真和代码生成。这些选项允许受保护模型的用户对引用了受保护模型的模型进行仿真并为其生成代码。如果要为受保护模型的功能设置密码保护,请输入至少包含八个字符的密码。每个选项都可以有唯一密码。
提示
受保护模型创建者会在 MATLAB® 会话期间缓存您的模型设置。如果您关闭并重新打开该对话框,设置将保持不变。密码和可调参数选择不会缓存。要还原默认设置,请点击重置。 (自 R2023b 起)
如果您有 Embedded Coder 许可证,并且模型指定基于 ERT 的系统目标文件,例如
ert.tlc
,则代码接口字段可见。在此示例中,
sldemo_mdlref_basic
未指定基于 ERT 的系统目标文件,因此代码接口选项在受保护模型创建者中不可用。从内容类型列表中选择经过混淆处理的源代码,以隐藏受保护模型的源代码目的和逻辑。有关模型保护选项的详细信息,请参阅Content type。
在仿真选项选项卡上,指定受保护模型的用户在仿真期间可以调节的参数。
要编译模型并列出可调参数,在用于仿真的可调参数部分,点击刷新 (自 R2023b 起)。
选择您需要受保护模型用户能够在仿真期间调节的参数。
在此示例中,
sldemo_mdlref_basic
没有任何可调参数。注意
对于代码生成,具有非自动存储类的参数是可调的。有关详细信息,请参阅Storage Classes for Parameters and Signals Used in Model Blocks。
在保存选项选项卡上,指定保存受保护模型的位置、是否将受保护模型与其支持文件一起保存在工程中以及是否创建框架模型。
在目标文件夹框中,指定受保护模型的文件夹路径。默认值为当前工作文件夹。
要自动收集、创建和打包受保护模型的支持文件,请选择将受保护模型与依赖项一起打包到一个工程中。
注意
在共享工程之前,请检查工程是否包含必要的支持文件。如果缺失支持文件,对相关的框架模型进行仿真或生成代码有助于识别缺失的文件。将缺失的依存关系添加到工程中,并根据需要更新框架模型。
选择将受保护模型与依赖项一起打包到一个工程中会选择为受保护模型创建框架模型。框架模型包含在工程中,并为引用受保护模型的 Model 模块提供独立环境。
要进一步自定义受保护模型,您可以:
为代码混淆指定自定义混淆器。请参阅Specify Custom Obfuscators for Protected Models。
指定多个代码生成目标。请参阅Create Protected Models with Multiple Targets。
为受保护模型定义回调。请参阅Define Callbacks for Protected Models。
要创建受保护模型,请点击创建。
包含受保护模型、框架模型和支持文件的工程存档 (.mlproj
) 将出现在指定的目标文件夹中。要测试受保护模型,请通过在当前文件夹浏览器中双击工程存档并指定目标文件夹来提取工程存档的内容。或者,右键点击工程存档。然后,点击提取到此处。工程将打开,提取的文件位于以工程存档命名的新文件夹中。
您可以测试受保护模型以将其与原始模型进行比较。有关详细信息,请参阅Test Protected Models。
要在模型层次结构中使用该受保护模型,请通过 Model 模块(例如框架模型中包含的 Model 模块)引用它。引用受保护模型的 Model 模块的仿真模式设置为加速。您不能更改此模式。有关详细信息,请参阅引用来自第三方的受保护模型。
保护模型的其他方法
要基于当前模型层次结构中的顶层模型创建受保护模型,请使用以下选项之一:
在 Simulink 工具条的仿真选项卡上,点击保存按钮箭头,然后选择受保护模型。
在 Simulink 工具条 C 代码选项卡上,点击共享按钮箭头,然后选择生成受保护模型。
要以编程方式创建受保护模型,请使用 Simulink.ModelReference.protect
函数。
受保护模型报告
从 Simulink 编辑器创建受保护模型时,将生成受保护模型报告,并将其作为受保护模型的一部分。对于此示例,要查看受保护模型报告,请双击受保护模型或右键点击框架模型中模块上的受保护模型徽章图标,然后选择显示报告。
该报告包含:
摘要,包括以下表:
环境,提供 Simulink 版本和其他产品版本,以及用于创建受保护模型的平台。
支持的功能,对受保护模型支持的每个可能功能报告打开、关闭或打开并启用密码保护。如果您为多个目标配置受保护模型,此表将包含受支持目标的列表。
接口报告,包括模型接口信息,如输入和输出设定、导出的函数信息、接口参数和数据存储。
该报告不包含代码生成报告中有关非受保护模型的报告部分,如代码度量报告和可追溯性报告,因为这些报告包含有关模型设计的详细信息。
受保护模型的要求和限制
创建受保护模型时,请考虑以下要求:
您必须拥有 Simulink Coder 或 HDL Coder 许可证才能创建受保护模型。
模型必须位于 MATLAB 路径上。
模型使用在保护期间处于激活状态的配置。您无法更改受保护模型的配置。
如果模型包含变体,则受保护模型仅包含在保护期间处于激活状态的变体。
模型保护过程不保留任何回调。有关创建用于受保护模型的回调的详细信息,请参阅Define Callbacks for Protected Models。
不要重命名受保护模型或更改其后缀。否则,模型将不可用,直到还原了其原始名称和后缀才可用。
为模型及其引用的模型使用唯一名称。如果某受保护模型所引用模型的名称与另一个受保护模型的名称相同,或与另一个受保护模型的层次结构内的不同模型的名称相同,则使用该受保护模型存在限制。如果某顶层模型引用了存在上述名称冲突的两个受保护模型,则您无法保护该顶层模型、为该顶层模型生成代码或者在软件在环 (SIL)、处理器在环 (PIL) 或快速加速模式下仿真顶层模型。
如果您的模型包含非内联的 S-Function,请对 .MEX 文件使用唯一名称。如果名称与 MATLAB 路径中的其他 .MEX 文件冲突,您无法仿真受保护模型。
该模型还必须满足模型引用的要求和限制中列出的要求。
代码生成要求和限制
要创建支持代码生成的受保护模型,受保护模型必须满足以下要求:
该模型必须使用普通、加速、软件在环 (SIL) 或处理器在环 (PIL) 模式和单个目标。
模型不能包含非内联 S-Function。
该模型不能选择代码生成 > 验证 > 测量函数执行时间配置参数。如果您在保护模型时选择了此选项,软件将关闭该参数并显示警告。
受保护引用模型必须支持代码生成且没有密码保护。
该模型必须与每个受保护引用模型的内容类型兼容。下表提供了兼容性信息。
代码生成内容类型兼容性
受保护父模型内容类型 兼容的受保护引用模型内容类型 二进制代码 二进制代码
经过混淆处理的源代码
二进制代码( 'ObfuscateCode'
设置为'false'
)二进制代码
二进制代码(
'ObfuscateCode'
设置为'false'
)经过混淆处理的源代码
可读源代码
经过混淆处理的源代码 经过混淆处理的源代码
可读源代码 经过混淆处理的源代码
可读源代码
当受保护父模型和受保护引用模型的内容类型不匹配时,代码生成会应用它们之中保护级别较高的内容类型。例如,如果受保护父模型设置为二进制类型,而受保护引用模型设置为经过混淆处理的源代码类型,则该受保护引用模型会生成为二进制类型的代码。如果受保护父模型设置为可读源代码类型,而受保护引用模型设置为经过混淆处理的源代码类型,则该受保护引用模型会生成为经过混淆处理的源代码类型的代码。
要避免在包含受保护模型的模型的代码生成过程中出现错误,请遵循下列各项:
受保护模型名称必须与同一模型引用层次结构中的其他模型名称不同。
接口必须匹配。
参数必须兼容。
嵌套受保护模型的要求和限制
要使受保护模型的接收者能够保护引用它的模型,受保护模型必须:
支持加速模式。您必须在受保护模型创建者中选择仿真,或使用
Simulink.ModelReference.protect
函数将'Mode'
设置为'Accelerator'
或'CodeGeneration'
。使用默认的
'CodeInterface'
设置:'Model reference'
。对仿真不使用密码保护。
没有回调。
在没有密码保护的情况下支持受保护的父模型要支持的操作。
使用与受保护父模型的预期内容类型兼容的内容类型(如果受保护父模型预期支持代码生成)。有关兼容的内容类型选项的列表,请参阅上一节中的表。
使用受保护的父模型预期要使用的编译器。
引用模型的名称不能与另一个受保护模型的名称相同,或与另一个受保护模型的层次结构内的不同模型的名称相同。
如果要保护的模型引用受保护模型,被引用的受保护模型必须满足前面的要求。
要保护一个引用了受保护模型的模型,必须将被引用的受保护模型的可调参数指定为对正在保护的模型是可调的。
注意
如果您在选择了 HDL 代码生成选项的情况下创建了一个受保护模型,则支持对引用了该受保护模型的模型进行仿真和 HDL 代码生成,并可对仿真和 HDL 代码生成进行加密。在使用此选项时,您不能对 HDL 源代码进行混淆处理、使用回调或使用嵌套的受保护模型。要了解有关 HDL 代码生成限制的更多信息,请参阅 Protected Model Restrictions for HDL Code Generation (HDL Coder)。