powered by simpleCommunicator - 2.0.56     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Программирование COM-порта
25 сообщений из 41, страница 1 из 2
Программирование COM-порта
    #38531830
AlexLag
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Добрый день, камрады. Не знаю в верный ли подраздел форума я обращаюсь потому, как программирование на 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 не
является системой режима реального времени(СРВ)! Или я всё-таки заблуждаюсь? Мне бы хотелось услышать, что вы думаете по этому поводу. Может всё-таки есть какой-то
способ решения? В какую сторону мне копать? За толковый совет по решению проблемы с меня пиво! Просто не знаю даже к кому обратиться с вопросами, на работе начальник и все
остальные совсем далеки от таких вопросов! С уважением, ко всем...
...
Рейтинг: 0 / 0
Программирование COM-порта
    #38531833
AlexLag
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Собственно конкретный вопрос. На сколько реально написать достаточно надёжный софт управления проходной для Windows(XP, 7, Vista-линейки NT), если согласно спецификации проходная после посылки пакета ожидает от ПК максимум 4 мс(миллисекунды)? Причём этот софт будет ещё и много-поточный - один поток работает со 2-м com портом(бегущая строка), второй поток работает с первым сериал-портом(проходная) и третий поток - обслуживаетGUI?
...
Рейтинг: 0 / 0
Программирование COM-порта
    #38531945
Arm79
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AlexLagпроверяет не пытается ли работник пройти дважды в одном направлении
Угу, прямо суперфункциональность. Например, прохожу через проходную, щелкнаю пропуском и вспомнаю, что забыл снять деньги. Подхожу к банкомату, снимаю деньги, а на работу уже не попасть - в одном направлении сразу два раза пытаюсь пройти. Здорово, да?

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


Что касается скорости, то 4 мс мало. Но даже не столько потому, что переключение контекста (про 10 мс на переключение очень сильно сомневаюсь, приведите, где прочли), столько что во время сборки мусора приложение приостанавливает свою работу. Во избежание этого нужно включать серверный режим сборки мусора, когда коллектор работает в отдельном потоке.
...
Рейтинг: 0 / 0
Программирование COM-порта
    #38531986
AlexLag
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Ну дело в том, что га устройстве сопряжения стоит контроллер, который просле всовывания пропуска ждёт 10 сек согласно документации и если человек не прошёл - то высылает пакет на ПК с обратным знаком(якобы человек туда-сюда прошёл) и в базе тупо сохраняется инфа о том, чо человек прошёл туда-сюда с интервалом 10 сек... Информацию по времени переключения контекста потоков я нашёл тут http://www.dtf.ru/articles/read.php?id=39888 И знаете я ей доверяю - мои опыты с проходной вполне согласуются с этими данными...
...
Рейтинг: 0 / 0
Программирование COM-порта
    #38532116
Фотография D129
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AlexLagСобственно конкретный вопрос. На сколько реально написать достаточно надёжный софт управления проходной для Windows(XP, 7, Vista-линейки NT), если согласно спецификации проходная после посылки пакета ожидает от ПК максимум 4 мс(миллисекунды)? Причём этот софт будет ещё и много-поточный - один поток работает со 2-м com портом(бегущая строка), второй поток работает с первым сериал-портом(проходная) и третий поток - обслуживаетGUI?
А что происходит с контроллером проходной, если 4 мс прошли?
...
Рейтинг: 0 / 0
Программирование COM-порта
    #38532125
Фотография D129
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AlexLag невозможно из-за того, что WindowsXP не
является системой режима реального времени(СРВ)! Или я всё-таки заблуждаюсь? Мне бы хотелось услышать, что вы думаете по этому поводу. Может всё-таки есть какой-то
способ решения?
Нет, не заблуждаетесь.
Виндовс действительно не может вам гарантировать ответ в течении какого-то конкретного времени.

Но строит реал-тайм системы на ней все-таки можно.

Надо использовать негативную логику - вместо позитивной.

То есть - проход всегда закрыт, пока не получен сигнал на открытие.
А не так как у вас - открыт, но закроется, если карточка просрочена.

Я работал с контроллерами автоматического склада - моторы транспортеров и монорельсовых погрузчиков -
ждем пока бит "можно ехать" не будет установлен в 1.
...
Рейтинг: 0 / 0
Программирование COM-порта
    #38532168
AlexLag
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
D129, ну если я не успею за это время дать ответ - как я понимаю через 4 мс контроллер на устройстве сопряжения опрашивает линию DTR-если на ней в таком случае стоит 0(разрешён проход - то проходная пропускает), если 1 - то запрещает проход. Дело не в том, что я не могу выставить по умолчанию запрет прохода. Дело в том, что при испытании своей тестовой прожки по работе с проходной моя прожка не успевает уложиться в 4 мс(я так думаю). Допустим я выставлю 1(запрет по умолчанию). Ну всунет человек пропуск - надо выставить моей программе 0 - пропустить. Ну выставляет программа после приёма пакета с порта нолик(я подписался на событие прихода данных в порт) , но контроллер на проходной уже через 4 мс считает не тот сигнал(предыдущий-т.е. 1)! И в итоге не пускает человека. Второй раз всунет - всё естественно ок! Так как вступили в силу изменения после первой попытки(с запаздыванием-таки линия в 0 установилась)! Может я чего-то недопонимаю по логике в работе с проходной, но покопался в исходниках DOS программы - вроде всё так...
...
Рейтинг: 0 / 0
Программирование COM-порта
    #38532179
