32 Таймера это реально?

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
matador
Начинающий
Начинающий
 
Сообщения: 4
Зарегистрирован: 11.04.2007 (Ср) 8:33

32 Таймера это реально?

Сообщение matador » 12.04.2007 (Чт) 12:37

Здравствуйте уважаемые форумчане!
На работе поставили следующую задачу:
Написать программу сбора данных, их сохранения и отображения на экране с промышленных приборов.
Имеется:
Железо - 4 прибора аналогового ввода/вывода, каждый прибор имеет по 8 каналов. Время опроса каждого канала различно и изменяется пользователем в пределах от 0.4 до 30 секунд. Приборы объединены в сеть по RS-485, затем через преобразователь интерфейсов RS-485/RS-232 всё это безобразие подключается к ПК.
ПК процессорная плата с 300 Mhz 128 Мб ОЗУ.
Так же имеется dll библиотека производителя приборов, которая позволяет считывать и записывать из/в прибор параметры и показания подключенных к прибору датчиков.
Что я сделал:
Я написал класс в котором описал прибор с его параметрами (свойства класса) операциями записи/чтения параметров (методы класса) и возможными ошибками (события класса).
Далее я просто накидал на форму 32 таймера - на каждый канал по таймеру, 32 флажка соответствующие каждому каналу. В процедуру каждого таймера добавил чтение измеренного значения с соответсвующего канала и занесения этого значения вместе с текущей датой, номером канала, номером прибора в массив. После этого счётчик увеличивается на 1. После того как счётчик достигает значения 32 массив записывается в текстовый файл, значение счётчика устанавливается в 1. И так до бесконечности.
И всё бы вроде хорошо да, вот просматривая полученные файлы увидел, что не все каналы опрашиваются и получается пробел, что недопустимо. На всех таймерах интервал равен 400.
Ещё мне кажется странным, что производители приборов убеждают в том, что 4 прибора должны нормально опрашиваться при скрости порта 9600 бит/сек, у меня же это происходит только при максимальной сокорти 115200 бит/сек и то если не записывать значения в файл. Как только добавляешь запись в файл, то начинаются пробелы.
Вот теперь собственно вопросы:
Как уйти от этих пробелов? Как задать последовательность работы таймеров. Т.е. у всех интервал одинаковый а в какой последовательности они работают? Что будет, когда интервалы будут разными и они будут перекрывать друг друга (в один момент времени сработают несколько тайимеров)?

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 12.04.2007 (Чт) 12:44

Ограничение - 15 таймеров на приложение.
Пересматривай логику работы.

(почитал, как все организовано)

У... Тяжелый случай.
Делай все заново.
Тебе достаточно одного таймера.
Lasciate ogni speranza, voi ch'entrate.

matador
Начинающий
Начинающий
 
Сообщения: 4
Зарегистрирован: 11.04.2007 (Ср) 8:33

Сообщение matador » 12.04.2007 (Чт) 12:54

Одного таймера достаточно если время опроса каждого канал будет одинаковым, а если на каждый из 32 каналов своё врем опроса задать то как тут с одним таймером то? Подтолкните в нужном направлении :?

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Сообщение Хакер » 12.04.2007 (Чт) 12:57

alibek
Угу.

Но почему в MSDN написано:
There is no practical limit on the number of active timer controls you can have in Visual Basic running under Windows 95 or Windows NT.


matador
Ну например, найди НОД всех интервалов, и поставь его таймеру.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 12.04.2007 (Чт) 13:05

matador писал(а):а если на каждый из 32 каналов своё врем опроса задать то как тут с одним таймером то?

Найди минимальный квант времени и таймер выставляй равным ему. И в коде таймера проверяй, наступило ли время выполнить опрос конкретного таймера.
Lasciate ogni speranza, voi ch'entrate.

matador
Начинающий
Начинающий
 
Сообщения: 4
Зарегистрирован: 11.04.2007 (Ср) 8:33

Сообщение matador » 12.04.2007 (Чт) 14:06

Хакер
Ну например, найди НОД всех интервалов, и поставь его таймеру

alibek
Найди минимальный квант времени и таймер выставляй равным ему. И в коде таймера проверяй, наступило ли время выполнить опрос конкретного таймера.

