Tia Portal: selbstgeschriebenen Baustein mit verschiedenen Werten mehrfach laden

K5286

Level-2
Beiträge
28
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
CPU: CPU 315-2 PN/DP 6ES7 315-2EH14-0AB0
Software: Siemens Tia Portal V11 SP2 Update 4



Hallo Zusammen

Ich hoffe jemand kann mir helfen. Ich arbeite seit kurzem mit dem Tia Portal. Dort habe ich einen Universalbaustein zur Analogverarbeitung geschrieben.

Diesen möchte ich nun mehrfach (max 300 mal) laden um alle Analogeingänge zu bearbeiten und in einem DB zu speichern. Gibt es eine Möglichkeit den Aufruf zu automatisieren? Ich würde nur ungern den Baustein 300 mal einzeln aufrufen und mit neuen Variablen beschreiben. :wink:


Hier der Universalbaustein:

CALL "UM TC-Editing", "I-DB: FB 200: UM TC Editing" %FB200, %DB200
TC Input (INT: IW...) := // Analogeingang 1-300 (Fortlaufende Adressierung IW300-IW900)
TC Offset (Real: x.x°C) := //DB1.DBD 1-300 (Array 0..300 als real)
TC out when wire break (Real: x.x°C) := 399.9 // Festwert für alle Aufrufe
TC out for TP (Real: x.x°C) := // DB11.DBD 1-300 (Array 0..300 als real)

Danke für eure Hilfe!




 

Anhänge

  • Fb200.png
    Fb200.png
    17,5 KB · Aufrufe: 49
Zuletzt bearbeitet:
Ist er nicht einfacher baustein anruf mit "mespunkt nummer"
CALL "UM TC-Editing", "I-DB: FB 200: UM TC Editing" %FB200, %DB200
In mespunkt = 1 bis 300

In UM TC-Editing anruf mit pointer DB1.DBD 1-300 (Array 0..300 als real) und DB11.DBD 1-300 (Array 0..300 als real)
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Ich habe auch schon an einen Pointer gedacht, doch leider sind die Funktionen im Tia Portal nicht mehr die selben, wie in Step 7 V5.5 :|

Wenn jemand also eine Ahnung hat, wie ein Pointer in meinem Fall im Tia Portal geschrieben wird, wäre ich dankbar. Die magische Taste F1 hilft nämlich leider nicht weiter.
 
Soweit ich weiß funktionieren die Pointer beim TIA Portal für die 300er Steuerungen genauso wie sie auch bei Step7 5.5 funktioniert haben. Wo hast du denn Unterschiede feststellen können?

Am einfachsten wäre es aber wenn du den Teil in SCL programmierst, in dem du in einer For-Schleife mit dem Schleifenindex auf deine Array-Daten zugreifst.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Danke für den Tip. Habe eine For Schleife geschrieben:

FOR #Schleife := 0 TO 300 BY 1
DO "DB: X-Cross: TC's to TP".TC [0] := "DB: X-Cross: TC's to PC" .TC[0];
"DB: X-Cross: TC's to TP".TC[0] := "DB: X-Cross: TC's to REC" .TC[0];
END_FOR;

"#Schleife" ist eine Statische Variable vom Typ INT und der FB in dem die Anweisung geschrieben wurde ist einem Instanz DB zugewiesen.


Nur leider wird sie nicht bearbeitet. Hat jemand eine Idee?
 
Zuletzt bearbeitet:
Bin jetzt in SCL nicht so firm, aber wenn Du den INT-Wert #Schleife nicht innerhalb der Schleife verwendest (vermutlich da, wo [0] steht), dann wird 300x das Gleiche ausgeführt. Und das war sicher nicht das, was Du wolltest.
 
Du musst den Baustein auch aufrufen.
Ich frage mich nur warum es überhaupt ein FB sein muss. Denn wenn der Baustein keine Daten halten muss dann ist ein FC besser geeignet.

Desweiteren würde ich Leerzeichen in Bezeichnern vermeiden, auch wenn das TIA Portal meint man müsse das erlauben. Das kracht öfters mal, weil man dann Bezeichner in Anführungszeichen fassen muss. Darum die Leerzeichen durch Unterstriche ersetzen (oder je nach Geschmack auf CamelCase Schreibweise wechseln).

Wenn der Baustein doch unbedingt ein FB sein soll, sähe der Aufruf so ähnlich aus:
Code:
FOR #index := 1 TO 300 DO

  #TC(TC_Input:= "DATA_DB".in[#index],
      TC_Offset:="DATA_DB".offset[#index],
      TC_out_when_wire_break:=399.9,
      TC_out_for_TP=> "DATA_DB".out_tp[#index]
  );
  
END_FOR;

TC ist dann die Instanz deines "UM_TC-Editing" Bausteins in den statischen Daten des FB (multiinstanz ;-) )
 
