Схема тривиальная:
1. открываем порт
2. настраиваем порт
3. очищаем буфер
4. посылка запроса
5. пауза
6. чтение ответа
7. пауза
8. переход на пункт 3.
Паузы стоят довольно большие 50ms. Этого времени вполне достаточно, чтобы полностью получить ответ из 13 байтов. К тому же если бы буфер и переполнялся бы,
SysComRead( port, ADR( dest1 ), 5, 0 ) -> 5
SysComRead( port, ADR( dest2 ), 5, 0 ) -> вернул тоже 5, но с мусором
Ладно всем спасибо за участие, извините за потраченное на меня время
Извини, не хотел обидеть, поставить под сомнения квалификацию и т.д.
Просто голова уже кругом идет. Я спрашивал о сотрудничестве с Овен, только потому, что рекомендации техподдержки можно считать официальными рекомендациями производителя.
А предложениями "что-то такое попробовать" и "что-то додумать" я за два дня наелся. Данная тема изначально была ориентирована на техподдержку.
Я ДЕЙСТВИТЕЛЬНО, НИКОГО НЕ ХОТЕЛ ОБИДЕТЬ
я считаю, что авторитетно поставить крест определить корректность этого решения может Александр Приходько, создававший эти примеры. от себя могу сказать, что не вижу абсолютно никакого здравого смысла в восьми чтениях буфера по 1 байту вместо 1 чтения по 8 байт.
что вам не нравится в примере? прочитали из буфера 8 байт, можете начинать проверять корректность посылки (адрес устройства, № функции...)
p.s. единственное, что у меня вызывает некоторые сомнения - ваша таймерная пауза между отправкой команды в буфер и переходом к чтению буфера в 100мс. по моему мнению это многовато.
Последний раз редактировалось swerder; 22.03.2012 в 10:37.
Всегда ответ надо читать по 1 байту и сразу анализировать. Ожидать что пришли все байты и только нужное количество байт нельзя. По 1 байту считываем, каждый анализируем на корректность и принимаем решение о конце пачки/бракованной пачке.
Пример с таким чтением в 2 приёма я проверю, но не скоро.
Тролль-наседка, добрый, нежный и ласковый
а кто их ждет? читаем, сразу проверяем, но пачкой читаем, а не поштучно.
Здравого смысла здесь и нет. Просто почему-то после такой замены пример не работает. А такая большая задержка была использована специально. За 100ms данный ответ с очень большой вероятностью окажется полностью в буфере "мастера". А дальше пытаюсь его прочитать из буфера, но не целиком, а частями. Я писал примеры, не с точки зрения практичности, а чтобы проблему, которую я описывал было легко обнаружить...
Ладно это уже не важно, в следующих четырех проектах будем использовать контроллеры другого производителя.
Всем спасибо за участие, терпение, и потраченное время. Всем удачи
Если библиотека позволяет вести пакетный обмен, то и надо этим пользоваться. Вероятно, проблемы при обмене по RS-485 при использовании SysLibCom связаны с не совсем корректным управлением шиной сети. Порядок обмена по RS-485 должен быть такой:
1) Master сети захватывает шину (сразу после подачи питание на устройство, выполняющего роль Maser);
2) Master делает небольшую паузу и загружает выходной буфер пакетом байт, данные посылаются в сеть;
3) Master после загрузки буфера держит шину пока весь пакет данных не будет выпихнут в сеть и не дойдет до Slave;
4) Slave после приема пакета должен сразу захватить шину и только после этого Master отпускает шину и становится на прием.
Передача от Slave к Master должна происходить аналогично. После приема пакета от Slave Master захватывает шину делает паузу и далее процедура повторяется.
Очень важным моментом при обмене по RS-485 является то, что шина в каждый момент времени должна быть захвачена хотя бы с одной стороны, ну и процедура перехвата шины должна быть скоординирована. Если не учесть эти моменты (касается того, кто писал программу прошивки для ПЛК63), то может происходить то с чем столкнулся многострадальный monteg.
Последний раз редактировалось IVM; 22.03.2012 в 12:08.
Так точно. Но почему тогда именно чтение по 1 байт на ПЛК63 глючит.
Чтение по 1 байту можно же считать частным случаем чтением двумя блоками.
Заменя
наКод:byte_read:=SysComRead(port_number, ADR(buf_otvet), 8, 0);
приводит к ошибкам, про которые я говорилКод:byte_read:=SysComRead(port_number, ADR(buf_otvet[ 0 ]), 1, 0); byte_read:= byte_read + SysComRead(port_number, ADR( buf_otvet[ 1 ] ), 1, 0); byte_read:= byte_read + SysComRead(port_number, ADR( buf_otvet[ 2 ] ), 1, 0); byte_read:= byte_read + SysComRead(port_number, ADR( buf_otvet[ 3 ] ), 1, 0); byte_read:= byte_read + SysComRead(port_number, ADR( buf_otvet[ 4 ] ), 1, 0); byte_read:= byte_read + SysComRead(port_number, ADR( buf_otvet[ 5 ] ), 1, 0); byte_read:= byte_read + SysComRead(port_number, ADR( buf_otvet[ 6 ] ), 1, 0); byte_read:= byte_read + SysComRead(port_number, ADR( buf_otvet[ 7 ] ), 1, 0);