Step 7 Azyklischer Parameterzugriff über FB 283 SINA_FB realisieren

Draco Malfoy

Level-1
Beiträge
1.168
Reaktionspunkte
82
Zuviel Werbung?
-> Hier kostenlos registrieren
Guten Abend allesamt.

Wollte mal folgendes fragen:
Habe von ein Paar Wochen einen FB schreiben müssen, wo ein azyklischer Parameterzugriff auf den Antrieb über FB 283 stattfindet.
Sprich, es werden Paramemeter in den DB geschrieben, danach wird geprüft, ob der Auftrag mit "done" quittiert wurde, danach nächster Parametersatz geschrieben, dann Ende.
Zur Stunde lief das Ganze eigentlich (meine ich jedenfalls), aber gestern ist mir beim erneuten Test in der Anlage aufgefallen, daß dort wohl mist läuft, der Baustein "verläuft" sich irgendwie, es entsteht ein Kreislauf weil bestimmte Merker nicht zum richtigen Zeitpunkt zurückgesetzt werden, oder aus anderen Gründen. Ich habe den Code mal angehängt, vielleicht weiß einer Rat, wie man diese Routine geschickter implementieren könnte, oder was ich falsch mache ?

Thanx im Voraus,

Grüße DracoAnhang anzeigen FB148.pdf
 
Mit wieviele Sinamic-Achsen redest du denn azyklisch über den FB283?
Jeweils nur mit einer zur selben Zeit. Mir ist später übrigens eingefallen daß die Timer möglicherweise woanders belegt sein könnten. Diese Erkenntnis setzte sich mit dem Auftauchen gewisser ... ähm... zusätzlicher Unterlagen durch. Daher wird das Problem des azyklischen Zugriffes jetzt mittlerweile über eine GRAPH Kette gelöst.

Trotzdem wär cool zu hören, ob diese Schrittkette, so wie die ist, gut programmiert ist oder noch verbesserungswürdig ist. Wobei, ich, unabhängig von dieser möglicherweise eher theoretischen Fragestellung feststellen muss, daß GRAPH schon ne sinnvolle Erfindung ist, irgendwie.

P.S. Die Bezeichnet der Timer sind nachträglich durch Symboltabellenimport hinzugekommen. Zur Tatzeit schienen die Timer, nach Informationen aus der Kreuzreferenztabelle jedenfalls, nicht belegt worden zu sein.
 
Zuletzt bearbeitet:
Ich habe das in SCL gelöst:
Code:
#Acycle_Busy := (NOT #AcycleReady) OR #Basis.single.busy;

// Single
IF (NOT #Acycle_Busy) THEN                  // Wenn bereit
  
  // Ram to Rom
  IF #HMI.ACycle.RamToRom THEN
    #HMI.ACycle.RamToRom := 0;
    
    #Basis.single.tasksi := 971;          // Antriebsobjekt Parameter speichern
    #Basis.single.Ind    := 0;
    #Basis.single.Data   := 1;
    #Basis.single.WR     := 1;  
  END_IF;

END_IF;

// Multi 
IF (NOT #InitDone) AND (NOT #Acycle_Busy) THEN                  // Wenn bereit
  IF (NOT #HMI.ACycle.InitDone_Flag) THEN
   
    #Basis.single.tasksi := 30010;          // Bis zu 10 beliebige Parameter lesen/schreiben
    #Basis.single.Ind    := 1;              // gibt den ersten zu bearbeitenden chain_PNU_xy an
    #Basis.single.Data   := 5;              // gibt den letzten zu bearbeitenden chain_PNU_xy an
    
    // Wert 1
    #Basis.chain.chain_PNU_1  := 2504;      // Motorumdrehungen
    #Basis.chain.chain_IND_1  := 0;
    #Basis.chain.chain_Data_1 := 0;
    // Wert 2
    #Basis.chain.chain_PNU_2  := 2505;      // Lastumdrehungen
    #Basis.chain.chain_IND_2  := 0;
    #Basis.chain.chain_Data_2 := 0;
    // Wert 3
    #Basis.chain.chain_PNU_3  := 2506;      // LU pro Lastumdrehung
    #Basis.chain.chain_IND_3  := 0;
    #Basis.chain.chain_Data_3 := 0;
    // Wert 5  
    #Basis.chain.chain_PNU_5  := 2000;      // n Motor Bezugsdrehzahl
    #Basis.chain.chain_IND_5  := 0;
    #Basis.chain.chain_Data_5 := 0;  
    
    #Basis.single.RD       := 1;              // Lesen anstoßen
    #HMI.ACycle.InitDone_Flag := 1;              // Verarbeitungsmerker
  ELSE IF #Basis.single.Done THEN
      // Waiting for Response
      // Wert 1 + 2
      #Motor.i_Getriebe := DINT_TO_REAL(#Basis.chain.chain_Data_1) / DINT_TO_REAL(#Basis.chain.chain_Data_2); // Motorumdrehungen / Lastumdrehungen
      // Wert 3
      #Motor.LU_rotation := #Basis.chain.chain_Data_3; // LU pro Lastumdrehung
      // Wert 5 
      #DintToReal :=  #Basis.chain.chain_Data_5;        // wird als REal übertragen und als DINT im DB abgelegt
      #Motor.n_Motor := REAL_TO_DINT(#OutDintToReal);   // n Motor Bezugsdrehzahl
      
      #InitDone              := 1;
      #HMI.ACycle.InitDone_Flag := 0;              // Verarbeitungsmerker 
      END_IF;
  END_IF;    

END_IF;
 
Zurück
Oben