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

База знаний Одина — Одинэсника Форумы ODIN — Форум по 1С Предприятию Почему ответ от весов приходит без точки остановки и как это исправить?

Просмотр 1 ветки ответов
  • Автор
    Сообщения
    • #33792
      Телеграм группа https://t.me/odineskiOdineski
      Участник

        Функция ОтправитьКомандуНаВесы() Экспорт
        // — Настройки —
        АдресВесов = Объект.АдресВесов; // IP и порт твоих весов
        Команда = «S»; // Команда MT-SICS (немедленный вес)
        //Таймаут = 5000; // мс ожидания ответа

        // — Подключаемся к весам через TCP —
        Соединение = OPI_TCP.ОткрытьСоединение(АдресВесов);
        // — Отправляем команду —
        // MT-SICS требует CRLF (rn) после каждой команды
        Данные = Команда + Символы.ВК + Символы.ПС;
        OPI_TCP.ОтправитьСтроку(Соединение, Данные, «ASCII»);
        // — Читаем ответ до CRLF —
        Ответ = OPI_TCP.ПрочитатьСтроку(Соединение, «ASCII»);
        // — Показываем результат —
        Если Не ЗначениеЗаполнено(Ответ) Тогда
        Сообщить(«Нет ответа от весов — проверь соединение или CRLF.»);
        Иначе
        Объект.Вывод = Ответ;

        ПРоблема с точкой остановы мне приходит ответ без нет в чем проблема или нужен таймаут или как?
        КонецЕсли;
        // — Закрываем соединение —
        OPI_TCP.ЗакрытьСоединение(Соединение);
        КонецФункции

      • #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 ветки ответов
      • Для ответа в этой теме необходимо авторизоваться.
      База знаний 1С