Het "Bouwen" van Macro's voor USBCNC

Nederlandse CNC controller op basis van de usb poort of Ethernet.

Moderator: Moderators

Plaats reactie
Gebruikersavatar
serum
Berichten: 5396
Lid geworden op: 08 mar 2008 20:37
Locatie: Zwolle

Re: Het "Bouwen" van Macro's voor USBCNC

Bericht door serum »

Arie, het jaar is nog jong, maar ik nomineer je hierbij voor de de mooiste post op het forum van het jaar.
Gebruikersavatar
Arie Kabaalstra
Donateur
Berichten: 13370
Lid geworden op: 07 feb 2007 18:37
Locatie: Bakhuuz'n
Contacteer:

Re: Het "Bouwen" van Macro's voor USBCNC

Bericht door Arie Kabaalstra »

Niet zo snel... 't mooie komt pas als duidelijk is dat de vraagsteller daadwerkelijk wat kan met dat hele verhaal...
Ferry
Berichten: 222
Lid geworden op: 28 jul 2007 09:32
Locatie: Rilland
Contacteer:

Re: Het "Bouwen" van Macro's voor USBCNC

Bericht door Ferry »

Hoi Jan,

Super duidelijke uitleg! hier kan ik wat mee!
Ik ga alles eens netjes uitsplitsen en onderbrengen in losse sub's

Ook dat trucje om de G91 te omzeilen heel erg handig, en niet meer het gevaar dat je een keer vergeet de G90 weer actief te maken!

Ik wil uiteindelijk toewerken naar iets waar ik verschillende dialogen aan kan roepen voor het frezen van relatief simpele vormen, zoals gaten sleuven of pockets zonder daar een stukje cam voor in te hoeven schakelen.


Ha en wat dat heel oud zijn betreft, tis maar hoe je het bekijkt, ben op mn 14e begonnen met basic op de ZX-spectrum en gaanderweg zelf beetje bij beetje verder geklooid

nogmaals hartelijk dank voor de duw in de goeie richting!

Nagekomen bericht :

Toch nog een dingetje wat me niet 100% duidelijk is in je voorbeeld

Code: Selecteer alles

SUB User_1
	gosub dialog1
	gosub dialogcheck
	gosub toolcheck
	gosub Gathelix
	gosub rectract
ENDSUB
Hoe zorg je er dan voor dat je als uit de toolcheck blijkt dat de tool niet geschikt is je weer opnieuw terecht komt op het punt waar de dialog1 wordt gestart?

In bovenstaand geval zou een simpelweg opnieuw aanroepen van de user1 voldoende zijn lijkt mij, maar wat als er na de gosub dialog1 ook nog een gosub dialog2 zou zijn, en er in de check op de gegevens uit dialog2 een fout zou optreden, dan wil je eigenlijk niet helemaal van voren beginnen.


Groetjes Ferry.....
Gebruikersavatar
Arie Kabaalstra
Donateur
Berichten: 13370
Lid geworden op: 07 feb 2007 18:37
Locatie: Bakhuuz'n
Contacteer:

Re: Het "Bouwen" van Macro's voor USBCNC

Bericht door Arie Kabaalstra »

Ferry,

Ik denk dat we dan ongeveer van dezelfde leeftijd zijn, Ik ben ook op mijn 14de begonnen met programmeren, maar dan op een Commodore C16.
Commodore Basic V3.5 dus..

Helaas.. heeft Edsger W. Dijkstra het volgende opgemerkt over programmeurs die in Basic hebben geschreven:
It is practically impossible to teach good programming to students that have had a prior exposure to BASIC: as potential programmers they are mentally mutilated beyond hope of regeneration.
Laat ik het zo stellen.. ik heb niet te veel blootstelling gehad.. omdat ik op de MTS les kreeg in het programmeren in Turbo Pascal, Daarna ga je toch anders schrijven, omdat Pascal meer een procedurele taal is.. je "moet" structuur aanbrengen.. in Basic, zeker met Goto's kun je "aankloten" en krijg je het vaak wel werkend.. maar..

Ik quote Edsger Dijkstra weer:
Program testing can be used to show the presence of bugs, but never to show their absence!
Hoe "compacter" je code, hoe minder de kans op grote Bugs..

Ik pretendeer niet een IT-er te zijn, maar door de jaren heen, met lezen van artikelen en boeken over programmeren (ja.. ook in Basic), heb ik het nodige opgestoken.. tevens heb ik in mijn werk genoeg gelegenheid gehad om de nodige dingen "uit te vlooien" op het gebied van (met name) CNC programmeren van Parametrische programma's..
Daar moet ik wel aan toevoegen dat Visual Basic, hoewel een variant van Basic, toch heel anders in elkaar steekt dan ZX of Commodore Basic. zeker de latere VB.NET (vanaf versie 7.0) heeft weinig meer van doen.

Wat begon als wat macrootjes groeide uiteindelijk uit tot iets wat je "software" mag gaan noemen.. omdat mijn "Macro.cnc" volstaat met subroutines die ik te pas en te onpas aan kan roepen voor aller hande trucs..

Persoonlijk zeg ik "kies een paradigma wat je prettig vind, en hou je daar aan"

Door de opbouw van mijn Macro's kun je stellen dat ik object georienteerd programmeer. ik beschouw elke bewerking als een object, en ik ken de eigenschappen van dat object toe in de dialoog.
de dialoog is op zijn beurt ook weer een object, omdat ik en vanuit de Userfunctie aan kan roepen, maar ook vanuit de Macro zelf..
Dit is mogelijk doordat ik de Dialoog in een aparte Sub heb staan, zodat je de diverse dialogen ook kan overerven in andere functies/objecten.

Wat ik hiermee wil zeggen is: beschouw het schrijven van macro's als het bouwen van software.. lees je in.. gebruik dezelfde methodieken als de professionals.

het grote verschil tussen VB.NET en EdingCNC G-Code voor de macro is dat je in VB eerst eigenlijk je grafische weergave bouwt, en dan de Code erachter hangt, in EdingCNC ga je eerst je structuur bouwen, en dan eventueel je grafische user interface, in de vorm van dialogen en messages.
Daarmee zijn je dialogen in wezen objecten, omdat je de eigenschappen definieert als je ze gaat gebruiken.

Je kunt er alle kanten mee op.. in wezen heb ik met mijn macro's die dialogen geven voor het programmeren van mijn bewerkingen een "IDE" oftewel een Integrated Development environment, terwijl het wegschrijven van de parameters naar de Teach-in file werkt als een Compiler, waar de uitvoer door de Interpreter wordt uitgevoerd in de macro
Kjelt
Donateur
Berichten: 6259
Lid geworden op: 14 jun 2007 21:51
Locatie: Eindhoven

Re: Het "Bouwen" van Macro's voor USBCNC

Bericht door Kjelt »

Arie Kabaalstra schreef: 09 apr 2019 02:17 dan moet je wel heel oud zijn.. of slecht voorgelicht.. Want!..
Edsger Wiebe Dijkstra, de "vader van de moderne informatica schreef het volgende:
A case against the GOTO Statement

Ik wil niet pretenderen dat ik volledig snap waar het over gaat.. maar de basis is me duidelijk.
Zoals ik het zelf altijd uitleg: met een Gosub kom je ALTIJD terug, met een GOTO weet je nooit waar ie blijft
'k heb me vroeger ook uitgebreid bezondigd aan het gebruik van GOTO, tot ik Gosub ontdekte.. sindsdien geen GOTO meer gebruikt.
Simpel gezegd wil je er voor zorgen dat je code leesbaar blijft en van boven naar beneden stroomt.
Juist dat laatste is wat je met een goto statement om zeep kunt helpen en je code zogenaamde "spaghetti" code wordt.
Je springt dan van de hak naar de tak niet alleen van boven naar beneden maar ook van beneden naar boven en dat is nou eenmaal voor een mens onleesbaar.

