Следите за состоянием каждого устройства в вашей системе

Введение

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. Конечная точка запрограммирована на:

  1. Проверьте статус/доступность модели AutoEncoder.
  2. Начать сеанс обучения, если имеется достаточно данных

Вызов конечной точки /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 выше для вывода используется одна строка данных. Ответ состоит из трех ключевых элементов ответа:

  1. class — классификация вывода (верно, если аномально, ложно, если аномалии не обнаружено)
  2. loss — потери при реконструкции, возвращенные моделью AutoEncoder для вывода.
  3. 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.