Как мне справиться с искусственными алгебраическими циклами, которые обнаруживает Simulink?

Это немного запутанная проблема, которая касается слегка открытого вопроса. Я понимаю, что StackOverflow не одобряет эту практику, но, как вы увидите, мне трудно разбить ее на более мелкие части.

У меня есть код C ++, который вызывается с использованием S-функции CMEX (скомпилирован с использованием legacy_code). Я вручную изменил файл-обертку, чтобы сделать S-Fn непрерывным в незначительный шаг времени. Это важно, потому что, когда это было фиксированный на второстепенном этапе я бы увидел лестничное изменение в выходных данных функции вместо плавной линии. С тех пор, как она стала непрерывной, эта проблема была решена.

К сожалению, позже я обнаружил, что блоки памяти между входными сигналами и S-функцией (которую я использовал для решения алгебраических циклов) зафиксированы на небольшом временном шаге. Я ранее задавал вопрос (Вот) о том, были ли альтернативы мы непрерывно, но, кажется, вопрос был похоронен.

Так что вместо этого я сослался на этот Математическая документация. Они утверждают, что вектор PWork может использоваться для сохранения постоянных значений в памяти между последовательными вызовами S-функции. Я смог использовать этот вектор, чтобы сделать это:
1. Сохраните значения текущего временного шага для следующего шага
2. На следующем шаге используйте старые значения
3. После расчетов обновите старые значения до текущих.
4. Повторите

По сути, я повторил внутреннюю функциональность блока памяти. Я думал, что теперь могу удалить блоки памяти и заменить их блоком начальных условий. К сожалению, при этом появляется предупреждение об алгебраической петле. Теперь моя модель иногда решает, а иногда нет.

Два случая показаны ниже схематически:

введите описание изображения здесь

S-Function а также S-Function2 являются объектами CMEX.

Я думаю, что, возможно, функция CMEX плотный к диагностическому коду алгебраического цикла, и Simulink не может понять, что на самом деле не реальная алгебраическая петля, но только искусственный один?

Мой вопрос: есть ли что-то, что я могу сделать, чтобы сказать Simulink, что на самом деле это не алгебраическая петля? Есть ли какая-то лучшая практика для того, что делать в таких случаях?

* РЕДАКТИРОВАТЬ: Схема была неточной и не правильно представлял мою модель. Обновил это

0

Решение

Задача ещё не решена.

Другие решения


По вопросам рекламы [email protected]