主要内容

确定子系统的代码为什么不重用

由于描述的局限性从子系统生成可重入的代码生成的代码,代码生成器可能不会重用你。确定为什么生成子系统不是重用代码:

  1. 审查的子系统部分代码生成报告。

  2. 比较子系统数据校验和。

审查子系统部分的HTML代码生成报告

如果代码生成器生成的代码并不为一个子系统可重用的代码,你配置子系统作为可重用,检查子系统部分的代码生成(见报告生成代码生成报告)。子系统部分包含:

  • 一个表,总结了nonvirtual子系统是如何转化为生成的代码。

  • 诊断信息描述为什么子系统没有生成可重用的代码。

子系统部分还noninlined子系统模型中映射到函数或函数在生成的代码中重用。例如,开放和建设rtwdemo_atomic模型。

比较子系统校验和数据

您可以确定子系统的代码为什么不重用通过比较子系统数据校验和。代码生成器决定子系统是相同的校验和通过比较子系统,如前所述限制。子系统重用在引用的模型,这个过程不可能国旗都不同。

考虑到模型中,rtwdemo_ssreuse魔法石,第1章SS2子系统是相同的实例。在两个子系统块参数实例函数包装被设置为可重用的功能

使用这种方法金宝appSimulink.SubSystem.getChecksum一个子系统的校验和。审查结果并不确定为什么代码重用。

  1. 打开模型rtwdemo_ssreuse。模型的副本保存在一个文件夹,你有写访问。

  2. 关联子系统魔法石,第1章SS2华东桐柏。为每个子系统,在模型窗口中,选择子系统。而选择子系统,在命令窗口中,输入:

    魔法石,第1章= gcb;
    SS2 = gcb;
  3. 使用这种方法金宝appSimulink.SubSystem.getChecksum每个子系统的校验和。这个方法返回两个输出值:输入的校验和值和细节用来计算校验和。

    [chksum1, chksum1_details] =…金宝appSimulink.SubSystem.getChecksum(魔法石,第1章);[chksum2, chksum2_details] =…金宝appSimulink.SubSystem.getChecksum (SS2);
  4. 比较两个校验和值。值应该等于基于子系统配置。

    isequal (chksum1 chksum2) ans = 1
  5. 使用金宝appSimulink.SubSystem.getChecksum确定两个子系统的校验和不同的原因,改变数据类型的模式输出端口(魔法石,第1章SS2的区别在哪里。

    1. 看的面具下魔法石,第1章。右键单击该子系统。在上下文菜单中,选择面具>看下面具

    2. 在子系统的框图,双击查找表块打开子系统参数对话框。

    3. 点击数据类型

    4. 选择块参数浸透在整数溢出并点击好吧

  6. 得到的校验和魔法石,第1章。比较两个子系统的校验和。这一次,校验和是不平等的。

    [chksum1, chksum1_details] =…金宝appSimulink.SubSystem.getChecksum(魔法石,第1章);isequal (chksum1 chksum2) ans = 0
  7. 您确定后,校验和不同,找到原因。的仿真软金宝app件®引擎使用信息,比如信号数据类型,一些参数值,和块的连接信息,计算校验和。确定为什么校验和不同,比较计算校验和值的数据。你可以得到这个信息从第二个返回值金宝appSimulink.SubSystem.getChecksum与四个领域的,这是一个结构数组。

    看结构chksum1_details

    chksum1_details chksum1_details = ContentsChecksum: [1 x1 struct] InterfaceChecksum: [1 x1 struct] ContentsChecksumItems: x1 struct [287] InterfaceChecksumItems: [53 x1 struct]

    ContentsChecksumInterfaceChecksum组件子系统的校验和校验和。剩下的两个字段,ContentsChecksumItemsInterfaceChecksumItems,包含校验和细节。

  8. 确定子系统的内容存在差异,接口,或两者兼而有之。例如:

    isequal (chksum1_details.ContentsChecksum.Value……chksum2_details.ContentsChecksum.Value) ans = 0 isequal (chksum1_details.InterfaceChecksum.Value……chksum2_details.InterfaceChecksum.Value) ans = 1

    在这种情况下,差异存在于内容。

  9. 像这样写一个脚本脚本找到的差异。

    idxForCDiffs = [];idx = 1:长度(chksum1_details.ContentsChecksumItems)如果(~ strcmp (chksum1_details.ContentsChecksumItems (idx)。标识符,…chksum2_details.ContentsChecksumItems (idx) .Identifier) disp([内容项标识符不同,num2str (idx)]);idxForCDiffs = [idxForCDiffs, idx];如果(ischar (chksum1_details.ContentsChecksumItems (idx) value))如果(~ strcmp (chksum1_details.ContentsChecksumItems (idx)。价值,……chksum2_details.ContentsChecksumItems (idx) value) disp([特征向量的值不同的内容项,num2str (idx)]);idxForCDiffs = [idxForCDiffs, idx];如果结束(isnumeric (chksum1_details.ContentsChecksumItems (idx) value))如果(chksum1_details.ContentsChecksumItems (idx)。值~ =…chksum2_details.ContentsChecksumItems (idx) value) disp([内容项数值不同,num2str (idx)]);idxForCDiffs = [idxForCDiffs, idx]; end end end
  10. 运行脚本。示例假设您命名脚本check_details

    202年内容项check_details特征向量的值不同

    结果表明,差异存在的指数项202子系统的内容。

  11. 使用返回的索引值处理,发现细节为每个标识符,和价值差异。

    chksum1_details.ContentsChecksumItems (202) ans =处理:rtwdemo_ssreuse(魔法石,第1章/查找表的标识符:“SaturateOnIntegerOverflow”价值:“上”

    细节确定查找表块参数浸透在整数溢出作为调试子系统重用的焦点问题。