⚙️ Open Source Web App for CNC, which include 5+ Mechanical Calculators and some GCODE generators!
website: https://meccanicapp.vercel.app
Github: https://github.com/Laaouatni/meccanicAPP
G90 // programmazione ASSOLUTA
G54 // Origine Zero Pezzo
T10 // Utensile
M6 // Prendere Utensile
S1592 M3 // Velocità Fresa (ancora da Sviluppare G96/G97)
G0 X-12 Y-2 Z0 // Spostamento Rapido
F637 // Avanzamento Fresa (ancora da Sviluppare G94/G95)
G1 X22 Y-2 Z0 // Spostamento Lineare
G1 X22 Y-14 Z0 // Spostamento Lineare
G1 X-12 Y-14 Z0 // Spostamento Lineare
G1 X-12 Y-14 Z2 // Distanza di Sicurezza 2MM
G0 X-12 Y-14 Z20 // Ritornare in posizione con una distanza di sicurezza maggiore
M30 // Spegnimento Programma
clicca il link per vedere come funziona
{
max: 0,
min: -0.018
}
{
max: 0,
min: -0.004
}
{
max: 0,
min: -0.250
}
il risultato è calcolato in diretta:
cioè appena viene modificato unvalue=""
dei<input>
, il risultato velocemente in meno di 1 secondo.
FORO | MAX_FORO | MIN_FORO |
---|---|---|
0.021 | 0.000 |
ALBERO | max_albero | min_albero |
---|---|---|
0.015 | 0.010 |
FORO | MAX_FORO | MIN_FORO |
---|---|---|
0.021 | 0.000 |
ALBERO | max_albero | min_albero |
---|---|---|
0.028 | 0.015 |
FORO | MAX_FORO | MIN_FORO |
---|---|---|
0.020 | 0.010 |
ALBERO | max_albero | min_albero |
---|---|---|
0.05 | 0.000 |
ecc…,
in modo semplice:
1. inserisci i dati
2. clicca buttone “calcola”
aggiunto generatore di Avanzamento
G94
per la fresatura:
type="range"
<output>
value=""
dei
<input>
, il risultato velocemente in meno
di 1 secondo.
FORMULA:
Fz * Zn * S = avanz_G94 mm/min
esempio:
0.8mm * 4n * 1200giri/min = 3840 mm/min
aggiunto generatore di Avanzamento
G95
per il tornitura:
type="range"
<output>
value=""
dei
<input>
, il risultato velocemente in meno
di 1 secondo.
FORMULA:
MIN_avanz = R * (1/4)
esempio:
0.8mm * 0.25 = 0.2mm/giro
FORMULA:
MAX_avanz = R * (1/2)
esempio:
0.8mm * 0.5 = 0.4mm/giro
aggiunto generatore di
Velocità di Taglio (VT) G96
per il
tornitura:
type="range"
<output>
<input disabled>
(piGreco, 1000)value=""
dei
<input>
, il risultato velocemente in meno
di 1 secondo.
Math.PI
)
FORMULA:
(S * D * π) / 1000 = Vt_G96 m/min
esempio:
1200 * 50 * 3.14 = 188.5 m/min (metri/minuto)
aggiunto generatore di Velocità
G97
per la fresatura:
type="range"
<output>
<input disabled>
(piGreco, 1000)value=""
dei
<input>
, il risultato velocemente in meno
di 1 secondo.
Math.PI
)
FORMULA:
(VT * 1000) / (Ømm * π) = G97 giri/min
esempio:
(180m/min * 1000) / (200 * 3.14) = 286.48giri/min (giri/minuto)
il generatore di spiantura è formato da un’insieme di funzioni al suo interno!
function createGcodeProgram(options) {
initGcode();
setGargoments();
startGsicurezza();
spianaturaGenerator();
stopGprogram();
return gcodeProgram;
}
il generatore GCODE è
100% personalizzabile, grazie all’utilizzo di
un JSON
file!
utensile = {
"vt": calcolaVelocitaDiTaglio(), // 230
"fz": calcolateAvanzPerDente(), // 0.8
"nDenti": calcolateNumDenti(), // 4
"feed": calcolaFeed(), // 1200
"speed": calcolaSpeed(), // 1500
"diametro": calcolaDiametro() // 50
}
pezzoGrezzo = {
"X0": calcolaX0(), // 50
"Y0": calcolaY0(), // 100
"Z0": calcolaZ0() // 1
}
options = {
"absolute": isAbsolute, // true or false
"F": utensile.feed, // 1200
"S": utensile.speed, // 1500
"D": utensile.diametro, // 50
"vt": utensile.vt, // 230
"Fz": utensile.fz, // 0.8
"nDenti": utensile.nDenti, // 4
"X0": pezzoGrezzo.X0, // 50
"Y0": pezzoGrezzo.Y0, // 100
"Z0": pezzoGrezzo.Z0, // 1
"percLavorazUtensile": 60, // 60%
"diamPercMisura": calcolaPercOfUtensile(), // 12
};
calcolatore di avanzamento:
function calcolaFeed(utensile) {
let FeedFormula = Math.round((utensile.Fz() * n_denti) * utensile.speed);
return FeedFormula;
}
calcolatore di velocità:
function calcolaSpeed(utensile) {
let SpeedFormula = Math.round((vt * 1000) / (utensile.diametro * Math.PI));
return SpeedFormula;
}
percentuale Loading:
let onePerc = 100 / gcodeArray.length;
let currentPerc = onePerc * (index + 1);
el.style.width = `${currentPerc}%`;
el.textContent = `${currentPerc.toFixed(1)}%`;
buttone “copia codice GCODE”
navigator.clipboard.writeText()
buttone “ritorna in alto”
window.scrollTo({
top: 0,
behavior: "smooth",
});
il programma ricorda l’ultima posizione XYZ:
// salvare i punti precedenti
function setLastPosVar(x, y, z) {
previusX = x;
previusY = y;
previusZ = z;
options.previusX = previusX;
options.previusY = previusY;
options.previusZ = previusZ;
}
function checkSolveXYZ(x, y, z) {
// se un valore è nullo, verrà scritto 0,
// altrimenti si scriverà il valore precedente
x == "" || previusX == "" ? x = 0 : x = previusX;
y == "" || previusY == "" ? y = 0 : y = previusY;
z == "" || previusZ == "" ? z = 0 : z = previusZ;
return { x, y, z };
}
G0
GCODE funzione:
function G0(x, y, z) {
// risolvere prima i possibili errori nei parametri
let XYZ = checkSolveXYZ(x, y, z);
// inserire la linea di codice
gcode.push(`G0 X${XYZ.x % 1 == 0 ? XYZ.x : XYZ.x.toFixed(1)} Y${XYZ.y % 1 == 0 ? XYZy : XYZ.y.toFixed(1)}
Z${XYZ.z % 1 == 0 ? XYZ.z : XYZ.z.toFixed(1)}`);
// salvare l'ultima posizione
setLastPosVar(XYZ.x, XYZ.y, XYZ.z);
}
G1
GCODE funzione:
function G1(x, y, z) {
// risolvere prima i possibili errori nei parametri
let XYZ = checkSolveXYZ(x, y, z);
// inserire la linea di codice
gcode.push(`G1 X${XYZ.x % 1 == 0 ? XYZ.x : XYZ.x.toFixed(1)} Y${XYZ.y % 1 == 0 ? XYZy : XYZ.y.toFixed(1)}
Z${XYZ.z % 1 == 0 ? XYZ.z : XYZ.z.toFixed(1)}`);
// salvare l'ultima posizione
setLastPosVar(XYZ.x, XYZ.y, XYZ.z);
}
function spianaturaGenerator(options) {
let isDestra = false; // iniziare da sinistra
// calcolare il numero di spianatura necessarie
let lineeY_totali = Math.floor(options.Y0 / options.diamPercMisura);
// Altezza da spianare
let lineeZ_totali = options.Z0;
for (...) { // cliclo ripetizione Z spianatura
// G54 punto di origine X (coordinata)
let startPointX = 0 - (options.D / 2) - 2;
// G54 punto di origine Y (coordinata)
let startPointY = (options.D / 2) - options.diamPercMisura;
previusZ = lineeZ_completed; // numero Z spianture mancanti da eseguire
G0(startPointX, startPointY, previusZ); // distanza di sicurezza
for (...) { // cliclo ripetizione Y spianatura
if (lineeY_completed == 1) {
// inserimento di F nel programma
gcode.push(`F${options.feed}`);
}
// se utensile è a destra si mouverà a sinistra
// se utensile è a sinistra si mouverà a destra
isDestra ? GtoSinistra() : GtoDestra();
if (lineeY_completed == lineeY_totali) {
lastGspianatura(options, isDestra);
}
}
}
// funzione per andare a destra
function GtoDestra(options) {
G1(options.X0 + 2, "", ""); // X è uguale a "lunghezza_totale +2mm"
isDestra = true; // siamo a destra attualmente, dopo lalavorazione G1
GtoDown(); // andare sotto
}
// funzione per andare a sinistra
function GtoSinistra() {
G1(0 - 2, "", ""); // 2mm fouri a sinistra (0 = punto origine)
isDestra = false; // siamo a sinistra attualmente, dopo lalavorazione G1
GtoDown(); // andare sotto
}
// funzione per andare giù del 60%
function GtoDown() {
G1("", previusY - diamPercMisura, ""); // andiamo sotto del 60%
}
// ultima passata, con sicurezza
function lastGspianatura(options, isDestra) {
let formulaDestra = options.X0 + (options.diametro / 2) + 2;
let formulaSinistra = 0 - (options.diametro / 2) - 2;
if (isDestra) {
// VAI A SINISTRA
G1(formulaSinistra, "", "");
Zsicurezza();
isDestra = false;
} else {
// VAI A DESTRA
G1(formulaDestra, "", "");
Zsicurezza();
isDestra = true;
}
// distanza di sicurezza in Z
function Zsicurezza(isDestra) {
G1("", "", previusZ + 2);
G0("", "", 0 + 20);
}
}
}
// inserire codice sullo schermo
function displayGcode(options, pezzoGrezzo) {
document.querySelector("#output-gcode").textContent = "";
let gcodeArray = createGcodeProgram(options, pezzoGrezzo); // array completo contutti i codici generati
// animazione per ognuna linea di codice
gcodeArray.forEach((Gline, index) => {
setTimeout(() => {
addLine(Gline, index, gcodeArray) // aggiungere una linea di codice generatada un'array
}, index * 1000 / 30); // 1 secondo diviso per numero volte che vogliamo
});
}
function addLine(Gline, index, gcodeArray) {
...
GnumLine.textContent = `N${index + 1}`; // numero linea
...
}