Интеграция учетной системы 1С с промышленным оборудованием (роботами-манипуляторами, станками с ЧПУ, программируемыми логическими контроллерами — PLC) — одна из ключевых задач современной автоматизации производства в рамках концепции Индустрии 4.0. Основная цель такой интеграции заключается в том, чтобы исключить человеческий фактор при фиксации выпуска продукции, точно подсчитывать производственные циклы, контролировать время работы оборудования и оперативно реагировать на возникающие ошибки и брак.
В этой статье мы подробно рассмотрим различные архитектурные подходы, разберем конкретные методы интеграции платформы 1С с промышленным оборудованием, проанализируем примеры программного кода и выясним, как правильно выстроить надежный обмен данными.
Перед тем как писать программный код, необходимо определиться с физическим и логическим уровнем взаимодействия оборудования и 1С. На практике выбор технологии зависит от того, какие интерфейсы поддерживает контроллер вашего робота (например, TCP/IP, USB, RS-485/RS-232) и предоставляет ли производитель открытое API (SDK). Выделим основные проверенные способы связи.
Если производитель оборудования поставляет динамические библиотеки (DLL) для работы со своим контроллером, мы можем подключить их напрямую в 1С в виде внешней компоненты. Платформа 1С поддерживает технологии COM и более современную кроссплатформенную технологию Native API.
Использование Native API предпочтительнее, так как оно позволяет организовать асинхронный обмен данными. Оборудование отправляет сигнал о завершении цикла, внешняя компонента ловит его и генерирует событие в 1С, которое перехватывается стандартной процедурой ОбработкаВнешнегоСобытия.
Давайте разберем пример инициализации внешней компоненты и обработки сигнала от робота-манипулятора в модуле управляемого приложения или форме:
&НаКлиенте
Процедура ПодключитьОборудование()
// Путь к файлу внешней компоненты (компонента должна быть предварительно загружена в макет)
ИмяФайлаКомпоненты = "ОбщийМакет.ДрайверРоботаКонтроллера";
Попытка
УстановитьВнешнююКомпоненту(ИмяФайлаКомпоненты);
ПодключитьВнешнююКомпоненту(ИмяФайлаКомпоненты, "RobotDriver", ТипВнешнейКомпоненты.Native);
// Создаем объект драйвера для отправки команд и настройки параметров
ДрайверРобота = Новый("AddIn.RobotDriver.RobotController");
ДрайверРобота.ПортПодключения = "192.168.1.100";
ДрайверРобота.ОткрытьПорт();
Сообщить("Связь с контроллером робота успешно установлена!");
Исключение
ВызватьИсключение "Не удалось подключить драйвер оборудования: " + ОписаниеОшибки();
КонецПопытки;
КонецПроцедуры
&НаКлиенте
Процедура ОбработкаВнешнегоСобытия(Источник, Событие, Данные)
// Фильтруем события, поступающие только от нашего робота
Если Источник = "RobotDriver" Тогда
Если Событие = "CycleCompleted" Тогда
// Сигнал о завершении цикла (переносе заготовки в точку Б)
ОбработатьЗавершениеЦикла(Данные);
КонецЕсли;
КонецЕсли;
КонецПроцедуры
&НаСервереБезКонтекста
Процедура ОбработатьЗавершениеЦикла(Знач ДанныеЦикла)
// ДанныеЦикла могут содержать, например, ID робота, время цикла или код детали
НоваяЗапись = РегистрыСведений.ЛогПроизводственныхЦиклов.СоздатьМенеджерЗаписи();
НоваяЗапись.Период = ТекущаяДатаСеанса();
НоваяЗапись.Оборудование = Справочники.Оборудование.НайтиПоКоду(ДанныеЦикла);
НоваяЗапись.Статус = "Успешно";
НоваяЗапись.Записать();
// Здесь же мы можем автоматически отразить выпуск полуфабриката в ERP-системе
КонецПроцедуры
В промышленной автоматизации (АСУ ТП) прямой доступ из учетной системы к контроллерам считается не самым лучшим решением, так как это создает избыточную нагрузку на процессоры PLC, критичные к таймингам реального времени. Общепринятым стандартом обмена является протокол OPC UA (Open Platform Communications Unified Architecture).
Схема взаимодействия выглядит так: производитель оборудования предоставляет OPC-сервер (например, Kepware, Matrikon или встроенный в панель управления софт), который опрашивает робота по внутренним протоколам. 1С, в свою очередь, выступает в роли OPC-клиента, подключаясь к тегам (переменным) сервера.
Для реализации этой схемы в 1С используются специализированные библиотеки или внешние компоненты OPC. Платформа подписывается на определенный тег (например, Robot1.CycleCounter) и считывает его значение по таймеру или по событию изменения данных.
Многие современные производственные линии и роботизированные ячейки управляются компьютерами (под управлением Windows или Linux), на которых развернут управляющий софт. Часто этот софт по умолчанию логирует все операции, ошибки и прохождения деталей во внутреннюю реляционную базу данных.
Проанализируем ситуацию: если управляющее ПО записывает каждый шаг робота в базу данных Microsoft SQL Server, мы можем настроить в 1С механизм Внешних источников данных или использовать COM-объект ADODB.Connection для прямого чтения логов.
Рассмотрим пример чтения данных из технологической базы данных SQL Server с помощью прямого ADO-запроса в 1С:
&НаСервере
Функция СчитатьНовыеЦиклыИзБазыОборудования(ПоследнийСчитанныйID) Экспорт
РезультатТаблица = Новый ТаблицаЗначений;
РезультатТаблица.Колонки.Добавить("ID", Новый ОписаниеТипов("Число"));
РезультатТаблица.Колонки.Добавить("ВремяСобытия", Новый ОписаниеТипов("Дата"));
РезультатТаблица.Колонки.Добавить("КодРобота", Новый ОписаниеТипов("Строка"));
Connection = Новый COMОбъект("ADODB.Connection");
ConnectionString = "Provider=SQLOLEDB;Data Source=192.168.1.10;Initial Catalog=RobotLogs;User ID=sa;Password=mySecurePassword;";
Попытка
Connection.Open(ConnectionString);
Исключение
ЗаписатьЛогОшибок("Ошибка подключения к SQL-базе робота: " + ОписаниеОшибки());
Возврат РезультатТаблица;
КонецПопытки;
Command = Новый COMОбъект("ADODB.Command");
Command.ActiveConnection = Connection;
// Пишем запрос на получение только новых логов циклов оборудования
Command.CommandText = "SELECT LogID, EventTime, RobotName FROM dbo.CycleHistory WHERE LogID > " + Формат(ПоследнийСчитанныйID, "ЧГ=0");
RecordSet = Command.Execute();
Пока НЕ RecordSet.EOF() Цикл
НоваяСтрока = РезультатТаблица.Добавить();
НоваяСтрока.ID = RecordSet.Fields("LogID").Value;
НоваяСтрока.ВремяСобытия = RecordSet.Fields("EventTime").Value;
НоваяСтрока.КодРобота = СокрЛП(RecordSet.Fields("RobotName").Value);
RecordSet.MoveNext();
КонецЦикла;
RecordSet.Close();
Connection.Close();
Возврат РезультатТаблица;
КонецФункции
Этот метод чрезвычайно надежен, так как база данных выступает в роли буфера. Если сервер 1С будет временно недоступен (например, при обновлении конфигурации или резервном копировании), данные в SQL-базе оборудования никуда не исчезнут. После восстановления связи 1С просто дочитает пропущенные записи по идентификатору LogID.
Один из самых современных и архитектурно чистых подходов — создание веб-сервиса (обертки) на уровне ОС управляющего компьютера робота. Разработчик на стороне оборудования пишет легкий скрипт (например, на Python, Go или C#), который слушает контроллер робота по протоколу TCP/IP (или Modbus TCP) и при завершении цикла отправляет HTTP POST-запрос в 1С на специально опубликованный HTTP-сервис.
Рассмотрим по шагам реализацию этой модели со стороны 1С:
ProductionExchange./v1/cycle_event.POST с обработчиком в модуле HTTP-сервиса.Пример кода обработчика HTTP-сервиса в 1С:
Функция ШаблонАдресаМетодPOST(Запрос)
Ответ = Новый HTTPСервисОтвет(200);
Ответ.Заголовки.Вставить("Content-Type", "application/json; charset=utf-8");
// Получаем тело POST-запроса от робота
СтрокаJSON = Запрос.ПолучитьТелоКакСтроку();
ЧтениеJSON = Новый ЧтениеJSON;
ЧтениеJSON.УстановитьСтроку(СтрокаJSON);
ДанныеСобытия = ПрочитатьJSON(ЧтениеJSON);
ЧтениеJSON.Закрыть();
// Проверим обязательные поля структуры JSON
Если НЕ ДанныеСобытия.Свойство("RobotID") Или НЕ ДанныеСобытия.Свойство("Status") Тогда
Ответ.КодСтатуса = 400; // Bad Request
Ответ.УстановитьТелоИзСтроки("{""error"":""Неверный формат данных""}");
Возврат Ответ;
КонецЕсли;
НачатьТранзакцию();
Попытка
// Регистрируем событие цикла в базе 1С
ДокументВыпуск = Документы.ВыпускПродукции.СоздатьДокумент();
ДокументВыпуск.Дата = ТекущаяДата();
ДокументВыпуск.Организация = Справочники.Организации.НайтиПоРеквизиту("Основная", Истина);
ДокументВыпуск.Оборудование = Справочники.Оборудование.НайтиПоРеквизиту("ИдентификаторОборудования", ДанныеСобытия.RobotID);
// Заполняем номенклатуру, полученную по данным цикла
ДокументВыпуск.Количество = 1;
ДокументВыпуск.Записать(РежимЗаписиДокумента.Проведение);
ЗафиксироватьТранзакцию();
// Отправляем успешный ответ оборудованию
Ответ.УстановитьТелоИзСтроки("{""result"":""success"",""document_number"":""" + ДокументВыпуск.Номер + """}");
Исключение
ОтменитьТранзакцию();
ЗаписатьЛогОшибок("Ошибка проведения выпуска: " + ОписаниеОшибки());
Ответ.КодСтатуса = 500; // Internal Server Error
Ответ.УстановитьТелоИзСтроки("{""error"":""Внутренняя ошибка базы данных""}");
КонецПопытки;
Возврат Ответ;
EndФункция
Преимущество такой push-модели в том, что 1С работает реактивно и не тратит ресурсы на постоянный периодический опрос оборудования (pull-модель). Оборудование само уведомляет 1С по факту совершения хозяйственной операции.
Бывают случаи, когда контроллер робота или станка полностью «закрыт» производителем (прошивка зашифрована, сетевые порты заблокированы, исходных кодов управляющего софта нет), либо вмешательство в программную логику оборудования лишает предприятие гарантии.
В такой ситуации отличным решением является использование косвенных физических признаков. Разберем этот кейс подробнее:
Этот метод абсолютно безопасен для дорогостоящих роботов, дешев в реализации и легко масштабируется на любые старые аналоговые станки без "умных" контроллеров.
При организации автоматического учета циклов на уровне 1С крайне важно учитывать нюансы реального производства. Простой подсчет физических перемещений манипулятора ("взял деталь в А, положил в Б") может привести к искажению данных в следующих случаях:
Поэтому в профессиональных системах управления производством (MES/ERP) сбор данных с датчиков должен обязательно комбинироваться со статусами оборудования. Если контроллер робота имеет выходные регистры ошибок, при фиксации цикла обязательно считывайте переменную ErrorCode или статус захвата GripperState. В 1С проводите выпуск продукции только тогда, когда цикл завершился без ошибок, а датчики подтвердили успешный зажим заготовки и успешную штамповку на прессе.
Интеграция 1С с контроллерами оборудования — это комплексная задача, требующая тесного взаимодействия программиста 1С и инженера АСУ ТП (программиста контроллеров). Платформа 1С v8.3 предоставляет все необходимые инструменты для решения этой задачи: от низкоуровневых внешних компонент Native API и прямого доступа к базам данных СУБД, до гибких REST HTTP-сервисов, способных принимать сообщения от любых внешних систем и скриптов в режиме реального времени. Начните проектирование интеграции с детального изучения мануала контроллера вашего оборудования и выбора наиболее безопасного и масштабируемого протокола обмена.