首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何修改这个定制的simscape块?

如何修改这个定制的simscape块?
EN

Stack Overflow用户
提问于 2015-04-23 13:19:09
回答 2查看 1.4K关注 0票数 2

我目前正在一个simulink模拟器上工作,现在我正在尝试定制一个simscape块,这样我就可以获得一个参数作为输入,而不是一个固定的值。

我已经添加了容量输入,但是我不知道如何正确地将其传播到C_Table,因为在生成库块时,它需要是1x3向量。有人能帮我吗?

整个块的代码:

代码语言:javascript
复制
 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
EN

回答 2

Stack Overflow用户

发布于 2015-04-23 14:08:41

我的建议是删除这一行

代码语言:javascript
复制
 C_Table = {[1 1 1], 'A*hr'} % Capacity values at specified temperature breakpoints

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

票数 0
EN

Stack Overflow用户

发布于 2015-04-27 08:18:35

以下是我在操作电池容量时所做的工作,将c设置为输入而不是输出。删除所有的C_table实例和底部的容量表查找,以防止设置c的两个实例。这有效地防止了由于温度而导致的容量变化的计算,但我发现这在这一点上对我来说只是一个小小的不便。

以下是功能块代码:

代码语言:javascript
复制
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
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29824703

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档