Vai al contenuto
PLC Forum


1212C con Sinamics V90 - gira scattoso


artichoke

Messaggi consigliati

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;

 

 

Link al commento
Condividi su altri siti

  • 2 weeks later...

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.

Link al commento
Condividi su altri siti

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 account

Accedi

Hai già un account? Accedi qui.

Accedi ora
×
×
  • Crea nuovo/a...