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

Предисловие

Simulink широко используется в промышленном моделировании и проектировании систем управления. Он прост в использовании для профессионалов в области промышленного управления и моделирования, но особенно сложен в эксплуатации и использовании для клиентов, которые не выполняют моделирование научных исследований. Обычные пользователи часто Требуется хороший интерактивный опыт и визуализация изображений. Использование общей памяти позволяет обмениваться данными между различными прикладными программами, а сигнал моделирования Simulink передается в стороннее программное обеспечение для визуализации, такое как программное обеспечение с хорошей визуализацией, такое как эффекты трехмерной анимации и двухмерные кривые, написанные на C #. В то же время вы также можете добавить некоторые хорошо визуализированные элементы управления в стороннее программное обеспечение и использовать общую память для передачи в MATLAB / Simulink, чтобы управлять работой MATLAB / Simulink.
Это сообщение в блоге дает некоторые справочные значения для инженеров, которые проектируют эффекты анимации, подобные программному обеспечению Prescan.Первое условие заключается в том, что программное обеспечение Prescan основано на платформе Simulink, а Prescan используется для моделирования сцены транспортного средства и вспомогательной проверки стратегии вождения на платформе Simulink. может передавать сигнал моделирования Simulink стороннему программному обеспечению и использовать механизм 3D-модели для получения эффекта отображения анимации, который значительно обогащает визуализацию программного обеспечения.
Все программы и модели Simulink, используемые в этом блоге, можно скачать во вложении в конце статьи.

Как Simulink вызывает функции C

Способ, которым Simulink использует разделяемую память, заключается в вызове функций C и C ++, которые могут манипулировать разделяемой памятью; мы можем начать с того, как Simulink вызывает функции C для реализации этого процесса.Существует три основных способа для Simulink вызывать функции C:
1. Самый простой использует модуль C Call, предоставленный в библиотеке модулей Simulink, который можно использовать в версии MATLAB 2020a (предполагается, что модуль будет поддерживаться в будущих версиях), но этот метод не может защитить исходный код. выпущен, исходный код также должен быть приложен.
2. Используйте поток состояний для вызова функций C. Этот метод очень подходит для моделирования конечного автомата, и существует необходимость в вызове функций C. При использовании общей памяти он может решить выполнение записи и чтения памяти при вызове общей памяти. Последовательность , и поток состояний можно использовать для создания лучшей последовательности вызовов. Настоятельно рекомендуется использовать этот метод для управления общей памятью.
3. Используя функцию S, этот метод может полностью настроить работу функции общей памяти, но этот метод требует написания CS MEX. Как правило, пользователи, которые не знакомы с функциями C и пишут модули S, не дружелюбны.

Интерактивная реализация Simulink и прикладной программы

В соответствии с размером шага, установленным решателем, Simulink выполняет модель один раз для каждого шага.Поэтому, если вы используете Simulink для вызова функции C, при условии, что частота дискретизации фиксирована, а время выборки модели, вызывающей C функция наследуется, каждый раз, когда Simulink передает размер шага A, выполняйте функцию C снова и снова. Для презентации решающая программа Simulink по умолчанию - это фиксированный размер шага ниже.

1. Функции C работают с общей памятью

Используйте функцию открытия пространства памяти, предоставляемую окнами, вызовите следующую функцию, чтобы открыть пространство памяти. Эта функция также может быть вызвана сценарием m MATLAB.

