|
Программирование COM-порта
|
|||
---|---|---|---|
#18+
Добрый день, камрады. Не знаю в верный ли подраздел форума я обращаюсь потому, как программирование на Winforms имеет к моеve djghjce несколько косвенное отношение. Но вопрос у меня будет следующий. У меня есть оборудование работающее через COM-порт с ПК- а конкретно проходная на предприятии. Человек всунул пропуск в считывающее устройство, сформировался пакет(номер пропуска, направление прохода, номер прохода) - и отправился на порт ПК. ПК анализирует содержимое пакета(по целостности информации, по списку разрешённых пропусков, проверяет не пытается ли работник пройти дважды в одном направлении)-и выставляет соответствующий сигнал на линию DTR(1-запрет, 0-разрешение прохода). Выводит информацию о проходах на экран ПК,пишет в дневную базу проходов. Параллельно ПК работает со вторым COM-портом для связи со светодиодным табло(там отображается бегущая строка, текущее время, которое берётся с ПК). Плюс в программе имеется меню для работы с базой пропусков и т.д.. Но это всё лирика. Софт на ПК написан под DOS(на Assembler написан драйвер для работы с регистрами порта - файл с расширением com, на TurboPascal-основной модуль, собственно говоря я в этих исходниках и копался для определения алгоритма работы всей системы, потому как в документации к проходной, как оказалось очень много пробелов и нестыковок )- а мне хотелось бы переписать это ПО для WindowsXP(хочу заюзать C#+WindiwsForms) - потому, как DOS проблематично устанавливать на новое железо. Теперь самый интересный момент - в документации к проходной сказано, что устройство сопряжения после отправки данных на COM-порт ожидает 4 мс(миллисекунды) и считывает состояние линии DTR! Меня этот момент смутил с самого начала! Потому, как я написал тестовую болванку, которая тупо принимает данные с порта от проходной и устанавливает сигналы(запрет/разрешение) на линию DTR. Так вот ведёт себя моя прога так, словно она не успевает вовремя выставить сигнал на линию DTR! К примеру при старте программы устанавливаю DTR в 0(разрешение прохода). Затем пишу код, который при приёме пакета c порта устанавливает DTR в 1(запрещение прохода)! Всовываю пропуск - по идее после прихода данных в порт - проходная не должна меня пропустить(выставить 1 на линию), но она пускает(получается не успевает изменить линию на 1?) , всовываю второй раз - да действительно не пускает - получается линия-таки изменилась, но изменения сигнала на линии осуществились после 4 мс(требуемых для проверки сигнала устройством сопряжения согласно документации)! Затем я копнул в в сторону работы планировщика процессов в WindowsXP и нашёл весьма забавную информацию - оказывается переключение контекста процессов ОС делает с интервалом 10 мс(а максимальное время выделяемое процессу 130 мс)! Получается, что сделать надёжную систему в WindowsXP с оборудованием, у которого такие характеристики, как у моей проходной просто невозможно из-за того, что WindowsXP не является системой режима реального времени(СРВ)! Или я всё-таки заблуждаюсь? Мне бы хотелось услышать, что вы думаете по этому поводу. Может всё-таки есть какой-то способ решения? В какую сторону мне копать? За толковый совет по решению проблемы с меня пиво! Просто не знаю даже к кому обратиться с вопросами, на работе начальник и все остальные совсем далеки от таких вопросов! С уважением, ко всем... ... |
|||
:
Нравится:
Не нравится:
|
|||
20.01.2014, 14:24 |
|
Программирование COM-порта
|
|||
---|---|---|---|
#18+
Собственно конкретный вопрос. На сколько реально написать достаточно надёжный софт управления проходной для Windows(XP, 7, Vista-линейки NT), если согласно спецификации проходная после посылки пакета ожидает от ПК максимум 4 мс(миллисекунды)? Причём этот софт будет ещё и много-поточный - один поток работает со 2-м com портом(бегущая строка), второй поток работает с первым сериал-портом(проходная) и третий поток - обслуживаетGUI? ... |
|||
:
Нравится:
Не нравится:
|
|||
20.01.2014, 14:25 |
|
Программирование COM-порта
|
|||
---|---|---|---|
#18+
AlexLagпроверяет не пытается ли работник пройти дважды в одном направлении Угу, прямо суперфункциональность. Например, прохожу через проходную, щелкнаю пропуском и вспомнаю, что забыл снять деньги. Подхожу к банкомату, снимаю деньги, а на работу уже не попасть - в одном направлении сразу два раза пытаюсь пройти. Здорово, да? Или коллегами идешь в столовую, двери открываются по одному пропуску и все проходят. А обратно - другой коллега щелкает пропуском. Получается, что человек вышел и не зашел обратно. Что касается скорости, то 4 мс мало. Но даже не столько потому, что переключение контекста (про 10 мс на переключение очень сильно сомневаюсь, приведите, где прочли), столько что во время сборки мусора приложение приостанавливает свою работу. Во избежание этого нужно включать серверный режим сборки мусора, когда коллектор работает в отдельном потоке. ... |
|||
:
Нравится:
Не нравится:
|
|||
20.01.2014, 15:14 |
|
Программирование COM-порта
|
|||
---|---|---|---|
#18+
Ну дело в том, что га устройстве сопряжения стоит контроллер, который просле всовывания пропуска ждёт 10 сек согласно документации и если человек не прошёл - то высылает пакет на ПК с обратным знаком(якобы человек туда-сюда прошёл) и в базе тупо сохраняется инфа о том, чо человек прошёл туда-сюда с интервалом 10 сек... Информацию по времени переключения контекста потоков я нашёл тут http://www.dtf.ru/articles/read.php?id=39888 И знаете я ей доверяю - мои опыты с проходной вполне согласуются с этими данными... ... |
|||
:
Нравится:
Не нравится:
|
|||
20.01.2014, 15:38 |
|
Программирование COM-порта
|
|||
---|---|---|---|
#18+
AlexLagСобственно конкретный вопрос. На сколько реально написать достаточно надёжный софт управления проходной для Windows(XP, 7, Vista-линейки NT), если согласно спецификации проходная после посылки пакета ожидает от ПК максимум 4 мс(миллисекунды)? Причём этот софт будет ещё и много-поточный - один поток работает со 2-м com портом(бегущая строка), второй поток работает с первым сериал-портом(проходная) и третий поток - обслуживаетGUI? А что происходит с контроллером проходной, если 4 мс прошли? ... |
|||
:
Нравится:
Не нравится:
|
|||
20.01.2014, 16:56 |
|
Программирование COM-порта
|
|||
---|---|---|---|
#18+
AlexLag невозможно из-за того, что WindowsXP не является системой режима реального времени(СРВ)! Или я всё-таки заблуждаюсь? Мне бы хотелось услышать, что вы думаете по этому поводу. Может всё-таки есть какой-то способ решения? Нет, не заблуждаетесь. Виндовс действительно не может вам гарантировать ответ в течении какого-то конкретного времени. Но строит реал-тайм системы на ней все-таки можно. Надо использовать негативную логику - вместо позитивной. То есть - проход всегда закрыт, пока не получен сигнал на открытие. А не так как у вас - открыт, но закроется, если карточка просрочена. Я работал с контроллерами автоматического склада - моторы транспортеров и монорельсовых погрузчиков - ждем пока бит "можно ехать" не будет установлен в 1. ... |
|||
:
Нравится:
Не нравится:
|
|||
20.01.2014, 17:01 |
|
Программирование COM-порта
|
|||
---|---|---|---|
#18+
D129, ну если я не успею за это время дать ответ - как я понимаю через 4 мс контроллер на устройстве сопряжения опрашивает линию DTR-если на ней в таком случае стоит 0(разрешён проход - то проходная пропускает), если 1 - то запрещает проход. Дело не в том, что я не могу выставить по умолчанию запрет прохода. Дело в том, что при испытании своей тестовой прожки по работе с проходной моя прожка не успевает уложиться в 4 мс(я так думаю). Допустим я выставлю 1(запрет по умолчанию). Ну всунет человек пропуск - надо выставить моей программе 0 - пропустить. Ну выставляет программа после приёма пакета с порта нолик(я подписался на событие прихода данных в порт) , но контроллер на проходной уже через 4 мс считает не тот сигнал(предыдущий-т.е. 1)! И в итоге не пускает человека. Второй раз всунет - всё естественно ок! Так как вступили в силу изменения после первой попытки(с запаздыванием-таки линия в 0 установилась)! Может я чего-то недопонимаю по логике в работе с проходной, но покопался в исходниках DOS программы - вроде всё так... ... |
|||
:
Нравится:
Не нравится:
|
|||
20.01.2014, 17:25 |
|
Программирование COM-порта
|
|||
---|---|---|---|
#18+
D129, И такой вопрос. Скорость порта 9600 бод. Программу написал на С#+WinForms. Длинна пакета, который формирует проходная 12 байт-я в LgComSpy++ смотрел. Время ответа ПК на пакет согласно документации 4 мс. При скорости 9600 бод - ггрубо говоря 1 бит инфолрмации передаётся за 0.0001 секунду, получается 12 байт передаются 12*8*0.0001 сек, что грубо говоря около 10 мс! Как такое вообще может быть? Получается в документации указано чистое время на Обработку ПК без учёта времени на доставку данных? ... |
|||
:
Нравится:
Не нравится:
|
|||
20.01.2014, 17:32 |
|
Программирование COM-порта
|
|||
---|---|---|---|
#18+
AlexLag12*8*0.0001 стартовый и стоповый бит не учёл ... |
|||
:
Нравится:
Не нравится:
|
|||
20.01.2014, 17:36 |
|
Программирование COM-порта
|
|||
---|---|---|---|
#18+
Изопропил, да, спасибо. Но я это так грубо оценил ... |
|||
:
Нравится:
Не нравится:
|
|||
20.01.2014, 17:39 |
|
Программирование COM-порта
|
|||
---|---|---|---|
#18+
AlexLagДело в том, что при испытании своей тестовой прожки по работе с проходной моя прожка не успевает уложиться в 4 мс(я так думаю) Виндовс работает квантами времени. Квант определяется системой (при установке) и обычно бывает 15 милисекунд. То есть, программа, в которой естественно есть рабочий поток, получает иногда (если система не нагружена - то часто) 15 милисекунд на выполнение своего кода. Кода при этом выполняется не мало (процессоры то быстрые нынче) - чаще всего пожалуй, все и выполнится (обработчики нажатий на кнопки, итп). Когда квант кончается, система останавливает поток, и ищет, кто еще ждет. Программа опять может получить квант, если других претендентов нет, а может и не получить - так как система может "заняться своими делами" То есть, компьютер технически может ответить за 4 милисекунды, даже поискать в списке номер карточки успел бы, но виндовс ему это не дает сделать. ... |
|||
:
Нравится:
Не нравится:
|
|||
20.01.2014, 17:40 |
|
Программирование COM-порта
|
|||
---|---|---|---|
#18+
AlexLagD129, И такой вопрос. Скорость порта 9600 бод. Программу написал на С#+WinForms. Длинна пакета, который формирует проходная 12 байт-я в LgComSpy++ смотрел. Время ответа ПК на пакет согласно документации 4 мс. При скорости 9600 бод - ггрубо говоря 1 бит инфолрмации передаётся за 0.0001 секунду, получается 12 байт передаются 12*8*0.0001 сек, что грубо говоря около 10 мс! Как такое вообще может быть? Получается в документации указано чистое время на Обработку ПК без учёта времени на доставку данных?Думаю, тут все проще - 4 милисекунды после доставки данных. Так логичнее. :-) Если вы можете поменять команду на "открыть" вместо "закрыть" - то не заморачивайтесь милисекундами, пишите обратную логику - Закрыто. Проводят карточку пошел запрос на открытие номер карточки получен номер проверен посылаем сигнал на открытие. ждем допустимый таймаут - 5 секунд например - посылаем сигнал на закрытие. У ком порта для этого есть соответствующий эвент - надо цепляться на него, писать свои циклы ожидания-чтения - излишне. ... |
|||
:
Нравится:
Не нравится:
|
|||
20.01.2014, 17:48 |
|
Программирование COM-порта
|
|||
---|---|---|---|
#18+
D129компьютер технически может ответить за 4 милисекунды, даже поискать в списке номер карточки успел бы, но виндовс ему это не дает сделать. Да ладно, ничего страшного. Основная бяка - это возможность переключения контекста в этот период - 4 мс. Можно несколько попыток предпринять. Нельзя ли увеличить таймаут ожидания? ... |
|||
:
Нравится:
Не нравится:
|
|||
20.01.2014, 17:48 |
|
Программирование COM-порта
|
|||
---|---|---|---|
#18+
D129, я полностью с вами согласен. но надеялся, что всё-таки чего-то недопонимаю. Получается, что под XP с такой проходной(4 мс на ответ) ничего не получится?((( ... |
|||
:
Нравится:
Не нравится:
|
|||
20.01.2014, 17:49 |
|
Программирование COM-порта
|
|||
---|---|---|---|
#18+
Arm79, Уточню один момент - за всё время тестирования - а всовывал пропуск я где-то раз 20! XP ни разу не успела вовремя дать ответ!)) ... |
|||
:
Нравится:
Не нравится:
|
|||
20.01.2014, 17:50 |
|
Программирование COM-порта
|
|||
---|---|---|---|
#18+
Arm79Нельзя ли увеличить таймаут ожидания? Я думал, что это мой вопрос. :-) Контроллер ведь не хочет ждать - на стороне компьютера - да ждите хоть два дня. :-) ... |
|||
:
Нравится:
Не нравится:
|
|||
20.01.2014, 17:51 |
|
Программирование COM-порта
|
|||
---|---|---|---|
#18+
D129Arm79Нельзя ли увеличить таймаут ожидания? Я думал, что это мой вопрос. :-) Контроллер ведь не хочет ждать - на стороне компьютера - да ждите хоть два дня. :-) ник перепутал. ... |
|||
:
Нравится:
Не нравится:
|
|||
20.01.2014, 17:52 |
|
Программирование COM-порта
|
|||
---|---|---|---|
#18+
D129, всё бы ничего в вашем варианте, кабы контроллер на устройстве сопряжения не считывал сигнал через 4 мс и не делал соответствующие действия после считывания сигнала:) Т.е. если он не дожидается за 4 мс ответа от ПК - то смотрит на линию и отдаёт соответствующую команду на проходную не смотря на то, что ПК там после этого выставит в линию! Ну я так понимаю... ... |
|||
:
Нравится:
Не нравится:
|
|||
20.01.2014, 18:03 |
|
Программирование COM-порта
|
|||
---|---|---|---|
#18+
D129, да, я подписался на этот евент прихода данных с порта:D ... |
|||
:
Нравится:
Не нравится:
|
|||
20.01.2014, 18:05 |
|
Программирование COM-порта
|
|||
---|---|---|---|
#18+
Arm79, К сожалению не могу изменить логику работы самого контроллера(( ... |
|||
:
Нравится:
Не нравится:
|
|||
20.01.2014, 18:06 |
|
Программирование COM-порта
|
|||
---|---|---|---|
#18+
AlexLagD129, всё бы ничего в вашем варианте, кабы контроллер на устройстве сопряжения не считывал сигнал через 4 мс и не делал соответствующие действия после считывания сигнала:) Т.е. если он не дожидается за 4 мс ответа от ПК - то смотрит на линию и отдаёт соответствующую команду на проходную не смотря на то, что ПК там после этого выставит в линию! Ну я так понимаю... Поправлюсь - контроллер ждёт 4 мс и считывает состояние линии. Ну на сколько я понял из документации. ... |
|||
:
Нравится:
Не нравится:
|
|||
20.01.2014, 18:09 |
|
Программирование COM-порта
|
|||
---|---|---|---|
#18+
AlexLag, пора код показать ... |
|||
:
Нравится:
Не нравится:
|
|||
20.01.2014, 18:32 |
|
Программирование COM-порта
|
|||
---|---|---|---|
#18+
Изопропил, собственно говоря в тестовой прожке и показывать то нечего Но выложу.. Код: c# 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. 56. 57. 58. 59.
... |
|||
:
Нравится:
Не нравится:
|
|||
20.01.2014, 19:45 |
|
Программирование COM-порта
|
|||
---|---|---|---|
#18+
начинаем медитацию - ReceivedBytesThreshold=12 (дабы событие возникло при заполнении буфера и Read был неблокирующим ... |
|||
:
Нравится:
Не нравится:
|
|||
20.01.2014, 22:54 |
|
|
start [/forum/topic.php?fid=20&msg=38532116&tid=1403324]: |
0ms |
get settings: |
11ms |
get forum list: |
14ms |
check forum access: |
5ms |
check topic access: |
5ms |
track hit: |
38ms |
get topic data: |
10ms |
get forum data: |
5ms |
get page messages: |
54ms |
get tp. blocked users: |
1ms |
others: | 13ms |
total: | 156ms |
0 / 0 |