De enigste uitzondering die je vandaag de dag nog ziet in C code is voor error afhandeling, als je bv in een functie op heel veel plaatsen er uit wilt wordt het nog gebruikt maar eigenlijk inderdaad beetje vies en gewoon niet doen ;-)
Gebruikersavatar
audiomanics
Donateur
Berichten: 5273
Lid geworden op: 28 feb 2007 09:31
Locatie: Appelscha
Contacteer:

Re: Het "Bouwen" van Macro's voor USBCNC

Bericht door audiomanics »

Voordeel van een GoTo is dat je geen stack opbouwt.. Bij geneste gosubs kan dat wel eens tot een crash leiden..(StackOverflow). En ook is, inderdaad, een error-afhandeling met een GoTo wel makkelijk om uit een sub te springen.. Al blijft de stack dan nog wel vol staan.
Verder is een GoTo eigenlijk "not done" hoewel je in puur assembly of machinetaal (jawel, het programmeren met uitsluitend enen en nullen) toch heel vaak gewoon naar een adres springt.. Maar wie programmeert er tegenwoordig nog in assembly.. Codes die ik destijds, overdreven gedocumenteerd, geschreven had zijn nu voor mij praktisch onleesbaar geworden (die processoren zijn ook niet echt meer in gebruik, zoals de Z80 en 68030... wel razendsnelle "inlines" geschreven voor oa Turbo-Pascal))
Kees
<klik>... euh..test... 123.... einde test... uit.<klik>
Gebruikersavatar
Arie Kabaalstra
Donateur
Berichten: 13370
Lid geworden op: 07 feb 2007 18:37
Locatie: Bakhuuz'n
Contacteer:

Re: Het "Bouwen" van Macro's voor USBCNC

Bericht door Arie Kabaalstra »

Simpel gezegd wil je er voor zorgen dat je code leesbaar blijft en van boven naar beneden stroomt.
Juist dat laatste is wat je met een goto statement om zeep kunt helpen en je code zogenaamde "spaghetti" code wordt.
Je springt dan van de hak naar de tak niet alleen van boven naar beneden maar ook van beneden naar boven en dat is nou eenmaal voor een mens onleesbaar.

De enigste uitzondering die je vandaag de dag nog ziet in C code is voor error afhandeling, als je bv in een functie op heel veel plaatsen er uit wilt wordt het nog gebruikt maar eigenlijk inderdaad beetje vies en gewoon niet doen ;-)
Ja.. daar komt het wel op neer.. ik streef er zelf naar om mijn code zo leesbaar mogelijk te houden.. in mijn macro ga ik met geneste subroutines tot een stack van 7.. da's nog niet in de buurt van de limiet, maar omdat mijn "Stack" in de code al zichtbaar is, hou ik het overzicht.. en da's wel zo lekker..

Ik heb ooit bij een bedrijf gewerkt waar men ook wat macro's had op de Fanuc gestuurde machines, en de schrijver daarvan was daar nogal trots op.. (aap met 7 ... ), de eerste blik in één van die macro's toonde een grote hoeveelheid GOTO's.. ik dacht dat ik ter plekke misselijk werd.. :lol: :oops:

de meeste programma's bestaan uit de delen die ik al eerder aanhaalde, invoer, controle, uitvoer en terugloop naar startpunt.
Door die delen in afzonderlijke subs te gooien, weet je precies wat elk deel doet, en in welke volgorde

Als je bijvoorbeeld een programma gaat maken dat een rondkamer uitfreest tot D > 2Dfrees, en je dus in meerdere gangen naar buiten gaat.. dan wordt de structuur niet wezenlijk anders

1- Gegevens "ophalen"
2- Dialoog OK/Cancel Check
3- Toolcontrole (past of niet)
4- Uitvoer
5- Terugkeer naar startpunt

Die hadden we al, voor in 1 keer helix naar beneden..

1- Gegevens "ophalen"
2- Dialoog OK/Cancel Check
3- Toolcontrole (past of niet)
4- Uitvoer
-controle : zolang radius < eindradius
-uitvoeren op huidige radius
-radius updaten
-eind controle
5- Terugkeer naar startpunt

dan komt er dus in de uitvoer niet alleen een subje dat naar beneden freest( Sub Helixfrezen), maar ook een die de radius vergroot tot de eindradius bereikt is.
Stel, je gaat met Frees 4 een gat van ø12 maken, dan begin je op, laten we zeggen met een 50% stepover, op R2 en krijg je een gat van 8, 10 en uiteindelijk 12.. zolang de radius parameter kleiner is dan Rgat-Rtool blijf je die Sub Helixfrezen aanroepen.

Dit is wel een meer gecompliceerde algoritme, want je moet na elke keer tot diepte frezen de parameters voor dat deel weer op 0 stellen.. Maar het is te doen.. als je bedenkt dat mijn rondkamercyclus uit niet 2, maar 3 lagen bestaat.. ik ga eerst in een Helix naar beneden tot de eerste snedediepte, dan ga ik tot de buitenmaat, en dat blijf ik herhalen tot ik op diepte ben..

n bovenstaand geval zou een simpelweg opnieuw aanroepen van de user1 voldoende zijn lijkt mij, maar wat als er na de gosub dialog1 ook nog een gosub dialog2 zou zijn, en er in de check op de gegevens uit dialog2 een fout zou optreden, dan wil je eigenlijk niet helemaal van voren beginnen.
Als je 2 dialogen nodig hebt voor een bewerking.. dan heb je 24 parameters.. als je 24 parameters moet instellen voor één bewerking.. dan heb je ergens iets niet goed gedaan..

Als je op een professionele machine (iets met een Heidenhain sturing ofzo) een verkeerde waarde in een cyclus invult.. dan doet ie gewoon niets met die cyclus, en is het aan jou om te zien waarom niet..

Als je vantevoren de fouten wilt afvangen.. dan ben je eigenlijk al heel erg liev voor de gene die de waarden moet inkloppen..

