如何从C .h文件中定义的typedef结构创建Simulink总线?

时间:2013-11-28 20:09:28

标签: c matlab simulink

有没有办法从C结构的定义创建Simulink总线?我们假设我在头文件中有一些C结构定义:

typedef struct {
  double a, b;
} u_T;

我可以使用它来自动生成Simulink.Bus对象吗?

修改:是否有工具生成Matlab代码,用于创建描述Simulink.Bus文件中结构的.h个对象?

3 个答案:

答案 0 :(得分:2)

最新版本的MATLAB(2017a)支持此功能。使用以下命令。

importInfo = Simulink.importExternalCTypes(headerFiles)

有关详细信息,请参阅:https://www.mathworks.com/help/simulink/slref/simulink.importexternalctypes.html

答案 1 :(得分:1)

您可以在创建总线对象时导入标头,但这仅用于使用Simulink Coder生成代码,而不是用于使用Simulink进行正常模拟。有关详细信息,请参阅Simulink.Bus上的文档。

执行所需操作的唯一方法是编写一个解析.h文件的解析器,并在MATLAB工作区中创建一个总线对象。我不知道有什么这样的工具。

答案 2 :(得分:0)

这是一个MATLAB脚本:

filename = 'Test3.h';
fid = fopen(filename);
tline = fgetl(fid);
i = 1;
while ischar(tline)
    % Search for structs
    if any(strfind(tline,'typedef struct'))
        tline = fgetl(fid);
        % Get elements
        while ~any(strfind(tline,'}'))
            % Create Element
            el(i) = Simulink.BusElement;
            c = regexp(tline,'(\w*) (\w*);','tokens');
            % Element Name
            el(i).Name = c{1,1}{1,2};
            % Element Data type
            switch c{1,1}{1,1}
                case 'float'
                    el(i).DataType = 'single';
                case 'int8_t'
                    el(i).DataType = 'int8';
                case 'uint32_t'
                    el(i).DataType = 'uint32';
                % Add unknown Data types as cases here 
                otherwise
                    el(i).DataType = ['Bus: ',c{1,1}{1,1}];
            end
            i = i+1;
            tline = fgetl(fid);
        end

        % Get struct name
        c = regexp(tline,'} (\w*);', 'tokens');
        % Create bus
        eval([c{1,1}{1,1},' = Simulink.Bus;']);
        % Assign elements
        eval([c{1,1}{1,1},'.Elements = el;']);
        % Assign Header file
        eval([c{1,1}{1,1},'.HeaderFile = ''',filename,''';']);
        clear el; i = 1;
    end
    tline = fgetl(fid);
end
fid = fclose(fid);
clear c fid filename i tline;

我希望它有所帮助...