Hírek:

Fontos tudnivalók a migrációval kapcsolatban, Kérlek nézd meg a Régi fórumról új fórumra való költözés

Main Menu

UCCNC vezérlő program

Indította gaben, 2024 április 09, 16:54

Előző téma - Következő téma

dezsoe

Képtelen vagyok előidézni a hibát. (Egyiket sem.) Nem szokásom, de Windows hibára kell gyanakodjak. Még azt lehet megpróbálni, hogy a komplett profiles mappát küldd el, hogy megnézzem, hátha valamit nem veszek észre, vagy nem úgy állítom be.

ium8w94xp


Zozi

Sajnos a géptől most messze vagyok, ha odajutok lemásolom.
Újratelepítésen is gondolkoztam, de majd csak akkor ha elkészült a mostani munkadarab (egy kis cnc maró alapja)

Lehetséges, hogy a dotnet miatt jön elő ilyen hiba? Az sp3 ban alapól magasabb verzióval volt, és telepítésnél is simán felment, nem az van mellette amit a telepítő mellett lehetne letölteni.

dezsoe

Az SP3-ból ítélve XP van a gépen. (Anyám borogass... Nem akarok vitát indítani, csak megjegyzem, mint privát véleményt, hogy a múzeumban van a helye, nem produktív gépen.) Majd próbáld ki azzal a .Net Framework-kel, amit le lehet hozzá tölteni, mert azzal működnie kéne. (Az SP3 egyébként nem tartalmaz .Net Framework-ot, azt egy másik lépésben raktad fel.)

Kétségtelen tény, hogy mindent elkövettem az UCCNC-vel, hogy előcsaljam a hibajelenséget, de XP-t azért nem telepítettem. Lehet, hogy kéne egy XP-s teszt gépet is csinálnom? [#rinya]

ger33ub5d

Az M6 makróval kapcsolatban volna egy kérdésem. Megoldható-e hogy szerszámcserénél mielőtt felveszi a következő szerszámot egy tisztító fúvatást csináljon? Azért volna lényeges, mert szeretnék egy szerszámcserélős adaptert amit a kínai 65mm-es marókra rá lehet szerelni. Ezen az adapteren kettő pneumatikus csatlakozó van, egyik a tisztításhoz, másik a cseréhez. Ahogy látom a makróban a szerszámcseréhez megvan a pneumatikai programrész, de hogy lehetne egy ilyen pneumatikus  
tisztítási parancsot beiktatni mielőtt felveszi a az új szerszámot? Gondolom kellene még egy kimeneti pint beállítani valamelyik porton ami vezérelné a tisztítószelepet de sajnos nem vagyok programozó így nem tudom mit kellene beírni a makróba. Előre is köszi.

dezsoe

Semmi extra nem kell hozzá, csak ennyi:

exec.Setoutpin(portszám, lábszám);
exec.Wait(várakozás_ms_ban);
exec.Clroutpin(portszám, lábszám);

Az első bekapcsolja az adott kimenetet, a második vár, amennyit kell, a harmadik kikapcsolja. Ha a szeleped 0-ra aktív, akkor az első és harmadik sort megcseréled. Ha jól értettem, hogy akkor kell fújni, amikor a régi szerszám már nincs bent, az új pedig még nincs, akkor szerintem ide kell a három sor:

if(Currenttool!=0) // No need to drop down tool if current tool number is zero
{
  // Move to old tool position on XY plane

  exec.Code("G00 G53 X" + ToolX[Currenttool] + " Y" + ToolY[Currenttool]);
  while(exec.IsMoving()){}

  // Drop current tool
 
  exec.Code("G00 G53 Z"+ Ztoolrelease); // Move Z axis down to tool holder position
  while(exec.IsMoving()){}
  exec.Setoutpin(Chuckopenport, Chuckopenpin); // Open the chuck with pneumatic valve
  exec.Wait(1000); // Wait one 1000msec
  exec.Code("G00 G53 Z"+ SafeZ); // Move Z up
  while(exec.IsMoving()){}
  // --- ide kell, szerintem ---
}

ium8w94xp

Látod? Csak úgy köpi a megoldást :)

