ADAM 5510 TCP, Связь через OPC сервер |
Ответить | Страница <12 |
Автор | |
Профили участников
Послать частное письмо
Поиск публикаций участников
Посетить домашнюю страницу участника
Добавить в список приятелей
Действительный член Присоединился: 14 Май 2003 Online Status: Offline Публикации: 770 |
Опубликовано: 09 Ноябрь 2005 20:19 |
Проще всего вычислить длину посылки, исходя из кода функции и объема передаваемых данных. Нужно только знать, где начало посылки в буфере. А для этого приемный буфер нужно очищать при ошибках и по таймауту. |
|
Инженер-системотехник
+7 (916) 477 3925 |
|
Профили участников
Послать частное письмо
Поиск публикаций участников
Посетить домашнюю страницу участника
Добавить в список приятелей
Действительный член Присоединился: 24 Февраль 2004 Категория: Russian Federation Online Status: Offline Публикации: 185 |
|
Максим, при всем к вам уважении - в данном вопросе не нужно ничего самому придумывать! В спецификации Модбас ЧЕТКО прописано - конец посылки определяется по временной паузе в приходе байтов (символов), равной по длине времени прихода трех с половиной символов на данной скорости обмена. А все остальные алгоритмы - они, конечно, возможны, но это уже сторонние измышышления. |
|
Александр Бурмистров,
www.entels.ru |
|
Профили участников
Послать частное письмо
Поиск публикаций участников
Посетить домашнюю страницу участника
Добавить в список приятелей
Действительный член Присоединился: 24 Февраль 2004 Категория: Russian Federation Online Status: Offline Публикации: 185 |
|
Инициатор данной ветки дополнительно общается со мной по пейджеру этого форума. Возможно, что мой последний ответ будет интересен всем. Мне кажется что i8000 и ADAM очень похожи. Вот какие я использую функции для обмена. com_485_install() com_485_deinstall() com_485_set_format() com_485_set_speed() com_485_flush_rx() com_485_flush_tx() com_485_rx() com_485_tx() com_485_tx_string() com_485_rx_empty() Т.е. чтобы проверить что в буффере что то есть я пишу что то вроде такого: while (!com_485_rx_empty()) { inp[k++]; } У Вас также? ------------------------------------------- Да, в I7188/I8000 примерно тоже самое. Для решения указанной ниже проблемы я придумал следующее. Создаем класс который будет посредником между программой и портом. Т.е. я посылаю что-то в порт, com_485_tx_string("test") и ставлю флажок чтоб никто больше ничего туда не посылал... --------------------------------------- А как туда кто-то еще может что-то послать, если у вас не многопоточная система? Поток выполнения задачи ведь только один, так? Интересно когда функция com_485_rx_empty() возвращает FALSE? Тогда когда пришел первый символ или закончилась передача всего пакета и весь он лежит чтоб его забрали? -------------------------------- Я думаю, что драйвер порта просто складывает приходящие байты в приемный буфер. И процедура com_485_rx_empty() проверяет наличие байтов в буфере, и все. Соответственно - она сама никак не контролирует окончание посылки. А как определить конец посылки в MODBUS , там нет ни стартового символа не стопового. ------------------------------------------ В Модбасе окончание посылки определяется через таймаут, смотрите описание. Нужно проверять приходящие байты com_485_rx_empty, после того как буффер стал пустым еще некоторое время подождать, чтобы убедится, что посылка закончилась, и начать анализировать ее. Подскажите как у Вас идет обмен с устроствами без тормозов и без delay... --------------------------------------------------- У нас система не ожидает тупо прихода очередных байтов. Грубо говоря - система занята своими делами, и периодически проверяет наличие байтов в приемном буфере. Только это делается не так "в лоб", а используется небольшое многозадачное ядро. И если поток обслуживания канала RS485 делает Sleep(), то все остальные потоки продолжают работать. |
|
Александр Бурмистров,
www.entels.ru |
|
Действительный член Присоединился: 29 Январь 2004 Категория: Russian Federation Online Status: Offline Публикации: 293 |
|
Языки программирования тут вообще не причем. Важно как поддержан RS 485 на нижнем уровне. Проблема в том, что RS485 полудуплексный. Т.е. передача идет так: переключаем микросхему линейного драйвера на передачу, передаем пакет данных и переключаемся на прием по окончании передачи последнего байта посылки. Причем моментально! Иначе рискуем пропустить прием или хуже того, сработает встроенная защита передатчика при встречной работе. Это и есть проблема N1. Есть 2 способа сделать RS485 на 16550 c прерываниями: 2) добавить к перед. данным лишний байт, поймать начало его передачи, переключиться на прием. Лишний байт отсекается физически.
|
|
Igor Petrov
|
|
Профили участников
Послать частное письмо
Поиск публикаций участников
Посетить домашнюю страницу участника
Добавить в список приятелей
Действительный член Присоединился: 14 Май 2003 Online Status: Offline Публикации: 770 |
|
Вот только засечь это время бывает довольно сложно. В то же время, можно точно вычислить длину посылки при её приеме. Думаю, вопрос ставился именно о том, как сделать проще, а не о том, как написано в спецификации. |
|
Инженер-системотехник
+7 (916) 477 3925 |
|
Профили участников
Послать частное письмо
Поиск публикаций участников
Посетить домашнюю страницу участника
Добавить в список приятелей
Действительный член Присоединился: 24 Февраль 2004 Категория: Russian Federation Online Status: Offline Публикации: 185 |
|
Да нужно засекать не это время, а заснуть, чтобы оно стало больше него. Не обязательно точно выверять интервал. И я ж думаю, что заснуть в потоке на какое-то время гораздо проще, чем анализировать пакеты, вычислять длину и пр. |
|
Александр Бурмистров,
www.entels.ru |
|
Профили участников
Послать частное письмо
Поиск публикаций участников
Посетить домашнюю страницу участника
Добавить в список приятелей
Действительный член Присоединился: 14 Май 2003 Online Status: Offline Публикации: 770 |
|
И все же, речь в нашей теме явно идет о DOS, в которой не предусмотрено ниаких потоков. Для и нагружать многопоточной средой и без того слабенький процессор, я думаю, не оправдано. |
|
Инженер-системотехник
+7 (916) 477 3925 |
|
Профили участников
Послать частное письмо
Поиск публикаций участников
Посетить домашнюю страницу участника
Добавить в список приятелей
Действительный член Присоединился: 24 Февраль 2004 Категория: Russian Federation Online Status: Offline Публикации: 185 |
|
Даже если вычислять длину посылки, то все равно необходим какой нибудь механизм, чтобы ожидать, когда же эта вся посылка к нам придет придет? И нужно только решить - просто тупо ждать, ничего не делая, или уйти в другой кусок кода, немного там поработать, потом вернуться обратно, проверить - а не прошло ли нужное нам время? Прошло - начинаем анализировать запрос, не прошло - уходим выполнять следующий кусок работы. И вот дабы не реализовывать такой механизм вручную, проще все это реализовать на базе многопоточного ядра. И не обязательно оно должно быть вытесняющим, с работой планировщика по таймеру - можно сделать обычную кооперативную многозадачность. Именно так у нас и работает наша система KLogic. И все прекрасно работает в контроллерах типа I7188 - там, все таки, 40 Мгц - когда то это было очень даже не мало. |
|
Александр Бурмистров,
www.entels.ru |
|
Участник Присоединился: 09 Июнь 2005 Категория: Russian Federation Online Status: Offline Публикации: 78 |
|
Здесь я хотел сказать что не надо в следующем цикле контроллера посылать посылку в порт... Так как еще не пришел ответ от предыдущего запроса. Еще вопрос Александру: "Что значит заснуть в потоке?". Я понял так что нужно вытащить все символы с буффера, прокрутить контроллер еще 3-5 циклов и если там не появяться еще символы то это вся послылка. Правильно? А так вроде бы все. P.S. Очень рад что мой вопрос Вас заинтересовал. Буду творить дальше. |
|
Профили участников
Послать частное письмо
Поиск публикаций участников
Посетить домашнюю страницу участника
Добавить в список приятелей
Действительный член Присоединился: 24 Февраль 2004 Категория: Russian Federation Online Status: Offline Публикации: 185 |
|
А мне очень жаль, что не согласились несколько месяцев назад, когда это у вас все только начиналось, на мое предложение портировать наш KLogic в этот контроллер. Делов то было всего ничего, и сейчас не знали бы всех этих проблем. |
|
Александр Бурмистров,
www.entels.ru |
|
Ответить | Страница <12 |
Переход на форум | Права доступа на форуме Вы не можете публиковать новые темы в этом форуме Вы не можете отвечать на сообщения в этом форуме Вы не можете удалять Ваши сообщения на этом форуме Вы не можете редактировать Ваши сообщения на этом форуме Вы не можете создавать голосования на этом форуме Вы не можете выражать своё мнение в голосованиях на этом форуме |