Step 7 Adressen in FBs nutzen

BSTom

Level-1
Beiträge
9
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo Gemeinde,

ich bin in einer Weiterbildung und jeden Tag lernt man etwas dazu.
Viele Dinge schafft man durch suchen und probieren.
Aber zu einer Sache finde ich einfach keine Lösung, auch unser Dozent weiss keinen Rat.

Wenn man einen Funktionsbastein erstellt hat man Variablen die man deklariert soweit gut.

Ich nenne mal ein Beispiel
Ich möchte 8 EIngänge erfassen.
Also in 8 Adressen Bool, erste Adresse z.B. 0.0

An diese Adresse komme ich aber nicht heran.

Abhilfe schafft aber nur das ich meine 8 In Variablen, 8 temporären Variablen zuweise.

Diese kann ich dann über LB0 oder LW0 verwenden.

Wichtig hierbei das ich diese aber auch zuerst initialisiere, wie ich heute nach langer Suche feststellen musste,

da 2 FBs in einem FC sich gegenseitig die L Bits beeinflusst haben.

Gibt es wirklich keine Chance an die VAriablen zu kommen?



Ich hoffe ich habe mich ein wenig Verständlich ausgedrückt.

Danke schon jetzt!

Thomas
 
Hallo Thomas,

Klar kannst du einfach an die Variablen dran kommen.

Innerhalb des FB's greifst du Symbolisch darauf zu
Zum Beispiel :
Dein Boolsche Eingang heißt :
START

Die verwendest / verknüpfst du dann z.b im FB als :
U #START

In Prinzip eine route vor das Symbol. In FUP genau so

Es gibt auch eine andere (Absolutadressierung) Weg
Dann verwendest du zum Beispiel:

U DIX0.0

Ich denke das das ist was du gesucht hast.

Bram
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo Gemeinde,

ich bin in einer Weiterbildung und jeden Tag lernt man etwas dazu.

<Wir lernen sogar fast jeden Tag etwas bei der Arbeitg dazu :rolleyes:

Aber zu einer Sache finde ich einfach keine Lösung, auch unser Dozent weiss keinen Rat.

Evtl. hat Dir auch einmal ein Dozent beigebracht, das ein Bild mehr als 1000 Worte sagt?

Also wie wäre es einmal ein Bild oder den Code was das Problem ist hier einzustellen?
Die Ausführung ist mehr als unverständlich und man kann eigentlich nur vermuten was das Problem sein soll.

Man kann in FBs sowie FCs für die Variablen (auch für die Temp) ein Symbol vergeben.
L Bits sind Lokaldaten also Temp Variablen ...
 
Hallo, danke für die Antworten.

Ein Bild oder Code habe ich eben nicht zur Hand.


Das mit den Symbolen ist mir bekannt.

Bei absoluten Adressen in einem FC kann ich ja wunderbar die Eingänge oder Ausgänge, Merker als Byte oder Wort oder Doppelwort ansprechen.

Als Beispiel ohne das es jetzt einen Sinn darstellt

Move Befehl eine Null dem Ausgangsdoppelwort 4 zuweisen.

Also AD4



in einem FB fehlt mir vom Verständnis hier die Adressierung.

Die Adressierung DIX0.0 steht ja für ein Bit.
Also zum Beibeispiel eine In Variable als Eingang1 bezeichnet.
Dann kann ich über das Symbol Eingang1 Das Bit nutzen.

Angenommen ich habe 8 In Variablen mit dem Namen Eingang1 bis 8,
dann sind das die Bits DIX0.0 bis 0.7

Die sind dann wiederum das DBB0

Kann ich damit so arbeiten als wäre es in einem FC das EB0?

Also ich habe bisher
Eingang1 = L0.0
Eingang2 = L0.1
.
.
.
Eingang8 = L0.7

dann konnte ich das LB0 nutzen.

Kann ich jetzt genauso mit DBB0 nutzen entweder
DBB0 zu LB0 moven
oder DBB0 direkt verwenden?




Hat die Absolute Adressierung Nachteile?