ger33ub5d

Szia dezsoe. Működik a program ahogy leírtad, csak lejjebb kellett beilleszteni, közvetlen a cserélendő szerszám felvétele elé. A helyzet az, hogy próbáltam már így meghatározni, csak nem a port és a pin számát írtam be hanem valamire átneveztem őket úgy mint például a szerszámcsere levegőszelepe: int Chuckopenport = 1;
int Chuckopenpin = 16;
csak valamiért az a szöveg nem volt jó. Viszont most átírtam a tisztítószelepet erre:                                  int Cleanport = 1;
int Cleanpin = 17; és így tökéletesen működik,legalább is szimulációban. Egyébként még változtattam a makrón két dolgot, egyik amit svejk kollégának írtál, hogy folyamatosan fusson a program szerszámcsere után, a másik hogy amikor felvette az új szerszámot akkor visszaállt oda, ahol az előző szerszám befejezte a munkát, majd utána állt rá a saját kezdőpontjára. Ezzel nincs is gond kis munkaterületű gépnél, de egy nagynál szerintem sok felesleges utat megy a gép. Ezért megjegyzésbe tettem azt a sort is amivel visszamenne az előző szerszám végpontjához, így csere után közvetlen megy a saját kezdőpontjához. Ehhez a megoldáshoz viszont nálam átkellet szerkeszteni a G kódban a szerszámcserék utáni első sor Z koordinátáit a makróban beállított biztonsági Z koordinátára, nehogy beleütközzön a szerszámtárba. Egyébként ez az új kód:
 
//Example linear toolchanger code

//Tool positions definition
int Chuckopenport = 1;
int Chuckopenpin = 16;
int Cleanport = 1;
int Cleanpin = 17;

double[] ToolX = new double[11];
double[] ToolY = new double[11];
ToolX[0] = 0; // Tool0 X position
ToolY[0] = 0; // Tool0 Y position
ToolX[1] = 40; // Tool1 X position
ToolY[1] = -10; // Tool1 Y position
ToolX[2] = 100; // Tool2 X position
ToolY[2] = -10; // Tool2 Y position
ToolX[3] = 150; // Tool3 X position
ToolY[3] = -10; // Tool3 Y position
ToolX[4] = 200; // Tool4 X position
ToolY[4] = -10; // Tool4 Y position
ToolX[5] = 250; // Tool5 X position
ToolY[5] = -10; // Tool5 Y position
ToolX[6] = 300; // Tool6 X position
ToolY[6] = -10; // Tool6 Y position
ToolX[7] = 350; // Tool7 X position
ToolY[7] = -10; // Tool7 Y position
ToolX[8] = 400; // Tool8 X position
ToolY[8] = -10; // Tool8 Y position
ToolX[9] = 450; // Tool9 X position
ToolY[9] = -10; // Tool9 Y position
ToolX[10] = 0; // Tool10 X position
ToolY[10] = -10; // Tool10 Y position

double SafeZ = 100;
double Ztoolrelease = 40;
double Ztoolpickup = 39;

int Newtool = exec.Getnewtool();
int Currenttool = exec.Getcurrenttool();

if(Newtool == -1) // If new tool number is -1 means a missing T code, so we need to stop here...
return;

if(Newtool <1 || Newtool >10) // Tool number is out of range, so we need to stop here...
return;

if(Newtool == Currenttool) // Same tool was selected, so do nothing, stop here...
return;

if(!exec.GetLED(56)||!exec.GetLED(57)||!exec.GetLED(58)) // If machine was not homed then it is unsafe to move in machine coordinates, stop here...
{
  // MessageBox.Show("The machine was not yet homed, do homeing before executing a tool change!");
  exec.Stop();
  return;
}

while(exec.IsMoving()){}

// Get current XY machine coordinates to return to this position at the end of the macro

double Xoriginalpos = exec.GetXmachpos();
double Yoriginalpos = exec.GetYmachpos();

// Stop spindle if running and Move Z up

exec.Stopspin();
exec.Code("G00 G53 Z"+ SafeZ); // Move Z up
while(exec.IsMoving()){}

