Каков теоретический способ написать i ++ в Dymola? А есть гибридная непрерывная и дискретная модели?

Я только начал изучать modelica и у меня есть один (новичок) вопрос. Проблема для меня в том, чтобы изменить образ мышления с обычного программирования на модельный.

Я хочу сделать простую программу. У меня есть входной массив с выходными значениями PV с разрешением 5 минут. У меня есть входной массив со значениями тепловой нагрузки с разрешением 60 минут. У меня есть накопитель энергии, который накапливает избыточную энергию или забирает энергию для удовлетворения потребности в тепле в режиме реального времени.

Я написал это в openmodelica:

`class Add
 Real PV[:] = 100:10:1000;
 Real Heat[:] = 200:300:6000;
 Real Storage;
 Real p;
 Integer j;
 Integer i;
 Boolean power,heat;
 equation
 power=sample(0,5);
 heat=sample(0,60);
 when power then
 j=j+1;
end when;

when heat then
i=i+1;

end when;

Storage= PV[j] * 2.375-Heat[i];

p=Storage+ pre(p);

end Add;`

Но когда я перехожу к dymola, он получает ошибку в этой части «p = Storage + pre (p);», потому что в нем говорится, что pre () не может использоваться для непрерывной модели. Когда я удаляю pre (), он говорит, что не может делиться на 0.

Вы можете мне объяснить, что я делаю не так?

Спасибо!


person bmorvaj    schedule 10.02.2014    source источник
comment
Совершенно непонятно, что вы пытаетесь сделать. Вы хотите, чтобы p был непрерывным или дискретным? Вы пытаетесь интегрировать p или что-то в этом роде. Было бы лучше, если бы вы включили несколько уравнений.   -  person Michael Tiller    schedule 11.02.2014
comment
Я хочу, чтобы хранилище было продлено. На самом деле мне не нужна переменная p, но именно так она сработала для меня. Я хочу сказать Storage = Storage + PV [j] -Heat [j] Это основная проблема: • Дискретный ряд требований к теплу, предполагаемый постоянным в течение каждого периода времени (1 час) • Дискретный ряд вводов, например, генерация pv, снова постоянная в течение каждого периода, но с другим периодом (5 мин) • Уравнение непрерывного преобразования • Срок непрерывного хранения У меня нет точного уравнения для хранения. Я просто хочу имитировать непрерывную зарядку или разрядку энергии с помощью входов, которые продолжаются, но меняются в определенное время.   -  person bmorvaj    schedule 11.02.2014
comment
На самом деле это не объясняет, но я думаю, что marcu1000s сделал правильное предположение. Что вы хотите сделать, так это интегрировать тепловую мощность с течением времени, чтобы определить общее количество потребляемой энергии. По крайней мере, это то, что сделал marcu1000s (очень красиво), и я почти уверен, что это то, что вам нужно.   -  person Michael Tiller    schedule 12.02.2014


Ответы (1)


Надеюсь, я правильно понял вашу проблему. И я использовал Dymola для решения простого примера - надеюсь, это работает и в OpenModelica.

Если вы пытаетесь использовать временные ряды входных данных, я бы предложил использовать модель Modelica.Blocks.Sources.TimeTable. В вашем случае первый столбец таблицы будет обозначать почасовые временные интервалы, то есть 0, 3600, 7200, ...; во втором столбце могут быть указаны значения потребности в тепле в кВт, если она постоянна на уровне 300 кВт, как в вашем примере, это может означать 300, 300, 300, ...;

Вы можете ссылаться на выходные данные модели TimeTable в уравнениях, используя ее RealOutput как TimeTable.y.

Таким образом, очень простой пример для вашего тестового случая может выглядеть так:

model heatStorage

  Modelica.SIunits.Conversions.NonSIunits.Energy_kWh storage "Energy content of storage in kWh";

  Modelica.Blocks.Sources.TimeTable solarThermal(table=[0,50; 3600,70; 7200,40; 10800,73]);
  Modelica.Blocks.Sources.TimeTable heatDemand(table=[0,300; 3600,300; 7200,300; 10800,
    300]);

equation
  der(storage) = (solarThermal.y - heatDemand.y)/3600;

end heatStorage;

Я предположил, что мощность солнечного теплового коллектора изменяется во времени. Если вы используете PV для нагрева воды, вы можете включить другую переменную и уравнение преобразования. Для переменной storage я использовал определение энергии в кВтч, поэтому я делю данное уравнение на 3600. Поскольку Modelica основана на уравнениях, запись der(storage) равносильна интегрированию правой части уравнения. Таким образом, вычисленное значение для storage является интегралом разницы между вводом и выводом.

Надеюсь, это поможет.

person marcu1000s    schedule 12.02.2014
comment
Хороший ответ. Я тоже так подозревал. - person Michael Tiller; 12.02.2014
comment
Большое тебе спасибо. Это начальная информация, которую я искал. - person bmorvaj; 12.02.2014
comment
Я рад, что смог помочь. Как показывает этот пример, и вы сами сказали в своем вопросе, Modelica иногда требует, чтобы вы думали немного иначе по сравнению с другим программированием. И спасибо, Майкл, за добрые слова в адрес моего решения. - person marcu1000s; 13.02.2014