2015-04-23 118 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