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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 03.07.2011, 23:35   #1
z-wer
Пользователь
 
Регистрация: 03.03.2010
Сообщений: 89
По умолчанию Счетчик импульсов с ком-порта, глюк ?

Реализовал счетчик импульсов с ком-порта.
И проявился очень интересный баг.
Если четное количество указано, прокрутить двигатель допустим на 20 импульсов геркона - то никаких ошибок, если 19 импульсов указать то прокручивает все равно на двадцать. 51 допустим - прокрутит на 52.
Сразу думал, что инерционность виновата. Но оказалось все иначе.
На всякий случай прикладываю код процедуры execute.
Цитата:
procedure TSensor.Execute;
var
Ovr: TOverlapped;
Mask: DWORD;
Signaled: Integer;

begin
FillChar(Ovr, SizeOf(TOverlapped), 0);
Ovr.hEvent := CreateEvent(nil, False, False, nil);
try
SetCommMask(Form1.CPort.Handle, EV_CTS);
repeat
WaitCommEvent(Form1.CPort.Handle, Mask, @Ovr);
// задержка и выключение через 0,2 сек
Signaled := WaitForSingleObject(Ovr.hEvent, 200);

if (Signaled = 0) then
begin
// счет геркона при вращении
case Form1.Rotate of
// вращение West Step, West Position, West Limit, Goto
1,3,5,7 : begin
if (Form1.West1.Checked) then dec(Form1.Count);
if (Form1.East1.Checked) then inc(Form1.Count);
Synchronize(UpdateCount);
end;
// вращение East Step, East Position, East Limit, Goto
2,4,6,8 : begin
if (Form1.West1.Checked) then inc(Form1.Count);
if (Form1.East1.Checked) then dec(Form1.Count);
Synchronize(UpdateCount);
end;
// счет геркона при калибровке
9 : begin
dec(Form1.Count);
Synchronize(UpdateCount);
end;
end;
end;

// остановка Step & Position & Goto
if (Form1.Pulse = Form1.Count) and
(Form1.Rotate > 0) and
(Form1.Rotate < 9) then
Form1.StopRotate;

// экстренная остановка
if (Signaled <> 0) then
Form1.StopRotate;

// остановка при калибровке
if (Signaled <> 0) and
(Form1.Rotate = 9) then
begin
Form1.Count := 0;
Synchronize(UpdateCount);
Form1.SaveParams;
Form1.StopRotate;
end;
until Terminated;
finally
CloseHandle(Ovr.hEvent);
end;
end;
Не могу вьехать где причину искать...

Последний раз редактировалось z-wer; 03.07.2011 в 23:39.
z-wer вне форума Ответить с цитированием
Старый 05.07.2011, 16:44   #2
z-wer
Пользователь
 
Регистрация: 03.03.2010
Сообщений: 89
По умолчанию

Неужели никто не подскажет решение проблемы ?

Попробовал повесить счетчик на OnCTSChange - теже грабли.
Если в отработчике указать подсчет по положительным импульсам, то все ОК
Ежели по положительным и отрицательным - повторяется таже ошибка.
z-wer вне форума Ответить с цитированием
Старый 05.07.2011, 17:43   #3
Aliens_wolfs
Форумчанин
 
Регистрация: 16.12.2009
Сообщений: 902
По умолчанию

У тебя какое то оборудование по com порту стоит или ты сам какой то прибор сделал по считыванию импульсов? Если оборудование то в считывании оно должно выдавать какой нибудь символ в порт его ловишь из буфера и подставляешь свои значения, с задержками ты не угадаешь с какой скоростью он крутиться.

Попробуй задержку так реализовать.

//Как событие появится в порту перейдет дальше.
Код:
if not WaitCommEvent(Form1.CPort.Handle, Mask, @Ovr) then
    begin
    if GetLastError = ERROR_IO_PENDING then
  Signale := WaitForSingleObject(Ovr.hEvent, INFINITE);
   end;

Последний раз редактировалось Aliens_wolfs; 05.07.2011 в 17:55.
Aliens_wolfs вне форума Ответить с цитированием
Старый 05.07.2011, 18:34   #4
z-wer
Пользователь
 
Регистрация: 03.03.2010
Сообщений: 89
По умолчанию

Ну в общем то да, что то типа своего прибора.
Мотор, датчик положения, концевые выключатели.

Signaled := WaitForSingleObject(Ovr.hEvent, 200);

Это для крайнего положения левого или правого.
0.2 сек для сброса напряжения с мотора при достижении пределов вращения.
А все остальное по событиям EV_CTS (счет импульсов с датчика).
Дребезга контактов точно нет, потому как из одного крайнего положения в другое переворачивается без проблем.
Выставляю счетчик в ноль, доходит к примеру до 1200, назад опять строго на ноль становится как вкопанный.
Хотя алго написан так, что если и появляются отрицательные значения и есть предел вращения - то мотор все равно будет вращать, пока не сработает концевик.
z-wer вне форума Ответить с цитированием
Старый 05.07.2011, 18:48   #5
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,426
По умолчанию

У вы при счёте оборотов учитываете 0 оборот?
В программировании отсчёт с 0.

указали 10. Считает 11. Указали 9. Считает 10.

