CODESYS форум

Добро пожаловать на официальный форум CODESYS
Deutsche Version English version russian version 
Текущее время: Вс май 28, 2017 7:34 pm

Часовой пояс: UTC+01:00




Начать новую тему  Ответить на тему  [ 47 сообщений ]  На страницу Пред. 1 2 3 4 След.
Автор Сообщение
 Заголовок сообщения:
СообщениеДобавлено: Ср фев 17, 2010 9:49 am 
Не в сети

Зарегистрирован: Вт сен 15, 2009 7:48 am
Сообщения: 47
Разобрались.
Предыдущий пример работает и для 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-сом


Вернуться к началу
 Заголовок сообщения:
СообщениеДобавлено: Пн мар 15, 2010 10:18 am 
Не в сети

Зарегистрирован: Пн ноя 23, 2009 10:46 am
Сообщения: 0
Да все получилось, после смены прошивки и изменении в 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) которая подключена к нулю вольт устройства. При этом пример из этого топика (переделанный под прием) выдает ошибку при запуске (см. на скриншоте).


Вложения:
error_rs232_read_v2.JPG
error_rs232_read_v2.JPG [ 171.42 КБ | 2485 просмотров ]
Вернуться к началу
 Заголовок сообщения:
СообщениеДобавлено: Вс мар 21, 2010 12:14 pm 
rrv писал(а):

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

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



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


Вернуться к началу
   
 Заголовок сообщения:
СообщениеДобавлено: Пн мар 22, 2010 5:01 pm 
Anonymous писал(а):
Посмотрите в chip.ini не стоит ли особыхпараметров натсройки ком портов? (навевает мысль сработка сторожевого таймера)


файл CHIP.INI содержит только настройку сети:
Код:
[IP]
NETMASK=255.255.255.0
DHCP=0
ADDRESS=192.168.3.100


Вернуться к началу
   
 Заголовок сообщения:
СообщениеДобавлено: Пн мар 22, 2010 5:04 pm 
Не в сети

Зарегистрирован: Пн ноя 23, 2009 10:46 am
Сообщения: 0
...
Есть еще идеи?

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


Вернуться к началу
 Заголовок сообщения:
СообщениеДобавлено: Вт мар 23, 2010 9:45 am 
Не в сети
Site Admin

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


Вернуться к началу
 Заголовок сообщения:
СообщениеДобавлено: Вт мар 23, 2010 6:53 pm 
Не в сети

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


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

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

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


Вернуться к началу
 Заголовок сообщения:
СообщениеДобавлено: Ср мар 24, 2010 10:21 am 
Не в сети

Зарегистрирован: Вт сен 15, 2009 7:48 am
Сообщения: 47
В приведенном примере я поменял SysComWrite на SysComRead и заменил содержание строки, которую будем считывать, для наглядности.
Для того чтоб watchdog не срабатывал, поставил паузу между открытием порта и чтением. Иначе Watchdog стабильно вылетает, скорее всего, из-за того, что порт не успевает открыться, как уже производится чтение. Это не критично для записи, но для чтения критично.
При чтении на «низких» скоростях может понадобиться пауза между циклами чтения и перед закрытием порта. Но на скорости (19200) в примере мне этих пауз уже не понадобилось (хотя было бы полезно для надежности). На рисунке 1 одновременно два проекта для разных плат. Справа на запись, слева на чтение.

Изображение
Рис 1.

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

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

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

Изображение
Рис 4.


Вернуться к началу
 Заголовок сообщения:
СообщениеДобавлено: Ср мар 24, 2010 10:23 am 
Не в сети

Зарегистрирован: Вт сен 15, 2009 7:48 am
Сообщения: 47
черт, опечатка в слове Pause, но картинки перерисовывать лень :)


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


:cry: :cry: :cry: :cry: :cry: :cry: :cry: :cry:

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


Вернуться к началу
   
 Заголовок сообщения:
СообщениеДобавлено: Чт мар 25, 2010 5:46 pm 
Не в сети

Зарегистрирован: Пн ноя 23, 2009 10:46 am
Сообщения: 0
опять забыл залогиниться (запретите анонимные посты! :) шучу)
пост выше мой.

Еще информация по системе:
CoDeSys v.2.3.9.10
RTOS 1.3
От COM порта используются только 5 (на земле) и 2 (данные) (это считыватель Proximity карт)
Может быть нужно заполнять все переменные COMSETTINGS.EX ?


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


Вложения:
RS232_Receiver_com2_v3.zip [19.86 КБ]
101 скачивание
Вернуться к началу
 Заголовок сообщения:
СообщениеДобавлено: Пт мар 26, 2010 12:02 pm 
Не в сети

Зарегистрирован: Вт сен 15, 2009 7:48 am
Сообщения: 47
rrv писал(а):
...
На всякий случай выкладываю свой код, проверьте если это возможно, я уже не знаю что делать....


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

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


Вернуться к началу
 Заголовок сообщения:
СообщениеДобавлено: Пт мар 26, 2010 7:09 pm 
Не в сети

Зарегистрирован: Пн ноя 23, 2009 10:46 am
Сообщения: 0
Вообще то нет, я перехожу на шаг 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 и закрывать по сути нечего.

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

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


Вернуться к началу
 Заголовок сообщения:
СообщениеДобавлено: Пн мар 29, 2010 7:56 am 
Не в сети

Зарегистрирован: Вт сен 15, 2009 7:48 am
Сообщения: 47
Важно соблюдать последовательность открытий и закрытий портов так, чтоб не происходило повторного открытия порта, иначе будет ошибка.

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

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

Ниже выкладываю проект приведенный в примере. Он работает на DK55 с COMSETINGSЕX и на прием и на передачу. (сейчас в блоке READ стоит запись)
http://www.prolog-plc.ru/st/doc/COM_wor ... C_read.pro


Вернуться к началу
 Заголовок сообщения:
СообщениеДобавлено: Пн мар 29, 2010 5:55 pm 
Не в сети

Зарегистрирован: Пн ноя 23, 2009 10:46 am
Сообщения: 0
Ура! Победил!

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

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

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

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


Вложения:
COM_working_DK55_SFC_read.pro [97.16 КБ]
152 скачивания
Pic3.JPG
Pic3.JPG [ 77.89 КБ | 2410 просмотров ]
Pic2.JPG
Pic2.JPG [ 94.26 КБ | 2410 просмотров ]
Pic1.JPG
Pic1.JPG [ 51.11 КБ | 2410 просмотров ]
Вернуться к началу
Показать сообщения за:  Поле сортировки  
Начать новую тему  Ответить на тему  [ 47 сообщений ]  На страницу Пред. 1 2 3 4 След.

Часовой пояс: UTC+01:00


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

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


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  
Создано на основе phpBB® Forum Software © phpBB Limited
Русская поддержка phpBB