if(Currenttool!=0) // No need to drop down tool if current tool number is zero
{
  // Move to old tool position on XY plane

  exec.Code("G00 G53 X" + ToolX[Currenttool] + " Y" + ToolY[Currenttool]);
  while(exec.IsMoving()){}

  // Drop current tool
 
  exec.Code("G00 G53 Z"+ Ztoolrelease); // Move Z axis down to tool holder position
  while(exec.IsMoving()){}
  exec.Setoutpin(Chuckopenport, Chuckopenpin); // Open the chuck with pneumatic valve
  exec.Wait(1000); // Wait one 1000msec
  exec.Code("G00 G53 Z"+ SafeZ); // Move Z up
  while(exec.IsMoving()){}
 
}

// Move to new tool position on XY plane
exec.Code("G00 G53 X" + ToolX[Newtool] + " Y" + ToolY[Newtool]);
while(exec.IsMoving()){}
// Pick new tool

exec.Code("G00 G53 Z"+ Ztoolpickup); // Move Z axis down to tool holder position
while(exec.IsMoving()){}
exec.Setoutpin(Cleanport, Cleanpin);
  exec.Wait(4000);
  exec.Clroutpin(Cleanport, Cleanpin);
exec.Clroutpin(Chuckopenport, Chuckopenpin); // Close the chuck with pneumatic valve
exec.Wait(1000); // Wait one 1000msec
exec.Code("G00 G53 Z"+ SafeZ); // Move Z up
while(exec.IsMoving()){}


// Move back to start point

//exec.Code("G00 G53 X" + Xoriginalpos + " Y" + Yoriginalpos);
while(exec.IsMoving()){}

// Measure new tool will go here....
exec.Code("G43 H"+Newtool); // Load new tool offset

exec.Wait(200);
while(exec.IsMoving()){}
if(!exec.Ismacrostopped()) // If tool change was not interrupted with a stop only then validate new tool number
{
  exec.Setcurrenttool(Newtool); //Set the current tool -> the new tool
  //messagebox.show("Tool change done.");
}
else
{
  exec.StopWithDeccel();
  MessageBox.Show("Tool change was interrupted by user!");
}

dezsoe

