artichoke Inserito: 22 marzo 2021 Segnala Inserito: 22 marzo 2021 Buongiorno a tutti, Premetto che mi sto cimentando da poco con SCL, comunque per fare pratica ecc ho deciso di programmare una nuova macchinetta in SCL.. Ho un motore (1FL6024-2AF2x-xxxx) con un azionamento (6SL3 210-5Fxxx-xxFx) che fa girare un mandrino. Su HMI imposto un tot di punti in gradi a cui dovrà corrispondere un tot di ampere della saldatrice, esempio: primo punto 45° - 50A secondo punto 180° - 100A terzo punto 90° - 0A Quindi parto da 0 gradi e in 45° vado da 0A a 50A, poi in 180° raggiungo 100A e in 90° arrivo a 0A Ho scritto il programmino e "funziona", il motore gira dei gradi che imposto e la saldatrice segue con l'amperaggio in base alla posizione.. Il problema è che il motore non gira fluido, gira scattoso, anche smontato e poggiato sul tavolo fa rumore come se stesse macinando, sembra come se ricevesse dei segnali di stop e di start ad una frequenza elevatissima. Questo problema l'ho già visto l'anno scorso, il softwarista all'inizio pensò ad un problema meccanico nei riduttori, poi vedendo il motore che faceva rumore anche poggiato sul banco pensò ad un problema elettrico, infine risolse il problema e disse che c'era un problema nella configurazione dell'azionamento, ora però non si ricorda come risolse il problema.. Vi allego il codice che ho scritto, così se ci fossero errori vedo di correggere e magari mi date qualche consiglio se ho scritto qualche porcata.. Vi ringrazio anticipatamente "EvArgon" := #Argon; "StartSaldatrice" := #Saldatura; #Parametri.Angoli[0] := 0; #Parametri.Angoli[1] := (((#Rpm / 60) * 3600) * #TpreSufflagio); #Parametri.Angoli[2] := #Parametri.Hmi.Angoli[0] * 10; #Parametri.Angoli[3] := #Parametri.Hmi.Angoli[1] * 10; #Parametri.Angoli[4] := #Parametri.Hmi.Angoli[2] * 10; #Parametri.Angoli[5] := #Parametri.Hmi.Angoli[3] * 10; #Parametri.Angoli[6] := (((#Rpm / 60) * 3600) * #TpostSufflagio); #Parametri.Potenze[0] := 0; #Parametri.Potenze[1] := 0; #Parametri.Potenze[2] := #Parametri.Hmi.Ampere[0]; #Parametri.Potenze[3] := #Parametri.Hmi.Ampere[1]; #Parametri.Potenze[4] := #Parametri.Hmi.Ampere[2]; #Parametri.Potenze[5] := #Parametri.Hmi.Ampere[3]; #Parametri.Potenze[6] := 0; #Parametri.AngoloTotale := 0; FOR #I := 0 TO 4 DO #Parametri.AngoloTotale := #Parametri.AngoloTotale + #Parametri.Angoli[#I]; //somma tutti gli angoli impostati END_FOR; //Sommo tutti gli angoli e li attribuisco a AngoloTotale IF "PlsAvvioCiclo" AND #Step = 0 THEN //se pls avvio ciclo premuto e lo step è 0 #Step := 1; END_IF; //avvio ciclo -> step 1 IF "PlsStopCiclo" AND #Step = 0 THEN "SinaPos_DB".AckError := TRUE; ELSE "SinaPos_DB".AckError := FALSE; END_IF; //Reset Anomalie azionamento CASE #Step OF 0: RETURN; 1: IF "PlsStopCiclo" THEN #Step := 5; END_IF; FOR #K := 0 TO 6 DO //ripeto il ciclo tante volte quanti sono gli angoli nell'array angoli[] #Parametri.AngoliAssoluti[#K] := 0; //azzero l'angolo in funzione del valore di K FOR #Y := 0 TO #K DO //ripeto il ciclo tante volte quanto vale K al momento dell'ingresso #Parametri.AngoliAssoluti[#K] := #Parametri.AngoliAssoluti[#K] + #Parametri.Angoli[#Y]; //aggiungo all'angolo [K] l'angolo [Y] END_FOR; END_FOR; //Calcolo gli angoli assoluti IF "SinaPos_DB".ActVelocity = 0 THEN //se motore fermo "SinaPos_DB".ExecuteMode := false; //stop azionamento "SinaPos_DB".ModePos := 5; //modo operativo Homing – reference point definition #Step := 2; RETURN; END_IF; //azionamento in attesa di reference point 2: IF "PlsStopCiclo" THEN #Step := 5; END_IF; IF "SinaPos_DB".ModePos = 5 THEN "SinaPos_DB".ExecuteMode := TRUE; //Azzera asse END_IF; //azionamento azzerato IF "SinaPos_DB".ActPosition = 0 THEN //se azzerato "SinaPos_DB".ExecuteMode := FALSE; //Stop Riferimento Azzeramento #Step := 3; RETURN; END_IF; //dopo aver azzerato passa a step 3 3: IF "PlsStopCiclo" THEN #Step := 5; END_IF; #Argon := TRUE; //apertura ev argon "SinaPos_DB".ModePos := 1; //modo operativo relativo "SinaPos_DB".Position := REAL_TO_DINT(#Parametri.AngoliAssoluti[4]); //Imposta posizione di destinazione "SinaPos_DB".Velocity := REAL_TO_DINT(#Rpm); //imposta velocita "SinaPos_DB".EnableAxis := true; //abilita asse IF "SinaPos_DB".AxisEnabled THEN //se asse abilitato "SinaPos_DB".ExecuteMode := true; //start motore #Step := 4; RETURN; END_IF; //start motore <---------------------------------------------------------------------------< 4: IF "PlsStopCiclo" THEN #Step := 5; END_IF; IF "SinaPos_DB".ActPosition >= REAL_TO_DINT(#Parametri.AngoliAssoluti[1]) THEN //se raggiunto angolo di presufflaggio #Saldatura := TRUE; //start saldatura END_IF; FOR #J := 0 TO 5 DO //ripeto il ciclo una volta meno di quanti sono gli angoli nell'array AngoliAssoluti[] #AngoloAttuale := "SinaPos_DB".ActPosition; IF #AngoloAttuale >= #Parametri.AngoliAssoluti[#J] AND #AngoloAttuale < #Parametri.AngoliAssoluti[#J + 1] THEN // se l'AngoloAttuale è compreso tra AngoloAssoluto J e J+1 indice = J #IndiceAngolo := #J; END_IF; END_FOR; //individuato in che punto della funzione mi trovo (* Funzione di interpolazione lineare (x2-x1):(y2-y1)=(x0-x1):(y0-y1) NB con 1 identifico la posizione iniziale con 2 identifico la posizione finale con 0 identifico la posizione attuale Risolvo e isolo y0 y0 = {[(x0-x1)*(y2-y1)]/(x2-x1)}+y1 #PotenzaInterpolata := (((#AngoloAttuale - #Parametri.Angoli[0]) * (#Parametri.Potenze[1] - #Parametri.Potenze[0])) / (#Parametri.Angoli[1] - #Parametri.Angoli[0]))-#Parametri.Potenze[0]; *) //funzione di interpolazione lineare #PotenzaInterpolata := ((((#AngoloAttuale - #Parametri.AngoliAssoluti[#IndiceAngolo]) * (#Parametri.Potenze[#IndiceAngolo+1] - #Parametri.Potenze[#IndiceAngolo])) / (#Parametri.AngoliAssoluti[#IndiceAngolo+1] - #Parametri.Angoli[#IndiceAngolo] )) + #Parametri.Potenze[#IndiceAngolo]); IF "SinaPos_DB".ActPosition >= REAL_TO_DINT(#Parametri.AngoliAssoluti[5]) THEN //se raggiunto angolo di postsufflaggio #"PotenzaInterpolata" := 0; #Saldatura := FALSE; END_IF; // eseguo post sufflagio "RifSaldatrice" := (#PotenzaInterpolata * (27648)) / #FondoscalaSaldatrice; IF "SinaPos_DB".ActPosition = REAL_TO_DINT(#Parametri.AngoliAssoluti[6]) AND "SinaPos_DB".ActVelocity = 0 THEN //se arrivato in posizione e il motore è fermo fine ciclo #Step := 5; RETURN; END_IF; //posizione raggiunta - fine ciclo 5: "SinaPos_DB".ExecuteMode := TRUE; //disabilita asse "SinaPos_DB".EnableAxis := FALSE; //asse abilitato "RifSaldatrice" := 0; //azzero la potenza richiesta #Saldatura := FALSE; //stop saldatura #Argon := FALSE; //valvola argon chiusa #Step := 0; END_CASE;
artichoke Inserita: 5 aprile 2021 Autore Segnala Inserita: 5 aprile 2021 Nessuno ha una vaga idea o soluzione?
Livio Orsini Inserita: 6 aprile 2021 Segnala Inserita: 6 aprile 2021 il 22/3/2021 at 19:29 , artichoke scrisse: Il problema è che il motore non gira fluido, gira scattoso, anche smontato e poggiato sul tavolo fa rumore come se stesse macinando, sembra come se ricevesse dei segnali di stop e di start ad una frequenza elevatissima. Da come scrivi non sembra un problema di programma, ma di azionamento. Visto che dici che il motore fa lo stesso difetto anche a banco, fai una prova elementare: dagli un riferimento manuale, se si comporta ancora allo stesso modo, hai eliminato l'azionamento dagli indiziati, altrimenti è lui il colpevole. Se l'azionamento non da problemi, carica un programma semplicissimo, che fa una rampa insalita ed in discesa, molto lenta e osserva il comportamento del motore.
Messaggi consigliati
Crea un account o accedi per commentare
Devi essere un utente per poter lasciare un commento
Crea un account
Registrati per un nuovo account nella nostra comunità. è facile!
Registra un nuovo accountAccedi
Hai già un account? Accedi qui.
Accedi ora