G02 ...

Programování encéček obecně, učebnice, firemní dokumentace, implementace konkrétních systémů, Siemens, Haidehain, Fanuc atd...
Odpovědět
dzairo
Příspěvky: 131
Registrován: 17. 9. 2008, 9:33

17. 9. 2008, 9:59

Ahoj vsetci.
Som novy na tomto fore a mam na vas otazku.
Pisem vlastny program na ovladanie CNC (jednoduche cnc 3osy)
a mam problem s G codom.

Prikaz G02 definuje kruznice alebo kruhovy vysek .
Ak je zapis v G02 X Y I J tak je jednoduche spravit kruznicovu interpolaciu lebo pozname polohu stredu kruznice.

Ale ako sa to pocita ked je prikaz v tvare G02 X Y R ????
ako urcim polohu stredu ak poznam len polomer a pocitocny bod a poncovy bod????

vie mi niekto poradit s tymto problemom???

dakujem dzairo
prochaska
Sponzor fora
Příspěvky: 8163
Registrován: 16. 7. 2006, 12:33
Bydliště: Praha Bohnice + Roudnice nad Labem
Kontaktovat uživatele:

17. 9. 2008, 10:29

Necht P=[Px,Py] je pocatecni bod, K=[Kx,Ky] koncovy bod, R polomer a S=[Sx,Sy] hledany stred. S lezi na pruseciku kruznice k se stredem K a polomerem R a kruznice p se stredem P a polomerem R. Uloha muze mit dve reseni. Pruseciky najdeme bud resenim soustavy dvou rovnic kruznice nebo volanim nize uvedene funkce

geo_2kruznice(Px,Py,R,Kx,Ky,R,S1x,S1y,S2x,S2y,neex)

(misto S je pouzito S1 a S2 pro obe reseni, neex je promenna typu boolean)


{----------------------------------------------------------------------------}
procedure geo_2kruznice (
xs1,ys1 : float; { stred prvni kruznice }
r1 : float; { polomer prvni kruznice }
xs2,ys2 : float; { stred druhe kruznice }
r2 : float; { polomer druhe kruznice }
var x1,y1 : float; { 1. prusecik }
var x2,y2 : float; { 2. prusecik }
var neex : boolean); { True = prusecik neexistuje }
{ False = existuje }
{ Najde oba pruseciky dvou kruzic. }
{----------------------------------------------------------------------------}
begin {geo_2kruznice}
neex:=false;

{ kontrola existence }
if not le(geo_delka(xs1,ys1,xs2,ys2),r1+r2) then begin
neex:=true;
exit;
end {if};

(*
FullSimplify [ Solve [ { (x-xs1)^2+(y-ys1)^2==r1^2,(x-xs2)^2+(y-ys2)^2==r2^2},{x,y}] ]
*)

x1:=((1/(2*((xs1-xs2))*((sqr((xs1-xs2))+sqr((ys1-ys2))))))*(((-sqr(r1))*sqr((xs1-xs2))+sqr(r2)*sqr((xs1-xs2))+((xs1-xs2))*((xs1+xs2))*((sqr((xs1-xs2))+sqr((ys1-ys2))))+ys1*sqrtz(neex,(-sqr((xs1-xs2)))*(((-sqr((r1-r2)))+sqr((xs1-xs2))+sqr((ys1-ys2))))*(((-sqr((r1+r2)))+sqr((xs1-xs2))+sqr((ys1-ys2)))))-sqrtz(neex,(-sqr((xs1-xs2)))*(((-sqr((r1-r2)))+sqr((xs1-xs2))+sqr((ys1-ys2))))*(((-sqr((r1+r2)))+sqr((xs1-xs2))+sqr((ys1-ys2)))))*ys2)));

y1:=((-sqrtz(neex,(-sqr((xs1-xs2)))*(((-sqr((r1-r2)))+sqr((xs1-xs2))+sqr((ys1-ys2))))*(((-sqr((r1+r2)))+sqr((xs1-xs2))+sqr((ys1-ys2))))))+sqr(r2)*((ys1-ys2))+sqr(r1)*(((-ys1)+ys2))+((sqr((xs1-xs2))+sqr((ys1-ys2))))*((ys1+ys2)))/(2*((sqr((xs1-xs2))+sqr((ys1-ys2)))));

x2:=((1/(2*((xs1-xs2))*((sqr((xs1-xs2))+sqr((ys1-ys2))))))*(((-sqr(r1))*sqr((xs1-xs2))+sqr(r2)*sqr((xs1-xs2))+((xs1-xs2))*((xs1+xs2))*((sqr((xs1-xs2))+sqr((ys1-ys2))))-ys1*sqrtz(neex,(-sqr((xs1-xs2)))*(((-sqr((r1-r2)))+sqr((xs1-xs2))+sqr((ys1-ys2))))*(((-sqr((r1+r2)))+sqr((xs1-xs2))+sqr((ys1-ys2)))))+sqrtz(neex,(-sqr((xs1-xs2)))*(((-sqr((r1-r2)))+sqr((xs1-xs2))+sqr((ys1-ys2))))*(((-sqr((r1+r2)))+sqr((xs1-xs2))+sqr((ys1-ys2)))))*ys2)));

