#state #continuous #modelica #dymola
#состояние #непрерывный #modelica #dymola
Вопрос:
При попытке использовать конечные автоматы в Dymola (кстати: я абсолютный новичок) У меня возникли проблемы с объявлением синусоидальной кривой в качестве входной переменной. Я получаю следующее 1-е сообщение об ошибке (я вставляю только начало):
Continuous time parts and discrete parts don't decompose for:
_StateMachines.state1.activeReset
_StateMachines.state1.act...
и 2-й:
Decomposition in base clocks failed.
See the file dsmodelBaseClockDecomposition.mof.
Я понимаю, что проблема вызвана попыткой использовать непрерывную временную переменную, а именно синусоидальную функцию, в качестве входных данных для дискретного блока, а именно конечного автомата.
Как я могу подключить синусоидальную функцию к конечному автомату?
Редактировать:
Мой код выглядит так (я удалил аннотации):
model ZLG3_v2 "2nd Version of ZLG3"
inner Real T_2(start=283);
Real T_ZuL(start=295);
model State1
outer output Real T_2;
equation
T_2=previous(T_2) 2;
end State1;
State1 state1;
model State3
outer output Real T_2;
equation
T_2=previous(T_2)-1;
end State3;
State3 state3;
Modelica.Blocks.Sources.Sine sine(freqHz=0.25, offset=305);
equation
//T_ZuL = 295;
T_ZuL=sine.y;
initialState(state1);
transition(
state3,
state1,T_2 <= T_ZuL,
immediate=false,
reset=true,
synchronize=false,
priority=1);
transition(
state1,
state3,T_2 > T_ZuL,
immediate=false,
priority=1,
reset=true,
synchronize=false);
end ZLG3_v2;
Две строки
//T_ZuL = 295;
T_ZuL=sine.y;
представляют интерес. Используя (в настоящее время не прокомментированное) уравнение с синусом.y появляется сообщение об ошибке. Наоборот, все работает просто отлично.
Заранее большое вам спасибо и наилучшие пожелания.
Ответ №1:
Что ж, проблема заключается в предполагаемых тактовых импульсах, которые вы должны указать, в противном случае вы используете непрерывный сигнал (sine.y) в дискретном конечном автомате, который имеет свои собственные дискретные тактовые импульсы. Для выборки сигнала sin с тактовой частотой конечного автомата достаточно блока выборки:
model ZLG3_v3 "3rd Version of ZLG3"
inner Real T_2(start=283);
State1 state1;
State2 state2;
Modelica.Blocks.Logical.Greater greater;
Modelica.Blocks.Sources.RealExpression realExpression(y=T_2);
Modelica.Blocks.Sources.Sine sin(y(start=295),freqHz=0.25, offset=305);
Modelica_Synchronous.RealSignals.Sampler.Sample sample;
model State1
outer output Real T_2;
equation
T_2=previous(T_2) 2;
end State1;
model State2
outer output Real T_2;
equation
T_2=previous(T_2)-1;
end State2;
equation
transition(
state2,
state1,greater.y,immediate=true,reset=true,synchronize=false,priority=1);
transition(
state1,
state2,not greater.y,immediate=true,reset=true,synchronize=false,priority=1);
connect(realExpression.y, greater.u2);
connect(sin.y, sample.u);
connect(sample.y, greater.u1);
end ZLG3_v3;
Редактировать:
Я заметил, что существует проблема с самим конечным автоматом, ниже приведен снимок конечного автомата с тем же реальным входным сигналом, что и триггер для переходов, который не проверяет ошибки и имитирует:
Комментарии:
1. Спасибо за ответ! Решение работает нормально. Я только должен добавить, что строка ‘initialState (state1);’ в части уравнения отсутствует, и мне пришлось немедленно установить значение false, иначе произошла другая ошибка. Большое вам спасибо.