Это немного запутанная проблема, которая касается слегка открытого вопроса. Я понимаю, что StackOverflow не одобряет эту практику, но, как вы увидите, мне трудно разбить ее на более мелкие части.
У меня есть код C ++, который вызывается с использованием S-функции CMEX (скомпилирован с использованием legacy_code
). Я вручную изменил файл-обертку, чтобы сделать S-Fn непрерывным в незначительный шаг времени. Это важно, потому что, когда это было фиксированный на второстепенном этапе я бы увидел лестничное изменение в выходных данных функции вместо плавной линии. С тех пор, как она стала непрерывной, эта проблема была решена.
К сожалению, позже я обнаружил, что блоки памяти между входными сигналами и S-функцией (которую я использовал для решения алгебраических циклов) зафиксированы на небольшом временном шаге. Я ранее задавал вопрос (Вот) о том, были ли альтернативы мы непрерывно, но, кажется, вопрос был похоронен.
Так что вместо этого я сослался на этот Математическая документация. Они утверждают, что вектор PWork может использоваться для сохранения постоянных значений в памяти между последовательными вызовами S-функции. Я смог использовать этот вектор, чтобы сделать это:
1. Сохраните значения текущего временного шага для следующего шага
2. На следующем шаге используйте старые значения
3. После расчетов обновите старые значения до текущих.
4. Повторите
По сути, я повторил внутреннюю функциональность блока памяти. Я думал, что теперь могу удалить блоки памяти и заменить их блоком начальных условий. К сожалению, при этом появляется предупреждение об алгебраической петле. Теперь моя модель иногда решает, а иногда нет.
Два случая показаны ниже схематически:
S-Function
а также S-Function2
являются объектами CMEX.
Я думаю, что, возможно, функция CMEX плотный к диагностическому коду алгебраического цикла, и Simulink не может понять, что на самом деле не реальная алгебраическая петля, но только искусственный один?
Мой вопрос: есть ли что-то, что я могу сделать, чтобы сказать Simulink, что на самом деле это не алгебраическая петля? Есть ли какая-то лучшая практика для того, что делать в таких случаях?
* РЕДАКТИРОВАТЬ: Схема была неточной и не правильно представлял мою модель. Обновил это
Задача ещё не решена.