Step 7 wie oft kann man denn Fb63 Fb64 pro verbindung aufrufen

RMLIF

Level-1
Beiträge
29
Reaktionspunkte
0
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
 
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
 
Zuviel Werbung?
-> Hier kostenlos registrieren
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
 
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
 
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.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
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
 
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
 
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.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
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
 
@ 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
 
Du mußt das nicht in einem Baustein schreiben, es reicht ein INOUT (Z.Bsp.) der allen anderen Bausteinen anzeigt, dass die Verbindung belegt ist, dann dürfen die nicht arbeiten.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Das hatte ich ja auch schon angedeutet - ich denke dennoch, dass es in einem FB (wegen der benötigten Gemeinsamkeiten) besser aufgehoben ist - auch nicht zuletzt wegen des "später mal durchfindens".

Gruß
Larry
 
Zurück
Oben