Het "Bouwen" van Macro's voor USBCNC

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

Moderator: Moderators

Plaats reactie
Gebruikersavatar
audiomanics
Donateur
Berichten: 4828
Lid geworden op: 28 feb 2007 09:31
Locatie: Appelscha
Contacteer:

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

Bericht door audiomanics » 20 okt 2015 17:41

Bedoel je dat je in plaats van, bijvoorbeeld, het uitvoeringscommando G1 X[#10] Y[#11], naar de machine te sturen dit in een bestand opslaat?
Dat zou er dan als volgt uit zien:
LOGMSG "G1 X["#10"] Y["#11"]"
En dan natuurlijk de regel G1 x[#10] Y[#11] even comment maken door er een ;(puntkomma) voor te zetten..

Kees
<klik>... euh..test... 123.... einde test... uit.<klik>

Gebruikersavatar
Arie Kabaalstra
Berichten: 9040
Lid geworden op: 07 feb 2007 18:37
Locatie: Bakhuuz'n
Contacteer:

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

Bericht door Arie Kabaalstra » 20 okt 2015 18:49

Ik heb mijn macro zo opgebouwd dat ik vanuit de Usersubs een dialoog open:

Code: Selecteer alles

	DLGMSG "FACING" "X1"1001 "Z1"1003 "X2"1011 "Z2"1013 "R-FEED"4001 "R-DOC"4002 "R-TOOL"4060 "F-FEED"4011 "F-DOC"4012 "F-TOOL"4061 "F-STOCK"4050 "SAFETY DISTANCE"4000
Daarmee heb ik alle parameters voor een vlakdraaibewerking

dan.. zet ik het met LOGMSG weg in een NC bestandje, genaamd "Teach_in.NC".. dit bestand wordt automatisch geladen bij het opstarten van EdingCNC, en Automatisch Herladen als ik 't wijzig..

in dit bestand komen alleen de Parameters te staan..

Code: Selecteer alles

	LOGMSG ";FACING" 
	LOGMSG "	#1001="#1001"		(X1)" 
	LOGMSG "	#1003="#1003"		(Z1)"		
	LOGMSG "	#1011="#1011"		(X2)"
	LOGMSG "	#1013="#1013"		(Z2)"
	LOGMSG "	#4001="#4001"		(R-FEE)D"
	LOGMSG "	#4002="#4002"		(R-DOC)" 
	LOGMSG "	#4060="#4060"		(R-TOO)L"
	LOGMSG "	#4011="#4011"		(F-FEED)" 
	LOGMSG "	#4012="#4012"		(F-DOC)" 
	LOGMSG "	#4061="#4061"		(F-TOO)L"
	LOGMSG "	#4050="#4050"		(F-STOCK)"
	LOGMSG "	#4000="#4000"		(SAFETY DISTANCE)"
	LOGMSG "	#1100="#1100"		(CYCLE INDEX)"
	LOGMSG "M99"
het idee is duidelijk.. dit maakt dat je de code makkelijk kan lezen en eventueel aanpassen..
M99 verwijst naar een Subroutine in mijn Macrofile die kijkt naar de waarde van #1100, die wijst namelijk naar de subroutine die het algoritme bevat om met deze parameters een vlakdraaibewerking te doen.. ( omdat langs en vlakdraaien dezelfde parameters bevatten, kan ik deze waarde ook veranderen in 2.. en gaat ie langsdraaien.. het enige verschil tussen deze twee bewerkingen is immers de bewerkingsrichting..

Zodra dus deze parameters weggeschreven zijn naar Teach_in.nc merkt EdingCNC dat het gewijzigd is.. en wordt het bestand opnieuw geladen..en toont ie de bewerking op het scherm...

Nou ben ik doende met het herschrijven van mijn macro.. met meer functionaliteit.. vandaar dat ik alles in aparte subs heb opgedeeld.. en in mijn Usersub alleen nog maar Gosubs staan.. want.. als ik een bewerking gedaan heb.. dan vraagt de machine (afhankelijk van een instelling) of ik de bewerking wil opslaan in het programma "Partprogram.nc".. inplaats van overschrijven, schrijft mijn macro dan de parameters erbij!.. zodat ik meerdere cycli in één programma af kan lopen.. een toolchange wordt ook als cyclus gezien.. dus ook die komen erbij..

Als ik nu een serie onderdelen moet gaan draaien.. dan zet ik de "Vraag" opslaan in partprogram aan, ik programmeer eerste cyclus, loop em af.. goed?.. toont ie opnieuw de dialoog.. zodat ik dingen kan veranderen indien nodig.. dan Ok heien.. en dan wordt ie opgeslagen.. Volgende cyclus proggen en aflopen.. goed?.. opslaan.. en zo verder.. als dan het eerste onderdeel klaar is, dan zet ik nummer 2 in de machine.. laad het programma PartProgram, druk op start, en ga koffie drinken.. :lol:

Gebruikersavatar
Arie Kabaalstra
Berichten: 9040
Lid geworden op: 07 feb 2007 18:37
Locatie: Bakhuuz'n
Contacteer:

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

Bericht door Arie Kabaalstra » 20 okt 2015 19:03

Code: Selecteer alles

;file created at: 20151020-150509
m100
m6t5
(cycle definition facing)
	#1100=1			(cycle index)
	#1020=0			(internal/external)
	#4000=0.5		(safetydistance)
	#1001=29.5		(x1)
	#1003=0.5		(z1)
	#1011=47		(x2)
	#1013=0.1		(z2)
	#4002=0.05		(depth of cut)
	#4001=40		(feed)
	#4005=30		(finish feed)
(end cycle)
m99
(cycle definition turning)
	#1100=2			(cycle index)
	#1020=0			(internal/external)
	#4000=0.5		(safetydistance)
	#1001=29.5		(x1)
	#1003=0.1		(z1)
	#1011=32.7		(x2)
	#1013=-6		(z2)
	#4002=0.1		(depth of cut)
	#4001=40		(feed)
	#4005=30		(finish feed)
(end cycle)
m99
(cycle definition turning)
	#1100=2			(cycle index)
	#1020=0			(internal/external)
	#4000=0.5		(safetydistance)
	#1001=32.7		(x1)
	#1003=0.1		(z1)
	#1011=35.7		(x2)
	#1013=-3.5		(z2)
	#4002=0.1		(depth of cut)
	#4001=40		(feed)
	#4005=30		(finish feed)
(end cycle)
m99
(cycle definition turning)
	#1100=2			(cycle index)
	#1020=0			(internal/external)
	#4000=0.5		(safetydistance)
	#1001=35.7		(x1)
	#1003=0.1		(z1)
	#1011=42.5		(x2)
	#1013=-1.1		(z2)
	#4002=0.1		(depth of cut)
	#4001=40		(feed)
	#4005=30		(finish feed)
(end cycle)
m99
m6 t1
(cycle definition facing)
	#1100=1			(cycle index)
	#1020=0			(internal/external)
	#4000=0.5		(safetydistance)
	#1001=42		(x1)
	#1003=0.1		(z1)
	#1011=47		(x2)
	#1013=0		(z2)
	#4002=0.05		(depth of cut)
	#4001=40		(feed)
	#4005=30		(finish feed)
(end cycle)
m99
(cycle definition turning)
	#1100=2			(cycle index)
	#1020=0			(internal/external)
	#4000=0.5		(safetydistance)
	#1001=42.4		(x1)
	#1003=0		(z1)
	#1011=43		(x2)
	#1013=-1.1		(z2)
	#4002=0.05		(depth of cut)
	#4001=40		(feed)
	#4005=30		(finish feed)
(end cycle)
m99
(cycle definition turning)
	#1100=2			(cycle index)
	#1020=0			(internal/external)
	#4000=0.5		(safetydistance)
	#1001=35.6		(x1)
	#1003=-1.1		(z1)
	#1011=36.2		(x2)
	#1013=-3.5		(z2)
	#4002=0.05		(depth of cut)
	#4001=40		(feed)
	#4005=30		(finish feed)
(end cycle)
m99
(cycle definition turning)
	#1100=2			(cycle index)
	#1020=0			(internal/external)
	#4000=0.5		(safetydistance)
	#1001=32.5		(x1)
	#1003=-3.5		(z1)
	#1011=33.2		(x2)
	#1013=-6		(z2)
	#4002=0.05		(depth of cut)
	#4001=40		(feed)
	#4005=30		(finish feed)
(end cycle)
m99
m6 t3
g00 x35 z0.5
g00 z-2.7
g01 x38.2 f5
g00 x35
g00 z0.5 
m101
m2
zo ziet bij mij een part-program eruit.. ik draai voor met Tool 5, draai na met tool 1, en steek een groefje met tool 3..
Omdat ik nog geen algoritme voor groefsteken heb geschreven,is dat deel nog "met het handje" geprogrammeerd.
Ook staan er minder parameters in dan in het hierboven geschreven voorbeeld..
Ik heb namelijk in de nieuwe macro het voor en nadraaien in één cyclus gezet.. maar als je het voordraaien, of het nadraaien met voeding 0 programmeert.. dan slaat ie dat over.. zo kun je dus gewoon de nominale maten programmeren.. in plaats van dat je moet gaan staan rekenen.. dat rekenen , dat laat ik wel aan de Emco over.. die is daar beter in dan ik.. ik programmeer gewoon een F-stock van 0.25 (half millimetertje in diameter)
Daarmee kan ik ook voor en nadraaien met verschillende tools.. de wissel gaat tenslotte ook automatisch.. en omdat het tool nu in de cyclus zit.. hoef ik daar ook niet meer om te denken.. ik kan gewoon "doorkloppen"

Gebruikersavatar
Arie Kabaalstra
Berichten: 9040
Lid geworden op: 07 feb 2007 18:37
Locatie: Bakhuuz'n
Contacteer:

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

Bericht door Arie Kabaalstra » 03 nov 2015 00:31

Ik trek deze weer even open.. waarom?... omdat ik weer iets ontdekt heb..

Eigenlijk stom.. ik gebruikte het foefje op de Heidenhain freesbank ook wel.. waarom ben ik het al die jaren vergeten?..

Waar gaat het om?.. welnu.. Incrementeel verplaatsen.. zonder G91!.. Hoe kan dat?..
Isse simpel.. leg ik even uit..

G00 X20 Y 0 ; dat lijkt me duidelijk
;en dan.. let op het springen van de lintworm!
G00 X[#5001+10] Y[#5002+10]

In die regel zit em de kneep.. #5001 en #5002 zijn de parameters voor de actuele X en Y waarden.. en daar tel ik gewoon 10 bij.. die regel heeft dus hetzelfde effect als

G00 G91 X10 Y10

Maar.. je hoeft de volgende regel dus niet meer je G90 aan te zetten.. :lol:

'k dacht.. zal het maar even delen hier.. ( kan van pas komen in Macrootjes.. terugtrekken met veiligheidsafstand.. hoef je niet te rekenen.. geen aparte parameters aan te maken.. of G91/G90 te proggen.
"dajjetmaareffeweet"

Gebruikersavatar
audiomanics
Donateur
Berichten: 4828
Lid geworden op: 28 feb 2007 09:31
Locatie: Appelscha
Contacteer:

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

Bericht door audiomanics » 03 nov 2015 00:43

Ik neem aan dat je 't wel even geprobeerd hebt.. want als je vooruit leest (LAF) is dat register nog niet gevuld met de juiste waarde..misschien..
Heb je trouwens iets voor "random" getallen??? (kan ik wel gebruiken bij mijn Voronoi implementatie.. Geheel in EdingCNC..)

Kees
<klik>... euh..test... 123.... einde test... uit.<klik>

Gebruikersavatar
hugo stoutjesdijk
Donateur
Berichten: 6891
Lid geworden op: 02 mar 2011 17:04
Locatie: elst (u)
Contacteer:

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

Bericht door hugo stoutjesdijk » 03 nov 2015 08:46

Waarom je dat foefje ook al op de heidenhain gebruikt ontgaat me, daar schrijf je gewoon XI10 als je die ene beweging incrementeel wilt hebben.
Ik ben voor meer techniek op school, maar dan wel vanaf groep 1 basischool.

Gebruikersavatar
DaBit
Donateur
Berichten: 8146
Lid geworden op: 05 dec 2012 13:48
Locatie: Oss

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

Bericht door DaBit » 03 nov 2015 08:59

audiomanics schreef:Ik neem aan dat je 't wel even geprobeerd hebt.. want als je vooruit leest (LAF) is dat register nog niet gevuld met de juiste waarde..misschien..
Jawel, want dat zit in de interpreter. Die kan best een eindje vooruit lopen en z'n segmenten naar de trajectplanner spugen.
Heb je trouwens iets voor "random" getallen??? (kan ik wel gebruiken bij mijn Voronoi implementatie.. Geheel in EdingCNC..)
Hmm, normaal doe je dat o.a. met een LFSR
Het zal het nog niet helemaal triviaal zijn om losse bitjes te isoleren, maar met wat round() en delen kom je d'r wel.

Gebruikersavatar
audiomanics
Donateur
Berichten: 4828
Lid geworden op: 28 feb 2007 09:31
Locatie: Appelscha
Contacteer:

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

Bericht door audiomanics » 03 nov 2015 09:59

DaBit schreef:Hmm, normaal doe je dat o.a. met een LFSR
Duidelijk verhaal en ook goed in programma te vatten (misschien wat omslachtig, maar bij gebrek aan een Random() functie)

Kees
<klik>... euh..test... 123.... einde test... uit.<klik>

Gebruikersavatar
Arie Kabaalstra
Berichten: 9040
Lid geworden op: 07 feb 2007 18:37
Locatie: Bakhuuz'n
Contacteer:

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

Bericht door Arie Kabaalstra » 03 nov 2015 12:04

op de Heidi gebruikte ik het om vanuit actuele positie nieuwe posities te berekenen.. zoals CC's.. voor polaire bewegingen.. of een CC voor een polaire array..

't nut is niet altijd het belangrijkste criterium.. dat het kan..daar gaat het soms ook om.. :lol:

Ik probeer altijd alle mogelijkheden uit.. bijvoorbeeld het foefje in mijn macro's.. dat ik de macro het programma laat schrijven dat de machine moet uitvoeren.. daardoor krijg ik eerst een preview na het invoeren van mijn dialoog.. normaliter als je een programma met een dialoog schrijft.. gaat ie meteen aan de slag met de ingegeven parameters.. dat was voor mij niet acceptabel.. ik wilde eerst een preview.. dus.. dan zo maar..

Zelfs Bert Eding begreep in eerste instantie niet hoe ik dat geflikt had.. Ok.. hij kent alle ins en outs van zijn software.. maar hij had LOGMSG nog nooit gebruikt voor het schrijven van Code.. dat was simpelweg nog niet bij em opgekomen..

Gebruikersavatar
Arie Kabaalstra
Berichten: 9040
Lid geworden op: 07 feb 2007 18:37
Locatie: Bakhuuz'n
Contacteer:

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

Bericht door Arie Kabaalstra » 25 nov 2015 00:21

Ik heb vandeweek een nuttige toepassing gevonden voor het Abs/inc programmeren in één regel.. Schroefdraadfrezen.. je kunt een spiraal programmeren met :

G02 x-20 y0 z[#5003-0.25] r20
G02 x20 y0 z[#5003-0.25] r20

zo krijg je een cirkeltje om x0 y0, radius 20, met een spoed van 0.5.. kan handig zijn in een macrootje.. zeker als je de spoed in een hoek verrekend... hoef je niet op hele halve cirkels uit te komen.. bereken je gewoon de z voor de laatste gedeeltelijke gang.. en presto!.. :)

Gebruikersavatar
hugo stoutjesdijk
Donateur
Berichten: 6891
Lid geworden op: 02 mar 2011 17:04
Locatie: elst (u)
Contacteer:

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

Bericht door hugo stoutjesdijk » 25 nov 2015 09:26

Ik vind een G2 zonder middelpunt toch altijd een beetje kaal, zou het zo oplossen.

Code: Selecteer alles

G0 X20 Y0
G2 I0 J0 ZI-0.5   

En als ik in 3 omwentelingen naar beneden wil:

Code: Selecteer alles

G9 G2 I0 J0 WI(3*360) ZI-1.5
( G9 =poolcoordinaten, WI is incrementele hoek ZI is incrementeel zakken )
Maar ja ik heb ook een exoot, die zo makkelijk is dat iedereen er bang van is. :mrgreen:
Ik ben voor meer techniek op school, maar dan wel vanaf groep 1 basischool.

Gebruikersavatar
Arie Kabaalstra
Berichten: 9040
Lid geworden op: 07 feb 2007 18:37
Locatie: Bakhuuz'n
Contacteer:

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

Bericht door Arie Kabaalstra » 25 nov 2015 10:09

en dat gaat nou net weer niet in EdingCNC.. :lol: .. ik zal het eens bij Bert op zijn bord gooien.. :)
op zich is een "I" volgens mij nog wel te verwezenlijken in de Software van de Interpreter.. komt neer op..

IF (Aswoord contains :"I")
movement =(#500X/Y/Z/A/B/C+Coordinate)
ENDIF

Ik zal het eens voorstellen...G90/G91 is me te omslachtig.. :mrgreen:

Ferry
Berichten: 218
Lid geworden op: 28 jul 2007 09:32
Locatie: Rilland
Contacteer:

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

Bericht door Ferry » 08 apr 2019 17:44

Geweldig topic dit al een hoop van geleerd maar ik zit toch met een probleempje waar ik niet 123 aan uitkom

Ik heb een macro proberen te maken die aan de hand van een dialoog in een spiraalvorm een gat freest
In de dialoog geef ik de volgende parameters in

x,y coordinaten van centrum gat.
Diameter van het te frezen gat
De stap groote voor de z-verplaatsing
De freesvoeding
Totale te frezen diepte

Ik heb geprobeerd de code zo "slim te maken dat hij op voorhand detecteert dat b.v. de diameter van de actuele tool te groot is om het gat te kunnen frezen. Daarvoor hou ik de regel aan dat de diameter van het te frezen gat minimaal 1 mm groter moet zijn dan de diameter van de actuele tool

Echter als ik nu een programma laad wat deze macro aan wil roepen krijg al direct de melding
L701 Gosub nesting to deep, stack overflow

Het lijkt erop alsof de macro voordat hij ook nog maar daadwerkelijk is aangeroepen al draait met een aantal aangenomen waardes!

En als ik dit via een hoop omwegen weet te vermijden dan zit ik nog met het volgende.
Als ik vanuit de macro na het detecteren van een onjuiste ingave via een gosub de macro opnieuw aanroep dan krijg ik na 25 keer op ok klikken uiteraard dezelfde foutmelding!
Dit lijkt mij ook niet de juiste manier van programmeren.

Ik ben opgegroeid in het tijdperk dat je gewoon nog een Goto gebruikte als er ergens een conditiecheck werd gedaan, en ga blijkbaar met het gosub gebeuren ergens goed de mist in.

bijgevoegd de code zoals ik die in de user_macro.cnc heb gezet.

Hopelijk kan een van de slimmeren hier eens zijn mening geven over deze fout

Bij voorbaat hartelijk dank,
Ferry......

Code: Selecteer alles

;user macro

SUB GATHELIX

; #####################
; gat frezen in helix #
; #####################
;
;
; begruikte variabelen
;
; #1	Diameter van actuele gereedschap
; #2	Totale te frezen diepte
; #3  	stapgroote
; #10	X-positie
; #11	Y-positie
; #12	Diameter gat
; #20  	Voedingssnelheid
; #99   Errorvlag   0=geen error,1=wel error
;
;
#99=1   ; geen error

#1=[#5009*2]   ; radius van actuele tool *2

; Dialoog om diverse variabelen op te vragen

DLGMSG "GATHELiX" "X-maat centrum" 10 "Y-maat centrum" 11 "Diameter gat" 12 "Totale diepte" 2 "Z-stap" 3 "Voeding" 20


; controle of er op cancel is gedrukt
if [#5398==-1] then         ; macro beindigen als er op cancel is gedrukt
    m30
endif

gosub CONTROLE              ; Controle's uitvoeren

if [#99==1]                 ; opnieuw data invoeren er is een fout gevonden
    gosub gathelix
endif


; #########################
; # Code om gat te frezen # 
; #########################

;#############################################################3


#30=[#2/#3]       ; aantal rondgangen
#31=fix[#30]      ; aantal rondgangen afgerond naar beneden
#32=[#31*#3]      ; Totale diepte afgeronde rondgangen
#33=[#2-#32]      ; nog af te leggen diepte voor laatste rondgang
#34=[#33/2]


#4=[#3/2]         ; DIEPTE PER HALVE GAT
#13=[#12-#1]      ; VERSCHIL TUSSEN GAT EN FREESDIAMETER
#14=[#13/2]       ; HALVE VERSCHIL
#15=#31           ; AANTAL RONDJES DAT GEMAAKT MOET WORDEN
#17=0             ; TELLER VOOR AANTAL RONDJES
#18=[#13/2]
;========================================

S12000 M03    	; spindel start
M00		; pauze wachten tot spindel op toeren is
G90 G00 z20	; 20 mm boven materiaal

G00 X#10 y#11	; ijlgang naar centrum gat
G00 z1		; ijlgang tot 1 mm boven materiaal

G91                ; RELATIEF PROGRAMMEREN	
G01 X[0-#14] F#20  ; AANLOPEN NAAR LINKERKANT GAT
;
G01 z-0.9           ; 0.1 mm boven materiaal

WHILE [#17< #15]
    G03 X#13 Y0 R#18 Z[0-#4]      ; 1e HALVE CIRCLE TEGEN DE KLOK IN MET Z-VERPLAATSING
    G03 X[0-#13] Y0 r#18 Z[0-#4]  ; 2e HALVE CIRCLE TEGEN DE KLOK IN MET Z-VERPLAATSING
    #17=[#17+1]			  ; rondgang teller verhogen
ENDWHILE
;
; vanaf hier nog 1 maal rond met laatste stukje verplaatsing in Z-as
;
G03 X#13 Y0 R#18 Z[0-#34]           ; 1e HALVE CIRCLE TEGEN DE KLOK IN met laatste Z-VERPLAATSING
G03 X[0-#13] Y0 r#18 Z[0-#34]       ; 2e HALVE CIRCLE TEGEN DE KLOK IN met laatste Z-VERPLAATSING

G03 X#13 Y0 R#18 Z0                 ; 1e HALVE CIRCLE TEGEN DE KLOK IN ZONDER Z-VERPLAATSING
G03 X[0-#13] Y0 r#18 Z0             ; 2e HALVE CIRCLE TEGEN DE KLOK IN ZONDER Z-VERPLAATSING

G01 z#2; eerst omhooG
G01 z1

G01 X#14                            ; TERUG NAAR CENTRUM VAN HET GAT
G01 z#2                             ; totale diepte terug omhoog

;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
G90                               ; TERUG NAAR ABSOLUUT PROGRAMEREN
G01 Z20 F1000
M05

ENDSUB



sub CONTROLE
#50=[[#12-1]/2]        ; (Gatdiameter -1 mm) /2 
	

if [#5009<#50] then                     ; FREES IS KLEIN GENOEG VOOR HET GAT
    msg "#5009 is kleiner dan #50"
     #99=0   ; errorvlag op 0 zetten geen fout dus
endif
	
if [#5009>=#50] then                     ; FREES IS TE GROOT VOOR HET GAT
    msg "#5009 is groter dan #50"
    #99=1    ; Errorvlag op 1 zetten dus fout
endif

endsub


Gebruikersavatar
Arie Kabaalstra
Berichten: 9040
Lid geworden op: 07 feb 2007 18:37
Locatie: Bakhuuz'n
Contacteer:

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

Bericht door Arie Kabaalstra » 09 apr 2019 02:17

Die Stack overflow komt omdat je je Sub recursief aanroept.. ( duur woord) je roept het begin aan vanuit ergens in de Sub.. 't kan in sommige specifieke gevallen .. maar met een stack van maximaal 25 levels.. is't nie handig..
Ik ben opgegroeid in het tijdperk dat je gewoon nog een Goto gebruikte als er ergens een conditiecheck werd gedaan, en ga blijkbaar met het gosub gebeuren ergens goed de mist in.
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.

Terug naar de probleemstelling..
Ik denk dat je een denkfoutje hebt gemaakt,

Code: Selecteer alles

; #99   Errorvlag   0=geen error,1=wel error
;
;
#99=1   ; geen error
Die spreken elkaar tegen.. 'k heb even een testje geschreven.. en ik had in eerste instantie hetzelfde probleem..

Code: Selecteer alles

#100=1
gosub testje
gosub dcheck
msg"#100=" #100
M2

sub Testje
Dlgmsg"Voer 1 in" "voer 1 in" 100
gosub controle
endsub

SUB DCHECK
	IF [#5398 <1]
		MSG "USER CANCELLED OPERATION"
		M2
	ENDIF
ENDSUB

sub controle
 if[#100<>1]
 gosub testje
 endif
endsub
 
Wat ik zelf altijd aan houd in het schrijven van macro's is ALLES opdelen in Subroutines.
Je onderneemt een aantal stappen:
1- Gegevens "ophalen"
2- Dialoog OK/Cancel Check
3- Toolcontrole (past of niet)
4- Uitvoer
5- Terugkeer naar startpunt

Simpllicity is prerequisite for reliability aldus Edsger W. Dijkstra
Zelf hou ik dan van structuur.. Ik begin in mijn User Sub met een Gosub, en nog een en nog een.. Laat ik je zien:
Bij voorkeur gooi ik mijn macrootjes in een UserSub

Code: Selecteer alles

SUB User_1
	gosub dialog1
	gosub dialogcheck
	gosub toolcheck
	gosub Gathelix
	gosub rectract
ENDSUB

en.. ja.. mijn macro ziet er in de praktijk ECHT zo uit..

Code: Selecteer alles

;REGION USER SUBROUTINES
SUB USER_1
	;FACING
	;SET WRITE PARAMETER
	#1060=[0]
	#1100=[1]
	GOSUB DIALOGS
	GOSUB TOOLCHECK
	GOSUB FILEWRITE
ENDSUB

SUB USER_2
	;TURNING
	;SET WRITE PARAMETER
	#1060=[0]
	#1100=[2]
	GOSUB DIALOGS
	GOSUB TOOLCHECK
	GOSUB FILEWRITE
ENDSUB

SUB USER_3
	;FILLET
	;SET WRITE PARAMETER
	#1060=[0]
	#1100=3
	GOSUB DIALOGS
	GOSUB TOOLCHECK
	GOSUB FILEWRITE
ENDSUB
Dit zijn namelijk de eerste 3 subs uit mijn Draaibankmacro

Waarom alles in aparte Subjes gooien?... in programmeer paradigma's spreekt men van "overerving" of Inheritance, bepaalde trucjes die je bij meerdere functies moet uitvoeren.. die schrijf je apart.. en elke functie die je schrijft "erft" dat trucje..

als je zoals ik zo'n beetje al je "slots" met Macrootjes volgestampt hebt.. wil je echt niet 20 keer een routine gaan schrijven die de dialoog controleert.. of je OK of Cancel gedrukt heb.da's altijd dezelfde parameter.. kan dus met dezelfde Sub routine..

Code: Selecteer alles

SUB DLGCHECK
	IF [#5398 <1]
		MSG "USER CANCELLED OPERATION"
		M2
	ENDIF
ENDSUB
Ik ben zelf geen liefhebber van recursieve algortimen, ofwel een het begin van een sub vanuit die sub aanroepen in bepaalde gevallen..
in het "testprogrammaatje" wat ik even in elkaar gekliederd heb, werkt het niet betrouwbaar.. beter is het om net als bij een Cancel op je dialoog gewoon een M2 eruit te gooien, of een "Errmsg", want wat je met de controle doet is een "error afvangen"

Zoals gezegd.. recursieve algoritmen.. daar zitten de nodige haken en ogen aan.. beter om ze niet te gebruiken, de stackhoogte is er ook om infinite loops te voorkomen..

Code: Selecteer alles

#100=1
gosub testje
gosub dcheck
gosub controle
msg"#100=" #100
M2

sub Testje
Dlgmsg"Voer 1 in" "voer 1 in" 100

endsub

SUB DCHECK
	IF [#5398 <1]
		MSG "USER CANCELLED OPERATION"
		M2
	ENDIF
ENDSUB

sub controle
 if[#100<>1]
 errmsg #100 "<>1"
 M2
 endif
endsub
Zo werkt het gegarandeerd..

even teruggrijpend naar het begin van het verhaal:

Code: Selecteer alles

SUB User_1
	gosub dialog1
	gosub dialogcheck
	gosub toolcheck
	gosub Gathelix
	gosub rectract
ENDSUB
je begint met het aanroepen van je dialoog.. Ik heb die ook apart in subroutines staan.. omdat ik een "write parameter" heb, een "flag" zo je wilt, waarmee ik bepaal waar ik de parameters heen schrijf.. ik laat mijn macro's namelijk een NC programma schrijven dat bij het opstarten automatisch geladen wordt, en herladen wordt als ik het wijzig.. da's mijn "teach in"programma, waar ik slechts 1 bewerking in kan programmeren.. Ik kan ook een "write parameter"zo instellen dat ie de geprogrammeerde bewerking ook in een "partprogram" schrijft, zodat ik meerdere bewerkingen onder elkaar in een programma kan zetten. zodoende kan ik bewerking voor bewerking een heel programma opbouwen.. het eerste product programmeer ik bewerking voor bewerking, en na het aflopen van mijn Teach in programma kan ik em wegschrijven naar het partprogram.. ik krijg de dialoog nogmaals te zien ( dezelfde dialoog) maar als ik dan op OK klik, dan schrijft ie em weg naar het Partprogram.. (overerving.. remember?).. daarom dus..

Maar terug.. dialoog ingevuld.. checken of er OK of Cancel geklikt is.. dan kijken of het tool past.. dan ga je naar je GatHelix, waar je de boel gaat uitfrezen, en dan rectract.. een foefje wat ik uitgevlooid heb is het volgende:

ik sla de startpositie voor ik ga bewegen op in machine coordinaten, en daar heb ik een M-Code voor gemaakt, dat kan in EdingCNC heel makkelijk:

Code: Selecteer alles

SUB M100
	;STORE STARTPOINT IN MACHINECOORDINATES
	#1501=[#5071*2]
	#1503=[#5073]
ENDSUB
Let wel.. dit is alleen de X en de Z as.. want deze is geschreven voor de draaibank
met M100 in je programma sla je het huidige coordinaat op, en met M101 loop ik terug naar die positie.
Ik heb dit bewust in MACHINE coordinaten gedaan, omdat ik dan zeker weet dat de slede op precies dezelfde positie terugkomt.. dit vanwege het gegeven dat ik op de draaibank een ATC heb met 6 tools in verschillende lengtes..
Stel.. ik heb gedraait met T2, een mesbeitel die 5 mm voor de ATC plaat uitsteekt, en daarna moet ik met T3 aan de slag, een binnendraaibeitel met 30 mm uitsteeklengte t.o.v. de ATC plaat..
Als ik terugtrek tot Z10.. staat mijn T3 nog 20 mm voorbij Z0, en dan kan ik niet wisselen zonder aanvaring..
Ik start altijd met de langste tool in mijn ATC vrij van mijn werkstuk.. met MACHINE coordinaten kom ik dan altijd op een veilige plaats.. (ik heb ervaringen met een draaibank met een FAGOR besturing die dus wel in werkstuk coordinaten terugtrok.. best lullig als je met een korte mesbeitel gewerkt had, en hij dan wilde wisselen naar een binnendraaibeitel die veel langer was.. dat was echt een serieuze bug.. )

Code: Selecteer alles

SUB M101
	;RETURN TO POSITION STORED IN M100 IN MACHINECOORDINATES
	G00 G53X #1501 Z#1503
ENDSUB
Voor het "rectracten" hoef ik dus alleen maar M101 te programmeren..

Terug verplaatsen naar veiligheidsafstand, dat doe ik altijd in de uitvoer van de bewerking.. je begint op een veiligheidsafstand, en daar eindig je ook.. da's een vast gegeven van elke bewerkingscyclus op elke denkbare machine.
je bent in feite gewoon bewerkingscycli aan het schrijven, net zoals je die vindt op professionele CNC machines, zoals bijvoorbeeld Heidenhain en Fagor..

Dan heb ik nog een programmeer foefje voor je.. je hoeft niet in G91 te programmeren.. ik geef er zelf ook de voorkeur aan dat NIET te doen..
je kunt wel incrementeel programmeren in een regel naast absolute coordinaten, dan gebruik je de huidige werkstuk coordinaten, en daar tel je de incremnentele beweging bij op:

Code: Selecteer alles

G01 x100 y 100 z[#5003-2]
in deze regel gaat de machine naar x100, y100, en 2 mm naar beneden in de Z-richting..
Ik bereken in mijn bewerkings cycli de coordinaten ten opzichte van de startcoordinaten , en die gebruik ik in mijn cyclus.. dat geeft je ook de mogelijkheid om als werkstuk oppervlak een andere waarde dan Z0 te gebruiken.. , wat je dan wel zelf uit moet zoeken is : de waarden die ik ingeef, zijn die incrementeel of absoluut... de Radius is een absolute waarde, de diepte kun je Incrementeel maken.. zeg dat je -6 kiest, en je werkstuk oppervlak is Z2, dan ga je tot Z-4.. programmeer je de diepte absoluut, dan moet je -4 programmeren in dat geval.. da's een keuze die je zelf moet maken, en ook konsekwent moet doorvoeren in al je macro's!

Schrijf dat op in een soort "manual", maak ook een lijstje met vaste parameters voor waarden die je altijd gebruikt.. dus altijd dezelfde Parameters voor je startcoordinaten, diepte, voeding, tool, radius, dieptestap, voeding enzovoorts.. Voeding kun je ook in Non-Volatile parameters ( nummer #4000 en hoger m.u.v. #4996-#4999, want die zijn gereserveerd voor de toolsetter)
Dan heb je standaard een "Standaard voeding" in je dialoog..

't is een heel verhaal geworden, maar programmeren is makkelijk, echter niet eenvoudig!.. en.. zoals Edsger W. Dijkstra zegt: The competent programmer is fully aware of the strictly limited size of his own skull; therefore he approaches the programming task in full humility, and among other things he avoids clever tricks like the plague.

Plaats reactie