Wat je ook kan doen.. Stel!.. we pakken dat Helix progje er even bij.. voor je de dialoog opent, zet je de diameter parameter op [2*#5009].. dan staat de minimale gatmaat al ingevuld.. moet je kleiner.. dan moet je er een ander tool inzetten.. Cancel drukken en opnieuw beginnen.. , je kunt ook middels een MSG de minimale en maximale maten opgeven. dan heb je een hulplijntje in je scherm.. :)
Gebruikersavatar
hugo stoutjesdijk
Donateur
Berichten: 11995
Lid geworden op: 02 mar 2011 17:04
Locatie: elst (u)
Contacteer:

Re: Het "Bouwen" van Macro's voor USBCNC

Bericht door hugo stoutjesdijk »

Arie Kabaalstra schreef: 09 apr 2019 14:33 It is practically impossible to teach good programming to students that have had a prior exposure to BASIC: as potential programmers they are mentally mutilated beyond hope of regeneration.
Ach, als je genoodzaakt bent in Basic te schrijven, en de code is lang genoeg ga je vanzelf de noodzaak van netjes werken wel inzien, en in Basic mag je gewoon gosubs gebruiken hoor. :mrgreen:
En later dank je god op je blote knietjes dat er Turbo Pascal gekomen is. Ik geloof m'n eerste versie voor $99.- een wereldschokkende lage prijs, en het was nog sneller en bedieningsvriendelijker dan de duizenden guldens kostende compilers die er tegenover stonden.
Ik denk dus dat het mij juist geholpen heeft van het inzien van de noodzaak om bepaalde zaken gewoon secuur te doen, of dat nu software is of je opzet bij 3D tekenwerk, net als de fundering van een huis. Als je begint met een slechte basis wordt je later tig-dubbel teruggepakt door je systeem.
Ik ben voor meer techniek op school, maar dan wel vanaf groep 1 basischool.
Gebruikersavatar
Arie Kabaalstra
Donateur
Berichten: 13370
Lid geworden op: 07 feb 2007 18:37
Locatie: Bakhuuz'n
Contacteer:

Re: Het "Bouwen" van Macro's voor USBCNC

Bericht door Arie Kabaalstra »

zoals ik al schreef.. toen ik ontdekte hoe krachtig Gosub was.. heb ik sindsdien geen Goto meer gebruikt.. helaas heb ik niet meer dan 1 jaartje les gehad met TurboPascal, en hadden we het niet voor thuis.. dat was wel jammer.. anders had ik thuis lekker verder kunnen "klooien"..

Ik zou nu graag nog eens C++ willen leren.. zodat ik op de API van EdingCNC software kan bouwen.. de DotNet API wordt niet meer ondersteund..
En juist op die DotNet API Heb ik 2 speciale GUI's gebouwd voor EdingCNC.. da's best leuk werk.. EdingCNC wordt op die manier een "Toolbox" waar je in je eigen GUI de nodige tools uit trekt voor hetgeen je wilt doen..

één van de GUI's voor een Coordinaten Ponsmachine kon je programmeren door er een tabel uit Excel in te plakken.. gewoon CtrlC/CtrlV.. of op een knop klikken.. Mijn toenmalige werkgever en mijn collega's waren daar heel enthousiast over..

In Basic ging ik ook meer en meer gestructureerd programmeren.. deels ook door de artikelen die ik toen al las over onderandere Edsger W. Dijkstra.. zulke dingen zetten je toch aan het denken..
Gebruikersavatar
hilberth
Berichten: 264
Lid geworden op: 08 sep 2010 09:40
Locatie: Omgeving Amsterdam
Contacteer:

Re: Het "Bouwen" van Macro's voor USBCNC

Bericht door hilberth »

Arie Kabaalstra schreef: 09 apr 2019 19:57 Ik zou nu graag nog eens C++ willen leren..
Dat hoorde ik je in 2013 al zeggen :roll:
Ik zou hier es naar kijken: https://www.dipmat.univpm.it/~demeio/pu ... uage_2.pdf
Het hele boek van Kernigan en Ritchie als pdf-bestand, ik heb er indertijd fl 49,95 voor betaald.
Overigens kan je met C veel ergere dingen doen dan je in Basic kan, een leuke is gealloceerd geheugen na gebruik niet meer vrij geven, doe dat een paar keer en er is geen geheugen meer om te alloceren, ook niet voor andere programma's :shock: Ja, das een crash..en tis ook niet altijd duidelijk wat de oorzaak is.
Je kan deze ook es proberen, dan ben je dr in een enkele stap: http://www.lmpt.univ-tours.fr/~volkov/C++.pdf
Think it, draw it, make it.
Gebruikersavatar
Arie Kabaalstra
Donateur
Berichten: 13370
Lid geworden op: 07 feb 2007 18:37
Locatie: Bakhuuz'n
Contacteer:

Re: Het "Bouwen" van Macro's voor USBCNC

Bericht door Arie Kabaalstra »

Ja.. inderdaad.. ik ben het al een tijdje van plan.. ik kom er alleen niet toe.. ik heb boeken, ik heb een IDE, maar echt een applicatie bouwen daar ben ik nog niet aan toe gekomen..

Eigenlijk zou ik wat "ondersteuning" willen hebben van iemand die me de "structuur" van C++ kan uitleggen.
De eerste stapjes zijn inmiddels wel gemaakt.. ik heb wat zitten spelen met een Arduino.. en die programmeer je in C.

Naar wat ik begrepen heb, is C++ alleen maar uitgebreider (Classes en Objecten) maar qua syntaxis hetzelfde als C
Gebruikersavatar
P1-Engineering
Donateur
Berichten: 429
Lid geworden op: 27 aug 2019 23:28
Locatie: Haarlem

Re: Het "Bouwen" van Macro's voor USBCNC

Bericht door P1-Engineering »

Vraag met betrekking tot het aanpassen van de Sorotec macro.

Ben nu ongeveer 2 weken onderweg met Eding CNC en langzamerhand beginnen de puzzelstukjes samen te komen. ;)
Om te beginnen heb ik de Sorotec macro geïnstalleerd, ingesteld etc. Na wat zoekwerk ben ik erachter gekomen dat de Sorotec macro de tooltable niet gebruikt. Waarschijnlijk omdat het grootste deel van de klanten deze niet gebruikt.
Aangezien ik een ATC spindel heb met toolhouders zou ik hier graag wel gebruik van maken. De gehele ATC functie ga ik pas in een later stadium implementeren aangezien ik daar een compleet nieuwe controller voor wil gaan bouwen.

Nu is mijn vraag, kan ik simpelweg de Sorotec routine voor het inmeten van het gereedschap in de macro vervangen voor de originele routine van Eding?.
Heb op het moment nog te weinig kennis van de macro's om dit te kunnen bepalen. Wil mij hier wel verder in gaan verdiepen, want de mogelijkheden zijn enorm.
Gebruikersavatar
Arie Kabaalstra
Donateur
Berichten: 13370
Lid geworden op: 07 feb 2007 18:37
Locatie: Bakhuuz'n
Contacteer:

Re: Het "Bouwen" van Macro's voor USBCNC

Bericht door Arie Kabaalstra »

Dan zal ik die sorotec macro eens moeten zien, om daar een oordeel over te vellen.
Gebruikersavatar
serum
Berichten: 5396
Lid geworden op: 08 mar 2008 20:37
Locatie: Zwolle

Re: Het "Bouwen" van Macro's voor USBCNC

Bericht door serum »

Code: Selecteer alles

;***************************************************************************************
;SOROTEC
;Withig 12
;77836 Rheinmünster
;Germany
;***************************************************************************************
;* MACRO CNC V2.0c Ohne Auto-WZW
;***************************************************************************************

;***************************************************************************************
;DOKU
;***************************************************************************************
;Versionshistorie
;V2.0c: Funktionen für Eding WIFI Handrad implementiert 
;V2.0b: Werte der Werkzeugtabelle auf Null setzen 
;V2.0a: Z-Höhenausgleich 
;V2.0 : 3D Taster für X und Y Nullpunktermittlung 
;		Bruchkontrolle (Nicht aktiviert)
;		Spindelwarmlauf
;		Werkezugwechselbutton 
;V1.0e : Bei Wechslertyp 0 und 1 wird jetzt vor Z-Nullpunktermittlung nicht mehr geprüft ob Werkezug vermessen

