Следите за состоянием каждого устройства в вашей системе
Введение
API отлично подходят для разгрузки вычислений и запуска процессов, которые нелегко выполнить на данном языке программирования. В первой части этой серии API REST на промышленных ПЛК¹ мы реализовали простой API, который добавляет и извлекает записи из базы данных SQL. Данные, введенные в базу данных, предназначены для обучения модели машинного обучения обнаружению аномалий в сервоприводах, подключенных к контроллеру.
В этом примере мы запустим базовый цикл обучения для собранных данных и выполним вывод о сервоприводах, чтобы увидеть, ведут ли они себя аномально. Для этого мы будем использовать сеть AutoEncoder с немаркированными данными и измерим потери при реконструкции, чтобы определить классификацию текущего состояния сервопривода.
Мотивация
Благодаря реализации модели обнаружения аномалий это позволяет нам отслеживать состояние каждого из сервоприводов в конфигурации. То, что может быть неочевидно невооруженным глазом и ухом, будет уловлено моделью, и пользователь сможет действовать соответствующим образом. Раннее обнаружение проблемы с сервоприводом дает нам время для планирования профилактического обслуживания, что значительно сокращает время простоя и помогает предотвратить любые повреждения, которые могут возникнуть в результате отказа сервопривода.
Фон
Сеть AutoEncoder будет использоваться для выявления аномалий в состоянии сервопривода. Сеть AutoEncoder подходит, потому что она будет отфильтровывать шум из входных данных и обеспечивать более точную реконструкцию с нелинейными отношениями, которые могут существовать. Поскольку будут использоваться неразмеченные данные, потеря реконструкции сети AutoEncoder будет использоваться для классификации аномалий. Данные с высокими потерями при реконструкции выше установленного порога будут считаться аномальными, а данные с низкими потерями при реконструкции ниже установленного порога будут считаться неаномальными.
3D-печать — популярное использование сервоприводов; работа принтера на высоких скоростях и ускорениях увеличит производительность принтера, а также вызовет более высокие динамические нагрузки. Принтер может работать почти 100% времени без остановки, поэтому полезно контролировать состояние сервоприводов скрытым образом.
Конфигурация
В этом примере мы будем создавать плагин Compass², который делает запросы к API для выборки и вывода данных. Хотя запросы API можно делать непосредственно с ПЛК, они будут выполняться с ПК, на котором работает Compass, чтобы избежать проблем с маршрутизацией запроса в соответствующую внешнюю сеть. Сетевая архитектура для выполнения запросов API показана ниже:
Стрелки на диаграмме — соединения Ethernet/IP. В этом примере контроллер MPiec будет общаться с дополнительным DNS-сервером посередине. Компьютер, на котором запущен Compass, автоматически обрабатывает DNS-маршрутизацию и отправляет запросы на соответствующий сервер.
Сервер REST API размещен на экземпляре AWS ec2 со следующими доступными конечными точками:
/api/v2/store_data #store a row(s) of data values for training /api/v2/inference #run inference on row(s) /api/v2/check #check on model availability
Модель
Модель AutoEncoder из репозитория PyOD GitHub³ будет использоваться для обнаружения аномальных состояний сервоприводов. Структура сети для AutoEncoder показана ниже:
В отличие от модели обнаружения аномалий, использованной в моей предыдущей статье⁵, которая может работать непосредственно на ПЛК, AutoEncoder требует больших вычислительных ресурсов и должен работать на другом устройстве, которое поддерживает векторизованные вычисления в большей степени. Если вам интересно узнать больше о сетях AutoEncoder, рассмотрите возможность прочтения этой статьи⁵. Используя API для выполнения логических выводов, мы значительно снижаем нагрузку на ЦП ПЛК и избегаем проблем с производительностью.
Данные
В этом примере будут использоваться все доступные и релевантные данные от сервопривода. Несколько ключевых переменных включают в себя:
- Положение обратной связи, скорость, ускорение и крутящий момент
- Заданное положение, скорость, ускорение и крутящий момент
В конечном итоге будет оптимальным уменьшить количество выборочных переменных, чтобы уменьшить нагрузку на ЦП при чтении переменных без значительного веса в модели AutoEncoder. В этом примере все параметры осей, связанные с кинематикой, будут считаны из следующего списка:
Макет плагина
Плагин, если он включен, будет автоматически собирать пакеты данных с сервоприводов и использовать конечную точку /api/v2/store_data
для отправки строк данных в API для дальнейшего обучения. Мы включим плагин и запустим несколько файлов G-кода на несколько часов, чтобы можно было взять разнообразный набор данных.
Как только будет собрано достаточное количество данных, будет вызвана конечная точка /api/v2/check
. Конечная точка запрограммирована на:
- Проверьте статус/доступность модели AutoEncoder.
- Начать сеанс обучения, если имеется достаточно данных
Вызов конечной точки /api/v2/check
в первый раз вернет следующее:
После того, как AutoEncoder завершит обучение и станет доступен для использования для логического вывода, конечная точка /api/v2/check
вернет следующее:
Код клиента плагина
Плагин Compass взаимодействует с API, отправляя HTTP-запрос методом POST. Запрос содержит соответствующие данные в формате JSON для данной конечной точки. Во время логического вывода строка или строки отправляются в API, и сервер возвращает аномальное состояние каждой строки. Запрос выполняется на С# со следующим кодом:
Удобный для копирования и вставки формат рис. 7:
private async Task<InferenceResponse> InferenceRequestAPI(Dictionary<string,string> data) { HttpClient client = new HttpClient(); client.BaseAddress = new Uri(URL); client.DefaultRequestHeaders.Accept.Add( new MediaTypeWithQualityHeaderValue("application/json")); var jsonData = JsonConvert.SerializeObject(data); var contentData = new StringContent(jsonData, Encoding.UTF8, "application/json"); var response = await client.PostAsync(urlParameters, contentData); string contents = await response.Content.ReadAsStringAsync(); client.Dispose(); InferenceResponse responseJSON = JsonConvert.DeserializeObject<InferenceResponse>(contents); return responseJSON; }
Сервер вернет ответ в следующем формате:
В случае с рис. 8 выше для вывода используется одна строка данных. Ответ состоит из трех ключевых элементов ответа:
class
— классификация вывода (верно, если аномально, ложно, если аномалии не обнаружено)loss
— потери при реконструкции, возвращенные моделью AutoEncoder для вывода.time
— время вывода
Выходные данные классификации основаны на значении threshold
, которое использует потери при реконструкции для бинаризации выходных данных автоэнкодера. В этом примере обучающая система сервера предварительно выбирает пороговое значение на основе первоначально предоставленных обучающих данных. Сервер предварительно выбрал значение 0,4 в качестве порога отсечки, что означает, что любой вывод с потерями при реконструкции выше 0,4 будет считаться аномалией.
Для производственных приложений порог должен быть тщательно выбран пользователем. Кроме того, должен быть реализован алгоритм постобработки для отслеживания частоты и величины положительных классификаций, чтобы одна положительная классификация не вызывала никаких действий.
Простой и эффективный способ отслеживать частоты аномалий — отслеживать 3 SMA (простые скользящие средние) в разные промежутки времени и сравнивать их друг с другом. Например, используя набор SMA за 5/30/120 минут, мы можем установить «номинальное» значение на основе SMA за 120 минут и сравнить его с SMA за 5 и 30 минут. Когда SMA нижнего интервала превышают 3 стандартных отклонения выше номинального значения, мы можем рассмотреть возможность отправки уведомления пользователю о необходимости проверки 3D-принтера.
Заключение
API-интерфейсы REST в сочетании с ПЛК чрезвычайно полезны по разным причинам, включая возможность простой интеграции высокопроизводительных моделей машинного обучения для мониторинга работоспособности устройств. Используя API, практически все возможно интегрировать с ПЛК и подключенными к нему устройствами.
Если вас интересует готовый плагин Compass, свяжитесь со мной.
Источники
[1] Лебединский, П. (2022, 27 мая). REST API на промышленных ПЛК Medium. Получено 26 сентября 2022 г. с https://towardsdatascience.com/a-single-number-metric-for-evaluating-object-detection-models-c97f4a98616d.
[2] Компас Яскавы. Яскава. (н.д.). Получено 26 сентября 2022 г. с https://www.yaskawa.com/products/motion/machine-controllers/software-tools/yaskawa-compass.
[3] Чжао Ю., Насрулла З. и Ли З., 2019 г. PyOD: набор инструментов Python для масштабируемого обнаружения выбросов. Журнал исследований машинного обучения (JMLR), 20 (96), стр. 1–7.
[4] Червинский — собственная работа, CC BY-SA 4.0, https://commons.wikimedia.org/w/index.php?curid=45555552
[5] Лебединский, П. (2021, 12 ноября). Обнаружение аномалий на сервоприводах. Средняя. Получено 12 мая 2022 г. с https://towardsdatascience.com/a-single-number-metric-for-evaluating-object-detection-models-c97f4a98616d.
[6] Ле, К.В. (2015). Учебное пособие по глубокому обучению, часть 2: автоэнкодеры, сверточные нейронные сети и рекуррентные нейронные сети. Google Brain, Google Inc.