/**************************************************************************
* Function open_shared_memory()
* Goal  : Creation of a memory-mapped file to share data between 2 processes
* IN    : -
* IN/OUT: -
* OUT   : - Error status in integer coded as following:
*          > 0 => No error occurred and the shared memory has been created
*          > 1 => The process could not create the memory-mapped file object
*          > 2 => The process could not return a pointer to the file view
**************************************************************************/
int open_shared_memory()
{
    
    
  /* Definition of the handle to the memory-mapped file object */
  HANDLE hMappingFile;

  /* Create a new shared memory area if it does not exist yet */
  if (sharedMemoryAddress == NULL)
  {
    
    
    /* Creation of the file mapping object */
    hMappingFile = CreateFileMapping(INVALID_HANDLE_VALUE, // use paging file
      NULL,                 // default security
      PAGE_READWRITE,       // read/write access
      0,                    // maximum object size (high-order DWORD)
      BUFFER_SIZE,          // maximum object size (low-order DWORD)
      SHARED_MEMORY_NAME);  // name of the mapping object
                            /* Exception handling */
    if (hMappingFile == NULL)
    {
    
    
      /* The file mapping object could not have been created */
      _tprintf(TEXT("Could not create the shared memory called: %s\n"), SHARED_MEMORY_NAME);
      return 1;
    }
    /* Create a view of the file in the process address space */
    sharedMemoryAddress = MapViewOfFile(hMappingFile, FILE_MAP_ALL_ACCESS, 0, 0, BUFFER_SIZE);
    /* Exception handling */
    if (sharedMemoryAddress == NULL)
    {
    
    
      /* No pointer to the file view could have been returned */
      _tprintf(TEXT("Could not map the shared memory called: %s\n"), SHARED_MEMORY_NAME);
      /* The process no longer needs access to the file mapping object */
      CloseHandle(hMappingFile);
      return 2;
    }
  }
  /* No error occurred */
  return 0;
}

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


void write_register_val(unsigned short address, double val1)
{
    
    
  /* Access the shared memory area */
  if (open_shared_memory() == 0)
  {
    
    
    /* Set the new value in the desired register */
    double * temp = (sharedMemoryAddress + address);
    *temp = val1;
  }
  else
  {
    
    
    getchar();
    exit(EXIT_FAILURE);
  }
}

2. Simulink и среда взаимодействия данных сторонних приложений.

Используйте функции общей памяти C (аналогичные C или C ++) и используйте поток состояний для вызова функций записи в общую память. Стоит отметить, что, поскольку Simulink должен выполнять функцию записи в общую память для каждого шага, перед запуском функции записи в общую память в следующий раз, то есть до того, как Simulink выполнит следующий шаг, необходимо проверить, не программное приложение считывает функцию значение по адресу. Следовательно, необходимо установить, используется ли бит флага возможности записи для координации скорости работы Simulink и сторонних программных приложений. Процесс координации Simulink показан на следующем рисунке:

Передний и задний процесс передачи данных

Блок-схема 1. Процесс взаимодействия внешних и внутренних данных

Сначала очистите бит флага записи переднего и заднего конца, чтобы первый шаг можно было записать в общую память; после записи в память можно установить бит флага записи; затем введите следующий вызов Simulink, когда третий -party программа не читает При выборке данных из общей памяти бит флага записи остается неизменным, и в следующий раз, когда модуль потока состояний запускается в модуле потока состояний, он всегда будет определять, можно ли записать данные (во избежание долгосрочное ожидание бесконечного цикла, сюда добавляется приблизительный счетчик тайм-аута, а именно каждый раз, когда обнаруживается доступное для записи состояние, счетчик увеличивается на единицу, а затем из бесконечного цикла можно выйти, определив, что счетчик больше определенных данных); когда стороннее приложение считывает данные в разделяемой памяти, оно очищает бит флага записи.Таким образом, Simulink не будет ждать вечно в бесконечном цикле.
Simulink сотрудничает со сторонними приложениями для записи данных, полученных Simulink, запущенным на каждом этапе, в общую память. В то же время сторонние приложения будут последовательно считывать данные в разделяемой памяти.

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

3. Сторонние приложения контролируют Simulink

Существует два основных способа использования сторонних приложений для управления Simulink. Это:
1. Использование сторонних приложений для вызова COM-интерфейса, предоставляемого MATLAB, для непосредственного управления MATLAB для выполнения команд управления. См. Метод для сторонних разработчиков. приложения для вызова функций интерфейса COM.Еще одна моя запись в блоге, приложение C # и совместное программирование MATLAB .
Управляйте запуском, паузой, остановкой, продолжением и пошаговой операцией Simulink в MATLAB.Команды управления следующие:

model_name = gcs;
set_param( model_name,'SimulationCommand' ,'start'); % 启动Simulink
set_param( model_name,'SimulationCommand' ,'pause'); % 暂停 Simulink
set_param( model_name,'SimulationCommand' ,'stop');  % 停止 Simulink
set_param( model_name,'SimulationCommand' ,'continue'); % 继续 Simulink
set_param(model_name, 'SimulationCommand', 'step');     % 步进 Simulink

Примечание: Этот метод требует, чтобы MATLAB не мог запускать другие сценарии M и чтобы MATLAB находился в нормальном состоянии.
2. Используйте совместно используемую память стороннего приложения, чтобы записать флаг выполнения, чтобы управлять запуском сценария MATLAB, а затем управляйте работа Simulink через сценарий MATLAB. Этот метод имеет наиболее полный контроль над MATLAB и рекомендуется.
Здесь нам нужно представить рабочий механизм между MATLAB и Simulink.Когда Simulink запущен, MATLAB может выполнять инструкции управления в командном окне. Следовательно, мы можем использовать первый метод для управления Simulink. Когда MATLAB выполняет функцию сценария, Simulink не может быть выполнен и находится в состоянии ожидания.Только когда выполнение сценария приостановлено, Simulink может продолжать выполнение.
Поскольку сторонние приложения управляют MATLAB через совместно используемую память, MATLAB требуется для мониторинга состояния флага совместно используемой памяти. Это требует, чтобы MATLAB все время выполнял функцию сценария M для достижения этого процесса, что заставляет Simulink все время блокироваться и не может быть смоделировано. Следовательно, когда модель Simulink должна быть выполнена, функция M должна временно приостановить на период времени, контролируя бит флага совместно используемой памяти для работы Simulink. Далее этот метод используется для управления MATLAB / Simulink.

4. Метод реализации

Фон управления передним планом Simulink и рабочий процесс программы моделирования показаны на 2. Этот процесс является процессом выполнения сценария M. Основная подробная часть - это часть взаимного контроля Simulink. Когда предварительная обработка завершена, функция main вызовет моделирование модели. Это первый раз, когда судят о том, разрешено ли модели начать симуляцию на переднем плане.Когда симуляция не разрешена на передней станции, основная программа фона m приостановится и будет ждать, пока симуляция не будет разрешена на переднем плане. После того, как симуляция фоновой модели включена на передней станции, фон будет управлять операцией симуляции Simulink, а затем M-файл приостановится и будет ждать, пока Simulink запустится. После того, как пауза файла M закончилась, команда управления переднего плана обнаруживается снова, и команда управления переднего плана принимается. Таким образом, понимается, что хотя файл M может принимать инструкции управления переднего плана, он также позволяет Simulink запускаться и принимать управление передним планом.

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

Блок-схема 2: управление передним планом и процесс фоновой работы

Как видно из рисунка, команды управления для переднего плана для управления фоновой операцией завершаются битом флага совместно используемой памяти. Команды на переднем плане для управления работой Simulink включают в себя: запуск, шаг, паузу, продолжение и завершение.
Примечание: Когда передняя станция работает быстро, потому что файл M работает, когда Simulink приостановлен, и флаг завершения работы модели установлен после завершения работы Simulink, файл M все еще находится в состоянии паузы, а стойка регистрации получит статус завершения работы. Флаг завершения работы модели установлен. На этом этапе приостановка M-файла завершается, что приведет к возникновению состояния ошибки, что M-файл все еще выполняется. Следовательно, время между завершением операции модели и инструкцией следующей операции модели больше, чем временной интервал паузы файла M на переднем плане, чтобы избежать этой ситуации.

приложение

рекомендация

отblog.csdn.net/qq_36320710/article/details/112008430
рекомендация