I have a problem writing the correct macro for head rotation.
The macro is implemented by:
1. sending a signal to the relay which causes the magazine to be unlocked
2. Moving the magazine in axis A, e.g. A45 - Tool 2
3. cutting off the signal from the magazine which causes the magazine to be blocked.
I switched from mach3 to uccnc - the macro worked without a problem there.
Below I have written a new macro for uccnc - m6
Please help me analyze and tell me where I made a mistake in the code:
- Code: Select all
// ================================================================================================
// M6 Automatic tool changer with A axis and Port 2, Pin 2 control for UCCNC
// ================================================================================================
if (!ChangeTool())
exec.Callbutton(130); // Zakończenie, jeśli zmiana narzędzia się nie powiedzie
// ================================================================================================
#Events
// ================================================================================================ Dialogs
// Dialogs
// ================================================================================================
static string _macro_title = "Tool change";
static string _error_msg = _macro_title + " error";
// ================================================================================================ ChangeTool
private bool ChangeTool()
{
double ToolX = -1; // Pozycja X do zmiany narzędzia (maszyna)
double ToolZ = -15; // Pozycja Z do zmiany narzędzia (maszyna)
int NewTool = exec.Getnewtool();
int CurrentTool = exec.Getcurrenttool();
// Sprawdzanie, czy wybrano to samo narzędzie
if (NewTool == CurrentTool)
return true; // Nie zmieniaj, jeśli wybrane to samo narzędzie
if (!exec.IsHomed()) // Jeśli maszyna nie została zhomowana
{
ShowError("The machine was not yet homed,\ndo homing before executing a tool change!");
return false;
}
// Czekaj na zakończenie ruchu
while (exec.IsMoving()) ;
// Pobranie bieżących współrzędnych X i Z, aby móc wrócić do tych pozycji po wymianie narzędzia
double Xoriginalpos = exec.GetXmachpos();
double Zoriginalpos = exec.GetZmachpos();
// Zatrzymanie wrzeciona
exec.Stopspindle();
while (exec.IsMoving()) ;
if (exec.Ismacrostopped())
{
ShowError("Tool change aborted");
return false;
}
// Najazd na pozycję wymiany narzędzia na płaszczyźnie XZ
exec.Code("G00 G53 X" + cs(ToolX) + " Z" + cs(ToolZ));
while (exec.IsMoving()) ;
if (exec.Ismacrostopped())
{
ShowError("Tool change aborted");
return false;
}
// Aktywacja portu 1, pinu 2 - wyjście sterujące
exec.Setoutpin(1, 2, true); // Ustaw port 2, pin 2 na stan wysoki (aktywacja)
// Przesunięcie rewolwera na odpowiednią pozycję dla nowego narzędzia
MoveToToolPosition(NewTool);
// Automatyczne ustawienie nowego narzędzia
exec.Setcurrenttool(NewTool);
exec.Code("G43 H" + NewTool.ToString()); // Załadowanie przesunięć narzędzia
while (exec.IsMoving()) ;
if (exec.Ismacrostopped())
{
ShowError("Tool change aborted");
return false;
}
// Dezaktywacja portu 2, pinu 2 po zakończeniu zmiany narzędzia
exec.Setoutpin(1, 2, false); // Ustaw port 2, pin 2 na stan niski (dezaktywacja)
// Powrót do pierwotnej pozycji
exec.Code("G00 X" + cs(Xoriginalpos) + " Z" + cs(Zoriginalpos));
while (exec.IsMoving()) ;
if (exec.Ismacrostopped())
{
ShowError("Tool change aborted");
return false;
}
// Automatyczne wznowienie cyklu po zakończeniu zmiany narzędzia
exec.CycleStart();
return true;
}
// ================================================================================================
// Funkcja do obsługi rewolwera narzędziowego (oś A)
private void MoveToToolPosition(int toolNumber)
{
// Przesuń do odpowiedniej pozycji na osi A w zależności od numeru narzędzia
switch (toolNumber)
{
case 1:
exec.Code("G00 A0.0"); // Narzędzie 1 na pozycji 0 stopni
break;
case 2:
exec.Code("G00 A45.0"); // Narzędzie 2 na pozycji 45 stopni
break;
case 3:
exec.Code("G00 A90.0"); // Narzędzie 3 na pozycji 90 stopni
break;
case 4:
exec.Code("G00 A135.0"); // Narzędzie 4 na pozycji 135 stopni
break;
case 5:
exec.Code("G00 A180.0"); // Narzędzie 5 na pozycji 180 stopni
break;
case 6:
exec.Code("G00 A225.0"); // Narzędzie 6 na pozycji 225 stopni
break;
case 7:
exec.Code("G00 A270.0"); // Narzędzie 7 na pozycji 270 stopni
break;
case 8:
exec.Code("G00 A315.0"); // Narzędzie 8 na pozycji 315 stopni
break;
default:
ShowError("Invalid tool number: " + toolNumber);
break;
}
// Czekaj na zakończenie ruchu osi A
while (exec.IsMoving()) ;
}
// ================================================================================================
// Konwersja wartości liczbowych na string z 6 cyframi po przecinku
private string cs(double d)
{
return d.ToString("F6");
}
// ================================================================================================
// Wyświetlanie komunikatów błędów
void ShowError(string str)
{
ShowDialog(str, _error_msg, MessageBoxButtons.OK, "*#");
}
// ================================================================================================
// Funkcja do wyświetlania okien dialogowych
DialogResult ShowDialog(string msg, string caption = "", MessageBoxButtons buttons = MessageBoxButtons.OK, string style = "")
{
// Wyświetl komunikat na ekranie głównym UCCNC
exec.Displaymessage(msg);
// Obsługa opcji dialogowych
return MessageBox.Show(exec.mainform, msg, caption, buttons);
// Automatyczne wznowienie cyklu po zmianie narzędzia
exec.CycleStart();
}
below is a macro from the mach3 program:
- Code: Select all
Sub Main() 'Definir variables
OldTool = GetOEMDRO (1200)
x = GetToolChangeStart( 0 )
y = GetToolChangeStart( 1 )
z = GetToolChangeStart( 2 )
a = GetToolChangeStart( 3 )
b = GetToolChangeStart( 4 )
c = GetToolChangeStart( 5 )
tool = GetSelectedTool()
'Konfiguracja
iToolNum = 8 'maksymalna ilosc narzedzi
RefTool = 1 'numer narzedzia po wyzerowaniu osi
iCwFeed = 5000 'posuw zmiany
iCcwFeed = 1000 'posuw cofania
'Najazd na punkt wymiany narzedzia
Code "G90 G00 G53 X-10"
Code "G90 G00 G53 Z-45"
While IsMoving()
Message "WYMIANA NARZĘDZIA"
sleep(10)
Wend
sleep(20)
Message ""
NewTool = tool
MaxToolNum = 13
If NewTool = OldTool Then
Exit Sub
End If
While NewTool = MaxToolNum
NewTool = Question ("Place valid tool number (1 to 13)")
Wend
'Call MovePos(OldTool)
'While IsMoving()
'Wend
ActivateSignal(Output4)
Code "G4 P 500."
Call MovePos(NewTool)
While IsMoving()
Wend
DeActivateSignal(Output0)
Code "G4 P40."
While IsMoving()
Wend
Call SetUserDRO (1200,NewTool)
SetCurrentTool( NewTool )
If isactive(input4) Then
I = 1
Else
I=0
End If
ActivateSignal(OUTPUT4)
sleep 700
deActivateSignal(output4)
sleep 0
If isactive(Output4) Then
J = 1
Else
J=0
End If
If IsActive(Input3) Then
While IsMoving()
Wend
Else
' Wejście 3 nieaktywne - przejście w stan błędu
Code "M30" ' Przykładowa komenda kończąca program w stanie błędu
End If
End Sub
Sub MovePos(ByVal ToolNumber As Integer)
Select Case ToolNumber
Case Is = 1
Code "G00 A0.0"
Case Is = 2
Code "G00 A45.0"
Case Is = 3
Code "G00 A90.0"
Case Is = 4
Code "G00 A135.0"
Case Is = 5
Code "G00 A180.0"
Case Is = 6
Code "G00 A225.0"
Case Is = 7
Code "G00 A270 .0"
Case Is = 8
Code "G00 A315 .0"
End Select
End Sub