У меня есть несколько комментариев. Я думаю, что вы просматриваете событие, когда активируются уравнения в предложении when. Но это не совсем правильно. Событие происходит, когда изменяется значение дискретной переменной. Дело в том, что непрерывный интегратор должен быть остановлен в этой точке, а уравнения интегрированы с новым значением.
Чтобы понять, как это влияет на вас в этом случае, вам следует учесть, что анонимное выражение (например, в ваших предложениях when), вероятно, рассматривается как анонимная дискретная переменная. Другими словами, вы можете думать об этом как об эквивалентном:
Boolean c1 = VGrid > VMax;
when c1 then
...
end when;
... и важно отметить, что событие (то есть изменение значения c1
) происходит как тогда, когда VGrid
становится больше, чем VMax
, так и когда оно становится меньше, чем VMax
. Теперь рассмотрим это:
Boolean c1 = VGrid > VMax;
Boolean c2 = time > pre(restartTime);
when {c1, c2} then
...
end when;
Теперь у вас есть еще больше событий, потому что задействованы два условия, и вы генерируете события каждый раз, когда одно из них меняет значение.
После всего сказанного, у вас действительно есть проблемы с производительностью? Обычно такие события становятся проблемой только при «болтовне» (случаи, когда значение условия меняет знак из-за числового шума в процессе интеграции). У вас есть какие-либо цифры, чтобы указать, насколько серьезными являются эти события? Также может помочь узнать, какой инструмент вы используете для симуляции этих вещей.
Наконец, из вашей логики я не понимаю, что произойдет, если VGrid> VMax, а затем, после timeOff, VGrid по-прежнему превосходит VMax?
Предполагая, что он правильно обрабатывает этот последний случай, я думаю, что PVControl2 на самом деле то, что вы хотите (и генерирует именно то количество событий, которое я ожидал, и по причинам, которые я ожидал).