Управление ШД с через LPT на VB6

создание собственных программ управления станком, управление LPT

Модераторы: Ruz_and, Master-VRI, al-drw, Мастак

ВЛАД
Сообщения: 12
Зарегистрирован: Пт июн 17, 2011 22:05

Управление ШД с через LPT на VB6

Сообщение ВЛАД » Вс июн 26, 2011 17:18

Начал собирать контроллер на ТМ7 и для его настройки и тестирования ШД написал небольшую программку на VB6. Может менять любой бит порта, выводить необходимое к-во шагов, с необходимой скоростью в LPT порт. Алгоритм вывода для контроллера на ТМ7 , правда ее у меня не было собрал на ТМ8, но я думаю это не принципиально. Временные задержки на основе циклов. На моем ПК работает. Хотелось бы проверить на других. Стоит ли заниматься с этой программой дальше?
Вложения
TEST.zip
(41.27 КБ) 911 скачиваний

Аватара пользователя
Dj_smart
Сообщения: 2311
Зарегистрирован: Вс ноя 09, 2008 00:00
Откуда: Украина.Меж Днепропетровском и Донецком
Контактная информация:

Re: Управление ШД с через LPT на VB6

Сообщение Dj_smart » Вс июн 26, 2011 22:59

Вот готовое и проверенное для ТМ7.
Вложения
CNC.rar
(180.12 КБ) 1015 скачиваний
Глаза боятся а руки делают!

ВЛАД
Сообщения: 12
Зарегистрирован: Пт июн 17, 2011 22:05

Re: Управление ШД с через LPT на VB6

Сообщение ВЛАД » Пн июн 27, 2011 16:56

Дело в том , что я писал программу для конкретной схемы в смысле из тех деталей что были. Из даташита на SMA 7029 я выбрал режим работы 2-PHASE (FULL STEP) т.к. получалось на одну микросхему меньше. Другие режимы Wawe driwe и с дробными шагами требовали усложнения схемы. Ввиду хренового зрения, я решил, что легче написать программу, чем работать паяльником. В чем разница этих режимов я еще не разбирался. Сама идея сделать станок посетила неделю назад, когда решили выбросить старые матричные принтеры. Так как выбросить все это добро рука не поднималась, решил поискать куда-бы применить ШД. Первое, что попалось станки с ЧПУ. Пока изучаю форум и экспериментирую. Попутно начал клепать механику. Какой алгоритм управления Вашей программы, а то мой " контроллер понимает только полный шаг " и с Вашей программой не дружит. И в чем преимущества Каждого из режимов?

ВЛАД
Сообщения: 12
Зарегистрирован: Пт июн 17, 2011 22:05

Re: Управление ШД с через LPT на VB6

Сообщение ВЛАД » Пн июн 27, 2011 18:13

ВЛАД писал(а):Вот готовое и проверенное для ТМ7.


Каким образом у Вас выводится импульс записи в ТМ7. У меня следующий алгоритм:
1. Выставляютя информация для запмси в порт (0-3 биты)
2. задерка
3. Бит 4 устанавливается в 1
4. Бит 4 устанавливается в 0
5. Биты 1-3 обнуляются

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

Поставил инвертор на С вход ТМ8 максимальная скорость возросла до 500 Герц, теперь работает и с моей и с Вашей программой, но с Вашей двигатель хаотично меняет направление движения. Наверное потому, что контроллер работает в режиме полного шага

Аватара пользователя
Мастак
Сообщения: 168
Зарегистрирован: Сб ноя 14, 2009 00:00
Откуда: Уфа

Re: Управление ШД с через LPT на VB6

Сообщение Мастак » Вт июн 28, 2011 12:54

Посмотри чем подача твоего сигнала отличается от подачи сигналов той прогой,что тебе дал смарт.
Там в папке, с его программой, есть папка prog.В ней для каждого канала прописаны сигналы.
Вот часть.Для первого канала.
Влево(Файл Left_1.txt):
00011000
00111000
00101000
01101000
01001000
11001000
10001000
10011000
Вправо(Файл Right_1.txt):
10001000
11001000
01001000
01101000
00101000
00111000
00011000
10011000

И так же для ещё 2-х каналов.Они отличаются лишь битом, которым включают нужный канал.Первые четыре это сигналы двигателю.Вторые четыре это какой канал включен:
0000 1000 - первый канал
0000 0100 - второй и т.д.

Нужно ли делать твою прогу.Желание твоё.Тебе придётся учить ещё как устроены форматы файлов где хранятся списки команд для станков. На мой взгляд проще сделать стандартный контроллер . И воспользоваться нормальной управляющей прогой.

ВЛАД
Сообщения: 12
Зарегистрирован: Пт июн 17, 2011 22:05

Re: Управление ШД с через LPT на VB6

Сообщение ВЛАД » Вт июн 28, 2011 21:30

