Современные технологии автоматизации» («СТА») —  журнал для квалифицированных специалистов по промышленной автоматизации Форум СТА — современные технологии автоматизации Домашняя страница
Домашняя страница форума CTA Домашняя страница форума CTA > II. АСУТП и SCADA > Архив
  Активные темы Активные темы
  FAQ FAQ  Искать в форуме   Зарегистрироваться Зарегистрироваться  Вход в систему Вход в систему

ADAM 5510 TCP, Связь через OPC сервер

 Ответить Ответить Страница  <12
Автор
Сообщение
Максим Ананских Смотреть выпадающим
Действительный член
Действительный член
Аватар

Присоединился: 14 Май 2003
Online Status: Offline
Публикации: 770
Свойства публикации Свойства публикации   Ответить, цитируя автора - Максим Ананских Ответить, цитируя автора -  ОтветитьОтвет Прямая ссылка на эту публикацию Тема сообщения: ADAM 5510 TCP, Связь через OPC сервер
    Опубликовано: 09 Ноябрь 2005 20:19

Проще всего вычислить длину посылки, исходя из кода функции и объема передаваемых данных. Нужно только знать, где начало посылки в буфере. А для этого приемный буфер нужно очищать при ошибках и по таймауту.

Инженер-системотехник
+7 (916) 477 3925
Наверх
remint Смотреть выпадающим
Действительный член
Действительный член


Присоединился: 24 Февраль 2004
Категория: Russian Federation
Online Status: Offline
Публикации: 185
Свойства публикации Свойства публикации   Ответить, цитируя автора - remint Ответить, цитируя автора -  ОтветитьОтвет Прямая ссылка на эту публикацию Опубликовано: 10 Ноябрь 2005 08:10
Первоначально опубликовано Максим Ананских

Проще всего вычислить длину посылки, исходя из кода функции и объема передаваемых данных. Нужно только знать, где начало посылки в буфере. А для этого приемный буфер нужно очищать при ошибках и по таймауту.


Максим, при всем к вам уважении - в данном вопросе не нужно ничего самому придумывать! В спецификации Модбас ЧЕТКО прописано - конец посылки определяется по временной паузе в приходе байтов (символов), равной по длине времени прихода трех с половиной символов на данной скорости обмена. А все остальные алгоритмы - они, конечно, возможны, но это уже сторонние измышышления.
Александр Бурмистров,
www.entels.ru
Наверх
remint Смотреть выпадающим
Действительный член
Действительный член


Присоединился: 24 Февраль 2004
Категория: Russian Federation
Online Status: Offline
Публикации: 185
Свойства публикации Свойства публикации   Ответить, цитируя автора - remint Ответить, цитируя автора -  ОтветитьОтвет Прямая ссылка на эту публикацию Опубликовано: 10 Ноябрь 2005 08:23
Первоначально опубликовано SIBER

Да, от таймаутов никуда не деться - лежат в природе такого рода обмена. А написание обработчика прерываний по последовательному порту в обсуждаемой конфигурации возможно, конечно. Однако, применение тех или иных средств (и взаимодействия между ними) нужно соотносить с динамикой контролируемых процессов априори.

Инициатор данной ветки дополнительно общается со мной по пейджеру этого форума. Возможно, что мой последний ответ будет интересен всем.

Мне кажется что 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
Наверх
_IP_ Смотреть выпадающим
Действительный член
Действительный член


Присоединился: 29 Январь 2004
Категория: Russian Federation
Online Status: Offline
Публикации: 293
Свойства публикации Свойства публикации   Ответить, цитируя автора - _IP_ Ответить, цитируя автора -  ОтветитьОтвет Прямая ссылка на эту публикацию Опубликовано: 10 Ноябрь 2005 10:55

Первоначально опубликовано compm2001

...как остро этот вопрос стоит при программировании PLC (не PC совместимых) на тех. языках (FBD, LD, ST, IL)?

