2015-04-23 121 views
2

我目前正在使用simulink模擬器,現在我正在嘗試自定義一個simscape模塊,以便我可以將參數作爲輸入而不是固定值。如何修改此自定義simscape塊?

我已經添加了容量輸入,但我不知道如何正確地將它傳播到C_Table,因爲它在生成庫塊時需要是1x3矢量。任何人都可以幫助我呢?

整個代碼塊的:

component Em_tableMod 
% Em_tableMod 
% This block implements the cell's main branch voltage source, and determines 
% values for capacity (C) and state of charge (SOC). The defining equations 
% depend on cell temperature, T. 

% Copyright 2012-2013 The MathWorks, Inc. 

    nodes 
     p = foundation.electrical.electrical; % +:left 
     n = foundation.electrical.electrical; % -:right 
    end 

    inputs 
     T = {293.15,'K'} % T:right 
     Capacity = {[0 0 0], 'A*hr'} % Cap:right 
    end 

    outputs 
     C = {31,'A*hr'} %C:left 
     SOC = {1,'1'} %SOC:left 
    end 

    parameters (Size=variable) 
     C_Table = {[1 1 1], 'A*hr'} % Capacity values at specified temperature breakpoints 
     Em_Table = {3.8*ones(5,3),'V'} % Matrix of voltage values, Em(SOC,T) 
     SOC_Table = {[0;0.1;0.5;0.9;1],'1'} % State of charge (SOC) breakpoints 
     Temp_Table = {[273.15 293.15 313.15],'K'} % Temperature (T) breakpoints 
    end 

    parameters 
     Qinit = {0,'A*hr'} % Initial charge deficit 
    end 

    variables(Access=private) 
     i = { 0, 'A' }; % Current 
     v = { 0, 'V' }; % Voltage 
     Qe = {0,'A*hr'}; % Charge deficit 
    end 

    function setup 

     % Check parameter values 
     if any(value(C_Table,'A*hr')<=0) 
      pm_error('simscape:GreaterThanZero','Capacity values at specified temperature breakpoints'); 
     end 
     if any(any(value(Em_Table,'V')<=0)) 
      pm_error('simscape:GreaterThanZero','Matrix of voltage values, Em(SOC,T)'); 
     end 
     if any(value(SOC_Table,'1')<0) 
      pm_error('simscape:GreaterThanOrEqualToZero','State of charge (SOC) breakpoints'); 
     end 
     if any(value(Temp_Table,'K')<0) 
      pm_error('simscape:GreaterThanOrEqualToZero','Temperature (T) breakpoints'); 
     end 
     if value(Qinit,'A*hr')<0 
      pm_error('simscape:GreaterThanOrEqualToZero','Initial charge deficit'); 
     end 

     % Set initial charge deficit 
     Qe = Qinit; 

    end 

    branches 
     i : p.i -> n.i; 
    end 

    equations 

     v == p.v - n.v; 

     % Charge deficit calculation, preventing SOC>1 
     if Qe<0 && i>0 
      Qe.der == 0; 
     else 
      Qe.der == -i; 
     end 

     % Perform the capacity table lookup 
     C == tablelookup(Temp_Table,C_Table,T,... 
      interpolation=linear,extrapolation=nearest) 

     % SOC Equation 
     SOC == 1 - Qe/C; 

     % Electrical equation by table lookup 
     v == tablelookup(SOC_Table,Temp_Table,Em_Table,SOC,T,... 
      interpolation=linear,extrapolation=nearest) 

    end 

end 

回答

0

我的建議是,刪除這條線

C_Table = {[1 1 1], 'A*hr'} % Capacity values at specified temperature breakpoints 

Capacity取代C_Table任何實例。

+0

如你所說,但我得到的功能設置錯誤,我曾嘗試:%校驗參數值和執行%容量表查找。我也嘗試刪除他們兩個,但它仍然留下了我的錯誤。 – RoyHau

+0

你得到了什麼錯誤信息? – am304

+0

導致: 使用MyBatteryBlocks.Em_tableMod> setup(第43行)時出錯 未定義的函數'值'用於類型爲'NetworkEngine.InputCompileData'的輸入參數。 – RoyHau

0

這是我所做的操縱電池容量,將c設置爲輸入而不是輸出。在底部刪除C_table和容量表查找的所有實例,以防止設置兩個實例c。 這有效地防止了由於溫度引起的容量變化的計算,但是我發現在這一點上這對我來說只是一個小小的不便。

下面是功能塊代碼:

component Em_tableMod 
% Em_tableMod 
% This block implements the cell's main branch voltage source, and determines 
% values for capacity (C) and state of charge (SOC). The defining equations 
% depend on cell temperature, T. 

% Copyright 2012-2013 The MathWorks, Inc. 

    nodes 
     p = foundation.electrical.electrical; % +:left 
     n = foundation.electrical.electrical; % -:right 
    end 

    inputs 
     C = {1,'A*hr'} % Cap:right 
     T = {293.15,'K'} % T:right 
    end 

    outputs 
     SOC = {1,'1'} %SOC:left 
    end 

    parameters (Size=variable) 
     Em_Table = {3.8*ones(5,3),'V'} % Matrix of voltage values, Em(SOC,T) 
     SOC_Table = {[0;0.1;0.5;0.9;1],'1'} % State of charge (SOC) breakpoints 
     Temp_Table = {[273.15 293.15 313.15],'K'} % Temperature (T) breakpoints 

    end 

    parameters 
     Qinit = {0,'A*hr'} % Initial charge deficit 
    end 

    variables(Access=private) 
     i = { 0, 'A' }; % Current 
     v = { 0, 'V' }; % Voltage 
     Qe = {0,'A*hr'}; % Charge deficit 
    end 
    function setup 

     % Check parameter values 
     if any(any(value(Em_Table,'V')<=0)) 
      pm_error('simscape:GreaterThanZero','Matrix of voltage values, Em(SOC,T)'); 
     end 
     if any(value(SOC_Table,'1')<0) 
      pm_error('simscape:GreaterThanOrEqualToZero','State of charge (SOC) breakpoints'); 
     end 
     if any(value(Temp_Table,'K')<0) 
      pm_error('simscape:GreaterThanOrEqualToZero','Temperature (T) breakpoints'); 
     end 
     if value(Qinit,'A*hr')<0 
      pm_error('simscape:GreaterThanOrEqualToZero','Initial charge deficit'); 
     end 

     % Set initial charge deficit 
     Qe = Qinit; 

    end 

    branches 
     i : p.i -> n.i; 
    end 

    equations 

     v == p.v - n.v; 

     % Charge deficit calculation, preventing SOC>1 
     if Qe<0 && i>0 
      Qe.der == 0; 
     else 
      Qe.der == -i; 
     end 



     % SOC Equation 
     SOC == 1 - Qe/C; 

     % Electrical equation by table lookup 
     v == tablelookup(SOC_Table,Temp_Table,Em_Table,SOC,T,... 
      interpolation=linear,extrapolation=nearest) 

    end 

end