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

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

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

    rrv - 2010-03-25

    опять забыл залогиниться (запретите анонимные посты! шучу)

    пост выше мой.

    Еще информация по системе:

    CoDeSys v.2.3.9.10

    RTOS 1.3

    От COM порта используются только 5 (на земле) и 2 (данные) (это считыватель Proximity карт)

    Может быть нужно заполнять все переменные COMSETTINGS.EX ?

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

    RS232_Receiver_com2_v3.zip [19.86 КБ]

     
  • Anonymous - 2010-03-26

    Originally created by: Mikhail Shvetsov

    rrv писал(а):
    ...
    На всякий случай выкладываю свой код, проверьте если это возможно, я уже не знаю что делать....

    Ваши проблемы вполне естественны, потому как Вы нигде не закрываете порт. в шаге INIT заполняете структуру, с ледующем шаге открывает порт, затем засылаете структуру в порт, затем читаете из порта , потом пауза и все сначала на INIT и открытие порта. На втором же цикле программы вы всегда будете получать ошибку открытия порта.

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

     
  • rrv

    rrv - 2010-03-26

    Вообще то нет, я перехожу на шаг 4 (а не на INIT как в вашей программе), а там вновь чтение с порта....

    и даже на первом проходе порт не открывается dwHandle=16#FFFFFFFF (я ставил FALSE на переходе перед чтением из порта, что бы программа останавливалась). В этом и проблема... Программу каждый раз запускаю полностью перезагрузив контроллер и залив программу заново.

    Повторюсь если использовать COMSETTINGS (первый пример изhttp://www.prolog-plc.ru/st/doc/RS232CDS.zip) то порт открывается нормально, но только если перед открытием порта выполнить ```

    bSt:=SysComSetSettings(dwPortHandle,ADR(comset));

    ``` причем dwPortHandle=0 при первом прохождении цикла, но ошибки при приеме

    Переделал, добавил секцию close, но это не помогло, так как dwHandle=16#FFFFFFFF и закрывать по сути нечего.

    Что делать, не знаю через месяц проект сдавать на производство конвейеров, а я топчусь с тривиальной задачей.... Не хотелось бы возвращаться к идее с китайскими контроллерами.

    P.S.

    А по поводу закрытия порта, следующий вопрос, а если я не хочу закрывать порт, я буду с него постоянно (раз в 0.1 сек) производить чтение, или закрывать обязательно?

     
  • Anonymous - 2010-03-29

    Originally created by: Mikhail Shvetsov

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

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

    Открытым порт можно держать сколько угодно, только в вашем случае не получается безе перезагрузки чипа, закрыть порт, даже при отладке программы. Для примера предположим, если вы уже прошили "загрузочный" проект это программы, то при попытке остановить программу, что-то отредактировать, загрузить и запустить, то открытие порта даст ошибку, потому как он уже был открыт стартовым проектом.

    Я бы попробовал, вычистить чип полностью, загрузить систему исполнения, установить соответствующий тарджет, написать программу с алгоритмом корректного останова программы (с закрытием порта) на передачу. А затем на прием.

    Ниже выкладываю проект приведенный в примере. Он работает на DK55 с COMSETINGSЕX и на прием и на передачу. (сейчас в блоке READ стоит запись)

    http://www.prolog-plc.ru/st/doc/COM_wor ... C_read.pro m

     
  • rrv

    rrv - 2010-03-29

    Ура! Победил!

    В итоге нашел пару грабель:

    1. работа по таймингам никуда не годится, требуется оперировать выводом функций (SysComSetSettings.Ex, SysComRead и д.р.)

    2. Следствие первого, но на всякий случай скажу, категорически НЕЛЬЗЯ объединять открытие, закрытие порта (а возможно и другие функции) с задержкой в одном блоке, то есть ставить минимальное время на выполнение блока с этими функциями, функции не срабатывают!

    Вот Рабочий пример:

    Вот только я не понял, как убрать ненужный блок Pause, пришлось делать обходную ветку Подскажите как это сделать.

    Огромное спасибо Михаилу Швецову за терпение и помощь!

    IMG: Pic3.JPG

    IMG: Pic2.JPG

    IMG: Pic1.JPG

    COM_working_DK55_SFC_read.pro [97.16 КБ]

     
  • Igor Petrov

    Igor Petrov - 2010-03-30

    rrv писал(а):
    Вот только я не понял, как убрать ненужный блок Pause, пришлось делать обходную ветку Подскажите как это сделать.

    Редактор SFC в CoDeSys запрещает делать конструкции недопустимые по стандарту МЭК. Так, не может быть просто один шаг, без перехода. Поэтому для удаления нужно выделить шаг вместе с переходом и нажать клавишу Delete.

     
  • Anonymous - 2010-03-30

    Originally created by: Mikhail Shvetsov

    rrv писал(а):
    1) Ура! Победил!
    2)..., категорически НЕЛЬЗЯ объединять открытие, закрытие порта (а возможно и другие функции) с задержкой в одном блоке, то есть ставить минимальное время на выполнение блока с этими функциями, функции не срабатывают!

    1) уф...

    2) Если выставить минимальное время работы блока, то цикл ПЛК "кружится" в этом блоке многократно пока не выйдет это минимальное время. Следовательно те функции которые в соновном теле блока будут повторяться многократно - с некоторыми функциями это приводит к ошибке.

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

     
  • rrv

    rrv - 2010-03-30

    Спасибо большое! Все понятно!

    P.S.

    Может кому интересно, расписал для себя этот пример с комментариями

    http://rrv.nsk.ru/wiki/index.php/Db54_C ... 1%82%D1%8B m

     
  • rrv

    rrv - 2011-05-20

    Остался последний вопрос, в случае если по какой то причине COM порт все таки открыт и программа вышла из цикла (например в процессе отладки), после этого открыть или закрыть порт нет возможности, даже Онлайн->Сброс(Заводской) не помогает, остается только перезагрузить контроллер кнопкой на плате. Работаю удаленно, отсюда вопрос: Как перегрузить контроллер из программы CoDeSys, а не кнопкой на плате. Ну и мало ли еще какие причины могут возникнуть перезагрузить контроллер из программы.

     
  • Avgur

    Avgur - 2011-05-23

    Ответ зависит от того, какой у вас контроллер и какая в нем операционная система.

     
  • rrv

    rrv - 2011-05-25

    Контроллер beck SC23 на плате DK55

     
  • Avgur

    Avgur - 2011-05-26

    Не работал с этим контроллером, но стоит копать в сторону SyLib... библиотек. В некоторых ПЛК есть библиотека, позволяющая выполнять команды операционной системы. Пример есть в этой теме.

     
  • rrv

    rrv - 2011-05-31

    Да спасибо за идею, нашел библиотеку rtos.lib (у меня операционка RTOS) в ней функция RtosReboot.

     
  • Anonymous - 2012-09-05

    Originally created by: Настена

    я новичек в кодесисе, подскажите пожалуйста, мне нужно считывать данные с ком порта и дальше обрабатывать в кодесисе, я скачала программу которую любезно выложил rrv, запустила, но у меня ничего не выдал hyperTerminal, а в самой программе dwHandle равен 0, подскажите, что это может быть

     
  • Igor Petrov

    Igor Petrov - 2012-09-06

    Настена писал(а):
    ..мне нужно считывать данные с ком порта и дальше обрабатывать в кодесисе..

    CoDeSys - штука универсальная. Он понятия не имеет какие порты стоят на каждом конкретном железе и как с ними работать. Все подобные, аппаратно-специфичные вещи вынесены в библиотеки с названиями SysLib... Они имеют право работать различно или вообще не работать (при отсутствии портов, часов и пр.) на разных контроллерах. Вам нужно копать документацию не по CoDeSys, а по конкретному контроллеру. Пример дан для Beck DK55.

     
  • Anonymous - 2012-09-06

    Originally created by: Настена

    у меня фестовский контроллер, а следовательно и фестовская библиотека, в ней есть библиотека SysLibCom, т.е. по идеи есть возможность работы с ком портами.спасибо за совет, я еще раз просмотрю документацию)

     
  • Anonymous - 2012-09-06

    Originally created by: Настена

    подскажите пожалуйста, а кодесис может считывать данные с какого-нибудь текстового редактора, или это тоже библиотека SysLib.. которая может как работать, так и нет?

     
  • Igor Petrov

    Igor Petrov - 2012-09-06

    Все SysLib.. работают только на живом контроллере. В эмуляторе работать не будет. Может быть в этом дело.

    Настена писал(а):
    подскажите пожалуйста, а кодесис может считывать данные с какого-нибудь текстового редактора, или это тоже библиотека SysLib.. которая может как работать, так и нет?

    Может. Вопрос только куда?
    1 если в среду программирования на PC, то есть импорт/экспорт
    2 если из файловой системы самого контроллера (при ее наличии) в прикладную программу, то см SysLibFile

     
  • Anonymous - 2012-09-06

    Originally created by: Настена

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

     
  • Igor Petrov

    Igor Petrov - 2012-09-07

    Датчик подключен к порту контроллера Фесто. Блокнот, насколько я понимаю,
    живет в компьютере и к контроллеру отношения не имеет абсолютно. Даже если предположить что блокнотом Вы называете файл на диске контроллера (который имеет ресурс до сотни тыс. записей), то предложенный способ угробит его за день.
    На порты в контроллерах Фесто никто не жаловался. Попробуйте разные настройки. Обязано работать.

     
  • jus

    jus - 2015-01-15

    Доброго времени суток. Не получается прочитать COM порт ПЛК 100, возможно ли это сделать по Вашему примеру?

     
  • dmt.sirotin

    dmt.sirotin - 2015-01-28

    Добрый день!!! Подскажите свои соображения- контролер ifm cr0505 - без файловой системы, com-порт один, который занят CoDeSys, сломал уже всю голову как мне содержимое файла передать на контролер ( заполнить массив) .
    1. пробую через com- codesys не даёт
    2. SysLibFile не поддерживает контроллер.

    Может что подскажите?
    заранее Спасибо

     
<< < 1 2 (Page 2 of 2)