Как получить данные из измерительного прибора в 1С через COM-порт

Программист 1С v8.3 (Управляемые формы) Промышленность, строительство и АПК
← На главную

В производственных процессах и отделах контроля качества часто возникает задача фиксации геометрических параметров деталей. Для исключения ручного ввода измерительные приборы (электронные индикаторы, штангенциркули, микрометры) подключают напрямую к рабочему месту оператора через физический или виртуальный последовательный интерфейс (COM-порт). Разберем практический способ организации прямого обмена данными между измерительным прибором и платформой 1С:Предприятие 8.3.

Архитектура взаимодействия и выбор компоненты

Для прямого низкоуровневого опроса последовательного порта в среде Windows традиционно используется библиотека MSCommLib (элемент управления MSComm32.ocx). Данный объект регистрируется в операционной системе и позволяет взаимодействовать с COM-портами через стандартный COM-механизм платформы 1С.

Выясним, с какими особенностями можно столкнуться при использовании этой компоненты:

  1. Разрядность платформы: Библиотека MSComm32.ocx является строго 32-разрядной (x86). Ее вызов в 1С возможен только из 32-разрядного клиента («Тонкий клиент (x86)» или толстый клиент). При запуске в 64-разрядном клиенте или на сервере 1С x86-64 попытка создания объекта завершится ошибкой.
  2. Режим опроса: Чтение данных из 1С выполняется путем опроса входного буфера порта с ожиданием поступления байтов.
  3. Формат данных: Если устройство передает бинарные пакеты, считывание необходимо переводить в режим работы с байтовыми массивами COMSafeArray.

Пример программного подключения к порту в 1С

Рассмотрим типовой сценарий: оператор нажимает кнопку передачи данных на самом приборе, в результате чего прибор отправляет пакет байтов в COM-порт. На стороне 1С выполняется процедура инициализации порта, ожидания пакета и выгрузки принятых данных.

Посмотрим на пример кода подключения и чтения:


Попытка
    ComPort = Новый COMОбъект("MSCOMMLib.MSComm.1");
Исключение
    Сообщить("Ошибка создания объекта MSComm: " + ОписаниеОшибки(), СтатусСообщения.ОченьВажное);
    Возврат;
КонецПопытки;

Попытка
    // Указываем номер порта, к которому подключен прибор (например, COM1)
    ComPort.CommPort = 1;
    
    // Параметры связи: скорость 9600, без контроля четности, 8 бит данных, 1 стоп-бит
    ComPort.Settings = "9600,N,8,1";
    
    // Отключаем программный контроль потока
    ComPort.Handshaking = 0;
    
    // Сбрасываем счетчик и очищаем буфер
    ComPort.InBufferCount = 0;
    ComPort.InBufferSize = 70;
    ComPort.InputLen = 0;
    
    // Режим приема: 1 - двоичные данные (возвращает COMSafeArray), 0 - текстовый режим
    ComPort.InputMode = 1;
    ComPort.NullDiscard = 0;
    
    // Активируем линию готовности к передаче
    ComPort.RTSEnable = 1;
    
    // Открываем порт
    ComPort.PortOpen = Истина;
    
    // Ожидаем появления данных в буфере
    ПодождатьПриемаСимволовСТаймаутом(ComPort, 7, 2);
    
    // Считываем принятые данные
    ПринятаяПосылка = ComPort.Input;
    
    // Закрываем порт сразу после получения данных
    ComPort.PortOpen = Ложь;
    
    Сообщить("Связь установлена, данные успешно прочитаны.");
Исключение
    Сообщить("Не удалось открыть порт или считать данные: " + ОписаниеОшибки(), СтатусСообщения.ОченьВажное);
    Если ComPort.PortOpen Тогда
        ComPort.PortOpen = Ложь;
    КонецЕсли;
КонецПопытки;

Почему буфер порта пуст: важность сигнала RTS

Частая проблема при работе с измерительными приборами (особенно китайского производства) заключается в том, что порт успешно открывается, на приборе нажимается кнопка отправки, но свойство ComPort.Input возвращает абсолютно пустой массив или пустую строку. Проанализируем физическую причину такого поведения.

Многие компактные измерительные приборы не имеют собственного полноценного источника питания для микросхемы согласования уровней RS-232. Для передачи сигнала интерфейс использует так называемое паразитное питание от служебных линий COM-порта управляющего компьютера. Сигнал RTS (Ready to Send) выставляет положительное напряжение на соответствующей ножке разъема, которое питает оптопару или передатчик кабеля прибора. Если в коде не включить свойство ComPort.RTSEnable = 1, микросхема преобразователя интерфейса останется обесточенной, и прибор физически не сможет передать данные в порт. В ряде аналогичных кабелей может дополнительно потребоваться включение линии терминала: ComPort.DTREnable = 1.

Особенности обработки принятых данных

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

  1. Чтение из переменной: После выполнения инструкции ПринятаяПосылка = ComPort.Input; данные из внутреннего буфера порта переносятся в переменную ПринятаяПосылка. Повторное обращение к свойству ComPort.Input вернет уже пустой результат, так как буфер очищается при вычитке. Выгрузку необходимо делать именно из полученной переменной: МассивБайт = ПринятаяПосылка.Выгрузить();.
  2. Декодирование формата: Большинство измерительных головок и штангенциркулей передают данные не готовым текстом, а специализированными двоично-десятичными кадрами (BCD), где отдельные биты отвечают за знак числа («плюс» или «минус») и единицы измерения (миллиметры или дюймы). Полученный массив байтов в 1С необходимо разобрать по спецификации конкретного прибора и перевести в числовое значение.

Альтернативные способы интеграции

Если решение на базе MSCommLib не подходит из-за ограничений разрядности или блокировки графического интерфейса 1С во время ожидания пакета, проанализируем современные альтернативные варианты:

  1. Библиотека подключаемого оборудования (БПО) и драйвер сканера: Если прибор настроен на выдачу ASCII-строки с символом перевода строки в конце пакета, его можно подключить как обычный сканер штрихкодов в режиме COM-порта. В этом случае 1С будет получать показания асинхронно через событие ОбработкаОповещения или ВнешнееСобытие без зависания интерфейса.
  2. Внешняя компонента Native API: Использование современных кроссплатформенных компонент для работы с COM-портом позволяет работать как в 32-разрядных, так и в 64-разрядных версиях 1С под управлением Windows и Linux.
  3. Внешний фоновый сервис: Создание легковесной службы на Python или C#, которая непрерывно удерживает связь с COM-портом, декодирует протокол прибора и отправляет готовые замеры в 1С через HTTP-сервис. Это решение полностью изолирует платформу 1С от аппаратных сбоев и тайм-аутов последовательного интерфейса.
← На главную