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

Seite 1 von 5 123 ... LetzteLetzte
Ergebnis 1 bis 10 von 45

Thema: Probleme mit SFC14 und 15 in SCL

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

    Pfeil


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Bei einem DP-Slave möchte ich mittels dem SFC15 Daten an ein Slave via Profinet senden und mit SFC14 einlesen. Eigentlich wollte ich, dass Schreiben und Lesen direkt nacheinander ausgeführt werden und die entsprechenden Daten in einem DB gespeichert werden sollen.

    Mein Problem hierbei ist, dass wenn ich beides hintereinander ausführe (also S_CMD) drücke, dann schreibt er mir die gelesenen Daten erst beim zweiten Betätigen dieses Taster in den DB. Mache ich dies hingegen einzeln (erst S_SCHREIBEN und dann S_LESEN drücken), dann schreibt er die Daten beim drücken von S_LESEN in den Datenbaustein.

    Kann mir mal jemand erklären warum dies mit dem direkt hintereinander nicht funktioniert? Liegt das vielleicht daran, dass diese zu schnell hintereinander ausgeführt werden und dies bei der einzelnen Betätigung funktioniert weil dann ein zweiter Zyklus begonnen hat?

    Gibt es eine Lösung, das beide hintereinander ausgeführt werden?



    Code:
    IF S_CMD = TRUE THEN         
        STROBEID_SPS := STROBEID_SPS+1;            
        DB1.DBB42 := INT_TO_BYTE(STROBEID_SPS);
        Error1 := Schreiben_SFC15();
        Error2 := Lesen_SFC14();
        DB2.DBX0.0 := FALSE;
    END_IF;
    
    IF S_LESEN = TRUE THEN
        Error2 := Lesen_SFC14();
        DB2.DBX0.4 := FALSE;
    END_IF;
    
    IF S_SCHREIBEN = TRUE THEN
        STROBEID_SPS := STROBEID_SPS+1; 
        DB1.DBB42 := INT_TO_BYTE(STROBEID_SPS);
        Error1 := Schreiben_SFC15();
        DB2.DBX0.3 := FALSE;
    END_IF;
    Geändert von b.weyand85 (02.09.2014 um 14:55 Uhr)
    Zitieren Zitieren SFC14 und 15 in SCL in einem Zyklus laufen lassen  

  2. #2
    Registriert seit
    22.03.2007
    Ort
    Detmold (im Lipperland)
    Beiträge
    11.726
    Danke
    398
    Erhielt 2.402 Danke für 2.001 Beiträge

    Standard

    Hallo,
    ist in deinem Script "Schreiben_SFC15" der Aufruf des SFC15 und "Lesen_SFC14" der Aufruf des SFC14 ?
    Wenn ja, wo werden dann die Übergabe-Parameter an den Baustein wie LADDR und RECORD versorgt ?
    Bei mir sieht so etwas z.B. so aus :
    Code:
    ret_wert_SFC14 := SFC14 (LADDR := Per_word , RECORD := Input_Data) ;
    und ... man kann die beiden Baustein durchaus im selben Zyklus und hintereinander aufrufen ...

    Gruß
    Larry

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

    Standard

    Oh sorry, die Information hätte ich natürlich mitliefern sollen.

    Ich habe dazu zwei einzelne Funktionen erstellt, die die jeweilige SFC aufruft. Das Ganze sieht dann wie folgt aus:

    Code:
     
    FUNCTION Lesen_SFC14: INT
    
    VAR
        
        Error1 :INT;
        Pointer_Lesen : STRUCT
            ANY_id :BYTE;
            Datentyp : BYTE;
            Laenge : WORD;
            DB_Nr : WORD;
            Byte_Pointer : DWORD;
        END_STRUCT;
        
        pAny AT Pointer_Lesen : ANY;
    END_VAR
    
    
    //Versorgung der 10 Byte Buffer für den ANY-Pointer
    Pointer_Lesen.ANY_id:= b#16#10;                 //Pufferlänge
    Pointer_Lesen.Datentyp:= 2;                         //Code für Datentyp BYTE
    Pointer_Lesen.Laenge:= INT_TO_WORD(32);             //Anzahl der Nutzdaten-Byte
    Pointer_Lesen.DB_Nr:= INT_TO_WORD(1);          //Nummer des Ziel-DBs für die Nutzdaten
    Pointer_Lesen.Byte_Pointer1 := dw#16#84000000;
    
    Error1:= DPRD_DAT(LADDR:= w#16#100, RECORD:= pAny);  //Daten lesen mit SFC14
    
    Lesen_SFC14 := Error1;
    
    END_FUNCTION
    
    FUNCTION Schreiben_SFC15: INT
    
    VAR
        Error :INT;
        Pointer_Schreiben : STRUCT
            ANY_id :BYTE;
            Datentyp : BYTE;
            Laenge : WORD;
            DB_Nr : WORD;
            Byte_Pointer2 : DWORD;
        END_STRUCT;
        
        pAny AT Pointer_Schreiben : ANY;
    END_VAR
    
    
    //Versorgung der 10 Byte Buffer für den ANY-Pointer
    Pointer_Schreiben.ANY_id2:= b#16#10;                 //Pufferlänge
    Pointer_Schreiben.Datentyp2:= 2;                         //Code für Datentyp BYTE
    Pointer_Schreiben.Laenge2:= INT_TO_WORD(32);             //Anzahl der Nutzdaten-Byte
    Pointer_Schreiben.DB_Nr2:= INT_TO_WORD(1);          //Nummer des Ziel-DBs für die Nutzdaten
    Pointer_Schreiben.Byte_Pointer2 := dw#16#84000130;
    Error:= DPWR_DAT(LADDR:= w#16#100, RECORD:= pAny);  //Daten schreiben mit SFC15
    
    Schreiben_SFC15 := Error;
    
    END_FUNCTION

    Beide Errors liefern auch eine 0 zurück, die Ausführung ist somit in Ordnung. Mich wundert halt nur, dass es erst beim zweiten Mal funktioniert, wenn ich die Taste drücke...

  4. #4
    Registriert seit
    22.03.2007
    Ort
    Detmold (im Lipperland)
    Beiträge
    11.726
    Danke
    398
    Erhielt 2.402 Danke für 2.001 Beiträge

    Standard

    Woher weisst du denn, dass es erst beim 2. Mal S_CMD funktioniert ?
    Hast du überlegt, dass dein PN-Slave vielleicht nicht unmittelbar auf deine Daten reagiert ?

    Warum hast du übrigens den Code auf mehrere Bausteine aufgeteilt - das macht das Ganze m.E. eher unübersichtlich ...

    Gruß
    Larry

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

    Standard

    Ich wähle ein Programm vor, welches ich mit einem entsprechenden Kommando und durch das erhöhen der STROBEID übertrage. Dies läuft in der Visualisierung ab, deshalb habe ich das hier auch nicht eingefügt.
    Dazu schreibe ich in DB1 ab BYTE 38 (deswegen dw#16#84000130) entsprechende Daten und sende diese an das Slave. Die empfangenen Daten sollen dann an die ab BYTE 0 geschrieben werden. Beim ersten Drücken wird nichts an diese Stelle geschrieben aber beim zweiten betätigen erhalte ich dort die Werte, die ich auch erwarte.

    Dass der Slave nicht unmittelbar auf die Daten reagiert habe ich noch nicht bedacht - ich weiß aber auch nicht genau wie ich eine Wartezeit einfüge...

    Den Code habe ich aufgeteilt, damit ich dies einzeln probieren konnte.

  6. #6
    Registriert seit
    22.03.2007
    Ort
    Detmold (im Lipperland)
    Beiträge
    11.726
    Danke
    398
    Erhielt 2.402 Danke für 2.001 Beiträge

    Standard

    ... dann solltest du es vielleicht so machen, dass du das Empfangen immer laufen läßt und nur das Senden asynchron durchführst - wobei streng genommen macht auch das eigentlich keinen Sinn - du sparst dir dadurch nichts. Von der Funktion her ist der Daten-Handshake (wie du es ja selber auch schon beschreibst) darauf ausgelegt, dass sich etwas ändern muss.

    Lass doch einfach die SFC14-SFC15-Geschichte permanent laufen und du änderst nur Ereignis-gestützt (z.B.) die jeweiligen Speicherinhalte.
    Von was für einem PN-Slave reden wir da übrigens ?

    Gruß
    Larry

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

    Standard

    Es handelt sich um einen Sinius Inverter.

    Problem bei dem permanenten Ablauf ist, wenn ich mehrere Programmsegmente übertrage (wo sich die Parameter wie Anfangsstrom, Endstrom, etc. ändern) und ich dies mit einer for-Schleife realisiere, wird mir nachher nur das letzte Segment richtig übertragen. Ich müsste dann schon so etwas wie eine Wartezeit einfügen und warten bis die Daten empfangen wurden.

  8. #8
    Registriert seit
    22.03.2007
    Ort
    Detmold (im Lipperland)
    Beiträge
    11.726
    Danke
    398
    Erhielt 2.402 Danke für 2.001 Beiträge

    Standard

    Wenn du die unterschiedlichen Parameter immer in die selbe Adresse des Koppelbereichs schreiben mußt und über einen weiteren Parameter festlegst, was du da überträgst, dann wirst du um solche "Wartezeiten" (allerdings nicht innerhalb der Schleife) nicht herumkommen.

    Gruß
    Larry

  9. #9
    Registriert seit
    27.05.2004
    Ort
    Thüringen/Berlin
    Beiträge
    12.222
    Danke
    533
    Erhielt 2.698 Danke für 1.950 Beiträge

    Standard

    BYTE 38 (deswegen dw#16#84000130) btw stimmt das???
    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

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

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    @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?

Ä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
  •