Языки программирования тут вообще не причем. Важно как поддержан RS 485 на нижнем уровне.

Проблема в том, что RS485 полудуплексный. Т.е. передача идет так: переключаем микросхему линейного драйвера на передачу, передаем пакет данных и переключаемся на прием по окончании передачи последнего байта посылки. Причем моментально! Иначе рискуем пропустить прием или хуже того, сработает встроенная защита передатчика при встречной работе. Это и есть проблема N1.
Последовательный канал реализован на чипе 16550 в котором нет прерывания по концу передачи! Есть прерывание "буферный регистр передатчика пуст" что соответствует помещению байта в сдвиговый регистр. т.е. началу передачи.
Однако есть программно доступный признак конца передачи. Чаще всего его и используют в библиотеках. Сколько байт передается, столько сидим и ждем его конца! Проц. только этим и занят.

Есть 2 способа сделать RS485 на 16550 c прерываниями:
1) разрешить одновременно прием и передачу, ловить прием своих данных. Усложняет обработку прерываний, но дает возможность диагностики КЗ в линии.

2) добавить к перед. данным лишний байт, поймать начало его передачи, переключиться на прием. Лишний байт отсекается физически.


 

Igor Petrov
Наверх
Максим Ананских Смотреть выпадающим
Действительный член
Действительный член
Аватар

Присоединился: 14 Май 2003
Online Status: Offline
Публикации: 770
Свойства публикации Свойства публикации   Ответить, цитируя автора - Максим Ананских Ответить, цитируя автора -  ОтветитьОтвет Прямая ссылка на эту публикацию Опубликовано: 10 Ноябрь 2005 11:41

Первоначально опубликовано remint

конец посылки определяется по временной паузе в приходе байтов (символов), равной по длине времени прихода трех с половиной символов...

Вот только засечь это время бывает довольно сложно. В то же время, можно точно вычислить длину посылки при её приеме. Думаю, вопрос ставился именно о том, как сделать проще, а не о том, как написано в спецификации.

Инженер-системотехник
+7 (916) 477 3925
Наверх
remint Смотреть выпадающим
Действительный член
Действительный член


Присоединился: 24 Февраль 2004
Категория: Russian Federation
Online Status: Offline
Публикации: 185
Свойства публикации Свойства публикации   Ответить, цитируя автора - remint Ответить, цитируя автора -  ОтветитьОтвет Прямая ссылка на эту публикацию Опубликовано: 10 Ноябрь 2005 12:04
Первоначально опубликовано Максим Ананских

Вот только засечь это время бывает довольно сложно. В то же время, можно точно вычислить длину посылки при её приеме. Думаю, вопрос ставился именно о том, как сделать проще, а не о том, как написано в спецификации.

Да нужно засекать не это время, а заснуть, чтобы оно стало больше него. Не обязательно точно выверять интервал. И я ж думаю, что заснуть в потоке на какое-то время гораздо проще, чем анализировать пакеты, вычислять длину и пр.
Александр Бурмистров,
www.entels.ru
Наверх
Максим Ананских Смотреть выпадающим
Действительный член
Действительный член
Аватар

Присоединился: 14 Май 2003
Online Status: Offline
Публикации: 770
Свойства публикации Свойства публикации   Ответить, цитируя автора - Максим Ананских Ответить, цитируя автора -  ОтветитьОтвет Прямая ссылка на эту публикацию Опубликовано: 10 Ноябрь 2005 12:14

Первоначально опубликовано remint

думаю, что заснуть в потоке на какое-то время гораздо проще

И все же, речь в нашей теме явно идет о DOS, в которой не предусмотрено ниаких потоков. Для и нагружать многопоточной средой и без того слабенький процессор, я думаю, не оправдано.

Инженер-системотехник
+7 (916) 477 3925
Наверх
remint Смотреть выпадающим
Действительный член
Действительный член


