Этот пример показывает основной рабочий процесс и ключ API для генерации кода С от алгоритма управления двигателем, и для проверки его скомпилированного поведения и время выполнения. Вы будете использовать Процессор в цикле (PIL) симуляция, чтобы завоевать доверие, которое код С выполнит как ожидалось, когда вы интегрируете его со встроенным программным обеспечением, которое взаимодействует через интерфейс с моторным оборудованием. Несмотря на то, что этот рабочий процесс использует приложение блока управления приводом для определенного процессора, можно применить этот рабочий процесс к фактически любому приложению или процессору.
Мы используем Ориентированный на поле Алгоритм управления для Постоянного магнита Синхронная Машина, чтобы показать этот рабочий процесс. Этот метод управления распространен в системах электропривода для гибридных электромобилей, производственного машинного оборудования и промышленной автоматизации.
В этом примере сгенерируйте и проверьте код С из модели алгоритма управления, которую можно интегрировать с дополнительным встроенным программным обеспечением, требуемым взаимодействовать через интерфейс, чтобы проехать оборудование.
Вы будете использовать среду симуляции, чтобы смоделировать и проверить поведение системы блока управления приводом с обратной связью. Если поведение системы управления в рамках спецификации, вы сгенерируете код С от моделей контроллеров. После осмотра кода вы оцените его функциональное поведение и время выполнения с помощью процессора в цикле (PIL) тестирование.
Чтобы упростить Тестирование с процессором в контуре обратной связи, вы выберете тестовые сигналы, чтобы осуществить модели контроллеров и установить ссылочные выходные параметры. Вы рассмотрите пример реализация PIL для процессора Texas Instruments™ F28335, который связывается с Simulink® на хосте - компьютере по последовательной связи. Можно использовать этот пример в качестве начальной точки, чтобы создать реализацию PIL для собственного процессора. Вы запустите модели контроллеров в режиме PIL, чтобы измерить время выполнения и проверить поведение при выполнении кода, работающего на встраиваемом процессоре против ссылки симуляции выходные параметры.
В итоговой реализации на встраиваемом процессоре вы интегрировали бы сгенерированный код С контроллера с дополнительным встроенным программным обеспечением, таким как периферийные устройства и прерывания, требуемые взаимодействовать через интерфейс с моторным оборудованием.
Примечания
Электрический Simscape™ требуется для системной симуляции в разделе "Verify Behavior through System Simulation". Это не требуется для других задач.
Реализация Instruments™ F28335 PIL Техаса является ссылочным подходом, что можно обратиться фактически к любому процессору. Однако, если вы хотите использовать эту реализацию непосредственно, вам будут нужны дополнительные файлы поддержки, компиляторы и инструменты из Техаса Instruments™. Можно найти больше информации о тех в разделе "Create PIL Implementation and Register with Simulink®" этого примера. Эта ссылочная реализация PIL не требует Инструмента Техаса, функция Целевого процессора C2000™ Embedded Coder®, но пользователи C2000™ поощряется установить Пакет Поддержки Texas Instruments C2000 с помощью Add-On Explorer.
В этом разделе вы проверите контроллер в системной симуляции замкнутого цикла.
Испытательный стенд системной модели состоит из тестовых воздействий, встраиваемого процессора, силовой электроники и моторного оборудования и визуализации. Можно использовать системную модель, чтобы осуществить контроллер и исследовать ее ожидаемое поведение. Можно использовать следующие команды, чтобы выполнить модель, и график регистрировал сигналы.
open_system('rtwdemo_pmsmfoc_system') out_system = sim('rtwdemo_pmsmfoc_system') rtwdemo_pmsmfoc_plotsignals(out_system.logsout)
out_system = Simulink.SimulationOutput: logsout: [1x1 Simulink.SimulationData.Dataset] SimulationMetadata: [1x1 Simulink.SimulationMetadata] ErrorMessage: [0x0 char]
Графики показывают, что двигатель является стационарным до motor_on
сигнал верен. Двигатель затем вращается в разомкнутом контуре, пока известное положение не обнаруживается, который обозначается импульсом индекса энкодера. Контроллер затем переходы к операции замкнутого цикла и двигателю достигает скорости устойчивого состояния.
В этом разделе вы исследуете архитектуру модели включая то, как данные заданы, как контроллер разделен от испытательного стенда, и как контроллер планируется. Эта архитектура упрощает системную симуляцию, генерацию алгоритмического кода и Тестирование с процессором в контуре обратной связи.
Файл определения данных создает данные MATLAB®, требуемые для симуляции и генерации кода. Этот файл данных автоматически запущен в PreLoadFcn
коллбэк модели места размещения тестирования системы.
edit('rtwdemo_pmsmfoc_data.m')
В модели места размещения тестирования системы встраиваемый процессор моделируется как комбинация периферийных устройств и программного обеспечения контроллера.
open_system('rtwdemo_pmsmfoc_system/Embedded Processor')
Программное обеспечение контроллера задано в отдельной модели. В этой модели подсистема Mode_Scheduler использует Stateflow®, чтобы запланировать различные режимы работы алгоритма Motor_Control.
open_system('rtwdemo_pmsmfoc')
В подсистеме Motor_Control сигналы датчика преобразованы в технические модули и переданы базовому алгоритму регулятора. Алгоритм регулятора вычисляет напряжения. Напряжения затем преобразованы в сигнал драйвера.
open_system('rtwdemo_pmsmfoc/Motor_Control')
Первичный закон о надзоре является ориентированным на поле контроллером. У контроллера есть внешний контур низкого процента, который контролирует скорость и более высокий внутренний цикл уровня, который управляет током.
open_system('rtwdemo_pmsmfoc/Motor_Control/Field_Oriented_Controller')
Скоростной Контроллер внешний контур выполняется как кратное Текущего времени Цикла управления. Можно просмотреть переменные MATLAB®, которые задают эти шаги расчета:
fprintf('High rate sample time = %f seconds\n', ctrlConst.TsHi) fprintf('Low rate sample time = %f seconds\n', ctrlConst.TsLo)
High rate sample time = 0.000040 seconds Low rate sample time = 0.005000 seconds
Заметьте, что самый высокий уровень в алгоритме регулятора составляет 25 кГц.
fprintf('High rate frequency = %5.0f Hz\n', 1/ctrlConst.TsHi)
High rate frequency = 25000 Hz
В этом разделе вы будете генерировать и визуально смотреть функцию кода С для контроллера.
Чтобы упростить интегрирование, модели контроллеров сконфигурированы в однозадачном режиме так, чтобы сгенерированный код мог быть вызван с помощью одного вызова функции. Это указатели на функцию ниже и более высокие уровни. Сгенерированная функция контроллера должна быть выполнена в шаге расчета высокого показателя.
Прототип функции задан в параметрах конфигурации модели, и порты ввода и вывода передаются в качестве аргументов. Можно просмотреть функциональную спецификацию для алгоритма регулятора.
mdlFcn = RTW.getFunctionSpecification('rtwdemo_pmsmfoc'); disp(mdlFcn.getPreview('init')) disp(mdlFcn.getPreview('step'))
Controller_Init ( ) error = Controller ( motor_on, command_type, current_request, * sensors, * pwm_compare )
Посредством использования глобальной структуры в сгенерированном коде можно получить доступ к ориентированному на поле пропорциональному контроллеру и интегральные составляющие. Эта глобальная структура задана в файле определения данных.
disp(ctrlParams.Value) disp(ctrlParams.CoderInfo)
Current_P: 10 Current_I: 10000 Velocity_P: 0.0050 Velocity_I: 0.0150 Position_P: 0.1000 Position_I: 0.6000 StartupAcceleration: 1 StartupCurrent: 0.2000 RampToStopVelocity: 20 AdcZeroOffsetDriverUnits: 2.2523e+03 AdcDriverUnitsToAmps: 0.0049 EncoderToMechanicalZeroOffsetRads: 0 PmsmPolePairs: 4 Simulink.CoderInfo StorageClass: 'ExportedGlobal' Identifier: '' Alignment: -1
Вы генерируете код С из модели можно следующим образом.
slbuild('rtwdemo_pmsmfoc')
### Starting build procedure for: rtwdemo_pmsmfoc ### Successful completion of build procedure for: rtwdemo_pmsmfoc Build Summary Top model targets built: Model Action Rebuild Reason ================================================================================================ rtwdemo_pmsmfoc Code generated and compiled Code generation information file does not exist. 1 of 1 models built (0 models already up to date) Build duration: 0h 0m 59.217s
Используйте сгенерированный отчет смотреть файл сгенерированного кода C и проверить, что правильный шаг и функции инициализации были сгенерированы. Также проверьте, что структура параметра была создана как глобальная переменная.
В этом разделе вы установите тестовые воздействия и ссылочный выход, чтобы помочь проверить поведение и профилировать время выполнения во время Тестирования с процессором в контуре обратной связи. Вы заставите локальную копию моделей контроллеров затем загрузить набор сигналов тестового воздействия, которые осуществляют различные режимы в контроллере. Вы затем сконфигурируете модели контроллеров, чтобы присоединить эти регистрируемые сигналы к входным портам, выполнить модели контроллеров и регистрировать сигнал выходного порта к рабочей области.
Параметры конфигурации моделей контроллеров, используемых, чтобы установить ссылочное поведение и тестовую среду, изменятся аналогичный описанному ниже. Блоки и параметры раньше указывали, что проект моделей контроллеров и сгенерировать производственный код не изменится. Однако, чтобы не изменять любую часть установленных моделей контроллеров, сохраните модель и поменяйте ее имя на rtwdemo_pmsmfoc_local.slx
.
save_system('rtwdemo_pmsmfoc','rtwdemo_pmsmfoc_local.slx') close_system('rtwdemo_pmsmfoc_system',0); close_system('rtwdemo_pmsmfoc',0);
omCallMethod failed on slmsgviewer.renameTab
Чтобы профилировать времена выполнения, выберите набор тестовых воздействий, которые выполнят пути интереса в контроллере. Один способ получить эти тестовые воздействия и ссылочный выход состоит в том, чтобы регистрировать их из модели системной симуляции.
in.motor_on = out_system.logsout.getElement('motor_on').Values; in.command_type = out_system.logsout.getElement('command_type').Values; in.command_value = out_system.logsout.getElement('command_value').Values; in.sensors = out_system.logsout.getElement('sensors').Values; display(in)
in = struct with fields: motor_on: [1×1 timeseries] command_type: [1×1 timeseries] command_value: [1×1 timeseries] sensors: [1×1 struct]
Эти сигналы могут теперь быть присоединены к входным портам и импортированный в модели контроллеров, таким образом, что они могут выполниться непосредственно и независимо от системной модели. Преимущество этого подхода состоит в том, что модели контроллеров могут быть протестированы и проверены как автономный компонент, упростив повторное использование и интеграцию с другими системными моделями или испытательными стендами с обратной связью. Чтобы уточнить, или подготовиться, модели контроллеров для тестирования, изменяют его Параметры конфигурации, чтобы присоединить входные сигналы и логарифмические сигналы в рабочей области MATLAB®. Эти изменения могут быть внесены графически в диалоговом окне Параметров конфигурации модели, или программно как показано ниже.
set_param('rtwdemo_pmsmfoc_local',... 'LoadExternalInput', 'on',... 'ExternalInput', 'in.motor_on, in.command_type, in.command_value, in.sensors',... 'StopTime','0.06',... 'ZeroInternalMemoryAtStartup','on',... 'SimulationMode', 'normal') save_system('rtwdemo_pmsmfoc_local.slx')
Можно теперь выполнить модели контроллеров и построить сигнал, сопоставленный с PWM, Сравнивают выходной порт.
out = sim('rtwdemo_pmsmfoc_local') controller_mode = out.logsout.getElement('controller_mode').Values; pwm_compare_ref = out.logsout.getElement('pwm_compare').Values; rtwdemo_pmsmfoc_plotpwmcompare(controller_mode, pwm_compare_ref)
out = Simulink.SimulationOutput: logsout: [1x1 Simulink.SimulationData.Dataset] SimulationMetadata: [1x1 Simulink.SimulationMetadata] ErrorMessage: [0x0 char]
Регистрируемый выход будет использоваться в качестве ссылочного поведения для Тестирования с процессором в контуре обратной связи.
Заметьте, что график аннотируется информацией о режиме контроллера на каждом временном шаге. Эта информация о режиме будет полезна при интерпретации выполнения профильная информация.
В этом разделе вы будете изучать и использовать пример реализация PIL. Вы начнете путем рассмотрения необходимой как условие документации справки от Embedded Coder®. Вы затем скопируете пример реализация PIL в вашу локальную директорию и укажете его с Simulink®. Вы рассмотрите подход, используемый, чтобы разработать реализацию PIL, и можете исследовать связанные файлы, чтобы получить дополнительное понимание. Если вы будете использовать плату Spectrum Digital Inc. eZdsp F28335 с Компоновщиком Кода v4 и последовательная связь, вы сможете сконфигурировать эту реализацию PIL, чтобы непосредственно работать с моделями контроллеров. Если вы используете различный процессор, можно использовать эту реализацию PIL в качестве начальной точки, чтобы создать собственную реализацию.
Основные принципы создания пользовательской реализации PIL описаны в, Создают Целевую Настройку Возможности соединения PIL для Simulink. Необходимо ознакомить себя с фундаментальным понятием использования rtiostream API, чтобы упростить связь между Simulink® (сторона хоста) и встраиваемым процессором (целевая сторона) во время Тестирования с процессором в контуре обратной связи. Обратите внимание на то, что Embedded Coder® обеспечивает драйверы стороны хоста для реализации TCP/IP по умолчанию (для всех платформ, поддержанных Simulink®), а также Windows® только версия для последовательной передачи. Создание сгенерированного кода выполняется с помощью make-файла как описано в, Настраивают Make-файлы Шаблона. Чтобы создать реализацию PIL, необходимо будет выполнить несколько задач во встроенной среде включая запись коммуникационного драйвера целевой стороны, запись make-файла, чтобы создать сгенерированный код и автоматизацию загрузки и выполнения созданного исполняемого файла.
Используя вышеупомянутый подход, реализация PIL была создана для платы Spectrum Digital Inc. eZdsp F28335. Ниже сводные данные целевых компонентов API возможности соединения, используемых в этой реализации.
Коммуникация стороны хоста - драйвер возможности соединения стороны хоста сконфигурирован, чтобы использовать последовательную передачу.
Коммуникация целевой стороны - коммуникация целевой стороны достигается с помощью рукописной последовательной реализации функций rtiostream, а также функций доступа таймера.
Процесс сборки - основанный на make-файле подход используется, чтобы создать исполняемое приложение.
Средство запуска - Загрузка и выполнение исполняемого файла выполняются с помощью утилиты Сценариев сервера отладки (DSS) компоновщика Studio™ v4 Кода (CCSv4).
Реализация PIL была итеративно разработана на трех этапах. Ниже описание этих этапов и задач, выполняемых на этих этапах. Можно найти полезным следовать за аналогичным подходом при разработке собственной реализации PIL
Этап 1: Создайте приложение последовательной передачи с CCSv4
Установите CCSv4 и проверьте, что он может соединиться с платой F28335 eZdsp.
Запишите встраиваемое приложение, которое отправляет и получает последовательные данные.
Протестируйте последовательную передачу между хостом - компьютером и встраиваемым приложением.
Идентифицируйте команды и опции для компилятора, компоновщика и архиватора, чтобы создать приложение с помощью make-файла.
Загрузите и запустите приложение от Windows® Command Prompt с помощью утилиты DSS.
Этап 2: Реализуйте и протестируйте встроенный последовательный rtiostream и автоматизацию запуска с MATLAB®
Расширьте последовательное приложение, чтобы реализовать rtiostream API-функции для повторения данных. Запишите rtIOStreamOpen, чтобы выполнить общую инициализацию платы, включая конфигурирование последовательного порта.
Проверьте отправку и получение последовательных данных со встраиваемым процессором от MATLAB® с помощью функции rtiostream_wrapper.
Загрузите и запустите приложение от MATLAB® с помощью системной команды, чтобы вызвать утилиту DSS.
Этап 3: Реализуйте и протестируйте настройку возможности соединения с Simulink®
Создайте класс настройки возможности соединения, чтобы сконфигурировать последовательную передачу стороны хоста, задать, который файлы кода целевой стороны из rtiostream приложения должны быть включены в процесс сборки, задать, как получить доступ к таймеру, который будет использоваться, чтобы собрать профильные данные и интегрировать вызов утилиты DSS, чтобы запустить встраиваемое приложение.
Создайте make-файл спецификации инструмента (target_tools.mk
) который задает команды и опции для компилятора, компоновщика и архиватора. Этот make-файл включен make-файлом шаблона (target_tools.mk
).
Создайте make-файл шаблона (ec_target.tmf
) это включает target_tools.mk
.
Идентифицируйте параметры, которые могут быть зависимым установки и сохранить их как настройки MATLAB®.
Создайте файл настройки Simulink®, который задает, когда реализация PIL допустима
Файлы, сопоставленные с этой реализацией PIL, включены с Embedded Coder®, но не находятся на пути MATLAB®. Чтобы исследовать эти файлы, можно скопировать их в локальную директорию. Можно указать эту реализацию PIL путем добавления этой директории в путь MATLAB® и обновления индивидуальных настроек Simulink®.
%copyfile(fullfile(matlabroot,'toolbox','rtw','rtwdemos','examplePilF28335'),'examplePilF28335','f') addpath(genpath(fullfile(matlabroot,'toolbox','rtw','rtwdemos','examplePilF28335'))) sl_refresh_customizations
Настройки MATLAB® используются, чтобы указать информацию пути и хост последовательный номер COM-порта. Если вы используете эту реализацию PIL непосредственно, необходимо задать эти настройки как подходящие для настройки.
Обратите внимание на то, что TI_F28xxx_SysSWDir
настройка указывает на директорию, предоставленную Техасом Instruments™ в их Прикладном программном обеспечении Экспериментатора C2000™ Кита (sprc675.zip
). Эти файлы не включены с Embedded Coder®.
setpref('examplePilF28335','examplePilF28335Dir', fullfile(matlabroot,'toolbox','rtw','rtwdemos','examplePilF28335')); setpref('examplePilF28335','CCSRootDir', 'C:\Program Files\Texas Instruments\ccsv4'); setpref('examplePilF28335','TI_F28xxx_SysSWDir', 'C:\Program Files\Texas Instruments\TI_F28xxx_SysSW'); setpref('examplePilF28335','targetConfigFile', fullfile(matlabroot,'toolbox','rtw','rtwdemos','examplePilF28335','f28335_ezdsp.ccxml')); setpref('examplePilF28335','baudRate', 115200); setpref('examplePilF28335','cpuClockRateMHz', 150); setpref('examplePilF28335','boardConfigPLL', 10); setpref('examplePilF28335','COMPort', 'COM4');
Реализация PIL теперь готова использоваться.
В этом разделе вы сконфигурируете модели контроллеров, чтобы использовать реализацию PIL. Вы рассмотрите файл настройки, используемый, чтобы указать реализацию PIL, установить параметры конфигурации модели использовать реализацию PIL и позволять регистрировать контроллеры выход и выполнение профильные данные.
Когда вы начнете симуляцию в режиме PIL, Simulink® будет проверять, допустима ли какая-либо из зарегистрированных реализаций PIL. Файл настройки задает, какие параметры конфигурации соответствуют допустимой реализации PIL. Можно исследовать файл настройки для этой реализации путем вызова следующей команды.
edit(fullfile(matlabroot,'toolbox','rtw','rtwdemos','examplePilF28335','sl_customization.m'));
Заметьте, что этот файл задает установку для аппаратного устройства и make-файла шаблона, которые требуются, чтобы использовать эту реализацию PIL. Можно изменить параметры конфигурации в моделях контроллеров, чтобы совпадать с этими настройками. Эти изменения могут быть внесены графически в диалоговом окне Параметров конфигурации модели, или программно как показано ниже.
set_param('rtwdemo_pmsmfoc_local',... 'ProdHWDeviceType', 'Texas Instruments->C2000',... 'TemplateMakefile', 'ec_target.tmf',... 'GenCodeOnly', 'off',... 'SimulationMode', 'processor-in-the-loop (pil)')
Можно указать собирающееся выполнение профильная информация во время Тестирования с процессором в контуре обратной связи путем логгирования выходных значений симуляции как переменной pilOut
и логгирование выполнения профильная информация как переменная executionProfile
. Эти изменения могут быть внесены графически в диалоговом окне Параметров конфигурации модели, или программно как показано ниже.
set_param('rtwdemo_pmsmfoc_local',... 'CodeExecutionProfiling', 'on',... 'CodeExecutionProfileVariable','executionProfile',... 'CodeProfilingSaveOptions','AllData'); save_system('rtwdemo_pmsmfoc_local.slx')
Модели контроллеров теперь готовы быть запущенными в режиме PIL.
В этом разделе вы запустите модели контроллеров в режиме PIL и исследуете поведенческое и результаты профилирования выполнения. Вы проверите, что поведение скомпилированного кода контроллера совпадает со ссылочным поведением симуляции, и затем проверьте, что подписание кода удовлетворяет требования синхронизации.
Можно запустить модель и построить результаты PIL симуляции. Когда вы запустите модель впервые, Embedded Coder® сгенерирует код для алгоритма, соединит код алгоритма с кодом последовательного интерфейса, создаст встраиваемое приложение, загрузит приложение на плату и начнет симуляцию на цели. Обратите внимание на то, что во время последующих PIL симуляций, код только регенерирован, если модель изменяется. Из-за издержек, сопоставленных с последовательным интерфейсом, PIL симуляция может запуститься медленнее, чем модель в режиме normal mode.
Команды MATLAB® ниже намеренно комментируются, когда они требуют связи с оборудованием и использования встроенных средств разработки, описанных ранее. Если вам соединили оборудование и встроенные установленные средства разработки, не комментируете и выполняете эти линии, чтобы запустить модель, построить результаты и проверить, что поведение численно эквивалентно симуляции, запускающейся в режиме normal mode. В противном случае продолжите рассматривать этот раздел, чтобы узнать об опциях анализа выполнения PIL.
% UNCOMMENT THE BELOW LINES TO RUN THE SIMULATION AND PLOT THE RESULTS % if exist('slprj','dir'), rmdir('slprj','s'); end % out = sim('rtwdemo_pmsmfoc_local') % pwm_compare_pil = out.logsout.getElement('pwm_compare').Values; % rtwdemo_pmsmfoc_plotpwmcompare_pil(controller_mode, pwm_compare_pil, executionProfile)
Верхним графиком является выход контроллера, PWM Выдерживают сравнение. Обратите внимание на то, что выходные параметры в режиме PIL выглядят одинаково как выходные параметры симуляции в режиме normal mode, показанном в разделе "Establish Reference Behavior for Controller Model". Можно вычесть выходные параметры симуляции режима normal mode от симуляции режима PIL выход, чтобы проверить, что они численно эквивалентны:
% UNCOMMENT THE BELOW LINE TO VERIFY NUMERICAL EQUIVALENCE OF THE OUTPUTS % pilErrorWithRespectToReference = sum(abs(pwm_compare_pil.Data - pwm_compare_pil.Data))
pilErrorWithRespectToReference =
0 0 0
Более низкий график является потраченным выполнением количества времени моделей контроллеров на каждом шаге времени симуляции. "Стенд" по состоянию требует наименьшего количества времени. Маленькие периодические скачки во время выполнения происходят, потому что контроллер является многоскоростным и одним управлением задачами. Периодические скачки соответствуют времени, требуемому запускать и базовую ставку и 5 кодов уровня миллисекунды в той же задаче.
Поскольку контроллер должен быть выполнен на уровне 25 кГц на встраиваемом процессоре, алгоритм должен завершить свое выполнение в течение 40 микросекунд (минус дополнительные требования высоты другим кодом, который может также выполняться на итоговом приложении.) Профильные результаты показывают, что алгоритм выполнится в течение времени, выделенного для этой настройки встроенной среды.
Сгенерированный код теперь проверяется, чтобы обеспечить численно эквивалентные результаты и удовлетворяет требования синхронизации выполнения для этого теста.
close_system('rtwdemo_pmsmfoc_local',0); close_system('power_utile',0);
Настройки MATLAB®, используемые в этой реализации PIL, являются персистентными между сеансами MATLAB®. Если вы хотите удалить эти настройки, запустить следующие команды.
rmpref('examplePilF28335');
rmexamplePilF28335hooks();
Этот пример показал симуляцию уровня системы и генерацию алгоритмического кода с помощью Ориентированного на поле Алгоритма управления для Постоянного магнита Синхронная Машина, чтобы исследовать функциональное поведение алгоритма регулятора. Это также показало общий подход для целевого интегрирования, функционального тестирования и профилирования выполнения для любого встраиваемого процессора. Если алгоритм был поведенчески правилен, код был сгенерирован от моделей контроллеров, протестировал на целевом процессоре и профилировал. Код алгоритма теперь проверяется и может быть интегрирован со встроенным программным обеспечением, которое взаимодействует через интерфейс с моторным оборудованием для дальнейшего тестирования.