Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 06.02.2013, 06:28   #1
vdnk
 
Регистрация: 29.01.2013
Сообщений: 6
Вопрос Война со скоростью (TTimer, Asm, LPT, COM-port)

Всем доброго дня.
Есть компьютер с LPT-портом, специально установленный на станок. На нем программа управления шаговыми двигателями. Задача - отправить на порт LPT байт с командами, потом "обнулить" порт, далее - снова команда, опять обнулить. Все работает, но... Я выбрал для задания времени TTimer, даже два - один выдает команду, второй обнуляет. Расчетное время, для выдачи требуемой скорости станка равно 5 и 3 мс соответственно. Компонент TTimer работает адекватно на времени не менее 200 мс, в моем случае удается сделать максимальную скорость в шесть-десять раз меньше требуемой.
Что делать?
Есть мысль - необходима вставка на ассемблере, с созданием нити с максимальным приоритетом - но проблема, что я в ассемблере практически не шарю; массив данных привязан к TList (b := byte(List[i]), как-то так).
Буду очень признателен дельным советам, или мааааленькому примитивному коду ))

А есть задача поинтереснее - как этот байт выдать не на LPT, а на COM с последующим преобразованием в RS485, железо уже есть.

Последний раз редактировалось vdnk; 06.02.2013 в 06:41. Причина: Уточнение
vdnk вне форума Ответить с цитированием
Старый 06.02.2013, 07:55   #2
s-andriano
Старожил
 
Аватар для s-andriano
 
Регистрация: 08.04.2012
Сообщений: 3,229
По умолчанию

Windows не является ОС реального времени.
Так что по-хорошему следует установить на комп другую ОС (например QNX) и разрабатывать софт под нее.

Средняя погрешность стандартного виндового таймера составляет десятки мс. И с этим ничего не поделаешь.
Немного улучшить ситуацию можно, используя мультимедийный таймер, но для этого нужно будет отказаться от стандартных компонентов Delphi и писать свои на WinAPI. Причем, без гарантий, что этого окажется достаточно для Ваших целей.
s-andriano вне форума Ответить с цитированием
Старый 06.02.2013, 10:14   #3
vdnk
 
Регистрация: 29.01.2013
Сообщений: 6
По умолчанию

Печально... Как-то вообще безрадостно...
vdnk вне форума Ответить с цитированием
Старый 06.02.2013, 11:29   #4
Sibedir
Тот ещё
Старожил
 
Аватар для Sibedir
 
Регистрация: 14.11.2007
Сообщений: 2,242
По умолчанию

Вот подобная тема у меня была
http://www.programmersforum.ru/showthread.php?t=225348
___________________________________ ___________________________________ _
А пакетную отправку данных сделать нельзя? Можно установить и запрограммировать подходящий контроллер, что-бы он сам пакет на мс разбивал.
___________________________________ ___________________________________ _
Если погрешность в несколько мс не критична, можно установить интервал по количеству тактов процессора
http://www.delphisources.ru/pages/fa...act_timer.html
http://www.delphisources.ru/pages/fa...processor.html
http://www.cyberforum.ru/delphi/thread4868.html
Sibedir вне форума Ответить с цитированием
Старый 06.02.2013, 11:59   #5
vdnk
 
Регистрация: 29.01.2013
Сообщений: 6
По умолчанию

Вот спасибо!! Сейчас попробую.

А то я уже начал писать что-то вроде

b: byte;
c: char;
..
Thread := TThread.Create(False)
..

repeat

Out32($378, b); //в LPT записывааем байт;
// или ComPort.WriteStr(c);
asm

// зацикливаемся на 3 мс

end;

Out32($378, $11)

asm

// зацикливаемся на 2 мс

end;

inc(i); // и следующая итеррация
vdnk вне форума Ответить с цитированием
Старый 06.02.2013, 12:50   #6
vdnk
 
Регистрация: 29.01.2013
Сообщений: 6
По умолчанию

Минимальное время THRTimer получается 8 с копейками мс, иногда 11 с копейками.
однако, придется менять систему, такие скачки мне не подходят.. или действительно ставить еще дополнительный контроллер, от чего я и пытался уйти
vdnk вне форума Ответить с цитированием
Старый 06.02.2013, 12:56   #7
vdnk
 
Регистрация: 29.01.2013
Сообщений: 6
По умолчанию

У меня тогда такой вопрос - а как программировать для QNX ? Кажется, встречал компиляторы для Делфей, но не уверен, что там будут работать системные функции.
А подойдет ли для этих целей неграфический добрый ДОС? Не знаю, как у него там со временем, по-моему, все замечательно ?
vdnk вне форума Ответить с цитированием
Старый 06.02.2013, 13:03   #8
FaTaL
Участник клуба
 
Аватар для FaTaL
 
Регистрация: 09.11.2007
Сообщений: 1,762
По умолчанию

А Windows CE не подойдёт? Вроде это тоже ОС реального времени.
FaTaL вне форума Ответить с цитированием
Старый 06.02.2013, 13:20   #9
vdnk
 
Регистрация: 29.01.2013
Сообщений: 6
По умолчанию

Все. Решил. С милисекундами тормозил немного: все в районе допусков, если ничего лишнего не открывать в Винде. Решил примерно так:

if HRTimer.StartTimer
then
for i := 0 to 4
do QT := HRTimer.ReadTimer;

TButton(Sender).Caption := FloatToStr(QT);

получаем примерно 3,5-4 мс (по 0,8 мс на каждый запрос), точнее не получится, думаю. Но уже достаточно для моих целей.

ВСЕМ ОГРОМНОЕ СПАСИБО!!!
vdnk вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
движение авто со скоростью saltonik Помощь студентам 9 02.04.2011 23:18
Копирование файла с заданой скоростью black_prog Помощь студентам 2 25.03.2011 16:00
проблемы с скоростью интернета zheka9601 Общие вопросы C/C++ 2 06.05.2010 20:11
Пересечение объектов. Проблема со скоростью движения Манжосов Денис :) Gamedev - cоздание игр: Unity, OpenGL, DirectX 11 06.03.2010 19:39
OpenGL. Проблема со скоростью передвижения объектов Blade Gamedev - cоздание игр: Unity, OpenGL, DirectX 5 26.10.2009 13:40