;Verwendete Variablen
;   #3500 INIT
;   #3501 Merker ( Wurde Werkzeug bereits Vermessen? 1=JA)
;   #3502 Merker Wird nur für eine Berechnung benötigt
;   #3503 Merker Ja / Nein in Dialogabfragen
;   #3504 Merker ob Bruchkontrolle von Automatik aufgerufen wurde 1=Automatik
;   #3505 Merker ob Längenmessung von Handrad 1=Handrad
;   #4500 FREI
;   #4501 Aktuelle Werkzeuglänge
;   #4502 Alte Werkzeuglänge
;   #4503 Maximale Werkzeuglänge                                (WZL-Vermessung)
;   #4504 Antastgeschwindigkeit zum Taster "suchen" (mm/min) 	(WZL-Vermessung)
;   #4505 Tastgeschwindigkeit zum Messen(mm/min)                (WZL-Vermessung)
;   #4506 ;Sicherheitshöhe als Maschinenkoordinate		(WZL-Vermessung)
;   #4507 ;Positionsangabe der X Achse 				(WZL-Vermessung)
;   #4508 ;Positionsangabe der Y Achse				(WZL-Vermessung)
;   #4509 Abstand Spindelnase zu Längensensor von Z0 aus     	(WZL-Vermessung)
;   #4510 Tasterhöhe						(ZNP-Vermessung)
;   #4511 Freifahrhöhe						(ZNP-Vermessung)
;   #4512 Antastgeschwindigkeit zum Taster "suchen"		(ZNP-Vermessung)
;   #4513 Tastgeschwindigkeit zum Messen			(ZNP-Vermessung)
;   #4514 Zwischenspeicher für X Pos
;   #4515 Zwischenspeicher für Y Pos
;   #4516 Zwischenspeicher für Z Pos
;   #4517 Merker (Es wurde kein Werkzeug ausgewählt)
;   #4518 Merker (Achse zurückfahren auf Z Vermessungspunkt)
;   #4519 Was tun nach Werkzeugvermessung: 0= vordefinierten Punkt anfahren 1= Werkstücknullpunkt fahren 2= Werkzeugwechselpos anfahren 3= Maschinennullpunkt anfahren 4= Stehen bleiben
;   #4524 Position X nach Längenmessung   
;   #4525 Position Y nach Längenmessung
;   #4526 Position Z nach Längenmessung
;   #4520 Werkzeugwechseltyp 0= Mache garnix 1 = Nur WPos Anfahren 2= WPos anfahren  + Vermessen 
;   #4521 (TYP 0) Werkzeugwechselpos  X 
;   #4522 (TYP 0) Werkzeugwechselpos  Y
;   #4523 (TYP 0) Werkzeugwechselpos  Z
;   #4524 Position X nach Längenmessung   
;   #4525 Position Y nach Längenmessung
;   #4526 Position Z nach Längenmessung
;   #4527 Abstand Taster zum Spindelkopf  bei Z0 G53 negativer Wert
;   #4528 Erlaubte Toleranz Bruchkontrolle
;   #4529 Merker ob Automatische Bruchkontrolle eingeschaltet
;   #4530 Merker ob Kegelcheck eingeschaltet NICHT IN GEBRAUCH
;   #4531 Kegelhöhe über Sensor NICHT IN GEBRAUCH
;   #4532 Drehzahl Stufe 1 für Warmlauf Spindel
;   #4533 Laufzeit Stufe 1 für Warmlauf Spindel
;   #4534 Drehzahl Stufe 2 für Warmlauf Spindel
;   #4535 Laufzeit Stufe 2 für Warmlauf Spindel
;   #4536 Drehzahl Stufe 3 für Warmlauf Spindel
;   #4537 Laufzeit Stufe 3 für Warmlauf Spindel
;   #4538 Drehzahl Stufe 4 für Warmlauf Spindel
;   #4539 Laufzeit Stufe 4 für Warmlauf Spindel
;   #4540 bis #4549 Leer für mehr Stufen
;   #4550 Nullpunktermittlung Merker Richtung
;   #4551 Nullpunktermittlung Versatz X+
;   #4552 Nullpunktermittlung Versatz X-
;   #4553 Nullpunktermittlung Versatz Y+
;   #4554 Nullpunktermittlung Versatz Y-
;   #4600 Ab hier für Wechsler reserviert 
;   #5397 Abfrage ob sich die Maschine im Render Modus befindet [0=Nein NormalModus] [1=Ja RenderModus]

