Main Content

定义数据类

此示例说明如何创建 Simulink® 数据类的子类。

使用 MATLAB® 类语法在一个包中创建一个数据类。或者,为数据类指定属性并定义存储类。

使用示例来定义数据类

  1. 在工作文件夹中,查看文件夹 dataclasses 中的 +SimulinkDemos 数据类包。

  2. 将该文件夹复制到您要用于定义您的数据类的位置。

  3. 重命名文件夹 +mypkg 并将其父文件夹添加到 MATLAB 路径中。

  4. 修改数据类定义。

手动定义数据类

  1. 创建包文件夹 +mypkg 并将其父文件夹添加到 MATLAB 路径中。

  2. +mypkg 内创建类文件夹 @Parameter@Signal

    注意

    Simulink 要求在 +Package/@Class 文件夹内定义数据类。

  3. @Parameter 文件夹中,创建 MATLAB 文件 Parameter.m 并将其打开进行编辑。

  4. 使用 MATLAB 类语法定义作为 Simulink.Parameter 子类的数据类。

    classdef Parameter < Simulink.Parameter
       
    end % classdef
    

要使用自定义类名称而不是 ParameterSignal,请使用自定义名称命名类文件夹。例如,要定义一个类 mypkg.myParameter

  • 将数据类定义为 Simulink.ParameterSimulink.Signal 的子类。

    classdef myParameter < Simulink.Parameter
       
    end % classdef
    

  • 在类定义中,将构造函数方法命名为 myParametermySignal

  • 将类文件夹(其中包含类定义)命名为 @myParameter@mySignal

可选:将属性添加到数据类

属性定义模块的前后分别用 propertiesend 关键字括起来。

classdef Parameter < Simulink.Parameter
	properties % Unconstrained property type
		Prop1 = [];
	end

	properties(PropertyType = 'logical scalar')
		Prop2 = false;
	end

	properties(PropertyType = 'char')
		Prop3 = '';
	end

	properties(PropertyType = 'char',...
      AllowedValues = {'red'; 'green'; 'blue'})
		Prop4 = 'red';
	end
end % classdef

如果要将属性添加到 Simulink.ParameterSimulink.SignalSimulink.CustomStorageClassAttributes 的子类,则可以指定以下属性类型。

属性类型语法
双精度值properties(PropertyType = 'double scalar')
int32 值properties(PropertyType = 'int32 scalar')
逻辑值properties(PropertyType = 'logical scalar')
字符向量 (char)properties(PropertyType = 'char')
具有有限个允许值的字符向量properties(PropertyType = 'char', AllowedValues = {'a', 'b', 'c'})

如果添加需要特殊复制行为的属性,可以通过覆盖 copyElement 方法来定义该行为。例如,在 +SimulinkDemos 数据类包中,类定义文件 Parameter.m 定义具有无约束属性类型的属性 GenericPropertycopyElement 方法指定 GenericProperty 的复制行为。当添加、删除或更改需要特殊复制行为的属性时,还必须确保更新 copyElement 方法。

如果使用 MATLAB 属性验证(请参阅验证属性值),而不是 PropertyType,则这些属性将在该类的属性对话框中显示为编辑字段。如果您使用 PropertyTypeAllowedValues,则会显示属性对话框:

  • 逻辑标量属性的复选框。

  • 字符向量和 AllowedValues 的下拉菜单。

可选:将初始化代码添加到数据类

您可以将构造函数添加您的数据类中以在实例化该类时执行初始化活动。添加的构造函数不能要求输入参量。

在此示例中,构造函数基于可选的输入参量初始化对象 obj 的值。

classdef Parameter < Simulink.Parameter
	methods
		function obj = Parameter(optionalValue)
			if (nargin == 1)
				obj.Value = optionalValue;
			end
		end
	end % methods
end % classdef

可选:定义存储类