Контроллеры я заказал, но когда они будут? А тут начались дожди, вот я и сидел изголялся. В принципе если поставить два инвертора на входах SMA 7029, то заработает и с твоей прогой. Просто я сначала поставил просто транзисторы на выходе ТМ8, смотрю слабовато. Потом SMA 7029 (просто была) с ШИМ, при 48 вольтах дури много, но греются шаговики. И еще? Чем выгоден алгоритм управления ШД твоей программы? Ну а насчет программ управления я не заморачиваюсь, просто хотелось своими руками пощупать ШД, что это и с чем его едят. Сидел почти неделю ( пока дожди шли). Уже что-то проясняется.

Аватара пользователя
Мастак
Сообщения: 168
Зарегистрирован: Сб ноя 14, 2009 00:00
Откуда: Уфа

Re: Управление ШД с через LPT на VB6

Сообщение Мастак » Ср июн 29, 2011 12:38

Выгодно тем, что нужно делать только контроллер. Автор программы,которая работает с тм7( VRI-CNC), Master-VRI.

ВЛАД
Сообщения: 12
Зарегистрирован: Пт июн 17, 2011 22:05

Re: Управление ШД с через LPT на VB6

Сообщение ВЛАД » Ср июн 29, 2011 13:35

Ок! Спасибо. Вопросов больше нет.

Olegik
Сообщения: 9
Зарегистрирован: Пн июн 20, 2011 22:18

Re: Управление ШД с через LPT на VB6

Сообщение Olegik » Ср июн 29, 2011 22:17

считаю что толк в написании своей программы есть! во-первых приходит понимание алгоритма управления, а во-вторых.... ну интересно человеку свое создавать :)

CrowScout
Сообщения: 72
Зарегистрирован: Чт сен 24, 2009 23:00
Откуда: Belarus
Контактная информация:

Re: Управление ШД с через LPT на VB6

Сообщение CrowScout » Чт июл 07, 2011 11:19