AlexLag
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
D129,
И такой вопрос. Скорость порта 9600 бод. Программу написал на С#+WinForms. Длинна пакета, который формирует проходная 12 байт-я в LgComSpy++ смотрел. Время ответа ПК на пакет согласно документации 4 мс. При скорости 9600 бод - ггрубо говоря 1 бит инфолрмации передаётся за 0.0001 секунду, получается 12 байт передаются 12*8*0.0001 сек, что грубо говоря около 10 мс! Как такое вообще может быть? Получается в документации указано чистое время на Обработку ПК без учёта времени на доставку данных?
...
Рейтинг: 0 / 0
Программирование COM-порта
    #38532185
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AlexLag12*8*0.0001
стартовый и стоповый бит не учёл
...
Рейтинг: 0 / 0
Программирование COM-порта
    #38532191
AlexLag
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Изопропил, да, спасибо. Но я это так грубо оценил
...
Рейтинг: 0 / 0
Программирование COM-порта
    #38532193
Фотография D129
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AlexLagДело в том, что при испытании своей тестовой прожки по работе с проходной моя прожка не успевает уложиться в 4 мс(я так думаю)

Виндовс работает квантами времени.
Квант определяется системой (при установке) и обычно бывает 15 милисекунд.
То есть, программа, в которой естественно есть рабочий поток, получает иногда (если система не нагружена - то часто)
15 милисекунд на выполнение своего кода. Кода при этом выполняется не мало (процессоры то быстрые нынче) - чаще всего пожалуй, все и выполнится (обработчики нажатий на кнопки, итп).
Когда квант кончается, система останавливает поток, и ищет, кто еще ждет. Программа опять может получить квант, если других претендентов нет, а может и не получить - так как система может "заняться своими делами"

То есть, компьютер технически может ответить за 4 милисекунды, даже поискать в списке номер карточки успел бы, но виндовс ему это не дает сделать.
...
Рейтинг: 0 / 0
Программирование COM-порта
    #38532203
Фотография D129
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AlexLagD129,
И такой вопрос. Скорость порта 9600 бод. Программу написал на С#+WinForms. Длинна пакета, который формирует проходная 12 байт-я в LgComSpy++ смотрел. Время ответа ПК на пакет согласно документации 4 мс. При скорости 9600 бод - ггрубо говоря 1 бит инфолрмации передаётся за 0.0001 секунду, получается 12 байт передаются 12*8*0.0001 сек, что грубо говоря около 10 мс! Как такое вообще может быть? Получается в документации указано чистое время на Обработку ПК без учёта времени на доставку данных?Думаю, тут все проще - 4 милисекунды после доставки данных.
Так логичнее.
:-)

Если вы можете поменять команду на "открыть" вместо "закрыть" - то не заморачивайтесь милисекундами,
пишите обратную логику -
Закрыто.
Проводят карточку
пошел запрос на открытие
номер карточки получен
номер проверен
посылаем сигнал на открытие.
ждем допустимый таймаут - 5 секунд например -
посылаем сигнал на закрытие.

У ком порта для этого есть соответствующий эвент - надо цепляться на него,
писать свои циклы ожидания-чтения - излишне.
...
Рейтинг: 0 / 0
Программирование COM-порта
    #38532204
Arm79
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
D129компьютер технически может ответить за 4 милисекунды, даже поискать в списке номер карточки успел бы, но виндовс ему это не дает сделать.

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

Нельзя ли увеличить таймаут ожидания?
...
Рейтинг: 0 / 0
Программирование COM-порта
    #38532206
AlexLag
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
D129, я полностью с вами согласен. но надеялся, что всё-таки чего-то недопонимаю. Получается, что под XP с такой проходной(4 мс на ответ) ничего не получится?(((
...
Рейтинг: 0 / 0
Программирование COM-порта
    #38532208
AlexLag
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Arm79,
Уточню один момент - за всё время тестирования - а всовывал пропуск я где-то раз 20! XP ни разу не успела вовремя дать ответ!))
...
Рейтинг: 0 / 0
Программирование COM-порта
    #38532209
Фотография D129
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Arm79Нельзя ли увеличить таймаут ожидания?
Я думал, что это мой вопрос.
:-)
Контроллер ведь не хочет ждать - на стороне компьютера - да ждите хоть два дня.
:-)
...
Рейтинг: 0 / 0
Программирование COM-порта
    #38532213