使用 setupCoderInfo 方法来配置您的类的 CoderInfo 对象。然后,创建对 useLocalCustomStorageClasses 方法的调用并打开自定义存储类设计器。

  1. 在您的数据类内的构造函数中,调用 useLocalCustomStorageClasses 方法。

    classdef Parameter < Simulink.Parameter
    	methods
    		function setupCoderInfo(obj)
    			useLocalCustomStorageClasses(obj, 'mypkg');
    			
    			obj.CoderInfo.StorageClass = 'Custom';
    		end
    	end % methods
    end % classdef
    
  2. 为您的包打开自定义存储类设计器。

    cscdesigner('mypkg')
  3. 定义存储类。

可选:定义存储类的自定义属性

  1. 创建 MATLAB 文件 myCustomAttribs.m 并将其打开进行编辑。将此文件保存在 +mypkg/@myCustomAttribs 文件夹中,其中 +mypkg 是包含 @Parameter@Signal 文件夹的文件夹。

  2. 使用 MATLAB 类语法定义 Simulink.CustomStorageClassAttributes 的子类。例如,考虑一个存储类,它不仅使用原始标识符定义数据,还在生成的代码中提供数据的替代名称。

    classdef myCustomAttribs < Simulink.CustomStorageClassAttributes
    	properties(PropertyType = 'char')
    		AlternateName = '';
    	end
    end % classdef
    

  3. 覆盖 isAddressable 方法的默认实现以确定存储类是否可写。

    classdef myCustomAttribs < Simulink.CustomStorageClassAttributes
    		properties(PropertyType = 'logical scalar')
    			IsAlternateNameInstanceSpecific = true;
    		end
    		
    		methods
    			function retVal = isAddressable(hObj, hCSCDefn, hData)
    				retVal = false;
    			end
    		end % methods
    end % classdef
    
  4. 覆盖 getInstanceSpecificProps 方法的默认实现。

    有关示例,请参阅以下覆盖函数:

    function props = getInstanceSpecificProps(hObj)
        % GETINSTANCESPECIFICPROPERTIES  Return instance-specific properties
        %   (custom attributes that can be modified on each data object).
            
          if hObj.IsStructNameInstanceSpecific
            props = findprop(hObj, 'StructName');
          else
            props = [];
          end
        end
    function props = getInstanceSpecificProps(hObj)
        % GETINSTANCESPECIFICPROPERTIES  Return instance-specific properties
        %   (custom attributes that can be modified on each data object).
          props = [];
          
          if hObj.IsOwnerInstanceSpecific
              ptmp = findprop(hObj, 'Owner');
              props = [props; ptmp];
          end
          
          if hObj.IsDefinitionFileInstanceSpecific
              ptmp = findprop(hObj, 'DefinitionFile');
              props = [props; ptmp];
          end
          
          if hObj.IsPersistenceLevelInstanceSpecific
              ptmp = findprop(hObj, 'PersistenceLevel');
              props = [props; ptmp];
          end
        end

    注意

    这是可选步骤。默认情况下,所有自定义属性都特定于实例且对于每个数据对象来说都是可修改的。但是,您可以限制哪些属性可以是特定于实例的。

  5. 覆盖 getIdentifiersForInstance 方法的默认实现以定义数据类的对象的标识符。

    注意

    在其默认实现中,此方法查询数据对象的名称或标识符,并在生成的代码中使用该标识符。通过覆盖此方法,您可以控制生成的代码中您的数据对象的标识符。

    classdef myCustomAttribs < Simulink.CustomStorageClassAttributes
    	properties(PropertyType = 'char')
    		GetFunction = '';
    		SetFunction = '';
    	end
     
    	methods
    		function retVal = getIdentifiersForInstance(hCSCAttrib,...
     hCSCDefn, hData, identifier)
    			retVal = struct('GetFunction',...
     hData.CoderInfo.CustomAttributes.GetFunction, ...
    			'SetFunction', hData.CoderInfo.CustomAttributes.SetFunction);
    		end%
    	end % methods
    end % classdef
  6. 如果您正在使用已分组的存储类,请覆盖 getIdentifiersForGroup 方法的默认实现以指定在生成的代码中该组的标识符。

    有关示例,请在工作文件夹中,参阅文件夹 @CSCTypeAttributes_FlatStructure 中的 CSCTypeAttributes_FlatStructure.m

相关主题