【问题标题】:How do I modify this customized simscape block?如何修改这个自定义的 simscape 块?
【发布时间】:2015-07-01 17:06:33
【问题描述】:

我目前正在开发一个 simulink 模拟器,现在我正在尝试自定义一个 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

【问题讨论】:

    标签: matlab simulink simscape


    【解决方案1】:

    我的建议是删除这一行

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

    并将C_Table 的任何实例替换为Capacity

    【讨论】:

    • 我已按照您的建议进行了尝试,但我在函数设置上遇到错误:%检查参数值并执行容量表查找。我也尝试删除它们,但它仍然给我留下错误。
    • 原因:使用 MyBatteryBlocks.Em_tableMod 时出错>设置(第 43 行)“NetworkEngine.InputCompileData”类型的输入参数的未定义函数“值”。
    • 当我删除这些行时,我得到: 原因:使用 MyBatteryBlocks.Em_tableMod>equations 时出错(第 78 行)给函数参数提供了错误的可变性。
    • 我在没有温度的类似块上测试相同的输入,我让它工作,但我遇到的问题是我无法根据需要调整放电特性
    • 看起来查找表的参数必须定义为可变大小参数,您不能使用物理输入来参数化您的查找表。所以看起来你不能真正做你想做的,容量值必须是常数参数,它们不能是随时间变化的信号。对不起。
    【解决方案2】:

    这是我为操纵电池容量所做的,将 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
    

    【讨论】:

      猜你喜欢
      • 2017-09-03
      • 1970-01-01
      • 1970-01-01
      • 2018-06-28
      • 1970-01-01
      • 2019-12-26
      • 2019-05-23
      • 1970-01-01
      • 2011-11-09
      相关资源
      最近更新 更多