Probleme mit SFC 14 / SFC 15 in FB

Zuviel Werbung?
-> Hier kostenlos registrieren
Hi,

ich habe jetzt einen FC erstellt der die Daten von einem Servo liest und in einen DB (mit einem UDT) transferiert.

Das funktioniert auch sehr gut.

Jetzt will ich den ersten FB für den Servo schreiben.

Dazu brauche ich nun wieder die Daten vom Servo aus dem DB.

Wie beim FC habe ich wieder einen Datenzeiger der die Daten aus dem DB an den FB übergibt.

Ich behaupte mal ich habe alles richtig gemacht, klappt aber nicht. :confused:

Hier mal der Code meines FB

Code:
[B]Netzwerk 1[/B]
  
      L     P##Daten_Zeiger             // Datenzeiger in AKKU 1 laden
      LAR1                              //  AR1 mit Inhalt von AKKU 1 laden

      L     W [AR1,P#4.0]               // DB Nummer in AKKU 1 laden
      T     #Daten.DB_Nr                // Inhalt von AKKU 1 nach TEMP kopieren

      L     D [AR1,P#6.0]               // Adresse in AKKU 1 laden
      T     #Daten.Adresse              // Inhalt von AKKU 1 nach TEMP kopieren

[B]Netzwerk 2[/B]

      AUF   DB [#Daten.DB_Nr]           // DB Nummer mit Inhalt aus TEMP öffnen
      LAR1  #Daten.Adresse              // AR1 mit Inhalt von AKKU 1 laden

[B]Netzwerk 3[/B]

      U     #MX1.PI.Betriebsart_24V
      =     #AKTIV
Der Aufruf dazu sieht so aus:

Code:
       CALL  FB     1 , DB111
       Daten_Zeiger       :="MX1".DB_VAR
       AKTIV              :=M0.1
In dem Datenbaustein MX1 ist das entsprechende Bit PI.Betriebsart_24V gesetzt. Aber das Bit M0.1 wird nicht HIGH.

Woran kann das liegen?
 
Ok also jetzt ist mir auf jeden Fall klar warum das nicht funktioniert.

Ich muss natürlich auch in dem FB alle meine Daten aus dem DB manuell auf die temporären Variablen zuweisen.
- BLKMOV funktioniert da nicht.

Ist doch richtig so? - Find ich nämlich schon recht umständlich ..

smartie
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Du hast ein FB genommen da musst du natürlich
mit den Adressregistern aufpassen.
Warum machst du das so, endweder du nimmst ein
FC und legst die Daten global an oder einen FB und
erzeugst eine Instanz und holst dir die Daten aus der
direkt im FB aus der Instanz.
 
Hallo,
ich muß / möchte hier noch einmal auf den Beitrag #1 von Smartie zurückkommen ...
Aus meiner Sicht spricht gar nichts dagegen, für jede Achse (oder was auch immer) einen eigenen FB zu machen - das mache ich auch grundsätzlich immer so. Auch ein mehrfaches Aufrufen der SFC14 und 15 sollte kein Problem darstellen.
Im Grundsatz sollte der ursprüngliche Baustein also funktionieren.
Was mich hier jetzt interessiert ist : wo ist denn der Datenbereich PI und PO deklariert ? Ich hoffe nicht im Bereich TEMP sondern doch ganz bestimmt im Bereich STAT des FB ...

Gruß
LL
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo zusammen,

wie SPS Killer schon bemerkt hat sind PI und PO nicht im TEMP sondern im STAT Bereich definiert.

@ Larry Laffer:
Du sagst du hast das schon öfter so realisiert. - Hast du vielleicht ein Beispiel für mich?

@ Helmut:

Ich habe einen FC zur Kommunikation mit jeweils einer Achse erstellt.
Die FB's sind für die einzelnen Betriebsarten der Achsen.
Aber irgendwie muss ich doch die Daten aus dem DB in den FB bekommen.

Ich hoffe ich nerv euch nicht zu sehr damit, aber das ist schon ne Menge neues für mich.

Gruß smartie
 
@Larry Laffer,
ich stimme dir auf jedem fall zu das man die SFC14/15 öfter aufrufen
kann. Bei Smartie sieht allerdings so aus, das er dieses für jede Betriebs-
art macht (wie ich aus Beitrag #3 lese) ich denke mal das er dieses aber
nicht gegeneinander veriegelt. Ich glaube er schreibt etwas in der ersten
Betriebsart etwas rein und macht es weiter unten mit einer anderen Betriebs-
art wieder platt.
Deswegen war mein Tip nur einmal an den Teilnehmer zu schreiben und
in die Betriebsarten separat zu sehen.
Aber Smartie hält sich auch Vornehm zurück mit entsprechenden Informationen
bzw. Code.

@Smartie,
um dir weiter helfen zu können stell doch mal mehr von deinen Programm
hier rein damit wir überhaubt sehen können wo es hackt.
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
... sieh mal an ... da ist der Helmut wieder etwas schneller gewesen ...

@Smartie:
Auif die Schnelle finde ich jetzt keinen Beispiel-Baustein - das bringt uns m.E. aber auch nicht wirklich weiter. Ich sehe das genau wie Helmut und würde auch sagen, dass es sinnig ist, deinen ganzen Baustein zu kennen und nicht nur den Auszug der ersten Zeilen (wenn das denn überhaupt so aussieht). Diese Zeilen könnten auch in einem meiner Bausteine so drin stehen.
Was dir schon zu denken geben sollte ist, dass dir der / die SFC keinen Fehler melden - die sind damit nämlich eigentlich nicht kleinlich.

Gruß
LL
 
Guten Morgen,

FC10 - MX1 Steuern

FUNCTION FC 10 : VOID
TITLE =
VERSION : 0.1

BEGIN
NETWORK
TITLE =Kommunikation mit Achse MX1 aufbauen

CALL FC 1 (
Daten_Zeiger := DB1.DB_VAR,
IO_Adresse := 258,
FEHLER_SFC := M 0.0);
NOP 0;
NETWORK
TITLE =Achse 1 freigeben
//IO-Adresse wird an dieser Stelle momentan nicht benötigt
U M 1.0;
= L 0.0;
BLD 103;
CALL FB 1 , DB 112 (
Daten_Zeiger := DB1.DB_VAR,
REFERENZIEREN_START := L 0.0,
AKTIV := M 0.1,
FERTIG := M 0.2);

NOP 0;
END_FUNCTION


FC1 - MOVIAXIS1


Code:
FUNCTION FC 1 : VOID
TITLE =
AUTHOR : HO
FAMILY : SEW
NAME : BUS_POSI
VERSION : 0.1


VAR_INPUT
  Daten_Zeiger : ANY ;    //Zeiger Ablage Daten für die Achse
  IO_Adresse : INT ;    
END_VAR
VAR_OUTPUT
  FEHLER_SFC : BOOL ;    
END_VAR
VAR_TEMP
  Daten : STRUCT     //Zeiger für DB und Adresse der Anzeige
   DB_Nr : INT ;    //Anzeige-DB Nr
   Adresse : DWORD ;    //Anzeige Start-Adresse im DB
  END_STRUCT ;    
  Peripherie : WORD ;    //Peripherie-Zeiger Umrichter
  RET_VAL_SFC14 : INT ;    //Rückgabe vom DP lesen
  RET_VAL_SFC15 : INT ;    //Rückgabe zum DP schreiben
  MX1 : UDT 1;    
  test : BOOL ;    
END_VAR
BEGIN
NETWORK
TITLE =Adresse von INT nach Word wandeln

      L     #IO_Adresse; 
      T     #Peripherie; 
      NOP   0; 
NETWORK
TITLE =Daten vom Umrichter lesen
//#MX1.PI
      CALL SFC   14 (
           LADDR                    := #Peripherie,
           RET_VAL                  := #RET_VAL_SFC14,
           RECORD                   := #MX1.PI);
      NOP   0; 
NETWORK
TITLE =Daten zum Umrichter schreiben

      CALL SFC   15 (
           LADDR                    := #Peripherie,
           RECORD                   := #MX1.PO,
           RET_VAL                  := #RET_VAL_SFC15);
      NOP   0; 
NETWORK
TITLE =Fehlerauswertung SFC

      O(    ; 
      L     #RET_VAL_SFC15; 
      L     0; 
      <>I   ; 
      )     ; 
      O(    ; 
      L     #RET_VAL_SFC14; 
      L     0; 
      <>I   ; 
      )     ; 
      =     #FEHLER_SFC; 
NETWORK
TITLE =Test

      U     #MX1.PI.Betriebsart_24V; 
      =     #test; 
NETWORK
TITLE =Datenzeiger auftrennen

      L     P##Daten_Zeiger; // Datenzeiger in AKKU 1 laden
      LAR1  ; //  AR1 mit Inhalt von AKKU 1 laden

      L     W [AR1,P#4.0]; // DB Nummer in AKKU 1 laden
      T     #Daten.DB_Nr; // Inhalt von AKKU 1 nach TEMP kopieren

      L     D [AR1,P#6.0]; // Adresse in AKKU 1 laden
      T     #Daten.Adresse; // Inhalt von AKKU 1 nach TEMP kopieren

NETWORK
TITLE =Datenbaustein aufschlagen

      AUF   DB [#Daten.DB_Nr]; // DB Nummer mit Inhalt aus TEMP öffnen
      LAR1  #Daten.Adresse; // AR1 mit Inhalt von AKKU 1 laden
NETWORK
TITLE =Daten aus #PI in Zwischenspeicher DB kopieren

      U     #MX1.PI.FU_freigegeben; 
      =     DBX [AR1,P#3.1]; 

      U     #MX1.PI.Betriebsart_24V; 
      =     DBX [AR1,P#3.4]; 



NETWORK
TITLE =Daten aus Zwischenspeicher DB in #PO kopieren


      U     DBX [AR1,P#32.1]; 
      =     #MX1.PO.Freigabe_Schnellstop; 


      U     DBX [AR1,P#32.2]; 
      =     #MX1.PO.Freigabe_Halt; 

END_FUNCTION
 
Zuletzt bearbeitet:
Weiter gehts:

FB2 - MX Referenzieren (zum Testen erst mal nur "ACHSE FREIGEBEN")

Code:
VAR
  MX1 : UDT 1;    
END_VAR
VAR_TEMP
  Daten : STRUCT     //Zeiger für DB und Adresse der Anzeige
   DB_Nr : INT ;    //Anzeige-DB Nr
   Adresse : DWORD ;    //Anzeige Start-Adresse im DB
  END_STRUCT ;    
END_VAR
BEGIN
NETWORK
TITLE =Datenzeiger auftrennen

      L     P##Daten_Zeiger; // Datenzeiger in AKKU 1 laden
      LAR1  ; //  AR1 mit Inhalt von AKKU 1 laden

      L     W [AR1,P#4.0]; // DB Nummer in AKKU 1 laden
      T     #Daten.DB_Nr; // Inhalt von AKKU 1 nach TEMP kopieren

      L     D [AR1,P#6.0]; // Adresse in AKKU 1 laden
      T     #Daten.Adresse; // Inhalt von AKKU 1 nach TEMP kopieren

NETWORK
TITLE =Datenbaustein aufschlagen

      AUF   DB [#Daten.DB_Nr]; // DB Nummer mit Inhalt aus TEMP öffnen
      LAR1  #Daten.Adresse; // AR1 mit Inhalt von AKKU 1 laden
NETWORK
TITLE =Daten aus Zwischenspeicher DB in FB transferieren

      U     DBX [AR1,P#3.4]; 
      =     #MX1.PI.Betriebsart_24V; 

      U     DBX [AR1,P#3.1]; 
      =     #MX1.PI.FU_freigegeben; 

NETWORK
TITLE =Daten aus FB in Zwischenspeicher DB kopieren

      U     #MX1.PO.Freigabe_Schnellstop; 
      =     DBX [AR1,P#32.1]; 

      U     #MX1.PO.Freigabe_Halt; 
      =     DBX [AR1,P#32.2]; 


NETWORK
TITLE =



NETWORK
TITLE =Achse freigeben

      U     #REFERENZIEREN_START; 
      =     #MX1.PO.Freigabe_Schnellstop; 
      =     #MX1.PO.Freigabe_Halt; 
NETWORK
TITLE =Rückmeldung : Betriebsart 24V (400V Versorung fehlt)

      U     #MX1.PI.Betriebsart_24V; 
      =     #AKTIV; 
NETWORK
TITLE =Rückmeldung : FU freigegeben

      U     #MX1.PI.FU_freigegeben; 
      =     #FERTIG; 

NETWORK
TITLE =



END_FUNCTION_BLOCK
UDT1

Code:
TYPE UDT 1
VERSION : 0.1


  STRUCT     
   IO_ADRESSE : INT ;    //IO-Adresse des Antriebs
   PI : STRUCT     
    Motor_steht : BOOL ;    //Statuswort : Motor steht
    Antrieb_betriebsbereit : BOOL ;    //Statuswort : Antrieb ist betriebsbereit
    Antrieb_referenziert : BOOL ;    //Statuswort : Antrieb ist referenziert
    Reserve_1 : BOOL ;    //Statuswort : Reserve
    Bremse_offen : BOOL ;    //Statuswort : Bremse ist offen (falls vorhanden)
    Fehler_FU : BOOL ;    //Statuswort : Fehler Frequenzumrichter
    Warnung_FU : BOOL ;    //Statuswort : Warnung Frequenzumrichter
    Fehler_IEC : BOOL ;    //Statuswort : Fehler MotionController
    Kommunikation_aufgebaut : BOOL ;    //Statuswort : Kommunikation (PLC <> MX) aufgebaut
    FU_freigegeben : BOOL ;    //Statuswort : Frequenzumrichter freigegeben
    Synchron : BOOL ;    //Statuswort : Synchron (zur Interpolierten Lageregelung)
    Sicherer_Halt : BOOL ;    //Statuswort : Sicherer Halt
    Betriebsart_24V : BOOL ;    //Statuswort : Betriebsart 24V (400V Versorgung fehlt)
    Prozessdaten_nicht_breit : BOOL ;    //Statuswort : Prozessdaten nicht bereit
    Reserve : BOOL ;    //Statuswort : Reserve
    SW_Endschalter_belegt : BOOL ;    //Statuswort : Software-Endschalter belegt
    AM_Referenzieren : BOOL ;    //Angewählter AxisMode : Referenzieren
    AM_Drehzahlregelung : BOOL ;    //Angewählter AxisMode : Drehzahlregelung
    AM_Pos_Abs : BOOL ;    //Angewählter AxisMode : Positionieren Absolut
    AM_Pos_Rel : BOOL ;    //Angewählter AxisMode : Positionieren Relativ
    AM_Tippen : BOOL ;    //Angewählter AxisMode : Tippen
    AM_Kurvenscheibe : BOOL ;    //Angewählter AxisMode : Kurvenscheibe
    AM_Synchronlauf : BOOL ;    //Angewählter AxisMode : Synchronlauf
    AM_Reserve : BOOL ;    //Angewählter AxisMode : Reserve
    AM_Referenzieren_fertig : BOOL ;    //AxisMode : Referenzieren fertig
    AM_Drehzahl_erreicht : BOOL ;    //AxisMode : Drehzahl erreicht
    AM_Pos_Abs_inP : BOOL ;    //AxisMode : Positioneren Absolut - In Position
    AM_Pos_Rel_inP : BOOL ;    //AxisMode : Positioneren Relativ - In Position
    AM_Tippen_Sollgeschw_err : BOOL ;    //AxisMode : Tippen - Sollgeschwindigkeit erreicht
    AM_Reserve_1 : BOOL ;    //AxisMode : Reserve
    AM_Reserve_2 : BOOL ;    //AxisMode : Reserve
    AM_Reserve_3 : BOOL ;    //AxisMode : Reserve
    AM_Referenzieren_stop : BOOL ;    //AxisMode : Referenzieren gestoppt
    AM_Drehzahlregelung_stop : BOOL ;    //AxisMode : Drehzahlregelung gestoppt
    AM_Pos_Abs_stop : BOOL ;    //AxisMode : Positionieren Absolut gestoppt
    AM_Pos_Rel_stop : BOOL ;    //AxisMode : Positionieren Relativ gestoppt
    AM_Tippen_stop : BOOL ;    //AxisMode : Tippen gestoppt
    AM_Kurvenscheibe_stop : BOOL ;    //AxisMode : Kurvenscheibe gestoppt
    AM_Synchronlauf_stop : BOOL ;    //AxisMode : Synchronlauf gestoppt
    AM_Reserve_4 : BOOL ;    //AxisMode : Reserve
    Akt_AM_Referenzieren : BOOL ;    //Axis Mode : Referenzieren - Aktiv
    Akt_AM_Drehzahlregelung : BOOL ;    //Axis Mode : Drehzahlregelung - Aktiv
    Akt_AM_Pos_Abs : BOOL ;    //Axis Mode : Positionieren Absolut - Aktiv
    Akt_AM_Pos_Rel : BOOL ;    //Axis Mode : Positionieren Relativ - Aktiv
    Akt_AM_Tippen : BOOL ;    //Axis Mode : Tippen - Aktiv
    Akt_AM_Kurvenscheibe : BOOL ;    //Axis Mode : Kurvenscheibe - Aktiv
    Akt_AM_Synchronlauf : BOOL ;    //Axis Mode : Synchronlauf - Aktiv
    Akt_AM_Reserve_1 : BOOL ;    //Axis Mode : Reserve
    Umrichterstatus : WORD ;    //Umrichterstatus
    Ist_Geschwindigkeit : WORD ;    //Ist-Geschwindigkeit
    Ist_Drehzahl : WORD ;    //Ist-Drehzahl
    Ist_Position_Anwender : DWORD ;    //Ist-Position in Anwendereinheit
    Ist_Position_Modulo : DWORD ;    //Ist-Position in Modulo
    IEC_Fehlernummer : WORD ;    //IEC Fehlernummer
    IEC_Subfehlernummer : WORD ;    //IEC Subfehlernummer
    FU_Fehlernummer : WORD ;    //Frequenzumrichter Fehlernummer
    FU_Subfehlernummer : WORD ;    //Frequenzumrichter Subfehlernummer
    Ist_Drehmoment : WORD ;    //Ist-Drehmoment
   END_STRUCT ;    
   PO : STRUCT     
    Reglersperre : BOOL ;    //Reglersperre
    Freigabe_Schnellstop : BOOL ;    //Freigabe/Schnellstop
    Freigabe_Halt : BOOL ;    //Freigabe/Halt
    Reserve_1 : BOOL ;    //Reserve
    Bremse_oeffnen : BOOL ;    //Bremse öffnen (falls vorhanden)
    Reserve_2 : BOOL ;    //Reserve
    Reset : BOOL ;    //Reset
    Reserve_3 : BOOL ;    //Reserve
    Reserve_4 : BOOL ;    //Reserve
    Tippen_Pos : BOOL ;    //Tippen Positiv
    Tippen_Neg : BOOL ;    //Tippen Negativ
    Reserve_5 : BOOL ;    //Reserve
    Reserve_6 : BOOL ;    //Reserve
    Reserve_7 : BOOL ;    //Reserve
    Reserve_8 : BOOL ;    //Reserve
    SW_Endschalter_AUS : BOOL ;    //Software-Endschalter deaktivieren
    AM_Referenzieren : BOOL ;    //Axis Mode : Referenzieren
    AM_Drehzahlregelung : BOOL ;    //Axis Mode : Drehzahlregelung
    AM_Pos_Abs : BOOL ;    //Axis Mode : Positionieren Absolut
    AM_Pos_Rel : BOOL ;    //Axis Mode : Positionieren Relativ
    AM_Tippen : BOOL ;    //Axis Mode : Tippen
    AM_Kurvenscheibe : BOOL ;    //Axis Mode : Kurvenscheibe
    AM_Synchronlauf : BOOL ;    //Axis Mode : Synchronlauf
    AM_Reserve : BOOL ;    //Axis Mode : Reserve
    STRT_Referenzieren : BOOL ;    //Axis Mode : START - Referenzieren
    STRT_Drehzahlregelung : BOOL ;    //Axis Mode : START - Drehzahlregelung
    STRT_Pos_Abs : BOOL ;    //Axis Mode : START - Positionieren Absolut
    STRT_Pos_Rel : BOOL ;    //Axis Mode : START - Positionieren Relativ
    STRT_Reserve_1 : BOOL ;    //Axis Mode : START - Reserve
    STRT_Kurvenscheibe : BOOL ;    //Axis Mode : START - Kurvenscheibe
    STRT_Synchronlauf : BOOL ;    //Axis Mode : START - Synchronlauf
    STRT_Reserve_2 : BOOL ;    //Axis Mode : START - Reserve
    Tippen_V_Soll : WORD ;    //Tippen - Sollgeschwindigkeit
    Tippen_Acc_Dec : WORD ;    //Tippen - Beschleunigung / Verzögerung
    DZR_V_Soll : WORD ;    //Drehzahlregelung - Sollgeschwindigkeit
    DZR_Acc_Dec : WORD ;    //Drehzahlregelung - Beschleunigung / Verzögerung
    Pos_Abs_V_Soll : WORD ;    //Positionieren Absolut - Sollgeschwindigkeit
    Pos_Abs_Acc_Dec : WORD ;    //Positionieren Absolut - Beschleunigung / Verzögerung
    Pos_Abs_Zielposition : DWORD ;    //Positionieren Absolut - Zielposition
    Pos_Rel_V_Soll : WORD ;    //Positionieren Relativ - Sollgeschwindigkeit
    Pos_Rel_Acc_Dec : WORD ;    //Positionieren Relativ - Beschleunigung / Verzögerung
    Pos_Rel_Distanz : DWORD ;    //Positionieren Relativ - Distanz
    Alle_BA_Ruck : WORD ;    //Alle Betriebsarten : Ruck
   END_STRUCT ;    
  END_STRUCT ;    
END_TYPE
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Beschreibung:

FC10 Ist zum Steuern der Achse 1 gedacht

FC1 stellt die Kommunikation zwischen einem Antrieb und der SPS her.
Die empfangenen und zu sendenden Daten werden in den DB 1 eingetragen.

FB1 soll eigentlich das Referenzieren sein, verwende ich aber im Moment zum testen.
Wird der Eingang #REFERENZIEREN_START gesetzt sollen die beiden Bits "Freigabe / Schnellstop" und Freigabe / Halt" gesetzt werden.

Darauf hin müsste der Antrieb das Bit "FU_freigegeben" setzten und am FB wird der Ausgang #FERTIG gesetzt.

Gruß smartie
 
Hallo Helmut,

ich habe das in Beitrag #30 geändert, ich hatte da ausversehen den FC2 (deinen Beispiel FC) hochgeladen. Jetzt ist mein FC1 hochgeladen.

smartie
 
Das Problem ist nicht das ich nichts aus dem Umrichter bekomme, sondern das
zunächst (Beitrag #1) das Bit Freigabe in der SPS statisch 1 war, aber im FU getoggelt hat.

Das Problem habe ich jetzt nicht mehr.

Wenn ich jetzt die eine Achse ansteuere dann klappt alles.

Aber wenn ich eine zweite Achse dazu nehme und das Bit Freigabe Achse 1 setze dann wird nicht Achse 1 freigegeben, sondern Achse 2.

Die Rückmeldung das die Achse freigegeben ist kommt aber bei Achse 2 an, was ja richtig wäre.

Nur die Daten die ich an den Antrieb schreibe kommen falsch an..

Ich versuch mal das Programm als ZIP hochzuladen, wenn das geht.

smartie
 
Die Adressierung müsste meine Meinung nach passen:

Wenn ich nur die Kommunikation mit Achse 1 aufrufe kommen alle Signale korrekt an.

Wenn ich nur die Kommunikation mit Achse 2 aufrufe kommen alle Signale korrekt an.

Wenn ich aber beide gleichzeitig aufrufe dann gibts Probleme.
 
Ich kenne mich jetzt nicht mit den Moviaxis System von SEW aus,
ist das so das die Aufteilung wie folgt ist.
Steckplatz 3: Allgemeine Daten
Steckplatz 4: 1 Achse
Steckplatz 5: 2 Achse
Steckplatz 6: 3 Achse
Steckplatz 7: 4 Achse

Moviaxis.JPG
 
Zurück
Oben