Как отправить команду в COM-порт из 1С:Предприятие 7.7 для управления контроллером Arduino?

Программист 1С v7.7 IT и автоматизация бизнеса
← На главную

Интеграция учетной системы 1С с микроконтроллерами (например, Arduino) позволяет автоматизировать физические процессы: управление электромагнитными замками витрин, светодиодной индикацией, шлагбаумами или датчиками. Однако при попытке отправить управляющие символы в последовательный интерфейс (COM-порт) разработчики часто сталкиваются с ситуацией, когда через терминальные программы вроде PuTTY всё работает корректно, а команды из командной строки Windows или встроенного языка 1С не дают результата.

В этой статье разберем физические и программные причины такого поведения, а также рассмотрим рабочие способы организации обмена данными между 1С:Предприятие 7.7 и контроллером.

Почему не работает прямая отправка через командную строку

Проанализируем ситуацию: почему вызов вида set /p x="1" < nul > \\.\COM5 или echo 1 > COM5 заставляет светодиод на плате мигать, но контроллер не выполняет команду (например, не открывает замок)?

  1. Аппаратный автосброс Arduino по сигналу DTR: В платах Arduino (Nano, Uno и др.) линия DTR (Data Terminal Ready) виртуального COM-порта соединена с выводом RESET микроконтроллера через конденсатор. При открытии порта операционной системой уровень DTR падает, вызывая перезагрузку микроконтроллера и запуск загрузчика (bootloader). Командная строка открывает порт на долю секунды, отправляет байт и сразу закрывает соединение. Контроллер в этот момент уходит в перезагрузку и физически не успевает принять или обработать данные. В PuTTY порт остается постоянно открытым, поэтому сброс происходит только один раз в момент подключения.
  2. Несовпадение параметров соединения (Baud Rate): При прямой записи в порт Windows использует параметры по умолчанию, которые могут не совпадать со скоростью, указанной в скетче контроллера (например, 9600 или 115200 бод).
  3. Лишние служебные символы: Команда echo 1 отправляет не только символ «1», но и невидимые символы возврата каретки и перевода строки (\r\n), что может ломать логику обработки в скетче.

Способ 1. Использование внешней компоненты для работы с RS-232

В платформе 1С:Предприятие 7.7 нет штатных объектов для прямого доступа к аппаратным портам ввода-вывода. Наиболее надежный и простой путь — использование специализированной внешней компоненты (например, vk_rs232 или аналогичных Native/COM-библиотек). Компонента единожды открывает COM-порт при запуске сеанса или перед началом обмена, удерживает соединение открытым и передает «чистые» байты без лишних терминаторов.

Рассмотрим пример подключения и передачи данных через внешнюю компоненту в 1С 7.7:


// Загрузка внешней компоненты
Если ЗагрузитьВнешнююКомпоненту("vk_rs232.dll") = 0 Тогда
    Предупреждение("Не удалось загрузить компоненту vk_rs232.dll");
    Возврат;
КонецЕсли;

// Создание объекта компоненты
Порт = СоздатьОбъект("AddIn.vk_rs232");

// Настройка параметров подключения: номер порта, скорость, четность, биты данных, стоп-биты
Порт.Параметры(5, 9600, 0, 8, 1);

// Открытие порта
Если Порт.Открыть() = 1 Тогда
    // Отправка управляющего символа для открытия замка
    Порт.Записать("1");
    
    // Закрытие порта после завершения сеанса работы
    Порт.Закрыть();
Иначе
    Сообщить("Ошибка открытия COM-порта!");
КонецЕсли;

Способ 2. Использование системного ActiveX-компонента MSComm32

Еще один классический вариант взаимодействия с последовательным портом — использование системного элемента управления MSCommLib.MSComm (библиотека MSCOMM32.OCX). Данный компонент регистрируется в Windows и доступен через стандартный механизм СоздатьОбъект().

Разберем пример работы с MSComm32:


Комм = СоздатьОбъект("MSCOMMLib.MSComm");
// Указываем номер COM-порта (5)
Комм.CommPort = 5;
// Скорость 9600, без четности, 8 бит данных, 1 стоп-бит
Комм.Settings = "9600,N,8,1";
// Отключаем управление линией DTR, чтобы избежать перезапуска платы
Комм.DTREnable = 0;

// Открываем порт
Комм.PortOpen = 1;

// Передаем команду контроллеру
Комм.Output = "1";

// Закрываем порт при необходимости
Комм.PortOpen = 0;

Способ 3. Использование платформы .NET (System.IO.Ports.SerialPort)

Если в системе не хочется использовать устаревшие OCX-компоненты, можно задействовать класс System.IO.Ports.SerialPort из платформы .NET через внешние COM-обертки или скрипты PowerShell. Это позволяет гибко настраивать таймауты, скорость, флаги DTR/RTS и выполнять асинхронную отправку без блокировки пользовательского интерфейса 1С.

Способ 4. Корректная отправка через командную строку Windows

Если требуется выполнить отправку без дополнительных библиотек средствами операционной системы, необходимо предварительно инициализировать порт утилитой mode, отключив управление линией DTR:

  1. Настраиваем порт командой: mode COM5: BAUD=9600 PARITY=N DATA=8 STOP=1 dtr=off
  2. Отправляем команду без добавления символов переноса строки.

Посмотрим на пример вызова из встроенного языка 1С 7.7 через системную команду:


КомандаНастройки = "mode COM5: BAUD=9600 PARITY=N DATA=8 STOP=1 dtr=off";
КомандаОтправки  = "set /p x=""1"" < nul > \\.\COM5";

КомандаСистемы(КомандаНастройки);
КомандаСистемы(КомандаОтправки);

Аппаратные способы предотвращения автосброса Arduino

Если отправка команд осуществляется сторонними программами, не позволяющими управлять линией DTR программно, рекомендуется доработать аппаратную часть схемы:

  1. Подключение конденсатора: Установите электролитический конденсатор емкостью 10 мкФ между контактами RESET и GND платы Arduino (плюс к RESET, минус к GND). Конденсатор сгладит импульс сброса при открытии порта. Обратите внимание: на время прошивки скетча конденсатор необходимо временно отключать.
  2. Подтягивающий резистор: Установите резистор сопротивлением 110–120 Ом между контактами RESET и +5V. Это предотвратит падение напряжения на линии сброса при поступлении сигнала от операционной системы.

Для надежной промышленной эксплуатации (например, управления торговыми замками) оптимальным решением является постоянное удержание порта открытым через специализированную внешнюю компоненту 1С либо использование сетевых интерфейсов (Ethernet/Wi-Fi контроллеры с протоколом TCP/HTTP).

← На главную