;***************************************************************************************
IF [#3500 == 0] then ; INIT
	#3500 = 1
	IF [#4504 == 0] THEN  	
		#4504 =50	;Antastgeschwindigkeit zum Taster "suchen" (mm/min)
	ENDIF
	IF [#4505 == 0] THEN  	
		   #4505 =10  	;Tastgeschwindigkeit zum Messen(mm/min)  
	ENDIF
	IF [#4511 == 0] THEN  	
	   	#4511 =10	;Freifahrhöhe		
	ENDIF
	IF [#4512 == 0] THEN  	
		#4512 = 50  	;Antastgeschwindigkeit zum Taster "suchen"
	ENDIF  
	IF [#4513 == 0] THEN  	
		#4513 =20  	;Tastgeschwindigkeit zum Messen
	ENDIF
ENDIF
;***************************************************************************************
;---------------------------------------------------------------------------------------
Sub user_1 ;Z-Nullpunktermittlung
;---------------------------------------------------------------------------------------
	IF [[#3501 == 1] or [#4520 < 2]]then	; Wurde Werkzeug bereits Vermessen? 1=JA oder ist längensensor inaktiv geschaltet
		#4518 = 0 							; Merker Achse zurückfahren auf Z Vermessungspunkt) Sicherheitshalber rücksetzen
		IF [#3505 == 0] 					; Merker ob Längenmessung von Handrad 1=Handrad
			DlgMsg "Soll Z-Nullpunkt ermittelt werden?" 
		ENDIF	
		#3505 = 0					; Merker ob Längenmessung von Handrad 1=Handrad
		IF [[#5398 == 1] AND [#5397 == 0]]	; OK Taste gedrückt und RenderModus AUS !!
			M5								; Spindel ausschalten
            msg "Taster wird angefahren"	
            G38.2 G91 z-50 F[#4512] 		; Schnelles anfahren auf Taster bis Schaltsignaländerung
            IF [#5067 == 1]					; Wenn Sensor gefunden wurde
            	G38.2 G91 z20 F[#4513]		; Langsam von Taster runterfahren zur exakten Z-Ermittlung
            	G90
	 			IF [#5067 == 1]				; Wenn Sensor gefunden wurde              
            		G0 Z#5063				; Schaltpunkt anfahren	
            		G92 Z[#4510] 			; Z-Nullpunkt übernehmen
            		G0 Z[#4510 + 5] 		; Taster 2mm Freifahren
            		msg"Z-Nullpunktermittlung fertig"
            	ELSE
            		G90 
					errmsg "FEHLER: Sensor hat nicht geschaltet"
				ENDIF
            ELSE	;CANCEL
            	G90 
				DlgMsg "WARNUNG: Kein Sensor gefunden! Erneut Versuchen?" 
				IF [#5398 == 1] ;OK   				
					GoSub user_1
				ELSE
					errmsg "Messung wurde abgebrochen!"
				ENDIF
      		ENDIF
		ENDIF   	
	ELSE
		#3505 = 0					; Merker ob Längenmessung von Handrad 1=Handrad
		DlgMsg "WARNUNG: Werkzeug wurde noch nicht vermessen!" 
		IF [#5398 == 1] 	;OK
	   		#4514 = #5071	; Zwischenspeicher für X Pos
			#4515 = #5072	; Zwischenspeicher für Y Pos
			#4516 = #5073	; Zwischenspeicher für Z Pos
			#4518 = 1		; Merker setzen das zurückpositioniert wird
			GoSub user_2
		ENDIF
	ENDIF
Endsub
;***************************************************************************************
Sub user_2 ;Werkzeuglängenmessung
;---------------------------------------------------------------------------------------
	#5016 = [#5011]		; Neue Werkzeugnummer
	#4527 = [#4509] 	; Abstand Taster zum Spindelkopf  bei Z0 (G53)(negativer Wert)
	#5017 = [#4503]	 	; Maximale Werkzeuglänge
    	#5019 = [#4507]	 	; Werkzeuglängensensorposition X-Achse
      	#5020 = [#4508]	 	; Werkzeuglängensensorposition Y-Achse
      	#5021 = 0 		; Gemessene Werkzeuglänge wird hier eingetragen
	msg "Werkzeug wird vermessen"
     	dlgmsg "Soll Werkzeug Vermessen werden?" "Werkzeuglänge ca:" 5017
	IF [[#5398 == 1] AND [#5397 == 0]] ;OK Taste wurde gedrückt und RenderModus ist AUS !!
		IF [[#5017] < 0] THEN	; Testen ob Werkzeuglänge negativ
			DlgMsg "!!! WARNUNG: Werkzeuglänge darf nicht negativ sein !!!"
			if [#5398 == 1] ;OK
				GoSub user_2
			ELSE
				GoSub user_2
			ENDIF
		ENDIF
		IF [[#4527 + #5017 + 10] > [#4506]] THEN	; Testen ob errechneter Wert höher wie sicherheitshöhe ist
			DlgMsg "!!! WARNUNG: Werkzeug zu lang !!!"
			if [#5398 == 1] ;OK
				GoSub user_2
			ELSE
				GoSub user_2
			ENDIF
		ENDIF
		M5
		G53 G0 z[#4506]					; Sicherheitshöhe 
       	G53 G0 x[#5019] y[#5020]
		G53 G0 z[#4527 + #5017 + 10]
		G53 G38.2 Z[#4527] F[#4504]
		IF [#5067 == 1]					; Wenn Sensor gefunden wurde
 		    G91 G38.2 Z20 F[#4505]
 			G90
    		IF [#5067 == 1]				; Wenn Sensor gefunden wurde, wird Tastpunkt in #5053 gespeichert
        		G00 g53 z#4506
				;***********Bei Direktvermessung Tabelle auf 0 schreiben
				#[5400 + #5016] = 0 ;[#5053 - #4527]														;Berechnete Werkzeuglänge in Tabelle speichern
				#[5500 + #5016] = 0 ;#5018																;Werkzeugdurchmesser in Tabelle speichern
				;***********Bei Direktvermessung Tabelle auf 0 schreiben Ende
				#5021 = [#5053 - #4527]		; Berechnung Werkzeuglänge = Tastpunkt  - chuck height
        		msg "Werkzeuglänge = " #5021
        		IF [#3501 == 1] 		; (Wurde Werkzeug bereits Vermessen? 1=JA)
          			#4502 = [#4501]		; Alte Werkzeuglänge speichern
              		#4501 = [#5021]		; Aktuelle Werkzeuglänge eintragen
              		#3502 =	[#4501 - #4502] ; Werkzeuglängenunterschied ausrechnen
              		G92 Z[#5003 - #3502] 	; Z-Nullpunkt ermitteln
            		;Werkzeuglaenge und Werkzeugdurchmesser in Tabelle speichern
        			;#[5400 + #5016] = [#5053 - #4527]	;Berechnete Werkzeuglänge in Tabelle speichern
        			;#[5500 + #5016] = #5018			;Werkzeugdurchmesser in Tabelle speichern
       			 	;msg "Gemessene Werkzeuglaenge="#[5400 + #5016]" gespeichert in Werkzeugnr. "#5016
				ELSE
              		#4501 = [#5021]		; Aktuelle Werkzeuglänge eintragen
            	ENDIF
			IF [#4518 == 1] then		; Merker (Achse zurückfahren auf Z Vermessungspunkt)
	   			G0 G53 Z#4506		; Repositionieren
	   			G0 G53 X#4514 Y#4515	; Repositionieren
				#4518 = 0		; Merker (Achse zurückfahren auf Z Vermessungspunkt)
				#3501 = 1		; Merker (Wurde Werkzeug bereits Vermessen? 1=JA)
			ELSE
				IF [#4519 == 0] then	; Was tun nach Werkzeugvermessung 0= vordefinierten Punkt anfahren
	   				G0 G53 Z#4506	; Sicher Z 
	   				G0 G53 X#4524 Y#4525	; Vordefinierten Punkt anfahren 
				ENDIF

				IF [#4519 == 1] then	; Was tun nach Werkzeugvermessung 1= Werkstücknullpunkt fahren 
	   				G0 G53 Z#4506	; Sicher Z 
	   				G0 X0 Y0	; Werkstücknullpunkt anfahren
				ENDIF

				IF [#4519 == 2] then	; Was tun nach Werkzeugvermessung 2= Werkzeugwechselpos anfahren
	   				G0 G53 Z#4523	; Werkzeugwechselpunkt anfahren
	   				G0 G53 X#4521 Y#4522; Werkzeugwechselpunkt anfahren
				ENDIF
					
				IF [#4519 == 3] then	; Was tun nach Werkzeugvermessung 3= Maschinennullpunkt anfahren
	   				G0 G53 Z#4506	; 
	   				G0 G53 X0 Y0	; Maschinennullpunkt anfahren
				ENDIF

				IF [#4519 == 4] then	; Was tun nach Werkzeugvermessung 4= Stehen bleiben		

				ENDIF

			Endif	
				#4518 = 0			; Merker (Achse zurückfahren auf Z Vermessungspunkt)			
           			#3501 = 1			; Merker (Wurde Werkzeug bereits Vermessen? 1=JA)	
  			ELSE
        			errmsg "FEHLER: Kein Sensor gefunden - RESET BETäTIGEN"
			ENDIF
		ELSE
			errmsg "FEHLER: Kein Sensor gefunden - Messung abgebrochen"
		ENDIF
	ENDIF	

Endsub
;***************************************************************************************
Sub user_3; Bruchkontrolle des Fräsers NICHT AKTIV
;---------------------------------------------------------------------------------------
#4529 = 0
IF [#4529 == 1]			 							; #4529 Merker ob Automatische Bruchkontrolle eingeschaltet
	IF [#3501 == 1]									; Merker (Wurde Werkzeug bereits Vermessen? 1=JA)
		msg "Bruchkontrolle"
		M5 M9
		G53 G0 z[#4506]								;Sicherheitshöhe 
		G53 G0 y[#5020]  							; XYChange Vorsict Sonderfall    
		G53 G0 x[#5019]								; XYChange Vorsict Sonderfall
		G53 G0 z[#4527 + #5017 + 10]
		G53 G38.2 Z[#4527] F[#4504] 
		IF [#5067 == 1]								;Wenn Sensor gefunden wurde
			G91 G38.2 Z20 F[#4505] 
			G90
			IF [#5067 == 1]							;Wenn Sensor gefunden wurde, wird Tastpunkt in #5053 gespeichert
				#4501 = [#5053 - #4527]				;Berechnung aktuelle Werkzeuglänge = Tastpunkt  - chuck height
				G00 G53 z#4506
				IF [[[#5021 + #4528] > [#4501]]  and [[#5021 - #4528] < [#4501]]]
					msg "Okay"
					msg " Massabweichung:" [#5021 - #4501]	
					
				ELSE
					#3504 = 0						;Merker ob Bruchkontrolle von Automatik aufgerufen wurde 1=Automatik
					G53 G0 Z[#4523]						; Sicherheitshöhe
					G53 G0 X[#4521] 					; Manuelle Werkzeugwechselpos X XYchange
					G53 G0 Y[#4522]						; Manuelle Werkzeugwechselpos Y XYchange
					Dlgmsg "Werkzeug Verschlissen, fortführen?" " Massabweichung:" 4501	
					IF [#5398 == 1] ;OK
						Dlgmsg "WARNUNG: Auftrag wird fortgeführt"	
					ELSE
						errmsg "Werkzeug Verschlissen, abbruch"
					ENDIF
				ENDIF
				IF [#3504 == 0]							;Merker ob Bruchkontrolle von Automatik aufgerufen wurde 1=Automatik
					IF [#4519 == 0] then				;Was tun nach Werkzeugvermessung 0= vordefinierten Punkt anfahren
						G0 G53 Z#4506					; Sicher Z 
						G0 G53 X#4524 					;Vordefinierten Punkt anfahren XYchange
						G0 G53 Y#4525					;Vordefinierten Punkt anfahren XYchange
					ENDIF
			
					IF [#4519 == 1] then				;Was tun nach Werkzeugvermessung 1= Werkstücknullpunkt fahren 
						G0 G53 Z#4506					;Sicher Z 
						G0 X0 						;Werkstücknullpunkt anfahren anfahren XYchange
						G0 Y0 						;Werkstücknullpunkt anfahren anfahren XYchange
					ENDIF
					
					IF [#4519 == 2] then				;Was tun nach Werkzeugvermessung 2= Werkzeugwechselpos anfahren
						G0 G53 Z#4523					;Werkzeugwechselpunkt anfahren
						G0 G53 X#4521 					;Werkzeugwechselpunkt anfahren XYchange
						G0 G53 Y#4522					;Werkzeugwechselpunkt anfahren XYchange
					ENDIF
						
					IF [#4519 == 3] then				;Was tun nach Werkzeugvermessung 3= Maschinennullpunkt anfahren
						G0 G53 Z#4506					; 
						G53 X0 						;Maschinennullpunkt anfahren XYchange
						G53 Y0 						;Maschinennullpunkt anfahren XYchange
					ENDIF

					IF [#4519 == 4] then				; Was tun nach Werkzeugvermessung 4= Stehen bleiben		
					ENDIF
				ENDIF					
			ELSE
				#3504 = 0								;Merker ob Bruchkontrolle von Automatik aufgerufen wurde 1=Automatik
				errmsg "FEHLER: Kein Sensor gefunden"
			ENDIF
		ELSE
			#3504 = 0									;Merker ob Bruchkontrolle von Automatik aufgerufen wurde 1=Automatik
			errmsg "FEHLER: Kein Sensor gefunden"
		ENDIF
	ENDIF
	#3504 = 0											;Merker ob Bruchkontrolle von Automatik aufgerufen wurde 1=Automatik
ELSE
	DlgMsg "Bruchkontrolle nicht aktiviert"
ENDIF
Endsub
;***************************************************************************************
Sub user_4
;---------------------------------------------------------------------------------------
;   #4532 Drehzahl Stufe 1 für Warmlauf Spindel
;   #4533 Laufzeit Stufe 1 für Warmlauf Spindel
;   #4534 Drehzahl Stufe 2 für Warmlauf Spindel
;   #4535 Laufzeit Stufe 2 für Warmlauf Spindel
;   #4536 Drehzahl Stufe 3 für Warmlauf Spindel
;   #4537 Laufzeit Stufe 3 für Warmlauf Spindel
;   #4538 Drehzahl Stufe 4 für Warmlauf Spindel
;   #4539 Laufzeit Stufe 4 für Warmlauf Spindel
DlgMsg "Spindelwarmlauf Starten?"
	IF [#5398 == 1]	;OK
	   	G53 G00 Z0
		M03 S#4532
		G04 P#4533	
		M03 S#4534
		G04 P#4535	
		M03 S#4536
		G04 P#4537	
		M03 S#4538
		G04 P#4539	
		M05
	ENDIF
Endsub
;***************************************************************************************
Sub user_5
;---------------------------------------------------------------------------------------
Dlgmsg "Welches Werkzeug soll eingewechselt werden" " Neue Werkzeugnr.:" 5011	
	IF [#5398 == 1] ;OK
		gosub change_tool
	ENDIF
Endsub
;***************************************************************************************
Sub user_6
;---------------------------------------------------------------------------------------
msg "sub user_6"
#5011 = [#5008]
Dlgmsg "!!! Werkzeugmanipulation !!!" "Alte Werkzeugnr" 5008" Neue Werkzeugnr" 5011
	IF [#5011 > 16] THEN
		Dlgmsg "Werkzeugnr Ungültig: Bitte Werkzeugnummer 1..16 Auswählen"
		M30
	ELSE
		#5015 = 1; Wurde werkzeug erfolgreich gewechselt 1=Ja
		IF [[#5011] > 0] THEN
	       		m6t[#5011]
			;G43
		ELSE
			m6t[#5011]
		ENDIF

	ENDIF

Endsub
;***************************************************************************************
Sub user_7
;---------------------------------------------------------------------------------------
   	msg "sub user_7"
	DlgMsg "Keine Funktion hinterlegt"
Endsub
;***************************************************************************************
Sub user_8
;---------------------------------------------------------------------------------------
;   #4550 Nullpunktermittlung Merker Richtung
;   #4551 Nullpunktermittlung Versatz X+
;   #4552 Nullpunktermittlung Versatz X-
;   #4553 Nullpunktermittlung Versatz Y+
;   #4554 Nullpunktermittlung Versatz Y-
Dlgmsg "Nullpunkt ermitteln 1 = X+ / 2 = X- / 3 = Y+  / 4 = Y-" "Richtung:" 4550 
IF [#4550 == 0]
ENDIF

;---- X-Plus-----------------------------------------------------------------------------------
IF [#4550 == 1]
	G91 G38.2 x20 F[#4504]
	G90
	IF [#5067 == 1]					; Wenn Sensor gefunden wurde
	    G91 G38.2 x-10 F[#4505]
		G90
		IF [#5067 == 1]				; Wenn Sensor gefunden wurde
			G92 X#4551
			G91 G00 x-1 
			G90
		ENDIF
	ELSE
		DlgMsg "FEHLER: Kein Sensor gefunden - Messung abgebrochen"
	ENDIF 
	#4550 = 0
ENDIF
;---- X-Minus-----------------------------------------------------------------------------------
IF [#4550 == 2]
	G91 G38.2 x-20 F[#4504]
	G90
	IF [#5067 == 1]					; Wenn Sensor gefunden wurde
	    G91 G38.2 x10 F[#4505]
		G90
		IF [#5067 == 1]				; Wenn Sensor gefunden wurde
			G92 X#4552
			G91 G00 x1 
			G90
		ENDIF
	ELSE
		DlgMsg "FEHLER: Kein Sensor gefunden - Messung abgebrochen"
	ENDIF 
	#4550 = 0
ENDIF
;---- Y-Plus-----------------------------------------------------------------------------------
IF [#4550 == 3]
	G91 G38.2 y20 F[#4504]
	G90
	IF [#5067 == 1]					; Wenn Sensor gefunden wurde
	    G91 G38.2 y-10 F[#4505]
		G90
		IF [#5067 == 1]				; Wenn Sensor gefunden wurde
			G92 y#4553
			G91 G00 y-1 
			G90
		ENDIF
	ELSE
		DlgMsg "FEHLER: Kein Sensor gefunden - Messung abgebrochen"
	ENDIF 
	#4550 = 0
ENDIF 
;---- Y-Minus-----------------------------------------------------------------------------------
IF [#4550 == 4]
	G91 G38.2 y-20 F[#4504]
	G90
	IF [#5067 == 1]					; Wenn Sensor gefunden wurde
	    G91 G38.2 y10 F[#4505]
		G90
		IF [#5067 == 1]				; Wenn Sensor gefunden wurde
			G92 y#4554
			G91 G00 y1 
			G90
		ENDIF
	ELSE
		DlgMsg "FEHLER: Kein Sensor gefunden - Messung abgebrochen"
	ENDIF 
	#4550 = 0
ENDIF
ENDSUB
;***************************************************************************************
Sub user_9
;---------------------------------------------------------------------------------------
   	msg "sub user_9"
	DlgMsg "Keine Funktion hinterlegt"
Endsub

;***************************************************************************************
Sub user_10
;---------------------------------------------------------------------------------------
  	DlgMsg "Soll Maschinennullpunkt angefahren werden?"
	if [#5398 == 1] ;OK
	   	G53 G0 Z0
	    	G53 X0 Y0
	ENDIF
Endsub
;***************************************************************************************
Sub home_z ;Homing per axis
;---------------------------------------------------------------------------------------
    msg "Referenziere Achse Z"
    M80
    g4p0.2
    home z
Endsub
;***************************************************************************************
Sub home_x
    msg "Referenziere Achse  X"
    M80
    g4p0.2
    home x
    ;homeTandem X
Endsub
;***************************************************************************************
Sub home_y
    msg "Referenziere Achse  Y"
    M80
    g4p0.2
    home y
    ;homeTandem Y
Endsub
;***************************************************************************************
Sub home_a
    msg "Referenziere  Achse A"
    M80
    g4p0.2
    home a
Endsub
;***************************************************************************************
Sub home_b
    msg "Referenziere  Achse  B"
    M80
    g4p0.2
    home b
Endsub
;***************************************************************************************
Sub home_c
    msg "Referenziere  Achse  C"
    M80
    g4p0.2
    home c
Endsub
;***************************************************************************************
;Home all axes
sub home_all
    gosub home_z
    gosub home_y
    gosub home_x
    gosub home_a
    gosub home_b
    gosub home_c
    G53 G01 X0 Y0 Z0 F1000; Achse X, Y und Z auf 0 Fahren    
    msg"Referenzierung fertig"	
    ;homeIsEstop on ;diese Zeile Einkommentieren wenn Refschalter = Endschalter  
    m30
endsub

;***************************************************************************************
Sub zero_set_rotation
;---------------------------------------------------------------------------------------
    msg "Ersten Punkt antasten und mit STRG + G fortfahren"
	m0
	#5020 = #5071 ;x1
	#5021 = #5072 ;y1
    msg "Zweiten Punkt antasten und mit STRG + G fortfahren"
	m0
	#5022 = #5071 ;x2
	#5023 = #5072 ;y2
	#5024 = ATAN[#5023 - #5021]/[#5022 - #5020]
	if [#5024 > 45]
       #5024 = [#5024 - 90] ;Punkte in Y Achse
	endif
	g68 R#5024
	msg "Koordinatensystem mit G68 R"#5024" gedreht"
	msg " Bitte Messtaster entfernen!!! "
Endsub

;***************************************************************************************
sub change_tool
;---------------------------------------------------------------------------------------
#5015 = 0				; Merker: Wurde werkzeug erfolgreich gewechselt 1=Ja
M5
M9				
;---------------------------------------------------------------------------------------
; 0 = Wechsel ignorieren
;---------------------------------------------------------------------------------------
IF [[#4520] == 0] 			; Werkzeugwechslertyp  0= Wechsel ignorieren 1 = Nur WPos Anfahren 2= WPos anfahren  + Vermessen 
	#5015 = 1; Wurde werkzeug erfolgreich gewechselt 1=Ja
ENDIF

;---------------------------------------------------------------------------------------
; 1 = Nur WPos Anfahren
;---------------------------------------------------------------------------------------
IF [[#4520] == 1] 			; Werkzeugwechslertyp  0= Mache garnix 1 = Nur WPos Anfahren 2= WPos anfahren  + Vermessen 
	#3503 = 1				; Werkzeugnummer bereits eingelegt  1=Ja
	IF [[#5011] == [#5008]] THEN
		Dlgmsg "Werkzeug bereits eingelegt. Trotzdem wechseln?"
		if [#5398 == 1] ;OK
			#3503 = 1
		ELSE
			#3503 = 0
		ENDIF
	ENDIF

	IF [#3503 == 1] THEN
		G53 G0 Z[#4523]			; Sicherheitshöhe
		G53 G0 X[#4521] Y[#4522]	; Werkzeugwechselpos X Y
		Dlgmsg "Bitte Werkzeug einwechseln" "Alte Werkzeugnr.:" 5008" Neue Werkzeugnr.:" 5011
		if [#5398 == 1] ;OK
			IF [#5011 > 99] THEN
				Dlgmsg "Werkzeugnr Ungültig: Bitte Werkzeugnummer 1..99 Auswählen"
				if [#5398 == 1] ;OK
					gosub change_tool
				ELSE
					errmsg"Werkzeugwechsel abgebrochen"
				ENDIF
					
			ELSE
				#5015 = 1; Wurde werkzeug erfolgreich gewechselt 1=Ja
			ENDIF
		ELSE
			errmsg"Werkzeugwechsel abgebrochen"
		ENDIF
	
	ENDIF
ENDIF

;---------------------------------------------------------------------------------------
; 2= WPos anfahren  + Vermessen 
;---------------------------------------------------------------------------------------

IF [[#4520] == 2] 			; Werkzeugwechslertyp  0= Mache garnix 1 = Nur WPos Anfahren 2= WPos anfahren  + Vermessen 
	#3503 = 1				; Werkzeugnummer bereits eingelegt  1=Ja
	IF [[#5011] == [#5008]] THEN
		Dlgmsg "Werkzeug bereits eingelegt. Trotzdem wechseln?"
		if [#5398 == 1] ;OK
			#3503 = 1
		ELSE
			#3503 = 0
		ENDIF
	ENDIF

	IF [#3503 == 1] THEN
		IF [[#5008] > 0] 
			#3504 = 1					; Merker ob Bruchkontrolle von Automatik aufgerufen wurde 1=Automatik
			;GOSUB user_3				; Bruchkontrolle aufrufen
			#3504 = 0					; Merker ob Bruchkontrolle von Automatik aufgerufen wurde 1=Automatik
		ENDIF
		G53 G0 Z[#4523]			; Sicherheitshöhe
		G53 G0 X[#4521] Y[#4522]	; Werkzeugwechselpos X Y
		Dlgmsg "Bitte Werkzeug einwechseln" "Alte Werkzeugnr.:" 5008" Neue Werkzeugnr.:" 5011
		if [#5398 == 1] ;OK
			IF [#5011 > 99] THEN
				Dlgmsg "Werkzeugnr Ungültig: Bitte Werkzeugnummer 1..99 Auswählen"
				if [#5398 == 1] ;OK
					gosub change_tool
				ELSE
					gosub change_tool
				ENDIF
					
			ELSE
				#5015 = 1; Wurde werkzeug erfolgreich gewechselt 1=Ja
				gosub user_2
			ENDIF
		ELSE
			errmsg"Werkzeugwechsel abgebrochen" 
		ENDIF
	
	ENDIF
ENDIF
;---------------------------------------------------------------------------------------

IF [[#5015] == 1] THEN   
	msg "Werkzeugnr.: " #5008" mit Werkzeugnr.: " #5011 " gewechselt"
        m6t[#5011]
	#5015 = 0; Wurde werkzeug erfolgreich gewechselt 1=Ja
ENDIF
;G01
endsub
;***************************************************************************************
sub config
;---------------------------------------------------------------------------------------
GoSub wzwp
GoSub znpp
GoSub wlmp
GoSub NL3D
GoSub SPWL
endsub

;***************************************************************************************
sub WZWP
;---------------------------------------------------------------------------------------
;0= Mache garnix 1 = Nur WPos Anfahren 2= WPos anfahren  + Vermessen
Dlgmsg "Bitte Werkzeugwechslertyp eingeben" "TYP" 4520  
if [#5398 == 1] ;OK
	IF [#4520 > 0 ] THEN
		Dlgmsg "Bitte Werkzeugwechselposition eingeben" "Position X-Achse" 4521 "Position Y-Achse" 4522 "Position Z-Achse" 4523
		
	ENDIF

ENDIF
endsub
;***************************************************************************************
sub ZNPP
;---------------------------------------------------------------------------------------
	Dlgmsg "Bitte Z-Nullpunktsensordaten eingeben" "Höhe Sensor" 4510 "Anfahrvorschub:" 4512 "Tastvorschub:" 4513
endsub

;***************************************************************************************
sub WLMP
;---------------------------------------------------------------------------------------
Dlgmsg "Bitte Werkzeuglängensensordaten eingeben" "Position X-Achse" 4507 "Position Y-Achse" 4508 "Sicherheitshöhe Z" 4506 "SP. ohne Werkzeug" 4509 "Max. Werkzeuglänge" 4503 "Anfahrvorschub:" 4504 "Tastvorschub:" 4505
;Dlgmsg "Daten Bruchkontrolle" "Bruchkontrolle aktivieren?" 4529 "Verschleisstoleranz +/- in mm:" 4528  
Dlgmsg "Position nach Messung anfahren" "Funktion:" 4519 "Position X-Achse" 4524 "Position Y-Achse" 4525 

;#4519 Was tun nach Werkzeugvermessung: 
;0= vordefinierten Punkt anfahren
;1= Werkstücknullpunkt fahren 
;2= Werkzeugwechselpos anfahren
;3= Maschinennullpunkt anfahren
;4= Stehen bleiben
;#4524 Position X nach Längenmessung   
;#4525 Position Y nach Längenmessung
;#4526 Position Z nach Längenmessung
endsub
;***************************************************************************************
sub NL3D
;---------------------------------------------------------------------------------------
;   #4551 Nullpunktermittlung Versatz X+
;   #4552 Nullpunktermittlung Versatz X-
;   #4553 Nullpunktermittlung Versatz Y+
;   #4554 Nullpunktermittlung Versatz Y-
	Dlgmsg "Versatz 3D Taster.." "in Richtung X+" 4551 "in Richtung X-" 4552 "in Richtung Y+" 4553 "in Richtung Y-" 4554 
ENDSUB

;***************************************************************************************
sub SPWL
;---------------------------------------------------------------------------------------
;   #4532 Drehzahl Stufe 1 für Warmlauf Spindel
;   #4533 Laufzeit Stufe 1 für Warmlauf Spindel
;   #4534 Drehzahl Stufe 2 für Warmlauf Spindel
;   #4535 Laufzeit Stufe 2 für Warmlauf Spindel
;   #4536 Drehzahl Stufe 3 für Warmlauf Spindel
;   #4537 Laufzeit Stufe 3 für Warmlauf Spindel
;   #4538 Drehzahl Stufe 4 für Warmlauf Spindel
;   #4539 Laufzeit Stufe 4 für Warmlauf Spindel
	Dlgmsg "Spindelwarmlaufparameter" "Drehzahl Stufe 1" 4532 "Laufzeit (sek.) Stufe 1" 4533 "Drehzahl Stufe 2" 4534 "Laufzeit(sek.) Stufe 2" 4535 "Drehzahl Stufe 3" 4536 "Laufzeit (sek.) Stufe 3" 4537 "Drehzahl Stufe 4" 4538 "Laufzeit(sek.) Stufe 4" 4539
ENDSUB


;***************************************************************************************
sub zhcmgrid
;***************************************************************************************
;probe scanning routine for eneven surface milling
;scanning starts at x=0, y=0

  if [#4100 == 0]
   #4100 = 10  ;nx
   #4101 = 5   ;ny
   #4102 = 40  ;max z 
   #4103 = 10  ;min z 
   #4104 = 1.0 ;step size
   #4105 = 100 ;probing feed
  endif    

  #110 = 0    ;Actual nx
  #111 = 0    ;Actual ny
  #112 = 0    ;Missed measurements counter
  #113 = 0    ;Number of points added

  ;Dialog
  dlgmsg "gridMeas" "nx" 4100 "ny" 4101 "maxZ" 4102 "minZ" 4103 "gridSize" 4104 "Feed" 4105 
    
  if [#5398 == 1] ; user pressed OK
    ;Move to startpoint
    g0 z[#4102];to upper Z
    g0 x0 y0 ;to start point
        
    ;ZHCINIT gridSize nx ny
    ZHCINIT [#4104] [#4100] [#4101] 
    
    #111 = 0    ;Actual ny value
    while [#111 < #4101]
      #110 = 0
      while [#110 < #4100]
        ;Go up, goto xy, measure
        g0 z[#4102];to upper Z
        g0 x[#110 * #4104] y[#111 * #4104] ;to new scan point
        g38.2 F[#4105] z[#4103];probe down until touch
                
        ;Add point to internal table if probe has touched
        if [#5067 == 1]
          ZHCADDPOINT
          msg "nx="[#110 +1]" ny="[#111+1]" added"
          #113 = [#113+1]
        else
          ;ZHCADDPOINT
          msg "nx="[#110 +1]" ny="[#111+1]" not added"
          #112 = [#112+1]
        endif

        #110 = [#110 + 1] ;next nx
      endwhile
      #111 = [#111 + 1] ;next ny
    endwhile
        
    g0 z[#4102];to upper Z
    ;Save measured table
    ZHCS zHeightCompTable.txt
    msg "Done, "#113" points added, "#112" not added" 
        
  else
    ;user pressed cancel in dialog
    msg "Operation canceled"
  endif
endsub

;***************************************************************************************
; Handradfunktionen
;---------------------------------------------------------------------------------------
;***************************************************************************************
 SUB xhc_probe_z ;Z-Nullpunktermittlung
;---------------------------------------------------------------------------------------
	#3505 = 1					; Merker ob Längenmessung von Handrad 1=Handrad
	gosub user_1 ;Z-Nullpunktermittlung
ENDSUB

;***************************************************************************************
SUB xhc_macro_1
;---------------------------------------------------------------------------------------
	msg"Keine Funktion für Macro 1 Hinterlegt"
ENDSUB

;***************************************************************************************
SUB xhc_macro_2
;---------------------------------------------------------------------------------------
	gosub user_2 ;Werkzeugvermessung
ENDSUB
;***************************************************************************************
SUB xhc_macro_3
;---------------------------------------------------------------------------------------
	msg"Keine Funktion für Macro 3 Hinterlegt"
ENDSUB
;***************************************************************************************
SUB xhc_macro_6
;---------------------------------------------------------------------------------------
	msg"Keine Funktion für Macro 6 Hinterlegt"
ENDSUB
;***************************************************************************************
SUB xhc_macro_7
;---------------------------------------------------------------------------------------
	msg"Keine Funktion für Macro 7 Hinterlegt"
ENDSUB
	
Plaats reactie