y2:=(sqrtz(neex,(-sqr((xs1-xs2)))*(((-sqr((r1-r2)))+sqr((xs1-xs2))+sqr((ys1-ys2))))*(((-sqr((r1+r2)))+sqr((xs1-xs2))+sqr((ys1-ys2)))))+sqr(r2)*((ys1-ys2))+sqr(r1)*(((-ys1)+ys2))+((sqr((xs1-xs2))+sqr((ys1-ys2))))*((ys1+ys2)))/(2*((sqr((xs1-xs2))+sqr((ys1-ys2)))));

end {geo_2kruznice};



{----------------------------------------------------------------------------}
function sqrtz (var neex : boolean;
n : float)
: float;
{ Odmocnina s testem a korekci nezapornosti. }
{ NEEX je na zacatku aby se dal snadno automaticky dopsat mezi parametry. }
{----------------------------------------------------------------------------}
begin {sqrtz}
neex:=false;
{ z nepatrneho zaporneho cisla se udela cista nula }
if (n>-epsilon) and (n<0) then n:=0;

{ neexistuje ? }
if n<0 then begin
n:=0;
neex:=true;
end;

result:=system.Sqrt(n);
end {sqrtz};



{----------------------------------------------------------------------------}
function geo_delka (x1,y1,x2,y2 : float) : float;
{ Delka usecky. }
{----------------------------------------------------------------------------}
begin {geo_delka}
geo_delka := sqrt(sqr(x1-x2)+sqr(y1-y2));
end {geo_delka};
Aleš Procháska
dzairo
Příspěvky: 131
Registrován: 17. 9. 2008, 9:33

17. 9. 2008, 11:28

Som prekvapeny. cele riesenie problemu. Ked budem mat trtochu casu tak to rozoberiem.
Rovno otazka ci nemas funkciu G02 kodu. Teda cele riesenie nielen najdenia bodu ale aj interpolaciu kruznice alebo useku kruznice.
Na nete je vela veci ( http://reprap.org/bin/view/Main/WebHome ) to je komplet projekt ale nema akceleraciu a deceleraciu rychlosti a nieje to realtime .

ako reaguje masina ak zisti ze udaje su neplatne teda plomer alebo zadanie polomeru (I,J) je neplatne???
Naco sa pouziva parameter K asi koly stupaniu ako na zavit???
Je G02 kod pre os x,y aj pre z alebo len pre x,y.

zdravim
dzairo
Příspěvky: 131
Registrován: 17. 9. 2008, 9:33

17. 9. 2008, 11:46

pozeram niekolko veci a niesu mi jasne.

kde je funkcia le???

if not le(geo_delka(xs1,ys1,xs2,ys2),r1+r2)

dalej :
{ z nepatrneho zaporneho cisla se udela cista nula }
if (n>-epsilon) and (n<0) then n:=0;

co je epsilon????
geo_delka - urcuje dlzku usecky medzi bodmy start a kniec
sqrtz je test coho???? nezapornosti?? .
co sa stane ak do premennych zadam zaporne hodnoty???

zdravim
prochaska
Sponzor fora
Příspěvky: 8163
Registrován: 16. 7. 2006, 12:33
Bydliště: Praha Bohnice + Roudnice nad Labem
Kontaktovat uživatele:

17. 9. 2008, 11:53

dzairo píše:Som prekvapeny. cele riesenie problemu. Ked budem mat trtochu casu tak to rozoberiem.
Rovno otazka ci nemas funkciu G02 kodu. Teda cele riesenie nielen najdenia bodu ale aj interpolaciu kruznice alebo useku kruznice.
Na nete je vela veci ( http://reprap.org/bin/view/Main/WebHome ) to je komplet projekt ale nema akceleraciu a deceleraciu rychlosti a nieje to realtime .

ako reaguje masina ak zisti ze udaje su neplatne teda plomer alebo zadanie polomeru (I,J) je neplatne???
Naco sa pouziva parameter K asi koly stupaniu ako na zavit???
Je G02 kod pre os x,y aj pre z alebo len pre x,y.

zdravim
Parametr K se používá pro středy kružnic v rovinách XZ resp. YZ (po G18 resp. G19). Stoupání šroubovice se zadává parametrem Z (resp. Y při G18 nebo X při G19).

Interpolaci nemám, to jsem vytáh z mého programovacího jazyka jehož výstupem je ale normální G-kód.

Kruhová interpolace se dělávala pomocí kvadratických čítačů a bylo to docela složité, co jsou teď procesory na bůhvíkolika MHz tak bych teď spíš vsadil na hrubou sílu, jako řídicí parametr vzal úhel a počítal klasicky r sin(fi), r cos (fi) a mezi kroky fi interpoloval lineárně (nebo si udělat tabulku sinů, do megové flashky se jich vejde... :-)). A zároveň se tím elegantně vyřeší rampy. Nebo jestli chceš klasiku tak vzít jednu osu jako řídicí (vždy 1/4 kruhu se musí prohodit) a počítal druhou souřadnici přes Pythagorovu větu, ale rampy budeš muset dopočítávat jinak.
Aleš Procháska
prochaska
Sponzor fora
Příspěvky: 8163
Registrován: 16. 7. 2006, 12:33
Bydliště: Praha Bohnice + Roudnice nad Labem
Kontaktovat uživatele:

17. 9. 2008, 12:02

LE je menší nebo rovno (to jméno funkce je ještě zlozvyk z Fortranu :-)).

