Как создать расширяемый журнал в Simulink-е
11.02.2020
Здравствуйте!
Помогите, пожалуйста, разобраться с задачей:
необходимо создать пополняемый журнал, в который нужно записывать результаты отработки некоторой функции на каждом шаге моделирования. Количество шагов ограничено, но заранее не известно.
Пробовал обратную связь с буфером задержки на 1 такт. Но т.к. размер журнала постоянно должен увеличиваться, при компиляции выдается ошибка размерности.
Пробовал создать глобальную переменную, но не получается создать структуру переменного объёма.
Какие еще м.б. варианты. Посоветуйте, пожалуйста, решение!
Работаю в Simulink-е недавно.
Ответы
Думается, что в зависимости от конкретики подходы м.б. разные. В зависимости от того что такое "журнал", и что такое "результат обработки нек.ф-ции".
Можно на блоках симулинка сделать - а затем в workspace.
"результат обработки нек.функции" -- это характеристики новой заявки.
"Журнал" -- фиксация поступивших заявок.
Поля журнала:
ID -- идентификатор записи (уникальный);
D -- данные записи (пока фиксированная структура, напр.: классиф1, классиф2, оценка).
На старте -- журнал пустой.
На каждом такте моделирования могут формироваться несколько заявок (по Пуассону).
Каждая нова заявка должна фиксироваться в журнале (напр. последней записью).
Затем журнал поступает на следующую обработку, где по классификаторам дополняется поле "оценка".
SimEvents? Лучше покажите модель, проще будет понять.
Пытаюсь в симулинке из функции дополнять глобальную структуру d_gl, дописывая "в конец журнала" новую запись, выполняя примерно следующее:
Но не получается создать в симулинке глобальную структуру d_gl
И что, вы на каждом шаге вызываете эту функцию?? Для каких целей вам глобальная структура? Пока вы не выложите проект целиком, вам не скажут, в чем конкретно ошибка.
Вообще на вашем месте я бы наверно писал структуру блоком To Workspace (раз уж вам нужна именно структура), и потом постобработкой выбирал нужные значения.
На каждом шаге выполняется последовательность действий:
сначала генерируется количество заявок;
затем, заявки классифицируются;
затем,классифицированные заявки обрабатываются.
Решение с глобальной переменной выбрал потому, что не смог сделать обратной связи для структуры переменного объема (т.е. для журнала заявок, пополняемого и расширяемого на кахдом такте моделируемого месяца).
Изначально задача была "сделать дополняемый журнал (по горизонтали и по вертикали)".
Как вам уже все здесь написали, никто не понимает, что вы делаете. Просто покажите модель, и может кто-нибудь подскажет.
Модель большая. Всю её показать -- дольше объяснять что к чему.
Поэтому спросил про непонятную для меня в реализации часть...
В общей постановке, задача в следующем:
1. Моделируется помесячная активность процесса;
2. На каждом такте моделирования (1 усл.мес.) формируется случ.количество случ. событий;
3. События заносятся в журнал учёта, где каждое событие -- новая строчка журнала.
4.По каждому событию проводится его обработка (в рамках след.моделируемого такта) с фиксацией итогов в строчке журнала, относящейся к событию.
Аналог -- журнал регистрации входящей корреспонденции.
Пришли новые письма -- их сначала занесли в журнал входящих.
Потом, когда назначили ответственных исполнителей, дописали ФИО в соответстсвующие строчки с ранее зарегистрированными письмами.
Получается, что такой журнал имеет переменный объем, и Simulink-у это ненравится.
Может кто сталкивался с подобными задачами, или знает, как такие задачи можно решить с учётом возможностей и ограничений Simulink-а!?
PS
Посмотрел предложение использовать запись "To Workspace".
К сожалению, данные "на лету" при этом не доступны ("Data is not available until the simulation pauses or stops."). Поэтому пригодилось только для сохранения "журнала" для анализа по итогам моделирования.
Я думаю, эта задача легко решается библиотекой SimEvents, о которой писал @Роман Мнев.
Вот здесь ее краткое описание: https://exponenta.ru/simevents#klyuchevye-vozmozhnosti
И вот здесь документация с примерами: https://docs.exponenta.ru/simevents/index.html
Спасибо, материалы по SimEvents посмотрел. Некоторые элементы SimEvents я, в последующем, наверное смогу поиспольовать для своей задачи, но пока, к сожалению, не понял, как решать задачу в топике.
Возможно, постановка задачи допускает многовариантность.
Но хотя бы один рабочий вариант хотелось бы рассмотреть!