Страница 110 из 1041 ПерваяПервая ... 1060100108109110111112120160210610 ... ПоследняяПоследняя
Показано с 1,091 по 1,100 из 10404

Тема: ВОПРОС-ОТВЕТ (отвечаем на простые вопросы от новичков)

  1. #1091
    Пользователь
    Регистрация
    13.10.2011
    Адрес
    Златоуст
    Сообщений
    1,021

    По умолчанию

    Какое-то гуманитарное описание проблемы. Прибор сам посылает без запроса что ли? Что у него там за протокол? Число принятых байт всегда 20 разве?

  2. #1092

    По умолчанию

    Здравствуйте, Sergey1024.
    Цитата Сообщение от Sergey1024 Посмотреть сообщение
    Что криминального в коде, почему теряются данные?
    Возможно на момент считывания буфера, ПЛКххх еще не успел получить все данные от внешнего устройства.
    Автоматизация Диспетчеризация Сервис
    e-mail: ads-kaluga@mail.ru

  3. #1093

    По умолчанию

    Цитата Сообщение от Yegor Посмотреть сообщение
    Какое-то гуманитарное описание проблемы. Прибор сам посылает без запроса что ли? Что у него там за протокол?
    Вы вопрос читали? Какая разница, какой протокол и кто шлет данные контроллеру?
    Цитата Сообщение от Yegor Посмотреть сообщение
    Число принятых байт всегда 20 разве?
    Этот вопрос к чему? Где вы в тексте вопроса увидели сообщение про число принятых байт?

    Еще раз: с одной стороны непрерывно шлются данные в порт, с другой - ПЛК тупо читает данные из порта и складирует в буфер. ВСЕ.
    При этом в буфере-приемнике (который buf в коде) принятые данные отличаются от посылаемых - часть данных теряется, примерно каждая 20 посылка приходит битая.
    Где собака порылась? Смена скорости с 115200 на 19200 ничего не дала.

  4. #1094

    По умолчанию

    Цитата Сообщение от Gans Посмотреть сообщение
    Возможно на момент считывания буфера, ПЛКххх еще не успел получить все данные от внешнего устройства.
    Без разницы - если не успел, в следующих циклах принятый остаток должен считаться и дописаться в буфер buf.

  5. #1095

    По умолчанию

    Цитата Сообщение от Sergey1024 Посмотреть сообщение
    Без разницы - если не успел, в следующих циклах принятый остаток должен считаться и дописаться в буфер buf.
    всё правильно, но вот после считывания данных программой буфер снова ПУСТ! и в следующий раз Вы считаете остатки данных которые не успели попасть в буфер на момент первого считывания. Если предыдущие данные Вы не сохранили для добавление остатков данных пришедших в буфер - то практически эти данные утеряны :-(
    P. S. Это же не С+/делфи, VBA и т.д. здесь нет генерации события что данные пришли это оставлено программисту самому разбираться :-)
    Автоматизация Диспетчеризация Сервис
    e-mail: ads-kaluga@mail.ru

  6. #1096

    По умолчанию

    Цитата Сообщение от Gans Посмотреть сообщение
    всё правильно, но вот после считывания данных программой буфер снова ПУСТ! и в следующий раз Вы считаете остатки данных которые не успели попасть в буфер на момент первого считывания. Если предыдущие данные Вы не сохранили для добавление остатков данных пришедших в буфер - то практически эти данные утеряны :-(
    В коде примера видно, что все пришедшие данные по мере поступления накапливаются в буфере buf. В реальном приложении я естественно анализирую и обрабатываю данные, в примере просто показана логика считывания данных.
    Допустим в порт я постоянно шлю посылки типа 11 22 33 44 55 66 77 88 FF FF
    В CDS при заполнении буфера я ставлю точку останова, смотрю в отладчике что пришло и вижу, что в буфере данные могут быть к примеру:
    11 22 33 FF FF 11...

    Вот и спрашиваю - что может быть причиной потери данных при приеме?

  7. #1097
    Пользователь Аватар для capzap
    Регистрация
    25.02.2011
    Адрес
    Киров
    Сообщений
    10,224

    По умолчанию

    Цитата Сообщение от Sergey1024 Посмотреть сообщение
    В коде примера видно, что все пришедшие данные по мере поступления накапливаются в буфере buf. В реальном приложении я естественно анализирую и обрабатываю данные, в примере просто показана логика считывания данных.
    Допустим в порт я постоянно шлю посылки типа 11 22 33 44 55 66 77 88 FF FF
    В CDS при заполнении буфера я ставлю точку останова, смотрю в отладчике что пришло и вижу, что в буфере данные могут быть к примеру:
    11 22 33 FF FF 11...

    Вот и спрашиваю - что может быть причиной потери данных при приеме?
    Ну видеть в буфере можете и просто мусор, прежде чем входить в цикл for обнулите буфер.
    Увеличивали ли период опроса, чтоб проверить пропадает ли информация

  8. #1098

    По умолчанию

    Цитата Сообщение от capzap Посмотреть сообщение
    Ну видеть в буфере можете и просто мусор, прежде чем входить в цикл for обнулите буфер.
    Зачем? Буфер заполняется полностью входными данными, после заполнения я в точке останова смотрю, что получил.
    Цитата Сообщение от capzap Посмотреть сообщение
    Увеличивали ли период опроса, чтоб проверить пропадает ли информация
    Что имеется в виду под периодом? Цикл ПЛК, таймаут на чтение?

  9. #1099
    Пользователь Аватар для capzap
    Регистрация
    25.02.2011
    Адрес
    Киров
    Сообщений
    10,224

    По умолчанию

    Цитата Сообщение от Sergey1024 Посмотреть сообщение
    Зачем? Буфер заполняется полностью входными данными, после заполнения я в точке останова смотрю, что получил.
    Что имеется в виду под периодом? Цикл ПЛК, таймаут на чтение?
    я вот не заметил, что у Вас идет проверка на равентство переменной с количеству ячеек буффера, вернее есть, но что будет если принято меньшее, начнется ли прием следующей партии данных с нулевого индекса буффера?
    Обнуляли бы, увидели

    Под периодом я понимаю чтоб принимать данные не 30 раз в секунду, а 15, 10, один раз в секунду, думаю намек понятен. Я же не предлагаю работать с такими параметрами, а протестировать

  10. #1100

    По умолчанию

    Цитата Сообщение от capzap Посмотреть сообщение
    я вот не заметил, что у Вас идет проверка на равентство переменной с количеству ячеек буффера, вернее есть, но что будет если принято меньшее, начнется ли прием следующей партии данных с нулевого индекса буффера?
    Обнуляли бы, увидели
    Не очень понял, зачем нужна такая проверка?
    тут делаем попытку считать данные из порта:
    c := DWORD_TO_INT(SysComRead(acom.Settings.Port, ADR(rxbuf), SIZEOF(rxbuf), 0));

    если получили какие-то данные - сохраняем в приемный буфер:
    FOR i := 0 TO c - 1 DO
    buf[bufc] := rxbuf[i];
    bufc := bufc + 1;
    IF bufc >= SIZEOF(buf) THEN
    bufc := 0; (* тут я ставлю точку останова и смотрю содержимое buf *)
    END_IF
    END_FOR

    Цитата Сообщение от capzap Посмотреть сообщение
    Под периодом я понимаю чтоб принимать данные не 30 раз в секунду, а 15, 10, один раз в секунду, думаю намек понятен. Я же не предлагаю работать с такими параметрами, а протестировать
    Да, пробовал - при посылке 5 раз в секунду на 19200 все равно иногда данные теряются.
    PS. Я так понимаю, что для ПЛК-73 альтернатива SysComLib в виде UNM не пройдет? В конфигураторе я не могу добавить модуль UNM.

Страница 110 из 1041 ПерваяПервая ... 1060100108109110111112120160210610 ... ПоследняяПоследняя

Метки этой темы

Ваши права

  • Вы не можете создавать новые темы
  • Вы не можете отвечать в темах
  • Вы не можете прикреплять вложения
  • Вы не можете редактировать свои сообщения
  •