Epsilon je nějaké malé číslo, o několik řádů menší než nejmenší souřadnice která má smysl, já používal 1e-6.

geo_delka se počítá mezi začátkem a koncem úsečky (zde tětivou kruhového oblouku) a když je větší než 2R tak úloha nemá řešení a hlásí se chyba (zastavím stroj).

sqrtz je normální odmocnina se zabudovaným kódem chyby který se nastaví když nelze vypočítat (tj. záporný poloměr).

Když zadáš záporný poloměr tak to skončí s chybou (to si musíš ošetřit ručně), záporné souřadnice by to snad mělo zvládnout, matematicky to není na závadu.
Aleš Procháska
dzairo
Příspěvky: 131
Registrován: 17. 9. 2008, 9:33

17. 9. 2008, 1:43

Dakujem.
Co sa tyka zaporneho polomeru tak ten nebude definovany to je somarina, bude len kladna hodnota ale poloha bodu start a bodu stop moze bit v roznych kvadrantoch a teda aj zaporna hodnota.
Co sa tyka tej funkcie LE tak rozumiem. Jednoducho maximalna dlzka tetivy je rovna 2*r alebo mensia. inac je to somarina.
co sa tyka interpolacie tak pouzivam LPC2148 na 72Mhz a chcem pouzit Bersnelov algoritmus kruznicovej intrepolacie (tak nejako sa vola) a jeto jednoduche len treba vediet kde zacat a kde skoncit. x^2+y^2=r^2 ak je lava strana vedsia ako prava tak bod je von z kruznice a ak je mensi tak je vo vnutri kruznice. mam to otestovane a skusim aj nejake insie mozno hotove funkcie. nemam v plane pouzivat sin a cos funkcie ajked procesor bude rychli(relativne aj 100MHz je malo na take veci jedine ak sa pouzije aproximacia) pozeram tvoju fukciu a je tam -sqrt to je aky zapis???
z akeho jazika jeto vitiahnute????
pri konvertovani do C to mozno bude trosku problem ale skusim to .

tie kody G17 a G18 sa naco presne pouzivaju ??? ako sa definuje ak chcem kruznicu ktora je naklonena ????

vdaka
prochaska
Sponzor fora
Příspěvky: 8163
Registrován: 16. 7. 2006, 12:33
Bydliště: Praha Bohnice + Roudnice nad Labem
Kontaktovat uživatele:

17. 9. 2008, 3:19

Algoritmus se jmenuje Bresenhamův :-)

Ten jazyk je Pascal, takže sqr je druhá mocnina a sqrt druhá odmocnina. Můžeš to přepsat prakticky tak jak to je, jen místo = dáš ==, místo := dáš = a musíš upravit volání těch funkcí (var x : boolean) je totéž jako (char *x).

G17 znamená rovinu kružnice svisle v osách XZ a G18 v osách YZ. Ale když už to děláš tak bys měl udělat i kružnici v obecné poloze, nejen v těch třech základních rovinách :-) A šroubovice by měla umět víc chodů, ne jen jeden jak se stalo v poslední době zlozvykem (na to by se to fi jako parametr hodilo).
Aleš Procháska
dzairo
Příspěvky: 131
Registrován: 17. 9. 2008, 9:33

17. 9. 2008, 4:30

v pascale som programoval niekedy teraz v Delphi.