Szia! Látod, megy ez, csak kísérletezni kell vele! [#email]

000000000

Mivel az UCNC Mach alapokra épül ez a szerszámváltó skript működhet mach alatt is ?

ger33ub5d

Nem tudom  meg kell próbálni. Én nem vagyok programozó, talán dezsoe többet tud róla mondani.

dezsoe

Szerencsére az UCCNC nem épül Mach alapokra, csak - mivel ugyanaz a feladata - igen sok párhuzamot lehet felfedezni. A Mach-ban Visual Basic a makró nyelvezete, UCCNC-ben pedig C#, tehát már a nyelv miatt sem lehet átvinni. A mezők, a LEDek, a gombok, a belső funkciók mind máshogy vannak, úgyhogy még az is kevés, ha csak simán átfordítod a makrót egyik nyelvről a másikra. Az egyetlen megoldás, ha alaposan átnézed, felfogod, hogy mit csinál egy adott makró, majd a másik rendszerben megírod. Mondjuk, ehhez nem árt mindkét rendszert kellően ismerni. :)

svejk

Egy kicsit visszakanyarodhatnánk a szerszámcseréhez?

Az eredeti default M6-os makroval kísérletezek.

Ahogy ajánlottad az M6 makro végére beírtam a:

exec.Writekey("SvejkAdatai", "LastSelectedTool", exec.Getcurrenttool().ToString());

sort, így akár "áramszünetes" kikapcsoláskor is emlékezni fog az utolsó szerszámra.

Az M99998 makroba pedig a a másik ajánlott:

int LastSelectedTool = Convert.ToInt32(exec.Readkey("SvejkAdatai", "LastSelectedTool", "0"));
AS3.Additemtolistbeginning("Legutobbi szerszam: " + LastSelectedTool, 2);

sorokat.

Működik kafán egy szépséghibával, hogy ugyan az üzenet ablakba kiírja, hogy melyik volt az utolsó szerszám, de a Tool:x értékét nem írja át helyből.

Tehát kellene még egy sor az M99998 makroba ami beírja az előzőleg elmentett és kiolvasott szerszám számát induláskor a 897-es mezőbe.
Az M6-os makróból puskázva talán: exec.Setcurrenttool....de hogy tovább?



Egy másik szerszámváltós kérdés, a T0 szerszám pontosan mit is jelent?
Ha kiadom az M6T0-át akkor nem kellene kiraknia az épp aktuális szerszámot a tárba és üresen hagyni az orsót?


Sajnos nekem nincs ipari tapasztalatom sem ilyen ügyekben.

dezsoe

Visszafelé válaszolva: a T0 az a nagykönyv szerint az, amit írsz, tehát üres befogó. A minta M6 nem kezeli az üres befogót:

if(Newtool <1 || Newtool >10) // Tool number is out of range, so we need to stop here...
return;

Aszongya, hogy ha T<1, akkor nem foglalkozik az egésszel. Tehát úgy kell módosítanod, hogy az előzőekben másolt sorban (Newtool <0 || Newtool >10) -re módosítod a feltételt, majd a

// Move to new tool position on XY plane

sor elé berakod, hogy

if (Newtool != 0)
{

és a file végére pedig

}
else
{
  exec.Setcurrenttool(Newtool); //Set the current tool -> the new tool
  MessageBox.Show("Tool change done.");
}

Ezzel azt éred el, hogy ha 0-ra vált, akkor nem megy el az új pozícióba és nem vesz fel semmit, csak beállítja a 0-s szerszámot és kiírja, hogy kész.

A másik problémára pedig annyi, hogy a példa csak felolvassa a mentett adatot, de nem csinál vele semmit. A mező átírása szép, de nem jó. A képernyőn ugyan azt fogod látni, amit beleírtál, de a szerszámcserélő mást fog gondolni, mert a rendszer belül tudja, hogy nem ez az aktuális szerszám. Hogy ne legyen olyan egyszerű, az M99998-ból nem hajtja végre a Setcurrenttool-t, mivel a reset még aktív. Ezt úgy tudod megoldani, hogy vagy használsz egy változót (#nnn) vagy kiraksz egy mezőt a képre és azon keresztül viszed át a felolvasott értéket. Az utóbbi nem fog ütközni semmilyen változókat használó programmal. Akkor a felolvasás (M99998-ban):

double LastSelectedTool = Convert.ToDouble(exec.Readkey("SvejkAdatai", "LastSelectedTool", "0.0"));
AS3.Additemtolistbeginning("Legutobbi szerszam: " + LastSelectedTool, 2);
AS3.Addfield("", "Arial", "left", 12, 0, 0, 1000, 120, "showfieldnb", 0, 96, 21000, 1); // egy eldugott mezo
AS3.Setfield(LastSelectedTool, 21000);

A felolvasást int-ről double-re változtattam, mert itt mindegy, a mező pedig úgyis double, majd elhelyeztem egy 21000 azonosítójú mezőt (nem szerkeszthetőt) a képernyőn kívül a (0,1000) pozícióba, tehát nem lesz útban, mert nem látszik. Beleírtam a felolvasott szerszámot, így az első M6-nál tudunk vele dolgozni.

Az M6 elején a

int Currenttool = exec.Getcurrenttool();

sor helyett ez kell:

int Currenttool = 0;
int Savedtool = AS3.Getfieldint(21000);
if (Savedtool == -1)
  Currenttool = exec.Getcurrenttool();
else
{
  Currenttool = Savedtool;
  AS3.Setfield(-1.0, 21000);
}

Így az első M6 futtatáskor az elmentett szerszámot tekinti aktuálisnak, nem azt, amit a képernyőn jelez. Miután felhasználta, jelzi, hogy már volt egy csere, így innentől már a ténylegessel foglalkozik.

svejk

Köszi!
No még ezt is át kell olvasnom párszor, hogy felfogjam, illetve a gyakorlatban is át kell majd ültetni akkor tudok még majd kérdezni.