A co do makra to na razie wrzuce 'swoje', a co się sam będę męczył .
Zapraszam wszytskich zainteresowanych do współpracy, w końcu od tego jest forum.
Najpierw słowo wstępne:
1. Makro dotyczy elektromechanicznych głowic starszego typu (później można zaadopotować do innych), natomiast tu proponuje się trzymać konkretnego modelu - bo łatwo o dokumnetacje z sieci: czyli Duplomatic BSV-N
http://www.duplomaticauto...ne_tool_turrets
strony 15 - 17.
2. Zmiast jednego makra M06 - do zmiany narzędzia - na razie proponuje osobne makro do każdej pozycji plus numer korektora. Dla 12 pozycyjnej głowicy makra np. od M101 do M112 (bo nie do końca wiem jak Mach to widzi - normalnie jest Tyyxx - gdzie yy to np. numer na głowicy a yy- numer korektora).
Czyli M102T07 - pozycja na głowicy 02 i narzędzie nr 07.
3. Dodatkowo proponuje makro np. nr M113 - służące usatwieniu się głowicy na pierwszej właściwej pozycji, po awaryjnym zatrzymaniu czy kolizji. Później można by to dokleić do właściwego makra jako np. podprogram ale na razie dla przejrzystości, proponuje to zrobić osobno.
A tu moja wersja makra z forum macha. Otwierać można WordPadem a najlepiej edytorem Macha VB. No i proszę pamiętać że to wersja testowa - nie do użytku w maszynie!
Kod: Zaznacz cały
'autor: Monty z forum Macha. Spolszczenie i drobne poprawki - tschaya.
'Makro dla pozycji nr 1
'Zmienne
Option Explicit
Dim NumerA '- aktualna pozycja rewolwera
Dim NumerB '- zadana pozycja rewolwera: dla makra 101 = 1
Dim LiczbaPozycji '- liczba pozycji do obrotu
Dim CzujnikRygla '- czujnik zbliżeniowy pozycji blokady
Dim CzujnikIndexu '- czujnik zbliżeniowy elektromagnesu
Dim Rotacja'- kierunek obrotów (CW , CCW)
Dim I
Dim Bit1, Bit2, Bit3, Bit4, Parity, Strobe
'Wejścia:
'OEMTRIG1 = Encoder Bit 1 'sygnały od 29
'OEMTRIG2 = Encoder Bit 2 'sygnał 30
'OEMTRIG3 = Encoder Bit 3 'sygnał 31
'OEMTRIG4 = Encoder Bit 4 'sygnał 32
'OEMTRIG5 = Parity Bit 'sygnał 33
'OEMTRIG6 = Strobe 'sygnał 34
'OEMTRIG7 = Czujnik zbliżeniowy Indexu'sygnał 35
'OEMTRIG8 = Czujnik zbliżeniowy Rygla''sygnał 36
'Wyjścia:
'OUTPUT10 = Elektromagnes ' sygnał 19
'OUTPUT11 = Silnik prawo (przekażnik) 'sygnał 20
'OUTPUT12 = Silnik lewo (przekażnik) 'sygnał 21
'OUTPUT13 = Hamulec (opcja dla Duplomatica) 'sygnał 22
'Odczyt bitów Encodera
If IsActive(29) Then
Bit1 = 1
Else
Bit1 = 0
End If
If IsActive(30) Then
Bit2 = 1
Else
Bit2 = 0
End If
If IsActive(31) Then
Bit3 = 1
Else
Bit3 = 0
End If
If IsActive(32) Then
Bit4 = 1
Else
Bit4 = 0
End If
If IsActive(33) Then
Parity = 1
Else
Parity = 0
End If
If IsActive(34) Then
Strobe = 1
Else
Strobe = 0
End If
'Odczytanie aktualnej pozycji enkodera
If Bit1=1 And Bit2=0 And Bit3=0 And Bit4=0 And Parity=1 And Strobe=1 Then
NumerA = 1
ElseIf Bit1=0 And Bit2=1 And Bit3=0 And Bit4=0 And Parity=1 And Strobe=1 Then
NumerA = 2
ElseIf Bit1=1 And Bit2=1 And Bit3=0 And Bit4=0 And Parity=0 And Strobe=1 Then
NumerA = 3
ElseIf Bit1=0 And Bit2=0 And Bit3=1 And Bit4=0 And Parity=1 And Strobe=1 Then
NumerA = 4
ElseIf Bit1=1 And Bit2=0 And Bit3=1 And Bit4=0 And Parity=0 And Strobe=1 Then
NumerA = 5
ElseIf Bit1=0 And Bit2=1 And Bit3=1 And Bit4=0 And Parity=0 And Strobe=1 Then
NumerA = 6
ElseIf Bit1=1 And Bit2=1 And Bit3=1 And Bit4=0 And Parity=1 And Strobe=1 Then
NumerA = 7
ElseIf Bit1=0 And Bit2=0 And Bit3=0 And Bit4=1 And Parity=1 And Strobe=1 Then
NumerA = 8
ElseIf Bit1=1 And Bit2=0 And Bit3=0 And Bit4=1 And Parity=0 And Strobe=1 Then
NumerA = 9
ElseIf Bit1=0 And Bit2=1 And Bit3=0 And Bit4=1 And Parity=0 And Strobe=1 Then
NumerA = 10
ElseIf Bit1=1 And Bit2=1 And Bit3=0 And Bit4=1 And Parity=1 And Strobe=1 Then
NumerA = 11
ElseIf Bit1=0 And Bit2=0 And Bit3=1 And Bit4=1 And Parity=0 And Strobe=1 Then
NumerA = 12
Else
MsgBox("Głowica rewolwerowa nie w pozycji! Wywołaj Makro 113")
End
End If
NumerB = 1' zamiast GetSelected - będzie to zdefiniowane numerem makra - 'osobny dla każdej pozycji rewolwera (np. 101 dla 1, 105 dla 5, 112 dla 12)
'zerowanie zmiennych
LiczbaPozycji = 0
CzujnikRygla = 0
Strobe = 0
CzujnikIndexu = 0
Rotacja= 0
'weryfikacja zadanego numeru
If NumerB < 1 Or NumerB >12 Then
MsgBox("Błędny numer narzędzia")
End
End If
If NumerB = NumerA Then
End
End If
'Logika kierunku :) - wybór kierunku obrotu i o ile pozycji
If NumerB > NumerA Then
LiczbaPozycji = (NumerB-NumerA)
Else
LiczbaPozycji = (NumerA-NumerB)
End If
If LiczbaPozycji > 6 Then
LiczbaPozycji = 12 - LiczbaPozycji
End If
If NumerB = (NumerA+LiczbaPozycji) Then
Rotacja= 1
ElseIf NumerB = (NumerA-LiczbaPozycji) Then
Rotacja= -1
ElseIf (NumerA+LiczbaPozycji) > 12 Then
Rotacja= 1
ElseIf (NumerA-LiczbaPozycji) < 1 Then
Rotacja= -1
Else
Rotacja= 1
End If
DeActivateSignal(22) 'wyłączenie hamulca (dla Duplomatica)
While IsMoving ()
Wend
If Rotacja= 1 Then
ActivateSignal(21) 'silnik CCW
Else
ActivateSignal(20) 'silnik CW
End If
'Sprawdzenie czy Czujnik Rygla = 0 jeśli nie po R2 (max.60 ms dla mojej głowicy) - komunikat błędu i silnik stop?
For I = 1 To LiczbaPozycji 'Liczy pozycje
While Strobe = 0 'czeka aż sygnał Strobe bedzie 1
If IsActive(34) Then
Strobe = 1
Else
Strobe = 0
End If
Wend
While IsActive(34) 'Sprawdza czy Strobe przeszedł w stan 0
Wend '
'
Strobe = 0
Next I
ActivateSignal(19) 'Aktywacja elektromagnesu pinu indeksu
While CzujnikIndexu = 0 'Srawdzenie czujnkia indeksu
If IsActive(35) Then
CzujnikIndexu = 1
Else
CzujnikIndexu = 0
End If
Wend
'If IsActive(20) Then 'silnik stop - coś mi ten wraunek nie chce 'działać w testach - pomieszałem zmienne z syganłami? dlatego wyłączam oba sygnały.
DeactivateSignal (20)
'Else
DeactivateSignal (21)
'End If
While IsMoving ()
Wend
Sleep(50) 'T1 - czas z dokumentacji Duplomatica, strona 16
If Rotacja= 1 Then 'Owrócenie kierunku obrotów silnika w celu zaryglowania/zamknięcia na pozycji roboczej
ActivateSignal(20) ' CW
Else
ActivateSignal(21) ' CCW
End If
While CzujnikRygla = 0 ' sprawdzenie czujnika zamka
If IsActive(36) Then
CzujnikRygla = 1
Else
CzujnikRygla = 0
End If
Wend
'If IsActive(20) Then 'silnik stop
DeactivateSignal (20)
'Else
DeactivateSignal (21)
'End If
While IsMoving ()
Wend
'
ActivateSignal(22) 'włączenie hamulca (dla Duplomatica)
While IsMoving ()
Wend
sleep(200) 'T2
DeActivateSignal(19) 'Wyłączenie elktromagnesu indeksu
While IsMoving ()
Wend
'Zadana pozycja osiągnięta
SetCurrentTool( NumerB) ' może dodać numer (offset) korektora?
'weryfikacja pozycji
'Odczyt bitów Encodera
If IsActive(29) Then
Bit1 = 1
Else
Bit1 = 0
End If
If IsActive(30) Then
Bit2 = 1
Else
Bit2 = 0
End If
If IsActive(31) Then
Bit3 = 1
Else
Bit3 = 0
End If
If IsActive(32) Then
Bit4 = 1
Else
Bit4 = 0
End If
If IsActive(33) Then
Parity = 1
Else
Parity = 0
End If
If IsActive(34) Then
Strobe = 1
Else
Strobe = 0
End If
If Bit1=1 And Bit2=0 And Bit3=0 And Bit4=0 And Parity=1 And Strobe=1 Then
NumerA = 1
Else
MsgBox("Głowica rewolwerowa w niewłaściwej pozycji")
End
End If
'Weryfikacja stanu czujników itd.
If IsActive(35) Then ' sprawdza Czujnik Indexu
MsgBox("Głowica rewolwerowa: rygiel indeksu nie w pozycji")
End
End If
If IsActive(36) Then 'sprawdzenie Czujnika Rygla/zamkniecia
CzujnikRygla = 1
Else
MsgBox("Głowica rewolwerowa: nie zablokowana!")
End
End If
If NumerA <> NumerB Then 'sprawdzenie numeru aktualnego z zadanym
MsgBox("Głowica rewolwerowa w niewłaściwej pozycji!!")
End
End If
End
' koniec głownego programu
' jakiś sygnał gotowości dla powrotu do dalszej części programu?