vo vzorci su napisane veci ako :
(((-sqr(r1))*sqr((xs1-xs2))
a pred sqr je - znamienko co jeto za zapis????
v pascale som programoval velmly davno neviem , nepametam si taky zapis.
vo vzorci je tiez pouzita podmienka neex ako vysledok ci vobec moze existovat kruznica. ale predsa da sa to zapisat jednoduchsie.
trosku mi ten vzorec roby problemy v zapise.

Pises:
>>G17 znamená rovinu kružnice svisle v osách XZ a G18 v osách YZ.
neviem ci to chapem ale je to to ze kruznica sa nakresli nie x,y ale x,z alebo ako????

>> Ale když už to děláš tak bys měl udělat i kružnici v obecné poloze, >>nejen v těch třech základních rovinách
to je ako??? (ja nemam vysoku skolu a preto sa vsetko ucim sam)

>> A šroubovice by měla umět víc chodů, ne jen jeden jak se stalo v >>poslední době zlozvykem (na to by se to fi jako parametr hodilo).
tym myslis ze zavit sa bude rezat tak ako chceme nie podla standardnych tabuliek ???

zdravim

PS: privitam kazdu pomoc , teraz mi to robi ciari v 3D , interpolacia.
vela prikazov je jednoduchych ale niektore su komplikovane.
dzairo
Příspěvky: 131
Registrován: 17. 9. 2008, 9:33

17. 9. 2008, 6:41

vo funkcii sqrtz parameter need nema ziadny vyznam a teda tam vobec nemusi byt (aspon si myslim). zakazdym ako sa spusti funkcia sa nastavi neex na false, a teda v zavere neviem urcit ci je cela funkcia (geo_2kruznice ) true alebo false. premenna by sa mala nastvit ako false (vo funkcii geo_2kruznice ) a vo funkcii sqrtz len testovat a definovat true. ak niekde je true tak potom uz sa motna funkcia nic nenastavuje(false).

sqrtz je funkcia ktora urobi druhu odmocninu z cisla a ma testovat ci je kladne alebo zaporne. ak je zaporne tak vrati hodnotu 0 a nastavi need na true(neplatne cislo) a tak cela vysledna funkcia (geo_2kruznice ) je true a to znamena ze nema riesenie (polomer alebo body nedavaju zmysel)
a neda sa sqrtz funkcia riesit jednoduchsie????
prochaska
Sponzor fora
Příspěvky: 8163
Registrován: 16. 7. 2006, 12:33
Bydliště: Praha Bohnice + Roudnice nad Labem
Kontaktovat uživatele:

17. 9. 2008, 6:46

dzairo píše:(((-sqr(r1))*sqr((xs1-xs2))
a pred sqr je - znamienko co jeto za zapis????
Jenom záporná hodnota té odmocniny. Takhle mi to vrátil jakýsi matematický solver a už jsem se v tom víc neryl, i když by se ta znaménka dala nějak přeházet aby to vypadalo lépe :-)
dzairo píše:vo vzorci je tiez pouzita podmienka neex ako vysledok ci vobec moze existovat kruznica. ale predsa da sa to zapisat jednoduchsie.
trosku mi ten vzorec roby problemy v zapise.
Kdybych ty vzorečky dělal ručně tak bych to tak udělal taky, ale já je vygeneroval (jako řešení soustavy rovnic) a jenom cut & paste přetáh do programu. To neex je tam dané takhle abych už nic neponičil. Ale myslím, že v céčku tam dáš jen &neex a bude to fungovat stejně. Osobně by se mi už v tom vrtat nechtělo když jsem to jednou rozchodil takhle :-)
dzairo píše:>>G17 znamená rovinu kružnice svisle v osách XZ a G18 v osách YZ.
neviem ci to chapem ale je to to ze kruznica sa nakresli nie x,y ale x,z alebo ako????
Ano, přesně tak.
dzairo píše:>> Ale když už to děláš tak bys měl udělat i kružnici v obecné poloze, >>nejen v těch třech základních rovinách
to je ako??? (ja nemam vysoku skolu a preto sa vsetko ucim sam)
Přiznám se, že nevím :-)
dzairo píše:>> A šroubovice by měla umět víc chodů, ne jen jeden jak se stalo v >>poslední době zlozvykem (na to by se to fi jako parametr hodilo).
tym myslis ze zavit sa bude rezat tak ako chceme nie podla standardnych tabuliek ???
Normálně ta interpolace po šroubovici udělá max. 1 závit a pak se musí těsně za ním programovat druhý atd. Občas se vidí varianta toho zápisu kde je ještě orientovaný úhel o kolik se to má vykroužit a Z neznamená celkový pozuv v Z ale stoupání na jeden závit.
Aleš Procháska
dzairo
Příspěvky: 131
Registrován: 17. 9. 2008, 9:33

18. 9. 2008, 5:33

ahoj takze testoval som (ciastocne) tvoju funkciu a zatial ide dobre. ked budem ma t viac casu tak to poriadne testnem .
skusalsom aj zaporne hodnoty na start a end pozicia bodov.

dakujem




regards
Odpovědět

Zpět na „Učebnice programování, literatura, dokumentace systémů“