Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Система";
Текущий архив: 2002.04.25;
Скачать: [xml.tar.bz2];

Вниз

О точных временных интервалах ...   Найти похожие ветки 

 
star   (2002-01-24 17:45) [0]

Необходимо управлять станком с двумя шаговыми двигателями, которые позиционируют инструмент над подвижным столом и сам подвижный стол. Программу хорошо бы писать под Дельфи. Возникла проблема: схеме управления шаговиками нужно выдавать точные временные интервалы, чтобы она двигала инструмент и стол. Как на дельфи выдавать точные интервалы в порт я не знаю. TTimer на сколько я знаю, врет безбожно, и нельзя, чтобы сигнал на управление пошел раньше или позже. Может кто знает, как выдавать в порт точные временные интервалы, подскажите ...


 
Фэ   (2002-01-24 20:33) [1]

Можно выдавать стабильную частоту через разряд TXD Com-порта.

F=115200/(2^N-1) где N=16
примерно от 57 кГц до долей Гц.
Частота стабилизирована от кварца.

Но вообще-то на шаговые выдают не частотный код, в импульсный, т.е. число имульсов.


 
kig   (2002-01-24 21:30) [2]

Посморите в MSDN
GetTickCount

Но
GetTickCount is limited to the resolution of the system timer.
Windows NT 3.5 and later: The system timer runs at approximately 10ms.
Windows NT 3.1: The system timer runs at approximately 16ms.
Windows 95/98/Me: The system timer runs at approximately 55ms.

А также ф-ции Multimedia Timers





 
Фэ   (2002-01-24 23:45) [3]

Для управления промышленными объектами использут промышленные компьютеры и ОС реального времени.
Win плохая платформа для этого.
Если только не использовать специализированную периферию.
Например для твоего случая нужен ПКЧ - преобразователь "код-число импульсов"


 
SoftOne   (2002-01-25 02:28) [4]

2 Фэ © (24.01.02 23:45)
Извини, уточню.
"Win плохая платформа для этого". Не столько плохая, сколько не годная вообще.


 
EsKor   (2002-01-25 04:44) [5]

Послушайтесь Фэ и SoftOne. Даже и не пытайтсь с помощью персонального компьютера управлять всем процессом работы оборудования. Хотя "извернувшись" и "изогнувшись" можно это сделать, в будущем это грозит самыми неприятными последствиями - шишок (и не только) набито уже много, к сожалению не обходилось и без человеческих жертв. Самым правильным решением будет использование программируемых контроллеров, а компьютер использовать только как средство сбора информации, ну и м.б. выдачи некоторых управляющих воздействий, но не собственно оборудованию, а контроллеру. Поищите информацию о SCADA-пакетах и вообще об управлении технологическими процессами (АСУ ТП). Если не найдете напишите мне на e-mail, постараюсь что-нибудь прислать. Если все-таки приспичило делать так как вы задумали, то опять же управлять станком нужно или через преобразователь, или опять же через простенький контроллер/адаптер, т.е. копьютер выдает в виде кода только направление перемещения и на какое расстояние, команды на включение/выключение и т.п. все "низовые" операции, в том числе и разные блокировки, должна выполнять аппаратура.


 
VuDZ   (2002-01-25 09:41) [6]

1. вот кусочек из моей проги для определения частоты проца - точность 100%

naked означает, что операторы для входа и выхода из ф-ии пишу я, а не компилятор
__declspec(naked)
__int64 GetCpuTick()
{ __asm {
rdtsc
ret
// тут получается хитрый момент, но факт в том, что
// возвращается сразу кол-во тактов проца прошедшее с моменда
// старта без доп. команд - слава С :)
} }

// с этим, я думаю, разобраться не проблема
double GetCpuFrequency ()
{
__int64 Frequency,
TimerCount1,
TimerCount2,
CpuCount1,
CpuCount2; if (!QueryPerformanceFrequency ((LARGE_INTEGER*) &Frequency)) return 0;

QueryPerformanceCounter ((LARGE_INTEGER*) &TimerCount1);

CpuCount1 = GetCpuTick ();
Sleep (500);
CpuCount2 = GetCpuTick ();
QueryPerformanceCounter ((LARGE_INTEGER*) &TimerCount2);
if (TimerCount1 == TimerCount2) return 0;
return ((double) ((CpuCount2 - CpuCount1) * Frequency) /
(double) (TimerCount2 - TimerCount1));
}


2. итак, мы имеем частоту проца. на основе этого вычисляем кол-во тактов, которое надо ждать, и потом просто ждём.
точность под виндой +/- 100-1000 тактов, всё зависит от привилегий процессора


 
Фэ   (2002-01-25 10:20) [7]

Как только появиться Application.ProcessMessages, а без него не удасться в приложении обойтись, WIndows о себе напомнит.


 
star   (2002-01-25 11:26) [8]

