• Регистрация
Alex_K
Alex_K 0.00
н/д

Как создать расширяемый журнал в Simulink-е

11.02.2020

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

Пробовал обратную связь с буфером задержки на 1 такт. Но т.к. размер журнала постоянно должен увеличиваться, при компиляции выдается ошибка размерности.

Пробовал создать глобальную переменную, но не получается создать структуру переменного объёма.

Какие еще м.б. варианты. Посоветуйте, пожалуйста, решение!

Работаю в Simulink-е недавно.

Теги

      11.02.2020

      Ответы

      • aBoomest
        aBoomest+942.89
        11.02.2020 08:32

        Думается, что в зависимости от конкретики подходы м.б. разные. В зависимости от того что такое "журнал", и что такое "результат обработки нек.ф-ции".
        Можно на блоках симулинка сделать - а затем в workspace.

        • Alex_K
          Alex_K0.00
          11.02.2020 09:44

          "результат обработки нек.функции" -- это характеристики новой заявки.
          "Журнал" -- фиксация поступивших заявок.
          Поля журнала:
            ID -- идентификатор записи (уникальный);
             D -- данные записи (пока фиксированная структура, напр.: классиф1, классиф2, оценка).
          На старте -- журнал пустой.
          На каждом такте моделирования могут формироваться несколько заявок (по Пуассону).
          Каждая нова заявка должна фиксироваться в журнале (напр. последней записью).
          Затем журнал поступает на следующую обработку, где по классификаторам дополняется поле "оценка".

        • Роман Мнев
          Роман Мнев +38.96
          11.02.2020 12:55

          SimEvents? Лучше покажите модель, проще будет понять.

          • Alex_K
            Alex_K0.00
            11.02.2020 13:46

            Пытаюсь в симулинке из функции дополнять глобальную структуру d_gl, дописывая "в конец журнала" новую запись, выполняя примерно следующее:

            function d_new = d_upgr(takt_Cnt, val)
             
            global d_gl;
             
            d_gl(takt_Cnt).id = takt_Cnt;
            d_gl(takt_Cnt).d  = val;
             
            d_new = 1;

            Но не получается создать в симулинке глобальную структуру d_gl

            • kurguz
              kurguz+270.00
              12.02.2020 18:10

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

              Вообще на вашем месте я бы наверно писал структуру блоком To Workspace (раз уж вам нужна именно структура), и потом постобработкой выбирал нужные значения.

              • Alex_K
                Alex_K0.00
                12.02.2020 19:00

                На каждом шаге выполняется последовательность действий:
                сначала генерируется количество заявок;
                затем, заявки классифицируются;
                затем,классифицированные заявки обрабатываются.
                Решение с глобальной переменной выбрал потому, что не смог сделать обратной связи для структуры переменного объема (т.е. для журнала заявок, пополняемого и расширяемого на кахдом такте моделируемого месяца).
                Изначально задача была "сделать дополняемый журнал (по горизонтали и по вертикали)".

                • kurguz
                  kurguz+270.00
                  12.02.2020 19:18

                  Как вам уже все здесь написали, никто не понимает, что вы делаете. Просто покажите модель, и может кто-нибудь подскажет.

                  • Alex_K
                    Alex_K0.00
                    12.02.2020 20:53

                    Модель большая. Всю её показать -- дольше объяснять что к чему.
                    Поэтому спросил про непонятную для меня в реализации часть...
                    В общей постановке, задача в следующем:
                    1. Моделируется помесячная активность процесса;
                    2. На каждом такте моделирования (1 усл.мес.) формируется случ.количество случ. событий;
                    3. События заносятся в журнал учёта, где каждое событие -- новая строчка журнала.
                    4.По каждому событию проводится его обработка (в рамках след.моделируемого такта) с фиксацией итогов в строчке журнала, относящейся к событию.

                    Аналог -- журнал регистрации входящей корреспонденции.
                    Пришли новые письма -- их сначала занесли в журнал входящих.
                    Потом, когда назначили ответственных исполнителей, дописали ФИО в соответстсвующие строчки с ранее зарегистрированными письмами.

                    Получается, что такой журнал имеет переменный объем, и Simulink-у это ненравится.

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

                    PS
                    Посмотрел предложение использовать запись "To Workspace".
                    К сожалению, данные "на лету" при этом не доступны ("
                    Data is not available until the simulation pauses or stops."). Поэтому пригодилось только для сохранения "журнала" для анализа по итогам моделирования.

                    • kurguz
                      kurguz+270.00
                      13.02.2020 10:14

                      Я думаю, эта задача легко решается библиотекой SimEvents, о которой писал @Роман Мнев. 

                      Вот здесь ее краткое описание: https://exponenta.ru/simevents#klyuchevye-vozmozhnosti

                      И вот здесь документация с примерами: https://docs.exponenta.ru/simevents/index.html

                      • Alex_K
                        Alex_K0.00
                        13.02.2020 18:24

                        Спасибо, материалы по SimEvents посмотрел. Некоторые элементы SimEvents я, в последующем, наверное смогу поиспольовать для своей задачи, но пока, к сожалению, не понял, как решать задачу в топике.
                        Возможно, постановка задачи допускает многовариантность.
                        Но хотя бы один рабочий вариант хотелось бы рассмотреть!