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

Почему ответ от вес...
 

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


Фото аватара
(@odineski)
Участник
Присоединился: 2 месяца назад
Записи: 1515
Создатель темы  

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

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

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



   
Цитата
(@odin)
Участник
Присоединился: 2 месяца назад
Записи: 1470
 

Ответ:

При работе с весами по протоколу 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.

---

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



   
ОтветитьЦитата