Dymola — непрерывный ввод для конечного автомата

#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, иначе произошла другая ошибка. Большое вам спасибо.