Wenn ich im Funktionsbaustein etwas ändere und Variablen zusätzlich erstelle, dann verschieben sich ja auch wieder die Byte Adressen.

Aber wenn die absolute Adressierung funktioniert (kann es zu Hause noch nicht testen) und keine Probleme mit sich bringt, hilft mir das schon weiter.

Das wäre dann das, was ich suche.

Danke schon mal für die Erklärungen.
 
Hat die Absolute Adressierung Nachteile?

Wenn ich im Funktionsbaustein etwas ändere und Variablen zusätzlich erstelle, dann verschieben sich ja auch wieder die Byte Adressen.
Aber wenn die absolute Adressierung funktioniert (kann es zu Hause noch nicht testen) und keine Probleme mit sich bringt, hilft mir das schon weiter.

Das wäre dann das, was ich suche.

Danke schon mal für die Erklärungen.
Es ist einfach keine schöne Programmierweise, die sich oft auch nur darin begründet, dem Ersteller einige Zeilen Programmcode einzusparen.
Und spätestens mit Multiinstanzen bekommt man damit auch schnell Probleme, weil sich dann Adressen verschieben.

Ich kann nur empfehlen, sich als Neuanfänger eine solche Programmierweise gar nicht erst anzugewöhnen. Unsere Vorgänger waren durch Einschränkungen leider oft zu solchen Kniffen gezwungen.
Aus meiner Sicht ist jedoch heutzutage die symbolische Programmierung ganz klar zu bevorzugen und gibt mit Sichten u.ä. auch hinreichend Möglichkeiten, die absolute Adressierung zu vermeiden.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
schnell Probleme, weil sich dann Adressen verschieben.
Das wäre ein Hauptgrund.

Auch wenn solche Wort- oder Bit-Zugriffe über die Adresse auf den ersten Blick logisch und effezient erscheinen mögen, fällt das ganze schnell außeinander sollten sich Adressen im DB verschieben. Da ein solcher Code sowas nicht verträgt kann man während der Programmierung, IBN, vor allem aber nach ein paar Jahren wenn die erste Erweiterung ansteht, keine Daten mehr dazwischen einfügen obwohl es von der Struktur durchaus logisch und wünschenswert wäre. Denn irgendwann sind selbst die größten Reserven die man vorher eingebaut hat aufgebraucht.

Auch die Durchgängigkeit der Querverweise (in TIA sind überlappende Zugriffe nicht mehr so schnell ersichtlich) und die Lesbarkeit des Codes durch Dritte verschlechtern sich.

Auf der 1500 wirst du bei den "optimierten" Datenbausteinen dann gar keine Adressen mehr vorfinden. Es schadet also nicht sich schon einmal drauf einzustellen.
 
Hallo,

das man absolute Adressen nicht verwenden soll, ist uns schon sehr Eindeutig mitgeteilt worden :cool:

Aber ich verstehe immer noch nicht wie ich ansonsten an die Daten komme.

Bleibt mir nichts anderes übrig, als jede Adresse die ich zusammenfassen möchte, einzeln an eine Temporäre L Variable zu binden,
dann das L Byte Wort oder Doppelwort zu nutzen um die Werte zu haben?

Ich hatte an absolut Gedacht, wenn ich den Datenbaustein mit angebe DB10.DBB0 als Beispiel.

Wenn ich DBB0 nutze bleibe ich dann nicht innerhalb des Funktionsbausteins und dem (egal welchen) Datenbausteins.

Das sich die Adressen verschieben können wenn man etwas einfügt, das ist mir schon bewusst.

Leichte Fragezeichen bleiben in meinem Kopf.

Thomas
 
Aber ich verstehe immer noch nicht wie ich ansonsten an die Daten komme.

Bleibt mir nichts anderes übrig, als jede Adresse die ich zusammenfassen möchte, einzeln an eine Temporäre L Variable zu binden,
dann das L Byte Wort oder Doppelwort zu nutzen um die Werte zu haben?
:confused:

Jede Adresse hat doch ein Symbol. Wenn Du mehrere boolsche Werte zu einem Byte zusammen fassen möchtest (wie z.B. M0.0 - M0.7 zu MB0), dann kann man dies z.B. mit klassischen Verknüpfungen und/oder Bitverschiebungen machen.

Außerdem kann man z.B. Sichten definieren. Bei S7 classic ist man dabei wohl allerdings auf SCL angewiesen.
Da sind unter TIA und den neueren CPUen die Möglichkeiten deutlich ausgebaut wurden.


Die wirkliche Frage stellt sich aber schon vorher.
Warum definierst Du einzelne Bits, wenn Du ein Byte verarbeiten möchtest?
Typisches Beispiel dafür sind z.B. einzelne Fehlerbits und die Erfassung des gesamten Bytes/Words, um zu detektieren, ob irgend ein Fehler vorliegt. Also eine Prüfung auf größer 0 des gesamten Bereichs.
Der richtige Weg wäre in diesem Beispiel aber eigentlich eine ODER-Verknüpfung der einzelnen Bits, bedeutet aber meistens mehr Schreibaufwand für den Programmierer.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo,

in diesen Fällen geht es um BCD Steller.

Einmal waren es 4 Stellen also 16 Bit
das andere mal war es ein BCD Steller also 4 Bit

Wenn ich als Input ein Byte nehme aber nur 4 Bit benötige, kann ich die absoluten Eingänge nicht als Byte zuweisen.
Da die anderen 4 Eingänge dann ja nicht benutzt werden können.

Das ganze soll 3 BCD Schalter (FB wird mehrfach benutzt) an einem Schaltschrank auswerten.
Da habe ich 4 Bits als Eingang 4 Lokalen Bytes zugewiesen. (Anders bekomme ich es ja nicht hin)
Werte dann die BCD Steller aus und gebe eine Variable aus in der der Wert des BCD Schalter steht,
sowie 9 Bits die mir eine 1 geben wenn jeweils die Zahl 1 bis 9 geschaltet wurde.


Mein anderer Funktionsbaustein, bekommt in dem Fall 16 Bits am Eingang,
wirft mir am Ausgang ein Wort (Int) mit der BCD Zahl, und zählt diese dann mit Hilfe eines Takgebers runter bis auf Null.
Das ganze ist ein Wartungszähler.

Dort könnte ich sicherlich ein Wort als In Variable nehmen, aber dann müssen meine Eingänge der SPS
auch alle in 2 aufeinander folgenden Bytes liegen. Bei einer neu Planung vielleicht machbar.
Aber das ganze soll ja felxibel nutzbar sein.

Warum kann man innerhalb eines FBs die Vairablen nicht über Ihre Bezeichnung adressieren?
In
Out
InOut
Static

als Beispiel In als Byte oder Wort

SCL
Sichten
TIA Portal

Das sind noch völlige Unbekannte!

Ich glaub ich schreibe mich um Kopf und Kragen und keiner versteht wirklich wo mir der Schuh drückt.
Bin übrigens nicht der einzige der sich mit dieser Frage rumschlägt.
 
Wenn ich als Input ein Byte nehme aber nur 4 Bit benötige, kann ich die absoluten Eingänge nicht als Byte zuweisen.
Da die anderen 4 Eingänge dann ja nicht benutzt werden können.
Warum kannst Du das nicht zuweisen?
Nicht benötigte (anderweitig verwendete) Bits können bei der Weiterverarbeitung auch ausmaskiert werden.



Das ganze soll 3 BCD Schalter (FB wird mehrfach benutzt) an einem Schaltschrank auswerten.
Da habe ich 4 Bits als Eingang 4 Lokalen Bytes zugewiesen. (Anders bekomme ich es ja nicht hin)
Werte dann die BCD Steller aus und gebe eine Variable aus in der der Wert des BCD Schalter steht,
sowie 9 Bits die mir eine 1 geben wenn jeweils die Zahl 1 bis 9 geschaltet wurde.
Eine möglische Zusammensetzung der 4 Einzelbits zum INT-Wert rein symbolisch:
Code:
      L     0
      U     #BCD0
      SPBN  _001
      L     1
      +I    
