PDA

Просмотр полной версии : C#, ТРМ200, протокол OWEN, проблема с многопоточностью



iwannahaveanick
02.12.2016, 13:12
Добрый день!
Имеется ТРМ200, подключённый через адаптер USB к компьютеру (определяется как COM-порт).
Необходимо считывать показания датчика температуры каждые n секунд в отдельном от основной программы потоке (т.к. программа параллельно также общается с другими приборами).

Проблема в следующем:
Если подключаться к устройству и считывать данные в одном потоке, то всё хорошо, если же подключаться в одном потоке, а пытаться считать данные в другом, то возникает ошибка код -2 (port not opened).

Подскажите, в чём может быть проблема?
Используется протокол OWEN, язык C#, VS2015.

kon48
02.12.2016, 13:44
Добрый день!
Предположу, что нужно открывать порт перед операцией обмена с прибором и закрывать его после выполнения обмена.
С уважением

iwannahaveanick
02.12.2016, 14:05
Не исключена ситуация, когда n=1, а то и меньше, в этом случае придётся открывать-закрывать порт чаще, чем раз в секунду, а это, на мой взгляд, не очень хорошо.

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

kon48
02.12.2016, 14:33
Уважаемый iwannahaveanck для обмена с приборами что используете ОРС сервер или библиотеку ввода/вывода ОВЕН?
ОРС сервер при работе по протоколу OWEN монопольно захватывает порт.
С уважением

iwannahaveanick
02.12.2016, 15:19
kon48, использую библиотеку ввода/вывода owen_io.dll

kon48
02.12.2016, 15:57
iwannahaveanck, по своему опыту использования библиотеки ввода/вывода owen_io.dll проблем не было.
К слову, Вы говорите, что не резон часто открывать и закрывать порт можно ы с этим и согласиться, но проводил оценку
времени операций ввода/вывода с приборами и операцию открытия/закрытия порта так оказалось, что последние не съедают
много времени. Например, в зависимости от быстродействия ПК у меня суммарное время операций опроса 6 приборов разных типов (ТРМ201, ТРМ210, ТРМ138, ТРМ148, ТРМ251)
составляет 0,77 ... 0,82 сек для быстрого ПК и 1,81... 2,41 сек для медленного ПК. А паспортное время опроса этих приборов задается в диапазоне 0,8...1,0 сек.
Т.е. по идее цикл опроса прибора в программе пользователя не должен быть меньше. При ошибках обмена время опроса (работы) прибора увеличивается раза в три.
Это внутренний алгоритм работы прибора вносит такую задержку. Потребное время цикла опроса приборов рассчитываю на наихудший случай.
Поэтому в своих программах перед циклом опроса приборов открываю порт и закрываю его после завершения операций работы с приборами.
Использую почти все функции библиотеки вплоть до анализа аварийных ситуаций.
С уважением

iwannahaveanick
02.12.2016, 16:24
kon48, спасибо за ответ!
Если не удастся разобраться с этой проблемой, видимо, придётся открывать-закрывать порт и поставить скорость опроса раз в 1.5 или 2 секунды.

kon48
07.12.2016, 11:34
Уважаемый iwannahaveanck удалось ли решить проблему. Если удалось поделитесь опытом.
С уважением

iwannahaveanick
07.12.2016, 14:40
Добрый день, kon48.
Проблему решить не удалось, приходится открывать-закрывать порт.
Похоже, что работа с прибором должна производиться только в том потоке, из которого был открыт порт.

Kostennikov
07.12.2016, 15:59
Вообще сделайте поток для чтения /записи и к нему менеджер или очередь и хоть из ста потоков общайтесь с ком портом через этот менеджер. а так да только в том потоке в котором открыт порт можно с ним работать. А вообще сделайте таймер и по таймеру останавливайте опрос приборов опросите нужное и продолжите откуда остановились в одном потоке. это самый простой вариант