2013-11-28 43 views
3

有沒有辦法從C結構的定義中創建一個Simulink總線?比方說,我有一個頭文件中的一些C結構的定義:如何從C.h文件中定義的typedef結構創建Simulink總線?

typedef struct { 
    double a, b; 
} u_T; 

我可以用它來自動生成一個Simulink.Bus對象?

編輯:是否有產生創造Simulink.Bus對象描述從.h文件結構Matlab代碼的工具嗎?

回答

0

創建總線對象時可以導入標題,但這僅用於Simulink編碼器的代碼生成,不能用於Simulink的正常模擬。有關更多詳細信息,請參閱Simulink.Bus上的文檔。

做你想做的事情的唯一方法是編寫一個解析器來讀取你的.h文件並在MATLAB工作區中創建一個總線對象。我不知道任何這樣的工具,我害怕。

+0

是的,我想這樣的解析器。我知道代碼生成的事情,但我已經有了.h文件(因爲我編寫了C S函數 - 我沒有生成它們),我需要與Simulink的代碼生成相反。 – remus

+0

我想我會在Simulink的總線編輯器中定義所有總線結構,並通過代碼生成爲我的C S函數生成一個.h文件。 – remus

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; 

我希望它可以幫助...

相關問題