RE: Почему ответ от весов приходит без точки остановки и как это исправить?

#33793
bot_avaOdin — Одинэсник
Участник

    Ответ:

    При работе с весами по протоколу MT-SICS через TCP важно учитывать, что весы могут не сразу отправлять полный ответ после получения команды, а формировать его с небольшой задержкой. Если функция сразу после отправки команды пытается прочитать ответ, то может получить неполные данные — например, без ожидаемой точки остановы (CRLF или другого завершающего символа).

    Основные причины и рекомендации:

    1. **Отсутствие таймаута ожидания ответа**
    В вашем коде нет явного ожидания или таймаута перед чтением ответа. Весы могут формировать ответ с задержкой, и если читать сразу — получите неполный ответ.
    Решение: добавить ожидание (таймаут) перед чтением или реализовать цикл чтения с проверкой окончания ответа.

    2. **Неправильный формат окончания команды или ответа**
    MT-SICS требует окончания команды CRLF (`rn`), вы используете `Символы.ВК + Символы.ПС` — это `rn`, что правильно. Но стоит проверить, что весы действительно ожидают именно такой формат. Иногда требуется дополнительная проверка документации весов.

    3. **Чтение ответа по частям**
    Возможно, ответ весов приходит по частям, и `OPI_TCP.ПрочитатьСтроку` читает только первую часть. Нужно реализовать чтение в цикле, пока не будет получен полный ответ (например, до CRLF).

    4. **Проверка кодировки**
    Вы используете `»ASCII»`, убедитесь, что весы действительно работают с этой кодировкой. Иногда требуется `»UTF-8″` или другая.

    5. **Проверка соединения и буферов**
    Убедитесь, что соединение стабильно, и буферы не переполняются.

    Пример улучшенного варианта с таймаутом и циклом чтения:

    1C
    Функция ОтправитьКомандуНаВесы() Экспорт
        АдресВесов = Объект.АдресВесов;
        Команда = "S";
        Таймаут = 5000; // 5 секунд
        ИнтервалОжидания = 100; // мс
        МаксимумПопыток = Таймаут / ИнтервалОжидания;
    
        Соединение = OPI_TCP.ОткрытьСоединение(АдресВесов);
        Если Не ЗначениеЗаполнено(Соединение) Тогда
            Сообщить("Не удалось открыть соединение с весами");
            Возврат Ложь;
        КонецЕсли;
    
        Данные = Команда + Символы.ВК + Символы.ПС;
        OPI_TCP.ОтправитьСтроку(Соединение, Данные, "ASCII");
    
        Ответ = "";
        Попытка = 0;
        Пока Попытка  0 Тогда
                    Прервать;
                КонецЕсли;
            КонецЕсли;
            Попытка = Попытка + 1;
            Пауза(ИнтервалОжидания);
        КонецЦикла;
    
        Если НЕ ЗначениеЗаполнено(Ответ) Тогда
            Сообщить("Нет ответа от весов — проверь соединение или CRLF.");
            OPI_TCP.ЗакрытьСоединение(Соединение);
            Возврат Ложь;
        Иначе
            Объект.Вывод = Ответ;
        КонецЕсли;
    
        OPI_TCP.ЗакрытьСоединение(Соединение);
        Возврат Истина;
    КонецФункции
    

    **Итог:**
    Да, нужен таймаут и/или цикл ожидания полного ответа от весов. Без этого вы рискуете получить неполный ответ без точки остановы. Также проверьте корректность формата команд и ответов, а также стабильность соединения.

    Рекомендую посмотреть здесь:
    https://helpf.pro/faq/view/920.html (пример работы с COM-объектами и таймаутами)
    и документацию к вашим весам по протоколу MT-SICS.

    Если нужна помощь с конкретным кодом или настройкой — обращайтесь.

    База знаний 1С