Zuviel Werbung? - > Hier kostenlos beim SPS-Forum registrieren

Seite 2 von 5 ErsteErste 1234 ... LetzteLetzte
Ergebnis 11 bis 20 von 45

Thema: Probleme mit SFC14 und 15 in SCL

  1. #11
    Registriert seit
    27.05.2004
    Ort
    Thüringen/Berlin
    Beiträge
    12.222
    Danke
    533
    Erhielt 2.697 Danke für 1.949 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Zitat Zitat von b.weyand85 Beitrag anzeigen
    @Ralle: Ja das stimmt, weil:

    -Speicherber. -| nix |- Byteadresse -|Bitadresse
    dw#2#1000 (= 0100 (=4) 0000 0000 0000 0001 0011 0000 = 38.0
    => dw#16#84000130


    @Larry:
    Ja, ich schreibe die an die selbe Stelle des Übertragungsbausteins. Wie realisiere ich denn eine solche Wartezeit einfach nur mit einem Timer, den ich dann an dieser Stelle einfüge?
    Yep, stimmt, da war ich auf dem ganz falschen Fuß!
    Gruß
    Ralle

    ... there\'re 10 kinds of people ... those who understand binaries and those who don\'t …
    and the third kinds of people … those who love TIA-Portal

  2. #12
    Registriert seit
    22.06.2009
    Ort
    Sassnitz
    Beiträge
    11.186
    Danke
    923
    Erhielt 3.291 Danke für 2.660 Beiträge

    Standard

    Zitat Zitat von Ralle Beitrag anzeigen
    BYTE 38 (deswegen dw#16#84000130) btw stimmt das???
    Zitat Zitat von b.weyand85 Beitrag anzeigen
    @Ralle: Ja das stimmt, weil:
    Statt der Hexadezimalzahl kann man auch eine Formel schreiben wie der Wert sich zusammensetzt. Das kann man später besser nachvollziehen. Wenn in der Formel nur Konstanten sind, dann schreibt der SCL-Compiler direkt das Ergebnis der Formel ins Programm (DW#16#84000130):
    Code:
    Pointer_Schreiben.Byte_Pointer:= DW#16#84000000 OR INT_TO_DWORD(38*8);
    oder auch
    Code:
    CONST
        Any_Bereich_DB := DW#16#84000000 ; // ANY Bereichskennung "DB"
    END_CONST
    ...
    Pointer_Schreiben.Byte_Pointer:= Any_Bereich_DB OR INT_TO_DWORD(38*8);
    Harald
    Es ist immer wieder überraschend, wie etwas plötzlich funktioniert, sobald man alles richtig macht.

    FAQ: Linkliste SIMATIC-Kommunikation über Ethernet

  3. #13
    Registriert seit
    27.05.2004
    Ort
    Thüringen/Berlin
    Beiträge
    12.222
    Danke
    533
    Erhielt 2.697 Danke für 1.949 Beiträge

    Standard

    Ich mach des immer noch mit SLD 3 (*, aber natürlich nur in AWL, in SCL wir PN/DP.
    Gruß
    Ralle

    ... there\'re 10 kinds of people ... those who understand binaries and those who don\'t …
    and the third kinds of people … those who love TIA-Portal

  4. #14
    Registriert seit
    22.03.2007
    Ort
    Detmold (im Lipperland)
    Beiträge
    11.718
    Danke
    398
    Erhielt 2.400 Danke für 2.000 Beiträge

    Standard

    Zitat Zitat von b.weyand85 Beitrag anzeigen
    @Larry:
    Ja, ich schreibe die an die selbe Stelle des Übertragungsbausteins. Wie realisiere ich denn eine solche Wartezeit einfach nur mit einem Timer, den ich dann an dieser Stelle einfüge?
    Hallo,
    vielleicht legst du mal etwas mehr offen, wie dein Übertragungsbereich gestaltet ist und was du alles übertragen willst - dann würde ich dir ggf. einen Vorschlag machen können. So in etwa bin ich wahrscheinlich in der richtigen Spur (deswegen hatte ich auch schon nach dem Gerät gefragt weil ich gehofft hatte, dass es eines ist, das ich schon kenne) .

    Gruß
    Larry

  5. #15
    Registriert seit
    20.07.2012
    Beiträge
    33
    Danke
    0
    Erhielt 0 Danke für 0 Beiträge

    Standard

    Von der Datenstruktur her, sende ich 32 Byte an den Inverter und bekomme dann auch 32 Byte zurück.

    Beide Sachen habe ich im DB1 stehen. Von Byte 0 bis 31 stehen die Daten, die vom Inverter kommen und von Byte 38 bis 69 sind die Daten, die an den Inverter gesendet werden. Dazwischen habe ich noch Spannungs- und Stromwerte eingefügt, bei denen High und Low-Byte vertauscht wurden, damit der Wert korrekt angezeigt wird.

    Einen weiteren Datenbaustein habe ich erstellt um dort die Schweißprogramme abzuspeichern. Diese werden über ein Touchpanel für die einzelnen Programmsegmente (10 möglich) eingegeben. In DB6 sind dann diese 10 Segmente (wo z.B. Anfangs-, Endstrom, Dauer, etc. drin stehen) angelegt. Segment 1 geht von Byte 0 bis 19 und das nächste Segment fängt dann bei Byte 32 Segment 2 an. Dazwischen befinden sich wieder Platzhalter zum Tausch von High und Low-Byte.

    Ich habe das bisher so gelöst, dass die in DB6 gespeicherten Daten mit SFC20 an die bestimmte Stelle in DB1 geschrieben werden. Hierzu zählt dann auch noch die Nr. des Programmsegmentes und die Kommando-ID. Das Kommando wird dann ausgeführt, wenn die Strobe-ID verändert wird (ich erhöhe diese dann um 1). Wenn das Kommando ausgeführt wurde steht in den Daten, die ich vom Inverter bekomme unter Result das Kommando, welches ausgeführt wurde und auch die Strobe-ID ist dann gleich.

    Reicht das so an Informationen?

  6. #16
    Registriert seit
    22.03.2007
    Ort
    Detmold (im Lipperland)
    Beiträge
    11.718
    Danke
    398
    Erhielt 2.400 Danke für 2.000 Beiträge

    Standard

    Ja ... so in etwa habe ich es mir auch schon vorgestellt ...
    Du möchtest nun nacheinander mehrere Datenblöcke übertragen ?
    Wenn ja, dann sähe dein Ablauf dafür wie folgt aus : (SFC14 und SFC15 laufen hierfür IMMER komplett mit)

    1. Zuweisen der Daten auf den Übertragungs-Bereich
    2. Setzen der Kommando-ID
    3. Ändern der Strobe-ID
    4. Warten bis die Strobe-ID und die Kommando-ID reflektiert worden sind (das kann u.U. mehrere SPS-Zyklen dauern)
    5. weiter mit 1. - allerdings mit dem nächsten Datensatz

    Das Ganze würde ich als eine Art Schrittkette in dem SCL-Baustein umsetzen (z.B. mit Select Case) ...

    Anders wird das sonst wohl nicht sauber funktionieren.
    Der ganze Ablauf kann nun so viele Datensätze übertragen, wie du brauchst und kann (bei entsprechender Ausführung) mit nur einem Trigger-Bit von "Aussen" angestossen werden. Wenn es fertig ist könntest du dann ja ein "Done" nach "Aussen" zurückgeben.

    Konntest du dem Ganzen folgen ?

    Gruß
    Larry

  7. #17
    Registriert seit
    20.07.2012
    Beiträge
    33
    Danke
    0
    Erhielt 0 Danke für 0 Beiträge

    Standard

    Danke Larry, so werde ich das mal versuchen. Bisher hatte ich das ja mit einer for-Schleife versucht und das hatte nicht geklappt. Das mit der Schrittkette wird dann wohl die bessere Lösung sein.

  8. #18
    Registriert seit
    20.07.2012
    Beiträge
    33
    Danke
    0
    Erhielt 0 Danke für 0 Beiträge

    Standard

    Ich habe mal eine Schrittkette programmiert, doch leider geht die SPS immer in STOP, wenn ich den Programm-übertragen-Taster drücke.

    Das Programm sieht folgendermaßen aus:

    Code:
    IF S_PROG_UEBERTRAGEN = TRUE THEN
        SCHRITT := 1;
        DB2.DBX0.2 := FALSE;
    END_IF;
    
    
        CASE SCHRITT OF
            1:  
                DB1.DBB43 := INT_TO_BYTE(6); //Kommando-ID auf 6 setzen: Programmsegment übertragen
                Quelle := 20;
                Ziel := 0;
                PROGSEG := 0;
                DB1.DBB45 := INT_TO_BYTE(PROGSEG);
                Tauschen(X1:= DB6.DBW[Quelle], X3:= DB6.DBW[Ziel]); //HIGH- und LOW-Byte tauschen
                Pointer1.ANY_id:= 16#10;  //Angabe der Syntax-ID
                Pointer1.Quelle_Datentyp:= 16#02; //Code für den Datentyp
                Pointer1.Quelle_Laenge:= 16#10;
                Pointer1.Quelle_DB_Nummer:= 16#06;                                    
                Pointer1.Quelle_Byte_Pointer:= dw#16#84000000; //Byte und Bitadresse des Datenbausteins hier 0.0
                //    -Speicherber.     -|  nix |-  Byteadresse    -|Bitadresse
                //dw#2#1000 (=8) 0100 (=4) 0000 0000 0000 0000 0101 0000                                                                          
                Pointer2.ANY_id:= 16#10;  //Vorbelegen der Ziel-ANY-Pointer Variablen
                Pointer2.Ziel_Datentyp:= 16#02;
                Pointer2.Ziel_Laenge:= 16#10;
                Pointer2.Ziel_DB_Nummer:= 16#01;
                //    -Speicherber.     -|  nix |-  Byteadresse    -|Bitadresse
                //dw#2#1000 (=8) 0100 (=4) 0000 0000 0000 0001 1000 0000 = 48.0 
                Pointer2.Ziel_Byte_Pointer:= dw#16#84000180;
                erg:= SFC20(srcblk:= pAny_Quelle, dstblk:= pAny_Ziel); //Aufruf von SFC20 Blockmove um Teile des Datenbausteins zu kopieren
                STROBEID_SPS := 1;
                DB1.DBB42 := INT_TO_BYTE(STROBEID_SPS);
                IF STROBEID_SPS = STROBEID_SINIUS THEN
                SCHRITT := SCHRITT +1;
                END_IF;
                
            2:
                PROGSEG := 1;
                DB1.DBB45 := INT_TO_BYTE(PROGSEG);
                Quelle := Quelle + 32;
                Ziel := Ziel + 32;
                Tauschen(X1:= DB6.DBW[Quelle], X3:= DB6.DBW[Ziel]);
                STROBEID_SPS := 2;
                DB1.DBB42 := INT_TO_BYTE(STROBEID_SPS);
                IF STROBEID_SPS = STROBEID_SINIUS THEN
                SCHRITT := SCHRITT + 1;
                END_IF; 
            
            3: 
                PROGSEG := 2;
                DB1.DBB45 := INT_TO_BYTE(PROGSEG);
                Quelle := Quelle + 32;
                Ziel := Ziel + 32;
                Tauschen(X1:= DB6.DBW[Quelle], X3:= DB6.DBW[Ziel]);
                STROBEID_SPS := 3;
                DB1.DBB42 := INT_TO_BYTE(STROBEID_SPS);
                IF STROBEID_SPS = STROBEID_SINIUS THEN
                SCHRITT := SCHRITT + 1;
                END_IF; 
    
    
    END_CASE;
    Wenn S_Uebertragen gedrückt wird, dann wird Schritt 1 gesetzt. In diesem werden die ganzen Vordefinitionen für Pointer etc. getrofffen. Nach dem Drücken funktioniert dies bis Schritt = 2 ist und auch Progseg wird = 1, jedoch geht dann die SPS in Stop. Wo liegt hier mein Denkfehler?

    Weise ich der Strobe-ID := Strobe-ID + 1 zu, so bleibt die SPS im RUN, jedoch wird nie ein Schritt weitergeschaltet, weil StrobeID der SPS nie gleich der StrobID des Inverters wird...

  9. #19
    Registriert seit
    22.03.2007
    Ort
    Detmold (im Lipperland)
    Beiträge
    11.718
    Danke
    398
    Erhielt 2.400 Danke für 2.000 Beiträge

    Standard

    Hallo,
    interessant wäre es, zu wissen welchen Fehler du bekommst und wo das Programm abstürzt ...

    Was mir generell zu deinem Code einfällt :

    die Schrittkette würde ich so machen :
    Code:
          2:
                PROGSEG := 1;
                DB1.DBB45 := INT_TO_BYTE(PROGSEG);
                Quelle := Quelle + 32;
                Ziel := Ziel + 32;
                Tauschen(X1:= DB6.DBW[Quelle], X3:= DB6.DBW[Ziel]);
                STROBEID_SPS := 2;
                DB1.DBB42 := INT_TO_BYTE(STROBEID_SPS);
                Schritt := 3 ;
    3 :
                IF STROBEID_SPS = STROBEID_SINIUS THEN
                SCHRITT := 4;
                END_IF; 
    
    usw.
    Wie sieht der Code von "Tauschen" aus ?

    Gruß
    Larry

  10. #20
    Registriert seit
    22.06.2009
    Ort
    Sassnitz
    Beiträge
    11.186
    Danke
    923
    Erhielt 3.291 Danke für 2.660 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Auf die Schnelle:
    - Wo hast Du den Code programmiert? Wo sind die Variablen SCHRITT, STROBEID... deklariert? FC und TEMP haben kein Gedächtnis.
    - Müsste der Schritt 1 nicht eigentlich in 2 Schritte aufgeteilt werden? So wie jetzt wird das Tauschen und Kopieren immer wieder wiederholt.
    - Der Code bei Tauschen(... und der Kommentar passen scheinbar nicht zusammen. (Word, Byte). Und steht da wirklich DB6.DBW[ ??
    - CPU-Stop: was steht im Diagnosepuffer?

    Ist das zusammenbasteln der konstanten Any wirklich nötig?

    Harald
    Es ist immer wieder überraschend, wie etwas plötzlich funktioniert, sobald man alles richtig macht.

    FAQ: Linkliste SIMATIC-Kommunikation über Ethernet

Ähnliche Themen

  1. TIA Probleme mit s71200 und scl
    Von RMLIF im Forum Simatic
    Antworten: 13
    Letzter Beitrag: 09.10.2013, 15:25
  2. Korrekter Aufruf von DPWR_DAT (SFC14) in SCL?
    Von iga-graz im Forum Simatic
    Antworten: 7
    Letzter Beitrag: 25.03.2009, 15:24
  3. Probleme mit SCL
    Von Kubi im Forum CODESYS und IEC61131
    Antworten: 12
    Letzter Beitrag: 20.03.2009, 19:30
  4. Probleme mit DBs in SCL
    Von chrissi im Forum Simatic
    Antworten: 22
    Letzter Beitrag: 09.08.2007, 13:06
  5. Probleme mit 2 For Next Schleifen in SCL
    Von Gerold im Forum Simatic
    Antworten: 4
    Letzter Beitrag: 07.10.2005, 11:01

Lesezeichen

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •