TIA Put and Get - Baustein Error

Münchnerjunge

Level-1
Beiträge
314
Reaktionspunkte
38
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo,

ich bin gerade dabei, mir einen Standart-Baustein aufzubauen, den ich dann später mal als Multiinstanz für meine Kommunikationen aufrufen kann. Habe das ganze mal in FUP angefangen, bekomme jetzt aber ein Problem. Gerne switche ich auch auf SCL um, sofern jemand da besser weiterhelfen kann.

Ich verwende eine 315 PN/DP und programmiere, wie ersichtlich, mit TIA.

Folgendes Bild sollte mein Problem darstellen:

Error_PUG.jpg

Ich wollte gerne meine DB Bereichszeiger an meinen Multiinstanz schreiben, deshalb als Any als InOut deklariert. Pointer hilft mir auch nicht weiter. Ich bekomme immer die Meldung "Unzulässige Parameterversorgung".

Muss ich das ganze zerpflücken oder wie kann ich das später mal extern beschreiben?

Ist für mich grade nicht unbedingt ersichtlich, vielleicht ja für die Forenteilnehmer easy, dann freue ich mich um so mehr über aufklärende Antworten.

Vielen Dank im Voraus!
 
Zuviel Werbung?
-> Hier kostenlos registrieren
S7-300/400:
ANY-Parameter können nicht von IN/IN_OUT zu Bausteinaufrufen durchgereicht werden. Sie müssen vorher in TEMP umkopiert werden. Diese Parameter-Kopien in TEMP können dann an den Bausteinaufruf geschrieben werden.

Hier ein Beispielcode mit 2 Varianten für das Umkopieren in classic-Step7-AWL
ANY-Parameter von IN/IN_OUT in TEMP umkopieren in Multiinstanz-FB

Für mehr Beispiele mal googlen mit "any an fb übergeben"

Harald
 
Hallo PN/DP,

danke für den Hinweis.

Hatte das ganze in der Zwischenzeit auf SCL umgeswitcht und da habe ich merkwürdigerweise bei gleicher Deklaration keine Probleme mehr.

Hier mein Code:
Code:
   ///////////////////////    
   ////(*Sendebefehl*)////
   ///////////////////////


IF #Do_Send AND NOT #F_Trig_Send THEN
    #Send := True;
   ELSE
       #Send := false;
   END_IF;
   #F_Trig_Send := #Do_Send;
   
   //////////////////////////
   ////(*Empfangsbefehl*)////
   //////////////////////////
   
   IF #Do_Receive AND NOT #F_Trig_Receive THEN
       #Receive := True;
   ELSE
       #Receive := false;
   END_IF;
   #F_Trig_Receive := #Do_Receive;
   
   
   
   //////////////////////
   ///(*Daten_Senden*)///
   //////////////////////
   
   #PUT_Instance(REQ := #Send,
                 ID := #ID_Verbindung,
                 STATUS => #Status_Send,
                 ADDR_1 := #Send_Data_DB,
                 SD_1 := #Partner_Send_Data_DB)
   ;
   
   
    /////////////////////////
    ///(*Daten_Empfangen*)///
    /////////////////////////


   #GET_Instance(REQ:= #Receive,
                 ID := #ID_Verbindung ,
              STATUS => #Status_Receive,
              ADDR_1 := #Receive_Data_DB ,
              RD_1 := #Partner_Receive_Data_DB)
;
              
    /////////////////////////////////
    ///(*Senden_Empfangen_Fehler*)///
    /////////////////////////////////


#Error_Se_Rec := #GET_Instance.ERROR
OR #PUT_Instance.ERROR;


Ist SCL einfach nur "dumm" und erkennt den Fehler nicht, oder funktioniert das ganze so? Kann es leider erst am Montag wieder testen, wenn ich die ganze Hardware habe.

Würde mich aber wirklich mal interessieren, vielleicht weiß ja jemand spontan ob das so funktionieren kann, oder ob ich die hier auch in Temp umkopieren muss?
 
Ich glaube, daß SCL zumindest in diesem Punkt mal nicht "dumm" ist, sondern automatisch den ANY in eine unsichtbare TEMP-Variable umkopiert.

Bei S7-300 kann man sehen, welchen AWL-Code der SCL-Compiler erzeugt, indem man den erzeugten Baustein (FB) in einen anderen Bausteine-Ordner kopiert und da normal öffnet.

Harald
 
Das wäre mir aber neu. Wir reden hier von TIA V13, nicht Step 7 5.5. Hier übernimmt er ja die SCL Quellen mit, wenn ich den kopiere. Oder täusche ich mich etwa?
Ich verstehe nicht, was Du mit kopieren und Quellen mitnehmen meinst... :confused:

Das classic-SCL kopiert den IN/IN_OUT-ANY direkt in den IN_OUT-ANY der PUT-Instanz ohne Umweg über TEMP. Der SCL-Compiler darf solchen Code erzeugen, der kennt ja die Adressen und setzt die normalerweise (*) automatisch richtig ein, falls sich Adressen ändern. ;)

(*) für TIA-SCL will ich nicht garantieren, da sind noch zu viele unglaubliche Bugs drin...

Nachtrag: Compiler Beispiel
Das classic-SCL V5.3 macht aus dem hier:
Code:
FUNCTION_BLOCK FBxxx

VAR_INPUT
  ID_Verbindung : WORD ;
END_VAR
VAR_IN_OUT
  Partner_Send_Data_DB : ANY ;
  Send_Data_DB : ANY ;
END_VAR
VAR_TEMP
  Status_Send : WORD ;
END_VAR
VAR
  // statische Variablen
  PUT_Instance : PUT ;
  Send : BOOL ;