Моя работа связана с ремонтом промышленных программируемых контроллеров. Приходится писать программы для проверки и ремонта отдельных плат. использую lpt порт совместно с самодельным расширителем портов.
Так вот - проблема решения даже нано задержек обсуждалась оч подробно тут - http://www.cyberforum.ru/cpp-beginners/ ... page2.html
Там есть готовые решения под С и дельфи.
Если долго мучиться... опять фигня получится :(

CrowScout
Сообщения: 72
Зарегистрирован: Чт сен 24, 2009 23:00
Откуда: Belarus
Контактная информация:

Re: Управление ШД с через LPT на VB6

Сообщение CrowScout » Чт июл 07, 2011 11:26

для VB я использовал QueryPerformanceCounter и QueryPerformanceFrequency
http://allapi.mentalis.org/apilist/Quer ... ter.shtml#

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

Может ктонить собрать многопоточный таймер в dll или ocx, на основе инфы из предыдущего поста, чтобы их мона было использовать в любой среде программирования??
...меня в 1 очередь интересует VB.
Последний раз редактировалось CrowScout Чт июл 07, 2011 12:22, всего редактировалось 1 раз.
Если долго мучиться... опять фигня получится :(

CrowScout
Сообщения: 72
Зарегистрирован: Чт сен 24, 2009 23:00
Откуда: Belarus
Контактная информация:

Re: Управление ШД с через LPT на VB6

Сообщение CrowScout » Чт июл 07, 2011 12:06

короче у меня получился под VB вот такой класс в один поток...

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

VERSION 1.0 CLASS
BEGIN
  MultiUse = -1  True
  Persistable = 0  NotPersistable
  DataBindingBehavior = 0  vbNone
  DataSourceBehavior  = 0  vbNone
  MTSTransactionMode  = 0  NotAnMTSObject
END
Attribute VB_Name = "myFineTimer"
Attribute VB_GlobalNameSpace = False
Attribute VB_Creatable = False
Attribute VB_PredeclaredId = False
Attribute VB_Exposed = True
Option Explicit
задерживает выполнение программы на TimeMs - в милисекундах, с запятой
тип переменной - Double
возвращает реальное время задержки

==== пример вызова ====
опишем класс
Public WithEvents fineTimer As myFineTimer

-sub hhh()
-set fineTimer = New myFineTimer
...
-еnd Sub
========================

Private Type LARGE_INTEGER
    LowPart As Long
    HighPart As Long
End Type

Private tmrEnabled As Boolean таймер используется
Private tmrInterval As Double
Public RealfineTimer As Double
описать событие Timer
Public Event endTimer()
пример запуска события
\nPublic Sub DetectAllObjects()
  ...
  RaiseEvent endTimer
-еnd Sub

Private Declare Function QueryPerformanceCounter Lib "kernel32" (lpPerformanceCount As LARGE_INTEGER) As Long
Private Declare Function QueryPerformanceFrequency Lib "kernel32" (lpFrequency As LARGE_INTEGER) As Long
Private Declare Sub CopyMemory Lib "kernel32.dll" Alias "RtlMoveMemory" (Destination As Any, Source As Any, ByVal Length As Long)


Private Function fTimer(ByVal TimeMs As Double) As Double
задерживает выполнение программы на TimeMs - в милисекундах
возвращает реальное время задержки

    Dim T As Long, liFrequency As LARGE_INTEGER, liStart As LARGE_INTEGER, liStop As LARGE_INTEGER

    Dim cuStart As Currency, cuStop As Currency
    Static cuFrequency As Currency

    etrieve tick count
    QueryPerformanceCounter liStart
    cuStart = LargeIntToCurrency(liStart)

    Retrieve the frequency of the perFormance counter
    If cuFrequency = Empty Then -если вызывается впервые, то
        проверка на ошибку
        If QueryPerformanceFrequency(liFrequency) = 0 Then fTimer = 0: Exit Function
        -узнать частоту процессора
        QueryPerformanceFrequency liFrequency
        convert the large integer to currency
        cuFrequency = LargeIntToCurrency(liFrequency)
    End If
    TimeMs = (TimeMs / 1000) * cuFrequency посчитаем на сколько тиков задержать..
    частота уже известна...
    do something
    Do
        etrieve tick count
        QueryPerformanceCounter liStop
        convert large integers to currency-s
        cuStop = LargeIntToCurrency(liStop)
        WaitMessage
        DoEvents
    Loop Until cuStop > (cuStart + TimeMs)   \n
    calculate how many seconds passed, and show the result
    fTimer = CStr(((cuStop - cuStart) / cuFrequency) * 1000) в милисекундах
End Function

Private Function LargeIntToCurrency(liInput As LARGE_INTEGER) As Currency
    copy 8 bytes from the large integer to an ampty currency
    CopyMemory LargeIntToCurrency, liInput, LenB(liInput)
    -аdjust it
    LargeIntToCurrency = LargeIntToCurrency * 10000
End Function

==== свойство Enabled ======
Public Static Property Get Enabled() As Variant
    Enabled = tmrEnabled
End Property

Public Static Property Let Enabled(ByVal vNewValue As Variant)
    tmrEnabled = vNewValue
    Do While tmrEnabled
        RealfineTimer = fTimer(tmrInterval)
        RaiseEvent endTimer вызывается СОБЫТИЕ < endTimer >
    Loop
End Property

======== свойство Interval =======
Public Static Property Get Interval() As Double
    Interval = tmrInterval
End Property

Public Static Property Let Interval(ByVal vNewValue As Double)
    tmrInterval = vNewValue
End Property



но я его практически не использую... тормозит систему
вот если б в 2 потока.... мог бы жить пожалуй..
вообще этот алгоритм в VB сам по мебе выполняется медленнее, чем в дельфи или С по определению, так как он не оперирует с 64битными переменными и приходится её раскладывать на 2 части. Это насколько я понял - ведь я любитель и слегка програмлю тока в VB. Как вы пониаете я не сам придумал этот код, а тока подправил под себя.
Если долго мучиться... опять фигня получится :(

CrowScout
Сообщения: 72
Зарегистрирован: Чт сен 24, 2009 23:00
Откуда: Belarus
Контактная информация:

Re: Управление ШД с через LPT на VB6

Сообщение CrowScout » Пт июл 08, 2011 10:15

вот тут http://www.mycomp.com.ua/text/6406;jses ... A5B35CA59D
всё подробно разжёвано про таймеры под VB.
Вот тут - http://habrahabr.ru/blogs/delphi/75234/
подробно разобран алгоритм короткого таймера

Нужно всего-то создать отдельный компонент из Дельфи или С в dll или OCX, используя многопоточность !!! и выложить его где-нибудь с примерами кода - как его использовать.
Уже столько лет тянется эта мука с таймерами - все знают как нужно их писать, а DLL ( что-то вроде IETIMER.OCX)так никто и не сделал.

Господа труПрограмисты!!! пжалсто !!! сделайте это!!! мы все будем вам благодарны.
Если долго мучиться... опять фигня получится :(

Аватара пользователя
Dj_smart
Сообщения: 2311
Зарегистрирован: Вс ноя 09, 2008 00:00
Откуда: Украина.Меж Днепропетровском и Донецком
Контактная информация:

Re: Управление ШД с через LPT на VB6

Сообщение Dj_smart » Пт июл 08, 2011 23:52

Не примите за наезд. Вы с МАЧем работали? Если нет, то идём на рутреккер.орг, и... Переплюнуть не сможете, гарантирую. Что по стабильности, что по наворотам. Это если ехать. Ну а если шашечки, то другое дело.
Глаза боятся а руки делают!

CrowScout
Сообщения: 72
Зарегистрирован: Чт сен 24, 2009 23:00
Откуда: Belarus
Контактная информация:

Re: Управление ШД с через LPT на VB6

Сообщение CrowScout » Сб июл 09, 2011 10:48

я не собираюсь изобретать велосипед - мне нужны таймеры не оч точные, +/- 20% вполне подойдёт, но с промежутками короче 1 миллисекунды для тестирования электронных плат и тп
Если долго мучиться... опять фигня получится :(


Вернуться в «програмирование»

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

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