Как я понял НОД и минимальный квант времени это одно и тоже. В моём случае это значит найти наименьшую величину из величин, равных разнице ближайших интервалов опроса, например для двух датчиков с интревалом опроса 0.4 и 0.5 секунды соответственно НОД или квант времени будет равен 0.1 секунде, так?
А в коде таймера проверить наступило ли время опроса конкретного датчика вот так:
время опроса каждого датчика привести к числу НОД, т.е. для первого датчика это будет 4 для второго 5. После каждого срабатывания таймера переменная содержащая НОД конкретного датчика увеличивается на 1, и как только для первого датчика НОД станет равен 4, произойдёт его опрос, и НОД обнулиться, так же и со вторым датчиком, так?

Viper
Артефакт VBStreets
Артефакт VBStreets
Аватара пользователя
 
Сообщения: 4394
Зарегистрирован: 12.04.2005 (Вт) 17:50
Откуда: Н.Новгород

Сообщение Viper » 12.04.2007 (Чт) 14:12

принцип правильный, дерзайте в реализации
Весь мир матрица, а мы в нем потоки байтов!

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 12.04.2007 (Чт) 14:13

Совершенно верно.
Также учитывай, что указывать интервал таймера меньше 50 практического смысла не имеет, это в общем случае его предел.
Lasciate ogni speranza, voi ch'entrate.

matador
Начинающий
Начинающий
 
Сообщения: 4
Зарегистрирован: 11.04.2007 (Ср) 8:33

Сообщение matador » 12.04.2007 (Чт) 14:30

Всем кто участвовал большое спасибо!
Приступаю к реализации.

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Сообщение Хакер » 12.04.2007 (Чт) 14:39

Нет, не правильно. НОД это наибольший общий делитель.

После каждого срабатывания таймера переменная содержащая НОД конкретного датчика увеличивается на 1, и как только для первого датчика НОД станет равен 4, произойдёт его опрос, и НОД обнулиться, так же и со вторым датчиком, так?


Не может быть НОД-а конкретного датчика. НОД может быть как минимум для двух чисел.


ЗЫ. Имеется ввиду мысли ты свои описал не правильно. А идея рабочая.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Cytron
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 266
Зарегистрирован: 15.02.2007 (Чт) 21:09

Сообщение Cytron » 12.04.2007 (Чт) 18:11

для многопоточности желательно написать главную программу
и программу для грязной работы.
принцип таков
запускается главная программа и запускает другую 32 раза
с разными параметрами командной строки.
проги собирают данные с датчика и передают главной проге по DDE.
главная прога записывает их в файл. конец. :roll:

blinow
Обычный пользователь
Обычный пользователь
 
Сообщения: 53
Зарегистрирован: 27.06.2005 (Пн) 3:13

Сообщение blinow » 13.04.2007 (Пт) 4:15

Это полный геморой, Вы что, с ума сошли, кто ж АСУ на VB пишет, для этого есть другие средства разработкиЮ другие операционные системы и пр. Например в QNX это вообще просто смешная задачка...

Amed
Алфизик
Алфизик
 
Сообщения: 5346
Зарегистрирован: 09.03.2003 (Вс) 9:26

Сообщение Amed » 13.04.2007 (Пт) 9:54

blinow, и чем же не устраивает VB?

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 13.04.2007 (Пт) 10:06

Скоростью, вообще-то.
VB не очень подходит для промышленных систем.
Lasciate ogni speranza, voi ch'entrate.

Cytron
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 266
Зарегистрирован: 15.02.2007 (Чт) 21:09

Сообщение Cytron » 13.04.2007 (Пт) 11:48

ну а чем мой способ плох?

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 13.04.2007 (Пт) 11:59

Тем, что количество геморроя в нём будет непомерно велико.
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

Amed
Алфизик
Алфизик
 
Сообщения: 5346
Зарегистрирован: 09.03.2003 (Вс) 9:26

Сообщение Amed » 13.04.2007 (Пт) 13:35

alibek, все зависит от конкретной системы. Описанная в первом посте задача вполне реальна, решение уже описали.
Вот опрос датчиков по таймеру с частотой 100 кГц, естественно, малодостижим средствами VB.

Cytron, проще ли реализовать все то, что делает "программа для грязной работы" в одну функцию. К тому же, это будет гораздо быстрее.

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 13.04.2007 (Пт) 13:40

Железо - 4 прибора аналогового ввода/вывода, каждый прибор имеет по 8 каналов. Время опроса каждого канала различно и изменяется пользователем в пределах от 0.4 до 30 секунд.
...
ПК процессорная плата с 300 Mhz 128 Мб ОЗУ.

128Мб памяти мало даже для Windows 2000. Незначительной активности приложений/пользователей достаточно, чтобы начался свопинг.
Lasciate ogni speranza, voi ch'entrate.