END_VAR

  PUT_Instance(REQ := Send,
               ID := ID_Verbindung,
//               STATUS => Status_Send,  // geht so erst ab TIA
               ADDR_1 := Send_Data_DB,
               SD_1 := Partner_Send_Data_DB)
  ;
  Status_Send := PUT_Instance.STATUS;
 
END_FUNCTION_BLOCK
diesen AWL-Code (Leerzeilen von mir):
Code:
      SET   
      SAVE  
      =     L      2.1

      U     #Send
      =     #PUT_Instance.IN4

      L     #ID_Verbindung
      T     #PUT_Instance.IN5

      L     DID [AR2,P#12.0]
      T     DID [AR2,P#30.0]
      L     DID [AR2,P#16.0]
      T     DID [AR2,P#34.0]
      L     DIW [AR2,P#20.0]
      T     DIW [AR2,P#38.0]

      L     DID [AR2,P#2.0]
      T     DID [AR2,P#40.0]
      L     DID [AR2,P#6.0]
      T     DID [AR2,P#44.0]
      L     DIW [AR2,P#10.0]
      T     DIW [AR2,P#48.0]

      +AR2  P#22.0
      UC    FB    15
      +AR2  P#8170.0

      L     #PUT_Instance.OUT8
      T     #Status_Send

      U     L      2.1
      SAVE  
      BE

Harald
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
Ach so... Mit TIA kenne ich mich nicht genug aus. Ich weiß nicht ob man den erzeugten FB ohne Quelle kopieren kann?

Bei S7-300 kann man aber zum Glück das TIA umgehen/kontrollieren, indem man den FB in eine CPU oder in PLCSIM lädt und mit Step7 V5.x wieder herauslädt. Schau mal hier

Harald
 
Bei gleicher Deklaration habe ich dann:

Code:
  SET         SAVE  
      =     L      0.0
      UN    #F_Trig_Send
      =     L      0.1
      U     #Do_Send
      U     L      0.1
      SPBN  M001
      =     #Send
      SPA   M002
M001: CLR   
      =     #Send
M002: CLR   
      U     #Do_Send
      =     #F_Trig_Send
      UN    #F_Trig_Receive
      =     L      0.1
      U     #Do_Rec
      U     L      0.1
      SPBN  M003
      =     #Receive
      SPA   M004
M003: CLR   
      =     #Receive
M004: CLR   
      U     #Do_Rec
      =     #F_Trig_Receive
      U     #Send
      =     #Put_Instance.IN0
      L     #ID_Verbindung
      T     #Put_Instance.IN1
      L     DIW [AR2,P#26.0]
      T     DIW [AR2,P#674.0]
      L     DID [AR2,P#22.0]
      T     DID [AR2,P#670.0]
      L     DID [AR2,P#18.0]
      T     DID [AR2,P#666.0]
      L     DIW [AR2,P#36.0]
      T     DIW [AR2,P#714.0]
      L     DID [AR2,P#32.0]
      T     DID [AR2,P#710.0]
      L     DID [AR2,P#28.0]
      T     DID [AR2,P#706.0]
      TAR2  LD     2
      TAR2  
      +     L#5264
      LAR2  
      UC    FB    35
      LAR2  LD     2
      CLR   
      U     BIE
      SPB   M005
      CLR   
      =     L      0.0
M005: L     #Put_Instance.OUT4
      T     #Status_Send
      CLR   
      U     #Receive
      =     #Get_Instance.IN0
      L     #ID_Verbindung
      T     #Get_Instance.IN1
      L     DIW [AR2,P#46.0]
      T     DIW [AR2,P#74.0]
      L     DID [AR2,P#42.0]
      T     DID [AR2,P#70.0]
      L     DID [AR2,P#38.0]
      T     DID [AR2,P#66.0]
      L     DIW [AR2,P#56.0]
      T     DIW [AR2,P#114.0]
      L     DID [AR2,P#52.0]
      T     DID [AR2,P#110.0]
      L     DID [AR2,P#48.0]
      T     DID [AR2,P#106.0]
      TAR2  LD     2
      TAR2  
      +     L#464
      LAR2  
      UC    FB    34
      LAR2  LD     2
      CLR   
      U     BIE
      SPB   M006
      CLR   
      =     L      0.0
M006: L     #Get_Instance.OUT4
      T     #Status_receive
      CLR   
      U     #Get_Instance.OUT3
      =     L      0.1
      U     #Put_Instance.OUT3
      O     L      0.1
      =     #Error_Se_Rec
      U     L      0.0
      SAVE
 
Danke. Hast Du das jetzt komplett in TIA gemacht oder via Step7 V5.x?

In V5.x gibt es auch noch die Möglichkeit die SCL-Quelle zu löschen (da muß man aber sehr vorsichtig mit umgehen, am besten nur in Testprojekten.)
Kann man in dem TIA ebenfalls die SCL-"Quelle"(?) ohne den erzeugten FB löschen?

Harald
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Ich habe den SCL-Baustein im PLCSim geladen und mit Step7 wieder ins PG geladen.

Ich kann in TIA ja Quelldateien erzeugen, oder aber einlesen. Einlesen geht aber nur aus SCL Quelle zu SCL Baustein. Das ganze nennt sich "Baustein aus Quelle generieren" und ist einfach per Rechtsklick in meiner Bausteinleiste zu finden. Mehr kann ich dazu aber auch nicht sagen.
Oder aber einen AWL Baustein als Quelle speichern Rechtsklick und "Baustein als Text speichern" mit Editor als "Baustein.awl" speichern und dann bei meinen Quellen einfügen.


Wüsste nicht wie ich in TIA aus meinem SCL Baustein einen AWL Code bekomme...
 
Zurück
Oben