Данный CODESYS форум содержит архивную копию русской ветви только для чтения. Для создания сообщений пожалуйста используйте актуальную международную платформу CODESYS Forum. Close

Работа с COM портами CDS V2.3

Anonymous
2009-12-18
2015-01-28
1 2 > >> (Page 1 of 2)
  • Anonymous - 2009-12-18

    Originally created by: Mikhail Shvetsov

    По уже многочисленным просьбам трудящихся выкладываю ниже пример работы с COM- портом.

    http://www.prolog-plc.ru/st/doc/RS232CDS.zip

    *** Добавленно 11.01.2010 ****

    После тяжелых праздничных дней начнем отдых на работе с пояснения примера.
    Сразу обмолвлюсь, опишем пример не тот, что был выложен ранее, который был написан давно и не мной, а создадим свой пример шаг за шагом, используя комплект DK55.

    Подключим питание, Ethernet для связи с CoDeSys и соединим Com1 платы на Com1 компьютера (или на любой другой свободный порт) см Рис 1. Извиняюсь за качество фотки, кроме телефона другого фотоаппарата под рукой сейчас нет.

    Рис 1. Комплект DK55.

    Так как на ранних примерах проекты мы создавать научились, сразу предлагаю создать проект, как на рисунке 2.

    Рис 2. Проект передачи по Com порту.

    Эта программа эта программа передает через COM порт данные, которые мы будем слушать HiperTerminal-ом.

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

    Шестая и Седьмая строка – передаваемые данные. Для эксперимента можно воспользоваться архивом или строкой, в нашем случае строкой. Обращу внимание, в конце строки DK55 стоит пробел, для красоты отображения в дальнейшем. Всего строка содержит 5 символов по байту.

    Восьмая строка, параметр dwTxBytes будет содержать количество переданных байт, нужен только для отображения процесса, как и флаг bSt. И последнее, Switch – ключ на запуск передачи.
    В блоке Init заполняем структуру параметров Com порта.

    Обратите внимание конкретно на плате DK55 используется порт, помеченный как Com1, в программе он же обзывается COM2. Подобное смещение наблюдается и на 61-х комплектах.

    В блоке OpenPort открываем порт, получая дескриптор, и устанавливаем параметры передачи. Тут следует отметить, что дескриптор должен отличаться от 0xFFFFFFFF (правой клавишей мышки в области объявления переменных в режиме ОНЛАЙН можно выбирать отображаемый режим системы исчисления). Если возвращаемый дескриптор равен 0xFFFFFFFF, это означает, что произошла ошибка открытия порта, порт не открыт. Аналогично с флагом bSt. После установки параметров он должен быть TRUE, иначе произошла ошибка.

    В блоке Write производим передачу циклически пока ключ Switch не перейдет в FALSE. А перейти в любое состояние он может в нашей программе только вручную.
    При передачи данных в dwTxBytes записывается количество переданных байт.

    После окончания циклов передачи данных, что определяет состояние Switch в блоке ClosePort мы обязательно должны закрыть порт. Иначе при следующей попытке его открыть возникнут проблемы. Это следует учитывать при ручной остановке программы с незакрытым портом. Последующее подключение к контроллеру и запуск даже измененной программы при попытке открыть порт выдаст ошибку.
    Подключаемся и запускаем программу и в ручную устанавливаем Switch в положение TRUE (рис 3).

    Рис 3. Проект в ОНЛАЙН

    Передача пошла. Теперь не плохо бы увидеть эту передачу. Для этого воспользуемся HyperTerminal –ом с параметрами, соответствующими нашим передачам (рис 4).

    Рис 4. Параметры HyperTerminal.

    После начала сеанса связи получаем картину как на рис 5.

    Рис 5. HyperTerminal на связи

    Если мы вместо компьютера подключим другой комплект с тем же проектом, с одним отличием SysComWrite заменен на SysComRead, мы сможем прочитать строку на этом комплекте.

    Замечание: Com-порт предназначенный для связи с CoDeSys в других целях использовать не получается.

    Как включить режим DMA, и вообще много полезного посмотреть можно тут:
    http://www.beck-ipc.com/files/api/scxxx/config.htm m

    IMG: Изображение

    IMG: Изображение

    IMG: Изображение

    IMG: Изображение

    IMG: Изображение

     
  • rrv

    rrv - 2009-12-28

    Не получилось, хочется описания.

    Тестировал на плате IPC@CHIP® DK55. Подключил RS-232 мышку к COM1, запустил RS232_Receiver.pro, но переменная не изменяется при нажатии кнопок на мышке.

    Что я делаю не так?

     
  • Igor Petrov

    Igor Petrov - 2009-12-28

    Пример рабочий. Простейший. Описывать там нечего при всем желании.

    Тут может быть 100 причин. Например, мышка то питается откуда? Очевидно, питание ей на DTR подаете от внешнего источника (на плате DB54 его нет)?

    Я обычно com порты проверяю путем соединения приемника с передатчиком, контакты 2 и 3. Что передал, то и принял.

     
  • rrv

    rrv - 2009-12-28

    Спасибо! про питание я не подумал. Проверю, отпишусь.

     
  • Anonymous - 2009-12-29

    Originally created by: Mikhail Shvetsov

    Наглядненько получается если подцепить ДК55 (ну или нечто другое) к компу, и послушать СОМ порт Гипертерминалом. COM-Sender выводит свое сообщение в окошко терминала.

     
  • rrv

    rrv - 2010-01-10

    Мда, ничего не получается...

    Я вижу что программа должна работать, но не работает

    Я и терминалом подключался и закорачивал контакты 2 и 3, ничего не получается. Может как то надо подправить стандартную конфигурацию DK55_Full_FP

    Прикладываю несколько скриншотов может они помогут понять, что я делаю не так.

    scr.zip [250.6 КБ]

     
  • Avgur

    Avgur - 2010-01-11

    Я так понял, что Вы соединили 2 программы (RS232_Receiver и RS232_Sender) из примера и, возможно, допустили ошибки. Исходные примеры не пробовали?

    Для начала протестируйте запись в порт, это самая простая операция. Подключите нуль-модемный кабель (исправный! заранее проверьте) к порту, проверьте настройки терминала и запустите его. По идее должны получать данные с порта.

    Кстати, в примере не проверяется правильность открытия порта (SysComOpen) и установки настроек порта (SysComSetSettings). Добавьте два if для проверки, может здесь глюк притаился...

    Update:

    Не сразу заметил, на скриншотах отладки хендл порта dwPortHandle равен 4294967295 или 16#FFFFFFFF, и это на 4 шаге выполнения программы. Т.е. порт не получилось открыть (в библиотеке SysComLib есть глобальная константа INVALID_HANDLE:DWORD:=16#FFFFFFFF;)

     
  • rrv

    rrv - 2010-01-11

    Это было первое что я проверил.

    И как быть? что может причиной?

    Для правильной работы библиотеки SysComLib требуется ли дополнительные доработки в IEC Platform Builder или на c++ в myrts

    P.S.

    В примере использовался эмулятор.

    Я делал так:

    1. Загрузил пример RS232_Sender,

    2. поменял COM1 на COM2 (т.к. на первом по умолчанию в DK55 подключение к терминалу контроллера),

    3. затем выбрал конфигурацию DK55_Full_FP,

    4. затем настроил параметры подключения,

    5. затем запустил на контроллере myrts.exe,

    6. подключился гипертерминалом на COM2 (Шнурок проверял подключаясь к COM1 и поработав в терминале контроллера)

    7. подключился из CoDeSys и запустил программу

    Ничего....

    Теперь я понял, что SysComLib не может открыть порт, но почему...

     
  • Avgur

    Avgur - 2010-01-11

    rrv писал(а):
    Для правильной работы библиотеки SysComLib требуется ли дополнительные доработки в IEC Platform Builder или на c++ в myrts
    Теперь я понял, что SysComLib не может открыть порт, но почему...

    Здесь поможет только чтение документации на Ваш ПЛК по работе с портами (как включить, как настроить и т.д.) RTFM и удачи!

     
  • Anonymous - 2010-01-11

    Originally created by: Mikhail Shvetsov

    Добавил в заглавный пост некоторое описание.

     
  • Avgur

    Avgur - 2010-01-11

    За фотку DK55 на фоне 15-летнего вискаря зачёт!!!

     
  • rrv

    rrv - 2010-01-13

    Mikhail Shvetsov писал(а):
    Обратите внимание конкретно на плате DK55 используется порт, помеченный как Com1, в программе он же обзывается COM2.

    Спасибо! Эта сторчка многое объясняет Первый пример заработал!

    Но вот беда, на DK55 два COM порта, по аналогии для COM2 в программе требуется использовать название COM3, но не выходит... попытался COM4 (может COMn=>COM(2*n)) не вышло... где грабли?

     
  • Anonymous - 2010-02-11

    Originally created by: Mikhail Shvetsov

    rrv писал(а):
    Спасибо! Эта сторчка многое объясняет Первый пример заработал!
    Но вот беда, на DK55 два COM порта, по аналогии для COM2 в программе требуется использовать название COM3, но не выходит... попытался COM4 (может COM=>COM(2*)) не вышло... где грабли?

    Тут не грабли а просто вилы в myrts.c . Надо расшаривать второй COM порт всекции:

    RHISerPortTypes s_SerialPortTypes =

    / See for a detailed description the RHI Documentation !!! /

    Позже выложу (если получится ) описание.

     
  • rrv

    rrv - 2010-02-13

    Цитата:
    Тут не грабли а просто вилы в myrts.c . Надо расшаривать второй COM порт всекции:
    RHISerPortTypes s_SerialPortTypes =
    / See for a detailed description the RHI Documentation !!! /

    Уже позже некуда, очень хочется описание.

    Спасибо за труд!

     
  • Anonymous - 2010-02-15

    Originally created by: Mikhail Shvetsov

    rrv писал(а):
    Уже позже некуда, очень хочется описание.
    Спасибо за труд!

    По инструкции так:

    Каждая строка отвечает за соответвующий порт, которые надо поменять с RHI_SERPORT_NAV на RHI_SERPORT_COM

    Последние строки поменть с RHI_SERPORT_SPI , RHI_SERPORT_I2C на RHI_SERPORT_NAV.

    Но с первого скачка у меня не получилось. Может у Вас получиться.

    Вот буду читать по совету на картинке RHI Documentation и трясти немецкий сапорт, которых в свою очередь "скорой помощью" не назовешь

    IMG: Изображение

     
  • Anonymous - 2010-02-17

    Originally created by: Mikhail Shvetsov

    Разобрались.

    Предыдущий пример работает и для COM2 на плате (COM3 в CDS)

    Для этого нужно выполнить вышеприведенные изменения в myrts.c и иметь на борту чипа RTOS 1.3 (с версией 1.22 работать не будет)

    Ниже по ссылке прилагаю проверенную систему исполнения (файлы проекта в комплекте) для DK55, на которой работает первоначальный пример на всех портах.

    http://www.prolog-plc.ru/st/doc/RTS_DK55.ZIP

    тарджет используется стандартный из ChipSDK версии DK55_FP_CM

    Прошивку 1.3 можно взять на сайте http://www.beck-ipc.com

    Прошивается CHIPTool-сом

     
  • rrv

    rrv - 2010-03-15

    Да все получилось, после смены прошивки и изменении в myrts.c, заработал и COM2 (в программе COM3).

    Но в реализации возникла проблема. Немного изменив первый пример (тот который фалом, а не на скриншотах) пытаюсь считать данные через COM2 с устройства которое генерирует 9 байт данных раз в 10 сек (одну и туже последовательность) 23 53 54 FF FF FF FF FF C5. Но в программе я считываю 11 байт 1E 78 98 1E 66 FE FE FE FE FE 66, то есть последовательность на два байта увеличивается. Причем бинарное сравнение не дает четкой картинки, например в последовательности

    001000110101001101010100111111111111111111111111111111111111111111000101

    0001111001111000100110000001111001100110111111101111111011111110111111101111111001100110

    Пробовал принимать Гипертерминалом, все принимается правильно.

    Вы пробовали не передавать, а принимать данные?

    Есть идеи где грабли?

    P.S. настройки порта (Пробовал на COM1 и на COM2):

    ```

    comset.byParity:=0;
        comset.byStopBits:=0;
        comset.dwBaudRate:=9600;
        comset.dwBufferSize:=20;
        comset.dwScan:=0;
        comset.dwTimeout:=0;
        comset.Port:=COM2;
        bSt:=SysComSetSettings(dwPortHandle,ADR(comset))

    ```;

    В описании:9600Бит/с, 8бит, без паритета, 1стоп бит

    P.P.S. В устройстве используется упрощенный нульмодемный кабель, то есть используются только два входа на rs232 платы контроллера, а именно: вторая ножка (RD) на которую подается битовая последовательность и пятая ножка (SG) которая подключена к нулю вольт устройства. При этом пример из этого топика (переделанный под прием) выдает ошибку при запуске (см. на скриншоте).

    IMG: error_rs232_read_v2.JPG

     
  • Anonymous - 2010-03-21

    Originally created by: Гость

    rrv писал(а):
    Пробовал принимать Гипертерминалом, все принимается правильно.
    Вы пробовали не передавать, а принимать данные?

    Пробовал передавать и принимать черз COM порты различных DK комплектов. Пример приведенный тут, передающий в гипертерминал строку, также может передать другому «БЭКУ».

    Посмотрите в chip.ini не стоит ли особыхпараметров натсройки ком портов? (навевает мысль сработка сторожевого таймера)

     
  • Anonymous - 2010-03-22

    Originally created by: Гость

    Anonymous писал(а):
    Посмотрите в chip.ini не стоит ли особыхпараметров натсройки ком портов? (навевает мысль сработка сторожевого таймера)

    файл CHIP.INI содержит только настройку сети:

    [IP]
    NETMASK=255.255.255.0
    DHCP=0
    ADDRESS=192.168.3.100
    
     
  • rrv

    rrv - 2010-03-22

    ...

    Есть еще идеи?

    Победить не могу...

     
  • Igor Petrov

    Igor Petrov - 2010-03-23

    Если чип четко стоит на приеме, то никаких лишних символов он не принимает. Есть ли там закрытие/открытие порта или переключение на прием управляющими сигналами (нужно для RS485)? Возможно, при переключениях линейных драйверов он и ловит лишний старт бит.

     
  • rrv

    rrv - 2010-03-23

    Igor Petrov писал(а):
    Если чип четко стоит на приеме, то никаких лишних символов он не принимает. Есть ли там закрытие/открытие порта или переключение на прием управляющими сигналами (нужно для RS485)? Возможно, при переключениях линейных драйверов он и ловит лишний старт бит.

    Если имеется ввиду, что порт открыт из CoDeSys то да, порт все время открыт во время циклов приема (см. пример на картинке). Теория о том, что ловится лишний start bit тоже не подтверждается, как видно из битовых последовательностей приведенных мной выше (по крайней мере я не нашел зависимости по добавлению битов).

    Может счастливые обладатели комплекта DK55 повторят эксперимент и опишут процесс приема со скриншетами, а то такое чувство, что только я и Михаил Шведцов (огромное ему спасибо!) проводим реальные испытания, а остальные только теоретические.

    Огромная просьба, у кого есть эволюционные платы, повторите эксперимент и отпишитесь.

     
  • Anonymous - 2010-03-24

    Originally created by: Mikhail Shvetsov

    В приведенном примере я поменял SysComWrite на SysComRead и заменил содержание строки, которую будем считывать, для наглядности.

    Для того чтоб watchdog не срабатывал, поставил паузу между открытием порта и чтением. Иначе Watchdog стабильно вылетает, скорее всего, из-за того, что порт не успевает открыться, как уже производится чтение. Это не критично для записи, но для чтения критично.

    При чтении на «низких» скоростях может понадобиться пауза между циклами чтения и перед закрытием порта. Но на скорости (19200) в примере мне этих пауз уже не понадобилось (хотя было бы полезно для надежности). На рисунке 1 одновременно два проекта для разных плат. Справа на запись, слева на чтение.

    Рис 1.

    Запускаем сначала проект на запись, потом на чтение, и видим что в «читающем» проекте изменилась строка (рис 2).

    Рис 2.

    В записывающем проекте приготовим новое значение для строки (рис 3)

    Рис 3.

    Как только новую строку применяем, соответсвенно меняется строка в читающем проекте(Рис 4.).

    Рис 4.

    IMG: Изображение

    IMG: Изображение

    IMG: Изображение

    IMG: Изображение

     
  • Anonymous - 2010-03-24

    Originally created by: Mikhail Shvetsov

    черт, опечатка в слове Pause, но картинки перерисовывать лень

     
  • Anonymous - 2010-03-25

    Originally created by: Гость

    Круто! Задержка помогла (надо будет потом поставить проверку переменной dwHandle на переход). Больше Watchdog не выбрасывает, но появилась другая проблема (прямо наказание какое ), порт не открывается dwHandle=16#FFFFFFFF. Причем это происходит если использовать COMSETTINGS.EX (точка стоит сознательно так как слово S.E.X запрещено на форуме), если же использовать COMSETTINGS (первый пример) то порт открывается нормально, но возникают ошибки при приеме, о чем я писал выше...

    P.S. Интересно как CoDeSys догадывается, что использовать до выполнения функций SysComSetSettings.Ex или SysComSetSettings при открытии портов. И вопрос вдогонку, SysComSetSettings.Ex точно надо выполнять после открытия порта, а то в первом примере SysComSetSettings выполняется до SysComOpen. Хотя я пробовал так и так, порт все ровно не открывается при использовании COMSETTINGS.EX

     
1 2 > >> (Page 1 of 2)