_001: U     #BCD1
      SPBN  _002
      L     2
      +I    
_002: U     #BCD2
      SPBN  _003
      L     4
      +I    
_003: U     #BCD3
      SPBN  _004
      L     8
      +I    
_004: T     #Value
Die Ausgabe der Einzel-Bits ist jeweils eine reine UND-Verknüpfung, z.B.:
Code:
      UN    #BCD3
      UN    #BCD2
      UN    #BCD1
      U     #BCD0
      =     #V1
Ist vlt. etwas aufwendiger beim (einmaligen) Erstellen, benötigt aber keine absoluten Adressen. Und erst dadurch wird's ja wirklich flexibel.
(PS: Dafür ist sogar ein FC ausreichend, da man dafür weder Temp und schon gar nicht STAT benötigt.)




Mein anderer Funktionsbaustein, bekommt in dem Fall 16 Bits am Eingang,
wirft mir am Ausgang ein Wort (Int) mit der BCD Zahl, und zählt diese dann mit Hilfe eines Takgebers runter bis auf Null.
Das ganze ist ein Wartungszähler.
Wär sicher gut, wenn Du die bisherige Umsetzung davon hier postest.



Dort könnte ich sicherlich ein Wort als In Variable nehmen, aber dann müssen meine Eingänge der SPS
auch alle in 2 aufeinander folgenden Bytes liegen.
Warum müssen die Eingänge alle zusammen liegen?
Mann kann sie auch in einer Zwischenvariable erst zusammen fügen und dann an den Baustein übergeben.
;)

Genau da bekommt man doch erst die Flexibilität in seine Bausteine - verschiedene Ausgangspunkte auf einen gemeinsamen Nenner bringen.
 
Zuletzt bearbeitet:
das andere mal war es ein BCD Steller also 4 Bit

Da habe ich 4 Bits als Eingang 4 Lokalen Bytes zugewiesen. (Anders bekomme ich es ja nicht hin)
Werte dann die BCD Steller aus und gebe eine Variable aus in der der Wert des BCD Schalter steht,
sowie 9 Bits die mir eine 1 geben wenn jeweils die Zahl 1 bis 9 geschaltet wurde.
So könnte das z.B. insgesamt aussehen:
Code:
FUNCTION "BCD-Encoder" : BOOL
TITLE =BCD-Schalter in INT-Wert und Einzelbits wandeln
VERSION : 0.1

VAR_INPUT
  BCD3 : BOOL ;    
  BCD2 : BOOL ;    
  BCD1 : BOOL ;    
  BCD0 : BOOL ;    
END_VAR

VAR_OUTPUT
  Value : INT ;    
  V1 : BOOL ;    
  V2 : BOOL ;    
  V3 : BOOL ;    
  V4 : BOOL ;    
  V5 : BOOL ;    
  V6 : BOOL ;    
  V7 : BOOL ;    
  V8 : BOOL ;    
  V9 : BOOL ;    
  V0 : BOOL ;    
END_VAR


BEGIN

NETWORK
TITLE =Wert
      L     0; 
      U     #BCD0; 
      SPBN  _001; 
      L     1; 
      +I    ; 
_001: U     #BCD1; 
      SPBN  _002; 
      L     2; 
      +I    ; 
_002: U     #BCD2; 
      SPBN  _003; 
      L     4; 
      +I    ; 
_003: U     #BCD3; 
      SPBN  _004; 
      L     8; 
      +I    ; 
_004: T     #Value; 

NETWORK
TITLE =V0
      UN    #BCD3; 
      UN    #BCD2; 
      UN    #BCD1; 
      UN    #BCD0; 
      =     #V0; 

NETWORK
TITLE =V1
      UN    #BCD3; 
      UN    #BCD2; 
      UN    #BCD1; 
      U     #BCD0; 
      =     #V1; 

NETWORK
TITLE =V2
      UN    #BCD3; 
      UN    #BCD2; 
      U     #BCD1; 
      UN    #BCD0; 
      =     #V2; 