Ну, допустим, поставлю я промежуточный контроллер. Но нужно же тогда иметь у него какой-то буфер для команд, которые посылаются компьютером, нужно же как-то своевременно обновлять этот буфер, сообщать компьютеру о том, что буфер переполнен или что в буфере появилось место для новой команды. Здесь тоже нужна какая-то синхронность, иначе, если буфер переполнится, а компьютер об этом не узнает, часть команд потеряется, или, наоборот, если буфер опустошится и компьютер его вовремя не заполнит, станок остановится (а останавливаться он не должен!).
Вот как это реализовать?
Смысл такой: есть платка, которая торкается в PCI, на ней стоит параллельный порт КР580ВВ55. Этот порт и должен был управлять шаговиками. Допустим, поставлю я какой-нибудь микроконтроллер, сделаю в нем буфер для команд шаговикам, сделаю на другом контроллере схему управления шаговиками, и свяжу их в пару, но как все-таки обеспечить синхронность работы контроллера для команд и компьютерной программы? Это главный вопрос. Не писать же под ДОС!


 
KSergey   (2002-01-25 12:23) [9]

а) писать таки под ДОС. А что вас в том смущает - мне что-то не понятно.
б) КР580ВВ55 обеспечивает двунаправленный ввод/вывод. Так и пусть контроллер по заполнении буфера выдает соотв. сигнал компутеру, который в ответ на то приостановит выдачу команд. Это обычная и нормальная тактика. Для примера посмотрите как работает порт принтера.
г) вам же умные люди говорят и не один раз: нельзя из персонального компутера, тем более под управлением win сделать управляющий компутер. Только как сборщик сведений. Ну в крайнем случае для наколеннго производства.


 
Фэ   (2002-01-25 12:35) [10]

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



 
BGA   (2002-01-25 12:38) [11]

В WinNT4.0 и выше реализованы объекты ядра - WaitableTimer, позволяют точно работать с временами от 19мсек. (время квантования потоков ядром ОС). Хорошо описаны у Рихтера.

Необходимо создать высокоприоритетный рабочий поток.
Рабочий код примерно такой:

procedure T????.Execute;
var
hTmr: THandle;
li: TLargeInteger;
lp: cardinal;
begin
hTmr := CreateWaitableTimer(NIL, False, NIL);
try
li := 0;
lp := INTERVALS_REQUEST[16];
if SetWaitableTimer(hTmr, li, lp, NIL, NIL, False)then //пусть тикает через 16 мсек
repeat
WaitForSingleObject(hTmr, INFINITE);
/***********************************************/
Рабочий код
/***********************************************/
until Stop???; // глобальная переменная для останова
finally
CloseHandle(hTmr);
CloseHandle(fhFile);
end;
end;



 
Leks   (2002-01-25 12:51) [12]

Вопрос не для этой конфы. Спросите здесь http://www.telesys.ru/wwwboards/mcontrol/index.shtml


 
Фэ   (2002-01-25 12:59) [13]

Шаговые двигатели могут иметь частоту импульсов > 1000 Гц - это меньше 1 ms.Не справиться Win с этим.


 
star   (2002-01-25 13:10) [14]

В паспорте моих шаговиков говорится, что минимальное время отработки одного шага = 300 миллисекунд. Я думаю микроконтроллер с этим вполне справится. Дело не в шаговиках. Просто хотелось узнать, как лучше реализовать общение дельфовской программы с железом, чтобы небыло накладок ...


 
Фэ   (2002-01-25 13:58) [15]

Шаговый на 3 Гц ? Это что-то, хотя все бывает.


 
serjant   (2002-01-25 13:59) [16]

Попробуй через SetTimet(...);
потом case message of:
.
.
.
wm_Timer: //твой код
Параметры функций в Help или MSDN ;)
У меня он срабатывал отлично.Удачи.


 
EsKor   (2002-01-28 04:25) [17]

Для star © (25.01.02 11:26)
Лучше не промежуточный контроллер, а управляющий. Существуют контроллеры с зашитой ОС совместмой с DOS. Так что можешь весь алгоритм управления станком, и даже множество алгоритмов программировать на своем любимом компьютере на, например, Turbo Pascal, а потом записать ее в контроллер. Конкретно как все это делается нужно смотреть документацию на конкретный контроллер и, скорее всего, придется пообщаться со специалистами от поставщика/разработчика этого контроллера.


 
a_k_v   (2002-01-30 08:14) [18]

2Star
Я в свое время осуществлял частотное управление кооординатной системой графопостроителя из под D3 w95, диапазон частот
был от 200 до 6000 Гц, так как мне форма импульса не особо важна то все сошло с рук, все это до сих пор фунциклирует в шарашке в которой я обучался, влоть до w98.
Только нельзя во время управления ничего с компом делать (я насильно отрубал клаву и мышь и замерял достаточно ли ресурсов компа и все такое)
Так же есть специальные контроллеры для управления шаговыми двигателями(цены на них вполне доступные), и есть книжка про шаговые двигатели (блин название и автора не припомню, но помню цвет - синенькая), так там описываются схемы подключения ШД к компьютеру и алгоритмы управления.



Страницы: 1 вся ветка

Форум: "Система";
Текущий архив: 2002.04.25;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.5 MB
Время: 0.006 c
14-81072
Suntechnic
2002-03-20 22:37
2002.04.25
Вот, наткнулся в Инете....


3-80747
kvcomp
2002-03-31 12:21
2002.04.25
Помогите-еее!!!


1-80998
Андрей Сенченко
2002-04-12 13:22
2002.04.25
Хочу порисовать на форме :)


1-80947
snoup
2002-04-11 22:55
2002.04.25
Дайти кто-нибудь простинький кодик как сделать кнопку круглой?


14-81066
Fellomena
2002-03-18 18:46
2002.04.25
Возможна ли связка *.lib от Фортрана с Delphi проектами ?





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский