Ошибка при работе с COM-портом

Общие вопросы программирования, алгоритмы и т.п.

Модератор: Модераторы

Ошибка при работе с COM-портом

Сообщение shyub » 24.01.2015 20:07:37

Здравствуйте!
Пульт, собранный на микроконтроллере, периодически посылает по RS485 на компьютер запросы, компьютер - отвечает. Однако, пульт сообщает, что ответ содержит ошибки. Операционная система Windows-7 x32, среда разработки Lazarus-1.3. Пробовал то же самое на Lazarus-1.2.6. Для оаботы с портом использовал функции WinAPI, компоненты Sdpo и Cportlaz_v1.0.0. (т.е в результате испытал 6 программ, написанных на Lazarus, эффект тот же самый). Аналогичную программу написал на С++ - всё прекрасно работает. Снял осциллограммы c выхода преобразователя RS232/RS485:
Осцилограммы.jpg

Явно видно, что при использовании Lazarus, длительность передачи "0" меньше, чем в программе, написанной на С++. Возникло подозрение, что какая-то проблема, связанная с RTS, поэтому снял осциллограмму непосредственно на выходе COM-порта компьютера:
RS232.jpg

Здесь так же видно, что искажения связаны с длительностью передачи нуля.
Для контроля обмена использовал сниффер Filemon - информация программами Lazarus и С++ передаётся одна и та же, т.е. вариант, что неправильно формируется ответ - исключен.
Испробовал множество вариантов, но Lazarus стабильно выдаёт одни и те же искажения (приём, к стати, работает нормально).
Вопросы:
1. Приходилось ли кому-нибудь работать с COM-портом в связке Lazarus - Windows-7?
2. Чем могут быть вызваны такие искажения?
shyub
постоялец
 
Сообщения: 112
Зарегистрирован: 25.11.2014 23:15:19

Re: Ошибка при работе с COM-портом

Сообщение serg_iv » 24.01.2015 20:53:53

Попробуйте использовать для ком порта компонент synaser. Он кроссплатформенный, примеров работы с ним на форуме было http://wiki.freepascal.org/Hardware_Access#Synaser
или сами поищите
у меня через синасер много оборудования работает.
serg_iv
постоялец
 
Сообщения: 276
Зарегистрирован: 15.10.2005 18:45:46
Откуда: Миасс

Re: Ошибка при работе с COM-портом

Сообщение shyub » 24.01.2015 23:25:33

Спасибо, попробую.
Но, мне кажется, не поможет, т.к. Filemon показывает, что в порт отправляестя сообщение без ошибок. Ошибка возникает где-то на уровне драйвера порта (железо исключаю, т.к. на С++ работает). Если не сложно, скиньте что-нибудь своё, работающее через RS485.
Произвёл эксперемент Lazarus-1.2.6+Cportlaz_v1.0.0 в ОС Windows-XP, результат - тот же самый.

Добавлено спустя 13 минут 25 секунд:
Ещё раз спасибо serg_iv.
Скачал http://synapse.ararat.cz/doku.php/download. Там есть примеры. Продолжу...
shyub
постоялец
 
Сообщения: 112
Зарегистрирован: 25.11.2014 23:15:19

Re: Ошибка при работе с COM-портом

Сообщение serg_iv » 25.01.2015 12:28:35

viewtopic.php?f=13&t=2624
вот большое обсуждение ком порта
serg_iv
постоялец
 
Сообщения: 276
Зарегистрирован: 15.10.2005 18:45:46
Откуда: Миасс

Re: Ошибка при работе с COM-портом

Сообщение mig-31 » 25.01.2015 16:18:48

Возникло подозрение, что какая-то проблема, связанная с RTS, поэтому снял осциллограмму непосредственно на выходе COM-порта компьютер

Сигнал RTS на RS485 не используеться. При 2-х и 4-х проводном соединении только Rx и Tх (Rx+/Rx- и Tх+/Tх-). Если не ошибаюсь все протоколы работающие по RS485, работают как UDP: послали телеграмму и в таймауте ждете ответа.
Если уж работаете через RS485, так и в компе используйте RS485 без всяких там преобразователей.
Явно видно, что при использовании Lazarus, длительность передачи "0" меньше, чем в программе, написанной на С++. Возникло подозрение, что какая-то проблема, связанная с RTS, поэтому снял осциллограмму непосредственно на выходе COM-порта компьютера:

Вообще-то непонятно зачем комп должен отвечать. Обычно RS485 и RS422 это Master-Slave. Master - опрашивает, Slave - отвечает.

Sdpo использует Synaser. С ним не должно быть проблем. Думаю, что проблема в вашем микроконтроллере.

В рабочей программе использовал PascalScada для опроса двух устройств на RS-422 по MODBUS RTU с преобразователем RS-232 на RS-422 все работает отлично. Сейчас планируем заменить преобразователь на карту от MOXA с RS-422, потому что преобразователю нужно отдельное питание (чем меньше проводов, тем лучше).
Так же с PascalScada тестировал на RS-485 по MODBUS RTU PLC и HMI от АББ, и тоже без проблем.
mig-31
постоялец
 
Сообщения: 224
Зарегистрирован: 14.07.2011 13:46:48

Re: Ошибка при работе с COM-портом

Сообщение shyub » 26.01.2015 15:50:58

Вопрос синимается. Спасибо за ответы.
Проблема была в том, что адаптировать код под Lazarus пришлось спустя где-то год после написания его на С++ и совершенно "вылетело из головы", что в данном протоколе используется бит чётности. Так что это чисто моя техническая ошибка. После того, как добавил бит чётности, всё заработало, как с компонентами, так и с Win-API. Ещё раз спасибо serg_iv и mig-31 за участие.
Хотел бы сделать уточнения на замечания, указанные mig-31:
Сигнал RTS на RS485 не используеться.
Дело в том, что в переходнике RS232/485 используется микросхема ADM-485, сигал RTS управляет направлением передачи (ControlRTS=rtsToggle).
Вообще-то непонятно зачем комп должен отвечать.
Компьютер используется в качестве ведомого устройства, т.е. эмулирует исполнительное устройство (компрессор), ведущим является штатный пульт. Цель всей работы - заменить пульт на компьютер (будет что-то типа SCAD-ы), однако, перенести компрессор в офис не представляется возможным, поэтому приходится сначала написать программу-эмулятор, отладить её с пультом, а затем уже писать заказанную программу.
И вопрос не совсем по теме к mig-31 В PascalScada есть компоненты для работы с контроллерами. Как поступаете вы, если необходимо взаимодействовать с контроллером, который PascalScada не поддерживает (в частности интересует Delta DVP-SX2 и ему подобные, а так же терморегуляторы Овен ТРМ-138)?
shyub
постоялец
 
Сообщения: 112
Зарегистрирован: 25.11.2014 23:15:19

Re: Ошибка при работе с COM-портом

Сообщение mig-31 » 26.01.2015 22:08:59

Дело в том, что в переходнике RS232/485 используется микросхема ADM-485, сигал RTS управляет направлением передачи (ControlRTS=rtsToggle).

Читайте тут на википедии http://en.wikipedia.org/wiki/RS-485написано, какие сигнал используются с RS485. Все остальные сигналы не используются.

RTS управляет направлением передачи

Если мне память не изменяет, так только для модема. Зачем он нужен, если у нас Мастер-Слэйв и по проводу для передачи и приема.

И вопрос не совсем по теме к mig-31 В PascalScada есть компоненты для работы с контроллерами. Как поступаете вы, если необходимо взаимодействовать с контроллером, который PascalScada не поддерживает (в частности интересует Delta DVP-SX2 и ему подобные, а так же терморегуляторы Овен ТРМ-138)?

Вами упомянутые устройства поддерживают MODBUS RTU, a Delta DVP-SX2, также и MODBUS TCP, протоколы. PascalScada поддерживает MODBUS RTU и MODBUS TCP. Эти протоколы де-факто стандарт в автоматизации. На этом сайте и статья есть http://freepascal.ru/article/raznoe/20120522102100/. Примеры найдете также и в самой PascalScada.
mig-31
постоялец
 
Сообщения: 224
Зарегистрирован: 14.07.2011 13:46:48

Re: Ошибка при работе с COM-портом

Сообщение serg_iv » 27.01.2015 08:20:13

с овеном через паскальСкаду по модбасу работаю, правда не с трм138, а с овеновскими АЦП. К 138 где то код считывания температуры по каналам писал когда то. Работало. Ща поищу.
Файл https://yadi.sk/d/nWY3FFF0eFxb3 для примера работы с ТРМ138 добавил.
serg_iv
постоялец
 
Сообщения: 276
Зарегистрирован: 15.10.2005 18:45:46
Откуда: Миасс


Вернуться в Общее

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 17

Рейтинг@Mail.ru