NETWORK
TITLE =V3
      UN    #BCD3; 
      UN    #BCD2; 
      U     #BCD1; 
      U     #BCD0; 
      =     #V3; 

NETWORK
TITLE =V4
      UN    #BCD3; 
      U     #BCD2; 
      UN    #BCD1; 
      UN    #BCD0; 
      =     #V4; 

NETWORK
TITLE =V5
      UN    #BCD3; 
      U     #BCD2; 
      UN    #BCD1; 
      U     #BCD0; 
      =     #V5; 

NETWORK
TITLE =V6
      UN    #BCD3; 
      U     #BCD2; 
      U     #BCD1; 
      UN    #BCD0; 
      =     #V6; 

NETWORK
TITLE =V7
      UN    #BCD3; 
      U     #BCD2; 
      U     #BCD1; 
      U     #BCD0; 
      =     #V7; 

NETWORK
TITLE =V8
      U     #BCD3; 
      UN    #BCD2; 
      UN    #BCD1; 
      UN    #BCD0; 
      =     #V8; 

NETWORK
TITLE =V9
      U     #BCD3; 
      UN    #BCD2; 
      UN    #BCD1; 
      U     #BCD0; 
      =     #V9; 

NETWORK
TITLE =Gültigkeit
      O     #BCD1; 
      O     #BCD2; 
      U     #BCD3; 
      NOT   ; 
      =     #RET_VAL; 
END_FUNCTION
Ist ab dem 3. Netzwerk nur noch 'ne reine Fleißarbeit und benötigt keinerlei absolute Adressen.
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
Wenn ich als Input ein Byte nehme aber nur 4 Bit benötige, kann ich die absoluten Eingänge nicht als Byte zuweisen.
Da die anderen 4 Eingänge dann ja nicht benutzt werden können.
Warum kannst Du das nicht zuweisen?
Nicht benötigte (anderweitig verwendete) Bits können bei der Weiterverarbeitung auch ausmaskiert werden.
Und noch Beispiele zur Übergabe als Byte und Ausmaskierung der nicht benötigten Bits:

Verwendung der Bits 0-3 (4-7 werden "genullt"):
Code:
      L     #InByte
      L     2#1111
      UW    
      T     #Value

oder der Bits 4-7 (0-3 werden aus geschoben):
Code:
      L     #InByte
      SRW   4
      T     #Value
In FUP/KOP wären dann noch Zwischenschritte/-variablen zum Anpassen der Formate nötig.




Das wirkliche Problem an Deiner Frage sind m.M.n. die meist immer noch (zumindest am Beginn) verwendeten Lehrmethoden nach S5-Standard mit Merkern.
Damit gewöhnt man sich diese unsymbolischen Zugriffe auf übergreifende Bereiche (die zugegebener Weise oft auch recht bequem sind) mit als Erstes an und wird sie dann nur schwer wieder los.
Aber gerade für mehrfach verwendete Bausteine ist diese Programmierweise mehr als nur kontraproduktiv.
 
Danke für die vielen Hilfen und Hinweise.

Ich werde mir das alles mal anhand von Beispielen mit der Software durchspielen.
Habe bei Ebay günstig eine S7 315-DP mit etwas Zubehör ersteigert,
denn nicht alles was im Simulator geht, geht auch an einer echten.

Das mit den Merkern ist mir schon sehr aufgefallen.

Alleine um Ausgänge zuzweisen die Mehrfach benutzt werden (Leuchtmelder etc.) ist es immer wieder erforderlich Merker zu nutzen.

Ich denke all das was man in einer Weiterbildung lernt, kann nur der Start sein und sehr viel lesen und probieren macht das ganze dann transparenter.

Ich bedanke mich für so ein tolles Forum, wo auch Anfängern geduldig zur Seite gestanden wird!

Toll!

Thomas
 
Das mit den Merkern ist mir schon sehr aufgefallen.

Alleine um Ausgänge zuzweisen die Mehrfach benutzt werden (Leuchtmelder etc.) ist es immer wieder erforderlich Merker zu nutzen.
Ebend nicht. Es gibt andere, voll symbolische Möglichkeiten.



