При замене весового оборудования, например, при переходе со старых моделей НВТ-3 на более современные НВТ-9 (или аналогичные индикаторы серии А12), программисты часто сталкиваются с проблемой «залипания» веса. Ситуация выглядит так: первое взвешивание проходит корректно, но при смене груза 1С продолжает считывать старое значение, и только через несколько попыток или с большой задержкой появляется актуальный вес. В этой статье мы подробно разберем, почему это происходит и как правильно настроить программно-аппаратный комплекс на базе 1С:Предприятие 7.7 и внешней компоненты vk_rs232.dll.
Основная причина некорректного поведения заключается в механизме работы COM-порта и логике передачи данных весовым терминалом. В отличие от старых моделей, современные терминалы НВТ-9 имеют более высокую частоту опроса и специфические режимы стабилизации. Когда весы настроены на непрерывную передачу данных, буфер операционной системы забивается посылками. Если 1С считывает данные реже, чем весы их отправляют, программа начинает доставать из очереди «устаревшие» пакеты данных, которые накопились в буфере, пока весы стояли под старым грузом или были пустыми.
Рассмотрим основные факторы, влияющие на ошибку:
vk_rs232.dll просто слушает порт. Если код 1С не очищает входную очередь перед чтением, вы будете получать данные минутной давности.Прежде чем менять код в 1С, необходимо убедиться, что сам весовой терминал настроен правильно. Для входа в режим конфигурации НВТ-9 обычно требуется удерживать клавишу «#» или «Функция» при включении прибора. Нас интересуют параметры связи, которые обычно обозначаются буквой P.
Проанализируем ключевые настройки:
9600. Важно, чтобы это значение совпадало с параметром в методе ОткрытьПорт вашей внешней компоненты.P5 = 1 (Command mode): Весы отправляют данные только при получении команды R или W от ПК. Это самый надежный режим, исключающий забивание буфера.P5 = 2 (Continuous): Непрерывная передача. Весы «спамят» в порт. Требует обязательной очистки буфера в 1С.P5 = 3 (Auto/Stable): Отправка данных один раз в момент фиксации стабильного веса. Может привести к тому, что 1С «пропустит» момент и не увидит данных.Для стабильной работы в 1С 7.7 чаще всего выбирают либо режим P5 = 1 (если компонента позволяет отправлять байты в порт), либо P5 = 2, но с программной хитростью в коде 1С.
Разберем, как правильно реализовать чтение данных, если весы работают в режиме непрерывной передачи. Главная задача — «промотать» буфер до самого конца, чтобы считать последнюю, самую свежую посылку.
Рассмотрим пример кода, который предотвращает считывание старых показаний:
// Создаем объект внешней компоненты
Попытка
ЗагрузитьВнешнююКомпоненту("vk_rs232.dll");
Весы = СоздатьОбъект("AddIn.Rs232");
Исключение
Сообщить("Ошибка загрузки компоненты vk_rs232.dll");
КонецПопытки;
// Функция для получения актуального веса
Функция ПолучитьТекущийВес()
// 1. Очищаем старые данные из порта (проматываем буфер)
ВременнаяСтрока = "";
Пока Весы.ДанныеВПорту() > 0 Цикл
ВременнаяСтрока = Весы.ЧитатьСтроку(); // Читаем и выбрасываем
КонецЦикла;
// 2. Ждем короткую паузу, чтобы пришла свежая посылка
// В 7.7 паузу можно реализовать через пустой цикл или внешнюю компоненту
Для ии = 1 По 1000 Цикл
// Небольшая задержка
КонецЦикла;
// 3. Теперь читаем свежие данные
Посылка = Весы.ЧитатьСтроку();
// 4. Парсим строку (для НВТ-9 обычно ищем символы конца строки и статус)
// Примерная логика выделения числа:
ЧистыйВес = СокрЛП(Сред(Посылка, 3, 7));
Возврат Число(ЧистыйВес);
КонецФункции
В данном примере мы используем метод ДанныеВПорту(), чтобы убедиться, что мы вычитали все накопленные пакеты. Только после того, как буфер опустел, мы берем следующую поступившую строку. Это гарантирует, что считанный вес соответствует тому, что сейчас реально лежит на платформе.
Иногда даже при правильном коде вес «скачет» или не обновляется. Выясним причину в настройках фильтрации. У весов НВТ-9 есть внутренние настройки цифровой фильтрации (параметры группы P1, P2). Если фильтрация слишком сильная, весы долго «думают», прежде чем признать вес стабильным и обновить данные в порту.
Важный совет: Если переоткрытие порта методом ЗакрытьПорт() / ОткрытьПорт() не помогает, значит, проблема в прошивке самого весового индикатора или в аппаратной части. Проверьте распайку кабеля RS-232. Для весов Невского завода стандартная распиновка: 2-3, 3-2, 5-5. Однако в некоторых случаях требуется соединение контактов 7-8 на стороне разъема весов для управления потоком данных.
Подведем итоги. Чтобы весы НВТ-9 корректно отдавали вес в 1С 7.7, выполните следующие шаги:
P4=9600 и попробуйте режим P5=2.vk_rs232.dll корректно настроена на параметры четности и стоповых битов (обычно это 8-N-1).Использование связки 1С 7.7 и современного оборудования вполне реально, если учитывать специфику работы последовательного интерфейса и своевременно очищать очередь входящих сообщений. Для интеграции аналогичного оборудования также можно использовать специализированную внешнюю компоненту для подключения весовых терминалов Т3 и Т9.