1
votes

I'm trying to implement a matlab class into a simulink MATLABSystem. When I implement superclass, the simulation works fine, but using the subclass I get the following error:

"Simulink cannot automatically infer the output signal properties of 'subclassSystem'. Simulink uses code generation technology to automatically determine the output signal properties from the System object. The System object 'subclass' contains code that does not support code generation. The error is 'Undefined function or variable 'obj'. The first assignment to a local variable determines its class.' The error occurred for MATLAB System block 'subclassSystem'. See line 29, column 28 in file 'superclass.m'. The error was detected during size propagation phase."

I commented this line in the code below

Do I have to specify something additional?

Here the subclass definition:

classdef subclass < superclass
    properties(Access = protected) % These variables must be initialised. Here or in the setupImpl function
    end

    methods (Access=protected)
        function resetImpl(obj)
        end

        %% Common functions
        function setupImpl(obj)
            % Perform one-time calculations, such as computing constants
            setupImpl@superclass();
            %obj.initFilter(obj.sampleTime, obj.delta_i, obj.delta_d, obj.g_mps2, obj.q0, obj.b_w0, obj.sigma_2_w, obj.sigma_2_a, obj.sigma_2_b_w, obj.sigma_2_yaw)
        end

        function attitude = stepImpl(obj,u, y)
            % Implement algorithm.
            attitude = 5;
        end
    end

    methods

        % Constructor must be empty for matlab.System. In Matlab call
        % initFilter after the object was created. In simulink setupImpl()
        % will be called
        function obj = subclass()
            obj@superclass();
        end
    end

end

Here the superclass definition:

classdef superclass < matlab.System


    % These variables must be initialized in the simulink model
    properties
        sigma_2_w;
        sigma_2_a;
        sigma_2_b_w;
        sigma_2_yaw;
    end

    properties(Access = protected) % These variables must be initialised. Here or in the setupImpl function
        R;
        Q;
    end

    methods (Access = protected)

        function resetImpl(obj)
        end

        %% Common functions
        function setupImpl(obj)
            % Perform one-time calculations, such as computing constants
            obj.Q  = diag([obj.sigma_2_w',obj.sigma_2_b_w']); % this is line 29
            obj.R = diag([obj.sigma_2_a',obj.sigma_2_yaw']); 
        end

        function attitude = stepImpl(obj,u, y)
            % Implement algorithm.
            attitude = 5;
        end
    end

    methods

        % Constructor must be empty for matlab.System. In Matlab call
        % initFilter after the object was created. In simulink setupImpl()
        % will be called
        function obj = superclass()
             % Support name-value pair arguments when constructing object
        end
    end
end
1
What happens if you don't have a constructor at all?Phil Goddard

1 Answers

0
votes

I found the error. In the setupImpl function of the subclass I had to call setupImpl of the superclass with the obj as argument:

setupImpl@Superclass(obj);

This is my constructor. Here I didn't use the obj as return value

function obj = Subclass()
    obj = obj@Superclass();
end