有沒有辦法從C結構的定義中創建一個Simulink總線?比方說,我有一個頭文件中的一些C結構的定義:如何從C.h文件中定義的typedef結構創建Simulink總線?
typedef struct {
double a, b;
} u_T;
我可以用它來自動生成一個Simulink.Bus
對象?
編輯:是否有產生創造Simulink.Bus
對象描述從.h
文件結構Matlab
代碼的工具嗎?
有沒有辦法從C結構的定義中創建一個Simulink總線?比方說,我有一個頭文件中的一些C結構的定義:如何從C.h文件中定義的typedef結構創建Simulink總線?
typedef struct {
double a, b;
} u_T;
我可以用它來自動生成一個Simulink.Bus
對象?
編輯:是否有產生創造Simulink.Bus
對象描述從.h
文件結構Matlab
代碼的工具嗎?
創建總線對象時可以導入標題,但這僅用於Simulink編碼器的代碼生成,不能用於Simulink的正常模擬。有關更多詳細信息,請參閱Simulink.Bus
上的文檔。
做你想做的事情的唯一方法是編寫一個解析器來讀取你的.h文件並在MATLAB工作區中創建一個總線對象。我不知道任何這樣的工具,我害怕。
這裏是一個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;
我希望它可以幫助...
這在MATLAB(2017A)的最新版本的支持。使用以下命令。
importInfo = Simulink.importExternalCTypes(headerFiles)
欲瞭解更多信息,請參閱:https://www.mathworks.com/help/simulink/slref/simulink.importexternalctypes.html
是的,我想這樣的解析器。我知道代碼生成的事情,但我已經有了.h文件(因爲我編寫了C S函數 - 我沒有生成它們),我需要與Simulink的代碼生成相反。 – remus
我想我會在Simulink的總線編輯器中定義所有總線結構,並通過代碼生成爲我的C S函數生成一個.h文件。 – remus