Amed
Алфизик
Алфизик
 
Сообщения: 5346
Зарегистрирован: 09.03.2003 (Вс) 9:26

Сообщение Amed » 13.04.2007 (Пт) 13:44

98.

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 13.04.2007 (Пт) 13:53

В 98 еще хуже с приоритетами.
Lasciate ogni speranza, voi ch'entrate.

Amed
Алфизик
Алфизик
 
Сообщения: 5346
Зарегистрирован: 09.03.2003 (Вс) 9:26

Сообщение Amed » 13.04.2007 (Пт) 14:05

Если рабочее место будет выделено только под эту задачу, проблем можно избежать.

Cytron
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 266
Зарегистрирован: 15.02.2007 (Чт) 21:09

Сообщение Cytron » 14.04.2007 (Сб) 15:39

Amed писал(а):Если рабочее место будет выделено только под эту задачу, проблем можно избежать.

я представляю игровой клуб в котором стоят компы для игр, но также которые являются webсерверами o_O

Amed
Алфизик
Алфизик
 
Сообщения: 5346
Зарегистрирован: 09.03.2003 (Вс) 9:26

Сообщение Amed » 14.04.2007 (Сб) 15:59

Cytron, это к чему сказано? Причем тут игровой клуб и веб-серверы?

Cytron
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 266
Зарегистрирован: 15.02.2007 (Чт) 21:09

Сообщение Cytron » 14.04.2007 (Сб) 20:00

нет, ну просто такие компьютеры обычно и выделают для задач такого рода, а больше не для чего. :?

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Сообщение Хакер » 14.04.2007 (Сб) 20:33

Что то я не понял. Веб-серверы выделяют для измерения показаний датчиков с частотой 100KHz ?
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

GAGArin
Неистовый флудер
Неистовый флудер
 
Сообщения: 1777
Зарегистрирован: 23.12.2002 (Пн) 12:46
Откуда: я тут взялся, не знаю...

Сообщение GAGArin » 14.04.2007 (Сб) 20:47

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

Amed
Алфизик
Алфизик
 
Сообщения: 5346
Зарегистрирован: 09.03.2003 (Вс) 9:26

Сообщение Amed » 14.04.2007 (Сб) 21:16

GAGArin, благодарю :)

Я уж было подумал, что пора вызывать санитаров.

Cytron
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 266
Зарегистрирован: 15.02.2007 (Чт) 21:09

Сообщение Cytron » 14.04.2007 (Сб) 21:50

GAGArin писал(а):Чел говорит, что на компе с такой убогой конфигурацией не будут пускать других задач, потому что такие конфигурации выделяются как раз под конкретную задачу. Так же как на компе с конфигурацией под игровой клуб никто не будет пускать веб сервер, ибо не предназначены они для этого.

да, я это и имел ввиду. :)

pronto
Постоялец
Постоялец
 
Сообщения: 597
Зарегистрирован: 04.12.2005 (Вс) 6:20
Откуда: Владивосток

Сообщение pronto » 15.04.2007 (Вс) 16:28

Можно вообще без таймеров обойтись...
Будет очень интересно узнать мнение автора по приложенному коду.

Код: Выделить всё
Option Explicit

Private Declare Function GetTickCount Lib "kernel32" () As Long

Private CurrTime(5) As Long, UseInterv(5) As Long '5 изменить на 31 - по числу каналов
Private s As Long, t As Long, d As Long, i As Long

Private n As Long

Private Sub Command1_Click()
s = GetTickCount()
n = 0
Do
   t = GetTickCount()
   d = t - s
   If d > 100 Then '100 - шаг изменения интервала
      For i = 0 To 5
         CurrTime(i) = CurrTime(i) + d
         If CurrTime(i) > UseInterv(i) Then
            'обработать канал
            '(считать и запомнить нужные данные...)
            Debug.Print i, UseInterv(i)
            CurrTime(i) = 0
         End If
      Next i
      s = GetTickCount()
   End If
   DoEvents
Loop While n = 0

Debug.Print "слежение остановлено"
End Sub

Private Sub Command2_Click() 'остановить слежение
   n = 1
End Sub

Private Sub Form_Load()
   UseInterv(0) = 500
   UseInterv(1) = 4000
   UseInterv(2) = 10000
   UseInterv(3) = 30000
   UseInterv(4) = 500
   UseInterv(5) = 4000
End Sub
O, sancta simplicitas!


Вернуться в Visual Basic 1–6

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

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

    TopList