Подключение специализированного лабораторного оборудования, такого как весы серии Ohaus Adventurer AX, к системе 1С часто вызывает вопросы у разработчиков. Основная сложность заключается в отсутствии специализированных драйверов от производителя, интегрированных в типовые решения 1С. Однако наличие COM-порта (RS232) позволяет организовать обмен данными напрямую. В этой статье мы разберем способы программного получения веса, проанализируем необходимые компоненты и рассмотрим примеры кода.
Первым шагом при интеграции весов является выбор метода взаимодействия с последовательным портом. Рассмотрим основные варианты, которые успешно применяются в среде 1С:
Проанализируем ситуацию: если ваша база работает в 64-битном клиентском приложении, старые .ocx и .dll библиотеки не загрузятся. В таком случае следует ориентироваться только на NativeAPI решения.
Прежде чем писать код, необходимо убедиться, что аппаратная часть настроена верно. Для весов Ohaus характерны следующие параметры по умолчанию (которые обязательно нужно продублировать в настройках компоненты в 1С):
Разберем важный нюанс: физический кабель RS232 для Ohaus может требовать специфической распиновки. Если данные не приходят, проверьте наличие перемычек между контактами RTS/CTS (7 и 8), если в настройках весов включено аппаратное управление потоком. Если же весы подключены через встроенный USB-порт, убедитесь, что в меню весов выбран режим Virtual COM Port, а в системе установлен соответствующий драйвер (обычно Silicon Labs).
Рассмотрим подробнее пример кода для получения веса. Данный метод основан на периодическом опросе порта. Обратите внимание на использование объекта WScript.Shell для создания задержки — это необходимо, чтобы весы успели отправить данные в буфер после открытия порта.
// Создаем объект для работы с портом
КонтроллерВесов = Новый COMОбъект("MsCommLib.MsComm.1");
КонтроллерВесов.CommPort = 1; // Номер порта в системе
КонтроллерВесов.Settings = "2400,N,8,1"; // Параметры из документации весов
КонтроллерВесов.PortOpen = Истина;
// Небольшая пауза для инициализации обмена
Shell = Новый COMОбъект("WScript.Shell");
Shell.run("timeout /t 1", 0, -1);
Shell = Неопределено;
// Читаем накопленные данные из буфера
СтрокаВес = КонтроллерВесов.Input;
Если НЕ ПустаяСтрока(СтрокаВес) Тогда
// Весы Ohaus часто присылают строку вида " 125.50 g"
// Нам нужно выделить числовое значение
МассивСигналов = СтрРазделить(СтрокаВес, " ", Ложь);
Для каждого ТекСтрока Из МассивСигналов Цикл
Если СтрДлина(СокрЛП(ТекСтрока)) > 0 Тогда
Попытка
РезультатВес = Число(ТекСтрока);
Прервать; // Нашли первое числовое значение
Исключение
Продолжить;
КонецПопытки;
КонецЕсли;
КонецЦикла;
КонецЕсли;
КонтроллерВесов.PortOpen = Ложь;
Выясним причину, по которой иногда простая команда печати не подходит. Лабораторные весы Ohaus поддерживают стандарт MT-SICS. Это позволяет не просто ждать нажатия кнопки "Print" на весах, а активно запрашивать данные из 1С. Рассмотрим основные команды:
I — запрос идентификационных данных весов.S — запрос стабильного значения веса (1С будет ждать, пока колебания чаши прекратятся).SI — немедленный запрос веса (даже если он еще не стабилизировался).Z — обнуление веса (Тарирование).Для отправки команды в порт используется метод Output. Например, отправка КонтроллерВесов.Output = "SI" + Символы.ПС; заставит весы мгновенно вернуть текущее значение в буфер Input.
Если вы решили использовать более современный подход (рекомендуется для Управляемых форм и 64-битных систем), структура кода будет выглядеть иначе. Вместо ActiveX-объекта мы подключаем внешнюю компоненту. Проанализируем общую схему:
// Подключение компоненты (предположим, она загружена в макет или лежит на диске)
УстановитьВнешнююКомпоненту("ОбщийМакет.КомпонентаRS232");
ПодключитьВнешнююКомпоненту("ОбщийМакет.КомпонентаRS232", "RS232", ТипВнешнейКомпоненты.Native);
Весы = Новый ("AddIn.RS232.RS232_Device");
// Настройка
Весы.Порт = 1;
Весы.Скорость = 9600;
Если Весы.ОткрытьПорт() Тогда
// Отправляем запрос на получение веса
Весы.ЗаписатьСтроку("P"); // Команда Print
// Читаем ответ
Данные = "";
Весы.ПрочитатьСтроку(Данные);
Сообщить("Вес получен: " + Данные);
Весы.ЗакрытьПорт();
Иначе
Предупреждение("Не удалось открыть COM-порт!");
КонецЕсли;
При разборе строки ответа важно учитывать, что весы могут передавать единицы измерения (g, mg, ct) и статус стабильности (S, SD). Посмотрим на пример типичной строки от Ohaus: "S 10.005 g". Здесь:
Для надежной работы системы рекомендуется очищать строку от нечисловых символов (кроме разделителя дробной части) с помощью регулярных выражений или перебора символов строки. Также убедитесь, что настройки региональных стандартов в 1С (точка или запятая в качестве разделителя) совпадают с тем, что присылают весы.
Важный совет: При фасовке удобно использовать режим автоматической отправки данных при стабилизации. В этом случае 1С должна постоянно "слушать" порт в фоновом режиме (например, через обработчик ожидания), и как только в буфере появляется корректная строка веса — фиксировать её в документе.
Подводя итог, можно сказать, что весы Ohaus отлично интегрируются с 1С. Главное — правильно определить разрядность вашего клиента 1С, выбрать соответствующую компоненту (ActiveX или NativeAPI) и верно настроить параметры передачи данных в соответствии с технической документацией конкретной модели Adventurer AX.