Фотография D129
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
D129Arm79Нельзя ли увеличить таймаут ожидания?
Я думал, что это мой вопрос.
:-)
Контроллер ведь не хочет ждать - на стороне компьютера - да ждите хоть два дня.
:-)
ник перепутал.
...
Рейтинг: 0 / 0
Программирование COM-порта
    #38532222
AlexLag
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
D129,
всё бы ничего в вашем варианте, кабы контроллер на устройстве сопряжения не считывал сигнал через 4 мс и не делал соответствующие действия после считывания сигнала:) Т.е. если он не дожидается за 4 мс ответа от ПК - то смотрит на линию и отдаёт соответствующую команду на проходную не смотря на то, что ПК там после этого выставит в линию! Ну я так понимаю...
...
Рейтинг: 0 / 0
Программирование COM-порта
    #38532231
AlexLag
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
D129, да, я подписался на этот евент прихода данных с порта:D
...
Рейтинг: 0 / 0
Программирование COM-порта
    #38532233
AlexLag
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Arm79,
К сожалению не могу изменить логику работы самого контроллера((
...
Рейтинг: 0 / 0
Программирование COM-порта
    #38532237
AlexLag
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
AlexLagD129,
всё бы ничего в вашем варианте, кабы контроллер на устройстве сопряжения не считывал сигнал через 4 мс и не делал соответствующие действия после считывания сигнала:) Т.е. если он не дожидается за 4 мс ответа от ПК - то смотрит на линию и отдаёт соответствующую команду на проходную не смотря на то, что ПК там после этого выставит в линию! Ну я так понимаю...
Поправлюсь - контроллер ждёт 4 мс и считывает состояние линии. Ну на сколько я понял из документации.
...
Рейтинг: 0 / 0
Программирование COM-порта
    #38532264
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AlexLag,

пора код показать
...
Рейтинг: 0 / 0
Программирование COM-порта
    #38532339
AlexLag
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Изопропил, собственно говоря в тестовой прожке и показывать то нечего Но выложу..
Код: 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.
//Обработчик загрузки формочки

        private void Form1_Load(object sender, EventArgs e)
        {
            try
            {
                //Настраиваем serial-port
                serialPort_Prohodnaya.PortName = "COM1";
                serialPort_Prohodnaya.DataBits = 8;
                serialPort_Prohodnaya.Parity = Parity.Even;
                serialPort_Prohodnaya.StopBits = StopBits.Two;
                serialPort_Prohodnaya.BaudRate = 9600;
              //подписываемся обработку события на приход данных в порт с проходной 
                serialPort_Prohodnaya.DataReceived += new SerialDataReceivedEventHandler(serialPort_Prohodnaya_DataReceived);
              //Подписываемся на обработчик возникновения ошибок приёма данных на всякий случай 
                serialPort_Prohodnaya.ErrorReceived += new SerialErrorReceivedEventHandler(serialPort_Prohodnaya_ErrorReceived);
             //открываем порт       
              serialPort_Prohodnaya.Open();
             //изначально устанавливаем DTR в 1-запрет прохода 
              serialPort_Prohodnaya.DtrEnable = true;
                
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
        }
//Обработчик ошибок при приёме
 void serialPort_Prohodnaya_ErrorReceived(object sender, SerialErrorReceivedEventArgs e)
        {
            MessageBox.Show(e.EventType.ToString());
        }

      void serialPort_Prohodnaya_DataReceived(object sender, SerialDataReceivedEventArgs e)
        {
            try
            {
                //Читаем данные по 12 байт
                byte[] data = new byte[12];
                serialPort_Prohodnaya.Read(data, 0, data.Length);
                serialPort_Prohodnaya.DtrEnable = false;//разрешаем проход
                 //по идее после первой попытки всовывания пропуска DTR должен установиться в
                 //  0 - т.е. контроллер должен разрешить проход , но этого не происходит, 
                 // разрешения проходит  только после второй и всех последующих попыток
                 // всовывания пропуска, т.е. линия за 4 мс не успела поменять своё состояние с
                 // момента прихода данных на порт с устройства сопряжения. 

               //Обновляем контролы
               //Т.к. обработчик прихода данных находится в другом потоке(не том, который
               //отвечает за работу с контролами)  -то через BeginInvoke
                listBox1.BeginInvoke(new UpdateDelegate(List1InvokeMethod));
           
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
          
        }
...
Рейтинг: 0 / 0
Программирование COM-порта
    #38532492
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
начинаем медитацию - ReceivedBytesThreshold=12 (дабы событие возникло при заполнении буфера и Read был неблокирующим
...
Рейтинг: 0 / 0
Программирование COM-порта
    #38532497
AlexLag
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Изопропил, свойство установить во время загрузки формы? И что это даст - я не совсем понимаю?(((
...
Рейтинг: 0 / 0
25 сообщений из 41, страница 1 из 2
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Программирование COM-порта
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]