Ich denke all das was man in einer Weiterbildung lernt, kann nur der Start sein ...
Ist nur blöd, wenn man das, was man als Erstes lernt, eigentlich gleich wieder vergessen kann, weil es nicht mehr den aktuellen Programmierweisen entspricht.
Und genau deswegen kann ich Dir nur raten: Vergiss Merker! Sie sind heutzutage max. noch als Takt- und Systemmerker angebracht. Und auch da nur mit symbolischem Zugriff.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
OK vielleicht hat da jemand einen kleinen Hinweis?

In der Weiterbildung arbeite ich grad an einer Transferanlage, um Probleme bei Ausgängen zu vermeiden,
wurde uns der Tip gegeben Ausgänge in einer extra Funktion zuzuweisen.
Was ich bisher auch ganz gut nachvollziehen konnte.

Aber was genau bedeutet dann voll symbolische Möglichkeiten.

Das was mir in FB's und FC's anbeoten wird?

Denn so wie ich das hier lese, scheine ich mir etwas anzueignen, was ich in der Zukunft wohl lieber nicht vertiefen sollte.

Eher mehr mit Funktionsbausteinen arbeiten?

Bei der Transfer Anlage sollen verschiedene Programme gefahren werden.

Ich überlege verschiedene Funltionen dafür zu nutzen und diese dann entsprechend aufzurufen und zu verlassen.

Oh man jetzt war ich froh schonmal was programmieren zu können und jetzt das.
Aber ich muss dazu sagen, das ich mir beim programmieren schon sehr oft die Frage gestellt habe, warum ich für fast jeden programmierten Baustein einen Merker habe.

Es wäre nett wenn Ihr mir den einen oder anderen Tip geben könnt.

Step7 kann ich nutzen, MHJ Software habe ich auf dem Lappi.

Danke Euch jetzt schon mal.

Thomas
 
Es ist etwas schwierig aufzuzeigen, wie man etwas symbolisch umsetzen kann, wenn man nicht weiß, was und wie bisher absolut programmiert wird.
Dafür gibt es einfach zu viele Möglichkeiten und würde hier den Rahmen sprengen.

Poste doch einfach mal Ausschnitte, z.B. von Deinen bisherigen Zuweisungen der Ausgänge.


Im Prinzip solltest Du immer als erstes Deinen Ein- und Ausgängen entsprechend ihrer Verwendung ein Symbol in der Symboltabelle geben. Daraus ergibt sich dann auch, wie diese Ausgänge angesprochen werden müssen. Also ob als Bit, Byte usw..
 
OK, ich frage jetzt mal ganz dumm welche Symboltabelle gemeint ist.
Ist die gemeint, die ich im Manager sehen kann unter S7-Programm oder ist die in den FCs bzw. FBs gemeint.

Denn bisher haben wir eher mit Funktionen gearbeitet, bei ein paar Aufgaben kam ein Funktionsbaustein ins Spiel.
Das der FC auch Schnitstellen hat, kam erst beim erklären des FBs zur Sprache.

Ich suche mal ein Beispiel heraus und poste es.

Thomas
 
Zuviel Werbung?
-> Hier kostenlos registrieren
OK, ich frage jetzt mal ganz dumm welche Symboltabelle gemeint ist.
Ist die gemeint, die ich im Manager sehen kann unter S7-Programm oder ist die in den FCs bzw. FBs gemeint.
Ja, die unter S7-Programm und die auch so heißt (das andere ist vermutlich die Bausteinschnittstelle, die Du da meinst).
Hardwareadressen sind nun mal absolut, da kommt man irgendwann nicht drum herum.

In der Symboltabelle werden diese absoluten Adressen mit Symbolen verbunden und im Programm dann nur noch diese Symbole verwendet. Dadurch ist es für das Programm egal, welche absolute Adresse sich wirklich hinter einem Symbol verbirgt -> sie wird austauschbar = flexibel.
 
Zuletzt bearbeitet:
Zurück
Oben