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

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

Thema: Adressen in FBs nutzen

  1. #1
    Registriert seit
    24.05.2016
    Beiträge
    9
    Danke
    7
    Erhielt 0 Danke für 0 Beiträge

    Standard


    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
    Zitieren Zitieren Adressen in FBs nutzen  

  2. #2
    Registriert seit
    12.12.2013
    Ort
    Kaiserslautern
    Beiträge
    1.337
    Danke
    386
    Erhielt 218 Danke für 173 Beiträge

    Standard

    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
    Wenn es nicht auf STRAVA ist, ist es nicht passiert !!

  3. Folgende 2 Benutzer sagen Danke zu de vliegende hollander für den nützlichen Beitrag:

    Bobbybau91 (19.06.2016),BSTom (21.06.2016)

  4. #3
    Registriert seit
    12.04.2005
    Ort
    Black Forest
    Beiträge
    1.336
    Danke
    27
    Erhielt 130 Danke für 117 Beiträge

    Standard

    Zitat Zitat von BSTom Beitrag anzeigen
    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

    Zitat Zitat von BSTom Beitrag anzeigen
    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 ...

    „Eine Frage raubt mir den Verstand bin ich verrückt oder sind es die Anderen ?“

    Albert Einstein

  5. #4
    BSTom ist offline Neuer Benutzer
    Themenstarter
    Registriert seit
    24.05.2016
    Beiträge
    9
    Danke
    7
    Erhielt 0 Danke für 0 Beiträge

    Standard

    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.

  6. #5
    Registriert seit
    27.06.2009
    Ort
    am Nordharz
    Beiträge
    3.717
    Danke
    443
    Erhielt 919 Danke für 740 Beiträge

    Standard

    Zitat Zitat von BSTom Beitrag anzeigen
    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.

  7. Folgender Benutzer sagt Danke zu hucki für den nützlichen Beitrag:

    BSTom (21.06.2016)

  8. #6
    Registriert seit
    23.07.2009
    Ort
    Österreich
    Beiträge
    2.343
    Danke
    450
    Erhielt 691 Danke für 516 Beiträge

    Standard

    Zitat Zitat von hucki Beitrag anzeigen
    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.
    If at first you don't succeed, you're not Van Damme!
    ... or maybe using TIA!

  9. Folgender Benutzer sagt Danke zu RONIN für den nützlichen Beitrag:

    BSTom (21.06.2016)

  10. #7
    BSTom ist offline Neuer Benutzer
    Themenstarter
    Registriert seit
    24.05.2016
    Beiträge
    9
    Danke
    7
    Erhielt 0 Danke für 0 Beiträge

    Standard

    Hallo,

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

    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

  11. #8
    Registriert seit
    27.06.2009
    Ort
    am Nordharz
    Beiträge
    3.717
    Danke
    443
    Erhielt 919 Danke für 740 Beiträge

    Standard

    Zitat Zitat von BSTom Beitrag anzeigen
    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?


    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.

  12. Folgender Benutzer sagt Danke zu hucki für den nützlichen Beitrag:

    BSTom (21.06.2016)

  13. #9
    BSTom ist offline Neuer Benutzer
    Themenstarter
    Registriert seit
    24.05.2016
    Beiträge
    9
    Danke
    7
    Erhielt 0 Danke für 0 Beiträge

    Standard

    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.

  14. #10
    Registriert seit
    27.06.2009
    Ort
    am Nordharz
    Beiträge
    3.717
    Danke
    443
    Erhielt 919 Danke für 740 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Zitat Zitat von BSTom Beitrag anzeigen
    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.



    Zitat Zitat von BSTom Beitrag anzeigen
    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.)




    Zitat Zitat von BSTom Beitrag anzeigen
    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.



    Zitat Zitat von BSTom Beitrag anzeigen
    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.
    Geändert von hucki (19.06.2016 um 23:46 Uhr)

  15. Folgender Benutzer sagt Danke zu hucki für den nützlichen Beitrag:

    BSTom (21.06.2016)

Ähnliche Themen

  1. Anfängerfrage zu FBs in ST
    Von JemandAnders im Forum CODESYS und IEC61131
    Antworten: 4
    Letzter Beitrag: 19.12.2013, 10:51
  2. Aktionen in FBs auslösen
    Von twincatter im Forum CODESYS und IEC61131
    Antworten: 2
    Letzter Beitrag: 23.08.2013, 13:18
  3. Antworten: 7
    Letzter Beitrag: 02.09.2011, 11:43
  4. Wertübergabe zw. FBs
    Von Jackjackson im Forum Simatic
    Antworten: 163
    Letzter Beitrag: 28.11.2008, 17:24
  5. Schachtelungstiefe von FBs
    Von Andre_ im Forum Simatic
    Antworten: 2
    Letzter Beitrag: 02.06.2006, 18:17

Lesezeichen

Berechtigungen

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