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

Seite 1 von 2 12 LetzteLetzte
Ergebnis 1 bis 10 von 12

Thema: wie oft kann man denn Fb63 Fb64 pro verbindung aufrufen

  1. #1
    Registriert seit
    17.10.2008
    Ort
    Lichtenfels
    Beiträge
    29
    Danke
    4
    Erhielt 0 Danke für 0 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Hallo zusammen

    Wie oft kann ich den FB 63 bzw fb 64 pro projektierter Verbindung aufrufen kann ich denn für jede Verbindung nur 1 mal benutzen oder kann ich den auch mehrmals aufrufen

    hab folgende Situation
    Ich muss per TCp verbindung an einem zentralen Leitrechner (iTAC System ) Daten senden und dann wieder empfangen dafür hab ich eine Verbindung auf eine IP Adresse und einen Port das ganze ist mit fb 65 und fb66 sowie einem fc 97 aus einem Beispielprojekt von Siemens aufgebaut
    die Verbindung steht und ist auch kein Problem
    Ich hab 4 Bearbeitungszellen jede dieser Zellen fragt mit einem Barcode beim iTac eine Freigabe für das Produkt ab und legt dann los
    hab mir das ganze in einem FB per Scl zusammen gebastelt funktioniert auch soweit wenn ich den FB nur einmal aufrufen rufe ich den Fb mehrmals auf funktioniert nur der erste Aufruf alle anderen aufrufe bleiben bei der Bearbeitung des Fb63 Bzw. fb64 Stehen
    kann das was mit dem Instanz Aufruf zu tun haben bzw muss ich vielleicht hier die Adressregister von den Instanzdatenbausteinen mit durch reichen damit die Rückmeldungen vom FB 63 FB 64 im richtigen instanzdatenbaustein ankommen

    Danke schon mal



    Verwendete CPU 315 2 PN/DP

    Grüße Rudi
    Zitieren Zitieren wie oft kann man denn Fb63 Fb64 pro verbindung aufrufen  

  2. #2
    RMLIF ist offline Neuer Benutzer
    Themenstarter
    Registriert seit
    17.10.2008
    Ort
    Lichtenfels
    Beiträge
    29
    Danke
    4
    Erhielt 0 Danke für 0 Beiträge

    Standard

    Anbei der CODE aus SCL

    Code:
    FUNCTION_BLOCK FB201
    
    // Bausteinparameter
    VAR_INPUT
        // Eingangsparameter
     
     
     IN_Scanner_Ergebniss: STRING [64];
     IN_Scanner_Ein: BOOL;
     IN_Scanner_Ergeb_Akt:BOOL;
      IN_Stoerung_Qitt:BOOL;
     Stationsnummer:INT;
     TCP_CONNECTED:BOOL;
     TCP_Verbindung:WORD;
    END_VAR
    
    VAR_IN_OUT
        // Durchgangsparameter
     
        IO_Text_Fehlermeldung:STRING[64];
        IN_iTAC_Senden:BOOL;
        IO_iTAC_IO:BOOL;
        IO_iTAC_NIO:BOOL;
        IO_iTac_Fehlermeldung:BOOL;
      
    END_VAR
    
    VAR_OUTPUT
        // Ausgangsparameter
    O_Busy:BOOL;
    O_Done:BOOL;
    END_VAR
    
    
    VAR_TEMP
        // temporäre Variablen
    test:ANY;
    END_VAR
    VAR
        // statische Variablen
        VAR_Text_Fehlermeldung:STRING[64];
        iTAC_DMC_String:STRING[64];
        Rueckmeldung_iTAC:STRING[64];
        iTAC_DMC_String_Teil1:String[64];
        iTAC_DMC_String_Teil2:String[64];
        iTAC_IO:BOOL;
        iTAC_NIO:BOOL;
        iTAC_Fehlermeldung:BOOL;
        Stationsnummer_Konst:ARRAY[1..4]OF STRING[64];
        Stationsnummer_STRING:STRING[64];
        IO_Ergebniss:INT;
        NIO_Ergebniss:INT;
        Send:FB63;
        FP_Send_Start :BOOL;
        input_FP_Start_Send:BOOL;
        Send_Start:BOOL;
        Send_Done:BOOL;
        Send_Busy:BOOL;
        Send_Error:BOOL;
        Send_Status:WORD;
        Recive:FB64;
        FP_Recive_Start :BOOL;
        input_FP_Start_Resive:BOOL;
        Recive_Start:BOOL;
        Recive_NDR:BOOL;
        Recive_Busy:BOOL;
        Recive_Error:BOOL;   
        Recive_Status:WORD;
        Recive_LEN:INT;
        Schrittkette:INT;
        Abfrage_Recive_LEN:INT;
        I:INT;
        NIO_Suchstring:ARRAY [1..5]OF STRING[2];
        at_str_Send AT iTAC_DMC_String : STRUCT // AT-Sicht auf die Variable "str"
        max_length : BYTE;  // Maximale-Länge des Strings
        act_length : BYTE;  // Aktuelle Länge des Strings
        chars: ARRAY [1..64] OF CHAR; // Die einzelnen Zeichen
        END_STRUCT;
        at_str_Recive AT Rueckmeldung_iTAC : STRUCT // AT-Sicht auf die Variable "str"
        max_length : BYTE;  // Maximale-Länge des Strings
        act_length : BYTE;  // Aktuelle Länge des Strings
        chars: ARRAY [1..64] OF CHAR; // Die einzelnen Zeichen
        END_STRUCT; 
        HM_Ablauf:STRUCT
        Send_Daten_Gesendet:BOOL;
        Send_Daten_Error:BOOL;
        Recive_Daten_Empfangen:BOOL;
        Recive_Daten_Error:BOOL;
        
        END_STRUCT;
       
    END_VAR
    //STRING INIT
    
      //Rueckmeldung_iTAC:='1234567890123456789012345678901234567890123456789012345678901234';
      // iTAC_DMC_String:= ' ';
    
    
      
    // Vorgaben Rückmeldungen
          Stationsnummer_Konst[1]:='01;';
        Stationsnummer_Konst[2]:='02;';
        Stationsnummer_Konst[3]:='03;';
        Stationsnummer_Konst[4]:='04;';
        
        //Vorbelegung NIO_Suchstring
        NIO_Suchstring[1]:='1;';
        NIO_Suchstring[2]:='2;';
        NIO_Suchstring[3]:='3;';
        NIO_Suchstring[4]:='4;';
        NIO_Suchstring[5]:='9;';
        
      // Stationnummer auswerten 
      Stationsnummer_STRING:=Stationsnummer_Konst[Stationsnummer];
      
        IF NOT  IN_Scanner_Ein AND IN_Scanner_Ergeb_Akt THEN   
       // iTAC STRING zusammensetzten
       
            iTAC_DMC_String_Teil1:=CONCAT(IN1 := '' // IN: STRING
                      ,IN2 :=Stationsnummer_Konst[Stationsnummer]  // IN: STRING
                        ); // STRING
      
            iTAC_DMC_String_Teil2:=CONCAT(IN1 := iTAC_DMC_String_Teil1 // IN: STRING
                      ,IN2 :=IN_Scanner_Ergebniss  // IN: STRING
                        ); // STRING
    
            iTAC_DMC_String:=CONCAT(IN1 := iTAC_DMC_String_Teil2 // IN: STRING
                      ,IN2 :='$r$l'
                   
                        ); // STRING
        END_IF;
       
         
    
          
                
                       
            IF IN_iTAC_Senden AND NOT O_Busy AND NOT IO_iTac_Fehlermeldung THEN
                Schrittkette:=1;
                
            END_IF;
            
            
            CASE Schrittkette OF
                0 :     O_Busy:=False;   
                        input_FP_Start_Send := false;
                        FP_Send_Start:= false;
                        input_FP_Start_Resive:= false;
                        FP_Recive_Start:=false;
                        Send_Start:=false;
                        Recive_Start:=false;
                        IO_Ergebniss:=0;
                        NIO_Ergebniss:=0;
                        ;
                
                1 :    IF TCP_CONNECTED THEN
                    // impuls beim OFF-ON
                        input_FP_Start_Send := True;
                        Send_Start := input_FP_Start_Send AND NOT FP_Send_Start ;
                        FP_Send_Start := input_FP_Start_Send ;
                        input_FP_Start_Resive := True;
                        Recive_Start := input_FP_Start_Resive AND NOT FP_Recive_Start ;
                        FP_Recive_Start := input_FP_Start_Resive ;
                        O_Busy:=true;
                        O_Done:=false;
                        IN_iTAC_Senden:=false;
                        Schrittkette:=3;
                    END_IF;;
                
                3 : IF HM_Ablauf.Send_Daten_Gesendet THEn
                        input_FP_Start_Send := false;
                        FP_Send_Start:= false;
                        HM_Ablauf.Send_Daten_Gesendet:=false;
                        Schrittkette:=10;    
                    END_IF;;
    
                    IF HM_Ablauf.Send_Daten_Error  THEN
                        input_FP_Start_Send := false;
                        FP_Send_Start:= false;
                        HM_Ablauf.Send_Daten_Error:=false;
                        Schrittkette:=0;    
                    END_IF;;
    
                            
               10 : IF HM_Ablauf.Recive_Daten_Empfangen THEN 
                        input_FP_Start_Resive:= false;
                        FP_Recive_Start:=false;
                        HM_Ablauf.Recive_Daten_Empfangen:=false;
                        Schrittkette:=15;
                    END_IF;;
                    
                    IF HM_Ablauf.Recive_Daten_Error THEN 
                        input_FP_Start_Resive:= false;
                        FP_Recive_Start:=false;
                        HM_Ablauf.Recive_Daten_Error:=false;
                        Schrittkette:=0;
                    END_IF;;
    
                
               15 :     IO_Ergebniss:=  FIND(IN1 := Rueckmeldung_iTAC // IN: STRING
                            ,IN2 := '0;OK;' // IN: STRING
                            ); // INT
                         IF IO_Ergebniss <>8 THEN 
                         FOR I := 1 TO 5 BY 1 DO
                         NIO_Ergebniss:=  FIND(IN1 := Rueckmeldung_iTAC // IN: STRING
                            ,IN2 := NIO_Suchstring[I] // IN: STRING
                            ); // INT
                        IF NIO_Ergebniss <>0 THEN 
                            EXIT;
                        END_IF;
                         ;
                        END_FOR;
                        END_IF;
                        IF IO_Ergebniss=8 OR NIO_Ergebniss <>0 THEN 
    
                        Schrittkette:=20;
                        END_IF;
                
               20 : IF IO_Ergebniss = 8 THEN
                        iTAC_IO:=true;
                        iTAC_NIO:=False; // Anweisungsteil_IF
                        Schrittkette:=25;      
                    END_IF;
                 
                    IF NIO_Ergebniss <>0 THEN
                        iTAC_IO:=false;
                        iTAC_NIO:=true; // Anweisungsteil_IF
                        iTAC_Fehlermeldung:=true;       
                        VAR_Text_Fehlermeldung:= DELETE(IN :=  Rueckmeldung_iTAC // IN: STRING
                                   ,L :=NIO_Ergebniss  // IN: INT
                                   ,P :=1  // IN: INT
                                   ); // STRING
                    Schrittkette:=25;
                    END_IF;;
               25 : IF iTAC_IO OR iTAC_NIO AND NOT iTAC_Fehlermeldung THEN
                        O_Busy:=false;
                        O_Done:=true;
                       Schrittkette:=0; 
                     //Leerstring Eintragen 1234567890123456789012345678901234567890123456789012345678901234
                        Rueckmeldung_iTAC:='                                                                ';
                       
                    END_IF;;
                    
                    
    
            END_CASE;
     // Störung Itac Qittieren 
     IF iTAC_Fehlermeldung AND IN_Stoerung_Qitt THEN
        iTAC_Fehlermeldung:=false;
          //Leerstring Eintragen 1234567890123456789012345678901234567890123456789012345678901234
        VAR_Text_Fehlermeldung:='                                                                ';
        
    END_IF;
    // INOUt Schnittstelle Beschreiben 
    
            IO_iTAC_IO:=iTAC_IO;
            IO_iTAC_NIO:=iTAC_NIO; 
            IO_iTac_Fehlermeldung:=iTAC_Fehlermeldung;
            IO_Text_Fehlermeldung:=VAR_Text_Fehlermeldung;
           
    // Aufruft Tsend Bausteine
       Send(REQ := Send_Start // IN: BOOL
                   ,ID :=TCP_Verbindung  // IN: WORD
                   ,LEN := 64 // IN: INT
                   ,DATA :=at_str_Send.chars);// INOUT: ANY
                   
        Send_Done:= Send.DONE; // OUT: BOOL
        Send_Busy:= Send.BUSY; // OUT: BOOL
        Send_Error:= Send.ERROR; // OUT: BOOL
        Send_Status:= Send.STATUS; // OUT: WORD
        
       // at_str_Send.max_length :=64;  
       // at_str_Send.act_length :=64;
        IF Send_Done  THEN
               HM_Ablauf.Send_Daten_Gesendet:=true;          
                    END_IF;
        IF Send_Error THEN
               HM_Ablauf.Send_Daten_Error:=true;          
                    END_IF;
    
        
    // Aufruft TResive Bausteine
     
         Recive(EN_R :=Recive_Start  // IN: BOOL
                       ,ID :=TCP_Verbindung  // IN: WORD
                       ,LEN :=0  // IN: INT
                       ,DATA :=at_str_Recive.chars  // INOUT: ANY
                       ); 
          Recive_NDR := Recive.NDR; // OUT: BOOL
          Recive_Busy := Recive.BUSY; // OUT: BOOL
          Recive_Error := Recive.ERROR; // OUT: BOOL
          Recive_Status:= Recive.STATUS; // OUT: WORD
          Recive_LEN:= Recive.RCVD_LEN; // OUT: INT
    
        at_str_Recive.max_length :=64;  
        at_str_Recive.act_length :=64;
    
        IF Recive_NDR  THEN
               HM_Ablauf.Recive_Daten_Empfangen:=true;          
                    END_IF;
        IF Recive_Error THEN
               HM_Ablauf.Recive_Daten_Error:=true;          
                    END_IF;
        IF Recive_LEN <> 0  THEN
        Abfrage_Recive_LEN:=Recive_LEN;
        
        END_IF;
    
    END_FUNCTION_BLOCK

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

    Standard

    Hallo,
    folgende Fragen noch dazu :
    1. geht alles über die gleiche Verbindung ?
    2. finden die Sende-Vorgänge zeitgleich statt ?
    3. benutzt du immer den FB201 - nur mit unterschiedlichen Instanzen ? Oder vielleicht sogar die gleiche Instanz ?

    Gruß
    Larry

  4. #4
    RMLIF ist offline Neuer Benutzer
    Themenstarter
    Registriert seit
    17.10.2008
    Ort
    Lichtenfels
    Beiträge
    29
    Danke
    4
    Erhielt 0 Danke für 0 Beiträge

    Standard

    Zitat Zitat von Larry Laffer Beitrag anzeigen
    Hallo,
    folgende Fragen noch dazu :
    1. geht alles über die gleiche Verbindung ?
    2. finden die Sende-Vorgänge zeitgleich statt ?
    3. benutzt du immer den FB201 - nur mit unterschiedlichen Instanzen ? Oder vielleicht sogar die gleiche Instanz ?

    Gruß
    Larry
    zu 1 Ja geht alles über die 1 Verbindung
    zu 2 Nein die Sendevorgänge laufen nacheinander ab da auch gleich auf die Antwort gewartet werden muss geht von der Gegenseite nicht anders
    zu 3 immer der fb201 nur unterschiedliche Instanzen

    Gruß Rudi

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

    Standard

    Naja ... wenn du von dem FB201 unterschiedliche Instanzen hast (was ja nicht verwerflich ist) dann können schon mehrere Instanzen gleichzeitig senden wollen ... Ich denke, das solltest du verriegeln.

  6. #6
    RMLIF ist offline Neuer Benutzer
    Themenstarter
    Registriert seit
    17.10.2008
    Ort
    Lichtenfels
    Beiträge
    29
    Danke
    4
    Erhielt 0 Danke für 0 Beiträge

    Standard

    das Problem ist weniger das senden sonder die Rückmeldungen der fb Bausteine kommen immer nur beim 1 Aufruf vom fb201 an und werden dort verarbeitet auch wenn der 2 Aufruf gesendet hat also beim fb 63 zB. done oder das ndr vom fb64
    daher die frage ob man überhaupt die send und recive Bausteine öfters für 1 Verbindung verwenden kann oder ob diese nur 1 mal pro Verbindung aufgerufen werden dürfen

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

    Standard

    Ich glaube, du hast es (mich) nicht richtig verstanden ...
    Deine unterschieldlichen Instanzen können doch ihre jeweilige Zuständkeit (nach jetzigem Stand) vor Allem beim Empfangen gar nicht erkennen.
    Du müßtest nach meiner Meinung wenn z.B. Instanz1 angetriggert wird hier ein "Busy" setzen, was das generelle Bearbeiten der 3 anderen Instanzen verhindert.
    Im Prinzip ist es dann aber m.E. so, dass du dich insgesamt besser ständest, wenn du alles in einem Baustein (FB) hättest, der das dann korrekt verwaltet.

    Gruß
    Larry

  8. Folgender Benutzer sagt Danke zu Larry Laffer für den nützlichen Beitrag:

    RMLIF (24.06.2013)

  9. #8
    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

    Ich baue für jeden FB63/64, also für jedes Gerät, das Daten sendet/empfängt eine eigene Verbindung mit eigener ID auf. Dann kann ich gleichzeitig auf allen Verbindungen senden/empfangen. Wenn du eine Verbindung für mehrere Geräte nutzt mußt du sicherstellen, dass immer nur ein Gerät arbeitet. Für diese Logistik bist du selbst verantwortlich, also ein FB bekommt die Freigabe zum Senden/Empfangen, die anderen werden gesperrt usw.

    Warum nicht unterschiedliche Verbindungen mit je einer eigener ID, du mußt doch eh die Verbindung manuell aufbauen und dort ene ID vergeben.

    PS: Allerdings bitte beachten, wie viele gleichzeitige Verbindungen deine CPU/CP zuläßt.
    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. #9
    RMLIF ist offline Neuer Benutzer
    Themenstarter
    Registriert seit
    17.10.2008
    Ort
    Lichtenfels
    Beiträge
    29
    Danke
    4
    Erhielt 0 Danke für 0 Beiträge

    Standard

    Hm ok
    so was ähnliches hab ich mir schon gedacht na ich werde das alles in einem Baustein schreiben ist denk ich auch die beste Lösung

    Danke dir
    Gruß Rudi

  11. #10
    RMLIF ist offline Neuer Benutzer
    Themenstarter
    Registriert seit
    17.10.2008
    Ort
    Lichtenfels
    Beiträge
    29
    Danke
    4
    Erhielt 0 Danke für 0 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    @ Ralle: ja das wäre mir auch das liebste gewesen das geht aber von der Gegenseite nicht
    da dann das iTAC System durcheinander kommt
    wert wie larry das vorgeschlagen hat alles in einem Baustein zusammenschreiben und es dort entsprechend verwalten das nur immer eine Station sendet und empfängt

    Gruß Rudi

Ähnliche Themen

  1. Antworten: 3
    Letzter Beitrag: 15.07.2012, 17:05
  2. Antworten: 13
    Letzter Beitrag: 06.02.2012, 20:35
  3. Wie oft kann der FC AG_LSEND benutzt werden
    Von SinusQuadrat im Forum Simatic
    Antworten: 6
    Letzter Beitrag: 21.10.2010, 11:11
  4. Antworten: 18
    Letzter Beitrag: 26.05.2009, 19:06
  5. Antworten: 1
    Letzter Beitrag: 18.08.2005, 22:57

Lesezeichen

Berechtigungen

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