Какое-то гуманитарное описание проблемы. Прибор сам посылает без запроса что ли? Что у него там за протокол? Число принятых байт всегда 20 разве?
Какое-то гуманитарное описание проблемы. Прибор сам посылает без запроса что ли? Что у него там за протокол? Число принятых байт всегда 20 разве?
Автоматизация Диспетчеризация Сервис
e-mail: ads-kaluga@mail.ru
Вы вопрос читали? Какая разница, какой протокол и кто шлет данные контроллеру?
Этот вопрос к чему? Где вы в тексте вопроса увидели сообщение про число принятых байт?
Еще раз: с одной стороны непрерывно шлются данные в порт, с другой - ПЛК тупо читает данные из порта и складирует в буфер. ВСЕ.
При этом в буфере-приемнике (который buf в коде) принятые данные отличаются от посылаемых - часть данных теряется, примерно каждая 20 посылка приходит битая.
Где собака порылась? Смена скорости с 115200 на 19200 ничего не дала.
всё правильно, но вот после считывания данных программой буфер снова ПУСТ! и в следующий раз Вы считаете остатки данных которые не успели попасть в буфер на момент первого считывания. Если предыдущие данные Вы не сохранили для добавление остатков данных пришедших в буфер - то практически эти данные утеряны :-(
P. S. Это же не С+/делфи, VBA и т.д. здесь нет генерации события что данные пришли это оставлено программисту самому разбираться :-)
Автоматизация Диспетчеризация Сервис
e-mail: ads-kaluga@mail.ru
В коде примера видно, что все пришедшие данные по мере поступления накапливаются в буфере buf. В реальном приложении я естественно анализирую и обрабатываю данные, в примере просто показана логика считывания данных.
Допустим в порт я постоянно шлю посылки типа 11 22 33 44 55 66 77 88 FF FF
В CDS при заполнении буфера я ставлю точку останова, смотрю в отладчике что пришло и вижу, что в буфере данные могут быть к примеру:
11 22 33 FF FF 11...
Вот и спрашиваю - что может быть причиной потери данных при приеме?
я вот не заметил, что у Вас идет проверка на равентство переменной с количеству ячеек буффера, вернее есть, но что будет если принято меньшее, начнется ли прием следующей партии данных с нулевого индекса буффера?
Обнуляли бы, увидели
Под периодом я понимаю чтоб принимать данные не 30 раз в секунду, а 15, 10, один раз в секунду, думаю намек понятен. Я же не предлагаю работать с такими параметрами, а протестировать
Не очень понял, зачем нужна такая проверка?
тут делаем попытку считать данные из порта:
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
Да, пробовал - при посылке 5 раз в секунду на 19200 все равно иногда данные теряются.
PS. Я так понимаю, что для ПЛК-73 альтернатива SysComLib в виде UNM не пройдет? В конфигураторе я не могу добавить модуль UNM.