Vielen Dank für den Tip!

Soweit läuft es. Ich habe nur noch eine Frage bzgl. des EW. Wie oder mit welchem Parameter wird der Startpunkt festgelegt (z.B IW 256)?
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Die Schleife läuft nun. Solange ich für den Analogeingang einen DB verwende.

Sobald ich das Programm umschreibe, auf einen echten Analogeingang verwenden, funktioniert die Schleife nicht mehr. Gibt aber auch keinen Fehler raus.

For-schleife.jpg

Vielleicht könnt ihr mir da weiterhelfen. Bin im Bereich SCL noch komplett "grün hinter den Ohren"....
 
Leider läuft die Schleife immernoch nicht richtig. Das Programm scheint Probleme zu haben den Schleifenwert auszulesen.
Hier mein Programm:
For-schleife.jpg

Rechts im Bild die drei [???] scheinen darauf hinzuweisen...
 
Wie groß hast du das Prozessabbild denn eingestellt? Wenn die Adressen nicht im Prozessabbild liegen, musst du nämlich nicht mit IW sondern mit IW und der Ergänzung um ":p" darauf zugreifen.

So wie es aussieht hat der SCL-Compiler des TIA-Portals hier aber einen Bug! (welch Wunder)

Demonstration:
In der Variablentabelle werden zwei Variablen angelegt.
1. "VarIW620", Datentyp Word, Adresse %IW620
2. "VarIW622", Datentyp Word, Adresse %IW622

Beispielcode im TIA-Portal in SCL:
Code:
#addr := 600;

#val := IW(#addr):P;  // 1.

#val := IW(610):P;   // 2.

#val := "VarIW620"; // 3.

#val := "VarIW622":P; // 4.
#addr ist eine Variable vom Datentyp Int, #val vom Datentyp Word.

Eigentlich sollte in den Zeilen mit Nummern 1, 2 und 4 auf das Prozessabbild zugegriffen werden.
Der generierte AWL-Code sieht aber so aus:
Code:
      SET   
      SAVE  
      =     L      4.0
      L     600
      T     #TEMP1
      L     EW   600
      T     #TEMP0
      L     EW   610
      T     #TEMP0
      L     EW   620
      T     #TEMP0
      L     PEW  622
      T     #TEMP0
      CLR   
      U     L      4.0
      SAVE

D.h. mit IW(123):p wird in SCL nicht auf das Prozessabbild zugegriffen, was es aber eigentlich sollte.

Ich habe SP2 Update 4, keine Ahnung ob es was neueres gibt.

Zum jetzigen Stand kannst du das gewünschte mit dem TIA-Portal also wegen dieses Fehlers nicht umsetzen.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Dank eurer Hilfe läuft es nun. Hier die Lösung: (FB mit Instanz DB mit SCL beschrieben)

Danke!
 

Anhänge

  • For-Schleife Universalbaustein beschreiben.png
    For-Schleife Universalbaustein beschreiben.png
    29,6 KB · Aufrufe: 39
Du greifst aber nicht auf die Peripherieadressen (PIW) zu, sondern auf das Prozessabbild (IW). Das funktioniert so lange man das Prozessabbild in der CPU so groß einstellen kann dass die Baugruppenadressen darin liegen.
Hast du das bei dir mal mit :p getestet? Vielleicht liegt der Fehler nur an meiner Version.
 
@ Thomas_V2.1:

Ich konnte das Programm noch nicht an der richtigen Anlage testen, da ich momentan unterwegs bin. Mit dem Simulator funktioniert das Programm mit und ohne ":p". Im Symulator gebe ich werte auf simulierte PIW's als INT (PIW 600 und höher). Soweit funktioniert es.
Ich bin mir nur nicht sicher, wie der Simulator den Wert weitergibt. Wirklich als PIW oder als IW. Ich kann es in einer Woche an der Anlage testen...

Falls Ihr bis dahin noch Ideen habt, her damit! :cool:
 
@Ralle: Danke für den Tip, aber das hätte ich auch noch selbst gewusst. *ROFL*





Ich habe noch ein ähnliches Problem. Diesmal müssen aus einem DB unterschiedliche Adressen zweier Arrays an Digitalausgangskarten gesendet werden.

Thema: DB Inhalt (3 Array's vom Typ Bool) gesplittet an Digitalausgang senden
http://www.sps-forum.de/showthread....Typ-Bool)-gesplittet-an-Digitalausgang-senden

Vielleicht habt ihr ja eine Idee die auf ähnlichem Weg funktioniert.

Gruß
 
Zuletzt bearbeitet:
Zurück
Oben