Присоединился: 24 Февраль 2004
Категория: Russian Federation
Online Status: Offline
Публикации: 185
Свойства публикации Свойства публикации   Ответить, цитируя автора - remint Ответить, цитируя автора -  ОтветитьОтвет Прямая ссылка на эту публикацию Опубликовано: 10 Ноябрь 2005 12:52
Первоначально опубликовано Максим Ананских

И все же, речь в нашей теме явно идет о DOS, в которой не предусмотрено ниаких потоков. Для и нагружать многопоточной средой и без того слабенький процессор, я думаю, не оправдано.

Даже если вычислять длину посылки, то все равно необходим какой нибудь механизм, чтобы ожидать, когда же эта вся посылка к нам придет придет? И нужно только решить - просто тупо ждать, ничего не делая, или уйти в другой кусок кода, немного там поработать, потом вернуться обратно, проверить - а не прошло ли нужное нам время? Прошло - начинаем анализировать запрос, не прошло - уходим выполнять следующий кусок работы.

И вот дабы не реализовывать такой механизм вручную, проще все это реализовать на базе многопоточного ядра. И не обязательно оно должно быть вытесняющим, с работой планировщика по таймеру - можно сделать обычную кооперативную многозадачность. Именно так у нас и работает наша система KLogic. И все прекрасно работает в контроллерах типа I7188 - там, все таки, 40 Мгц - когда то это было очень даже не мало.
Александр Бурмистров,
www.entels.ru
Наверх
compm2001 Смотреть выпадающим
Участник
Участник


Присоединился: 09 Июнь 2005
Категория: Russian Federation
Online Status: Offline
Публикации: 78
Свойства публикации Свойства публикации   Ответить, цитируя автора - compm2001 Ответить, цитируя автора -  ОтветитьОтвет Прямая ссылка на эту публикацию Опубликовано: 10 Ноябрь 2005 15:24
Первоначально опубликовано remint


Для решения указанной ниже проблемы я придумал следующее. Создаем класс который будет посредником между программой и портом. Т.е. я посылаю что-то в порт, com_485_tx_string("test") и ставлю флажок чтоб никто больше ничего туда не посылал...
---------------------------------------
А как туда кто-то еще может что-то послать, если у вас не многопоточная система? Поток выполнения задачи ведь только один, так?

Здесь я хотел сказать что не надо в следующем цикле контроллера посылать посылку в порт... Так как еще не пришел ответ от предыдущего запроса.
Еще вопрос Александру: "Что значит заснуть в потоке?". Я понял так что нужно вытащить все символы с буффера, прокрутить контроллер еще 3-5 циклов и если там не появяться еще символы то это вся послылка. Правильно?
А так вроде бы все.
P.S. Очень рад что мой вопрос Вас заинтересовал. Буду творить дальше.
Наверх
remint Смотреть выпадающим
Действительный член
Действительный член


Присоединился: 24 Февраль 2004
Категория: Russian Federation
Online Status: Offline
Публикации: 185
Свойства публикации Свойства публикации   Ответить, цитируя автора - remint Ответить, цитируя автора -  ОтветитьОтвет Прямая ссылка на эту публикацию Опубликовано: 10 Ноябрь 2005 15:36
Первоначально опубликовано compm2001

Очень рад что мой вопрос Вас заинтересовал. Буду творить дальше.

А мне очень жаль, что не согласились несколько месяцев назад, когда это у вас все только начиналось, на мое предложение портировать наш KLogic в этот контроллер. Делов то было всего ничего, и сейчас не знали бы всех этих проблем.
Александр Бурмистров,
www.entels.ru
Наверх
 Ответить Ответить Страница  <12

Переход на форум Права доступа на форуме Смотреть выпадающим

Bulletin Board Software by Web Wiz Forums® version 9.64
Powered by Web Wiz Forums Free Express Edition
Copyright ©2001-2009 Web Wiz