Я ток понял что это:
Код:
Form1.Count := 0;
У вас счёстчик.

Попробуйте так:
Код:
Form1.Count := 1;

Последний раз редактировалось Человек_Борща; 05.07.2011 в 18:49. Причина: ёётчик.
Человек_Борща вне форума Ответить с цитированием
Старый 06.07.2011, 08:09   #6
z-wer
Пользователь
 
Регистрация: 03.03.2010
Сообщений: 89
По умолчанию

Нет со счетчиком все нормально.
Count - это индикация.
Pulse - это точка в которой должен остановится мотор.

Есть кнопки Лимит - вращение до предела, т.е пока не сработает концевик.
Есть кнопки Позиция - вращение на точку указанную в таблице.

Загоняю мотор в крайнюю левую точку, жму калибровку, все переменные сбрасываются в нули.
В таблице к примеру указаны 5 значений - 50, 100, 150, 200, 250.
Пять раз жмакаю по кнопке Позиция, мотор останавливается в точке 250.
Жму на Лимит (т.е. возврат в крайнюю точку), мотор вращает до сработки концевика - индикация на Count = 0.

Повторяю тоже самое но со значениями 51, 102, 153, 204, 255 (все нечет).
Жму на Лимит - индикация на Count = -5.

Почему так, вьехать не могу
Может у меня проблема с железом, Компорт на ftdi232rl ?
Я уже грешным делом подумывал, может как счетчик реагирует на нажатие кнопки, оказалось нет - если снять питание с мотора, жмакай до посинения, показания не меняются.
z-wer вне форума Ответить с цитированием
Старый 06.07.2011, 11:01   #7
raxp
Старожил
 
Регистрация: 29.09.2009
Сообщений: 9,713
По умолчанию

Цитата:
Дребезга контактов точно нет, потому как из одного крайнего положения в другое переворачивается без проблем.
c герконами, да на больших оборотах - не рассказывайте сказки, у ваш же не оптический датчик положения типа PDF (RVI-58 и т.п.) или энкодер.

И вообще, с каких это пор в качестве датчика угла поворотов ставят герконы? Уже давно эксплуатируются датчики положения и энкодеры на датчиках холла и электронно-оптические. И сигналы там выдаются A/B со смещением фазы для определения направления вращения и возможности устранения дребезга.

Цитата:
Компорт на ftdi232
ну что сказать ...а почему вы с ним работаете как виртуальным комом, есть SDK позволяющая использовать полноценный USB режим. Наиболее оптимальным, и так будет правильнее, будет реализовать подсчет импульсов не на верхнем уровне, а на уровне МК, ПЛИС и передавать уже готовый результат по USB ...а так получается вы гоните импульсы сразу напрямую через конвертор на линию связи без всякой защиты. Какова еще длина линии?
Разработки и научно-технические публикации :: Видеоблог :: Твиттер
Radar systems engineer & Software developer of industrial automation
raxp вне форума Ответить с цитированием
Старый 06.07.2011, 11:50   #8
z-wer
Пользователь
 
Регистрация: 03.03.2010
Сообщений: 89
По умолчанию

Все спасибо ребята за помощь, проблема решена через диспетчер устройств.
Время ожидания по дефолту 16 мсек.Уменшил до 2 и импульс перестал теряться в дебрях драйвера.

raxp, спасибо за теорию.
Можно конечно и на контроллере через юсби все дело прикрутить, согласен. Почему геркон - да потому что поставить датчик холла или оптику не имеет смысла в моем случае, слишком много гемороя из-за конструктивных особенностей мотора.
1150 импульсов в минуту скорость срабатывания геркона. У самого двигателя конечно обороты гораздо выше, но стоит редуктор.

И еще минимум месяц уйдет на изучение контроллеров, Си, или асемблера, вот потому такая реализация.
z-wer вне форума Ответить с цитированием
Старый 06.07.2011, 12:44   #9
raxp
Старожил
 
Регистрация: 29.09.2009
Сообщений: 9,713
По умолчанию

Цитата:
проблема решена через диспетчер устройств.
Время ожидания по дефолту 16 мсек
хотите сказать, что структуру DCB вы не заполняли? тогда ясно.
Разработки и научно-технические публикации :: Видеоблог :: Твиттер
Radar systems engineer & Software developer of industrial automation
raxp вне форума Ответить с цитированием
Старый 06.07.2011, 14:15   #10
z-wer
Пользователь
 
Регистрация: 03.03.2010
Сообщений: 89
По умолчанию

Да не заполнял. У меня задействованы только cts, dsr, rts, dtr.
Два входа, два выхода.
z-wer вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Счетчик импульсов через ком-порт z-wer Компоненты Delphi 10 21.05.2011 11:01
Счетчик импульсов на LPT. Delphi clone_ Общие вопросы Delphi 7 29.04.2011 01:29
Определенная последовательность импульсов на ком порт antinup C++ Builder 3 27.05.2010 09:29
Счетчик импульсов stanik123 Общие вопросы Delphi 11 09.10.2009 10:10
Как получить данные с COM-порта или другого любого порта? DeLure Общие вопросы C/C++ 5 20.09.2007 00:50