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

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

Thema: Indirekte Adressierung auf IN- bzw.OUT-Schnittstelle eines FC´s

  1. #1
    Registriert seit
    20.12.2006
    Beiträge
    46
    Danke
    2
    Erhielt 4 Danke für 4 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Hallo Leute! Ich bin auf der Suche, die IN- und OUT-Schnittstelle eines FC´s indirekt einzulesen bzw. zu beschreiben. Im konkreten Fall will ich eine Menge Eingangsbits in den Lokaldatenbereich kopieren, um sie dort zu verarbeiten und entsprechend wieder als OUT-Variable zurückschreiben. "Zu Fuss" ist das halt mühsam und nicht schön, daher würde ich das Ganze gern als indirekte Schleife abarbeiten. Soweit ich weiss funktioniert ja nur der TEMP-Bereich mit L bzw. T LW [#adresse]. Was muss ich statt "LW" für IN- bzw. OUT-Bereich angeben?
    Zitieren Zitieren Indirekte Adressierung auf IN- bzw.OUT-Schnittstelle eines FC´s  

  2. #2
    Registriert seit
    22.03.2007
    Ort
    Detmold (im Lipperland)
    Beiträge
    11.794
    Danke
    398
    Erhielt 2.417 Danke für 2.013 Beiträge

    Standard

    Hallo,
    mach doch mal ein Beispiel für die IN-Schnittstelle und was dann damit passieren soll ...

    Gruß
    Larry

  3. #3
    Registriert seit
    20.12.2006
    Beiträge
    46
    Danke
    2
    Erhielt 4 Danke für 4 Beiträge

    Standard

    Hier ein ganz simples Beispiel. Ich möchte anhand der als IN-Variable übergebenen Zeit (z.B. 2 Sekunden) nacheinander die OUT-Variablen beschreiben. Wie gesagt, normale Wertvergleiche sind ja kein Thema, aber nicht schön. Daher will ich die OUT-Bits in einer Schleife indirekt beschreiben.
    Angehängte Grafiken Angehängte Grafiken

  4. #4
    Registriert seit
    22.03.2007
    Ort
    Detmold (im Lipperland)
    Beiträge
    11.794
    Danke
    398
    Erhielt 2.417 Danke für 2.013 Beiträge

    Standard

    Naja ... das ginge so (ist aber nicht so schön) :
    Code:
    L p##boTakt1
    LAR1
    
    U #Bedingung
    = [AR1, p#0.0]  // adressiert boTakt1
    
    L p#0.1
    +AR1
    
    U #Bedingung
    = [AR1, p#0.0]  // adressiert boTakt2
    
    // usw.
    wie man daraus ggf. eine Schleife (oder was auch immer macht) weißt du sicherlich ...

    Gruß
    Larry

  5. Folgender Benutzer sagt Danke zu Larry Laffer für den nützlichen Beitrag:

    Katakis (26.11.2014)

  6. #5
    Registriert seit
    20.12.2006
    Beiträge
    46
    Danke
    2
    Erhielt 4 Danke für 4 Beiträge

    Standard

    Ok, das war so naheliegend, dass ich es nicht ernsthaft in Betracht gezogen habe. Manchmal ist es eben doch besser, ein wenig einfacher zu denken. Vielen Dank für die Unterstützung!

  7. #6
    Registriert seit
    06.06.2011
    Beiträge
    11
    Danke
    0
    Erhielt 2 Danke für 2 Beiträge

    Standard

    Hi, du schreibst Die Bits sollen nacheinander beschrieben werden.

    Was ich jetzt sehe ist das Du 32 Ausgangsbits hast und eine Fertigmeldung.
    Da Du dir eine Menge Tiparbeit sparen möchtest, warum nimmst du für Den Ausgang nicht ein Doppelword und shiftest immer um eine Position nach Links? Ist vielleicht ein ganz anderer Denkansatz.

    Gruß Peter

  8. #7
    Registriert seit
    20.12.2006
    Beiträge
    46
    Danke
    2
    Erhielt 4 Danke für 4 Beiträge

    Standard

    Ginge natürlich auch. Aber dann hast du bei der Aufrufschnittstelle nur ein Doppelwort, das du angeben kannst. In meinem Fall geht es um die Taktung von Leckagesitzen von Doppelsitzventilen über ASi-Bus. Da ist es mir schon recht, wenn ich die Bit-Adressen einzeln angeben kann. Klar, wenn ich den OUT-Bereich genauso wie den L-Bereich adressieren kann, ist das auch eine überlegenswerte Sache. Dann bleibt die Aufrufschnittstelle "leserlich" und ich dann trotzdem im FC doppelwortweise rumrangieren.

  9. #8
    Registriert seit
    22.06.2009
    Ort
    Sassnitz
    Beiträge
    11.326
    Danke
    932
    Erhielt 3.332 Danke für 2.690 Beiträge

    Standard

    Achtung, der Code von Larry funktioniert nur in einem FB.
    In einem FC liefert "L P##boTakt1" NICHT die Adresse des Ausgangsparameters boTakt1 sondern die Adresse der am Ausgang boTakt1 angeschlossenen Variable.

    Die IN-/OUT-Parameter eines FC können imho nicht in einer Schleife indirekt adressiert werden.

    Man könnte ein ARRAY_OF_BOOL oder ein DWORD übergeben und darin die Bits indirekt adressieren.

    Harald
    Es ist immer wieder überraschend, wie etwas plötzlich funktioniert, sobald man alles richtig macht.

    FAQ: Linkliste SIMATIC-Kommunikation über Ethernet

  10. Folgender Benutzer sagt Danke zu PN/DP für den nützlichen Beitrag:

    Larry Laffer (27.11.2014)

  11. #9
    Registriert seit
    23.07.2009
    Ort
    Österreich
    Beiträge
    2.367
    Danke
    457
    Erhielt 696 Danke für 521 Beiträge

    Standard

    Ja, indirekt auf IN/OUT bei FC ist gefährlich.

    Zitat Zitat von PN/DP Beitrag anzeigen
    Achtung, der Code von Larry funktioniert nur in einem FB.
    In einem FC liefert "L P##boTakt1" NICHT die Adresse des Ausgangsparameters boTakt1 sondern die Adresse der am Ausgang boTakt1 angeschlossenen Variable.
    Und nicht einmal das direkt.

    Kleines Bespiel...


    Wenn man am FC-Ausgang einen Merker verwendet, dann kommt man im FC an die Adresse dran.
    Wenn man am FC-Ausgang jedoch ein Datenbaustein-Bit verwendet, dann nicht mehr direkt.
    Mann kann dann schon mittels Pointer auf die Adressen schreiben, man schreibt dann halt nur irgendwohin...

    Ein weiteres Problem ist der Unterschied ob der FC in FUP oder AWL aufgerufen wurde.
    Hier ein Beispiel für den Unterschied und was man jeweils bekommt wenn man versuch indirekt auf in Parameter zuzugreifen.

    Allein dieser Unterschied macht es schon so gut wie unmöglich sinnvoll auf diese Weise zu arbeiten.



    Die SPS legt beim Aufruf des FC die IN/OUT-Parameter in den Temp-Bereich und arbeitet dann intern mit Pointern auf die "Vorigen Lokaldaten".
    IM FUP-Aufruf macht der AWL-Umsetzer das noch vorher (sichtbar), beim direkten AWL-Aufruf macht's die Maschine (unsichtbar)
    Nach dem FC-Aufruf wird dann wieder vom TEMP auf die eigentlichen Adressen kopiert.

    Ich wusste aber schon mal besser über dieses Verhalten bescheid. Vielleicht kann ja hier noch mal jemand genauer Licht ins Dunkel bringen wie das Handling bei den FCs funktioniert. Vor allem der Unterschied wenn man einen Merker und
    einen DB am OUT hat....
    Würd mich jetzt echt nochmal interessieren...

    @Katakis
    Für deinen Fall wird's wohl das einfachste sein wenn du...
    a) einen FB draus machst
    b) Wenn's ein FC sein muss würd ich's vermutlich so machen:
    - Doppelwort an FC - IN/OUT als Speicher

    - Doppelwort auf ein 32Bit-Array im Temp kopieren
    - Bits entsprechend manipulieren
    - Bits aus Temp auf FC-Out kopieren
    - 32Bit Array aus Temp wieder auf Doppelwort in FC-IN/OUT sichern.
    Angehängte Grafiken Angehängte Grafiken
    Geändert von RONIN (01.08.2015 um 20:41 Uhr)
    If at first you don't succeed, you're not Van Damme!
    ... or maybe using TIA!

  12. #10
    Registriert seit
    22.06.2009
    Ort
    Sassnitz
    Beiträge
    11.326
    Danke
    932
    Erhielt 3.332 Danke für 2.690 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Richtig, bei Datenbaustein-Bit als Aktualparameter liefert "L P##boTakt1" die Adresse der Kopie der Aktualvariable im L-Stack (Vorgänger-Lokaldaten).

    Was ist bei der Parametrierung der Ein- und Ausgangsparameter einer Funktion zu beachten?
    Zitat Zitat von 189227
    2.Versorgung der elementaren Ein- und Ausgangsparameter

    Bei der Versorgung von elementaren Formalparametern (z.B. die Datentypen BOOL, BYTE, WORD oder DWORD) der Schnittstelle einer Funktion sind zwei Fälle zu unterscheiden.
    1. Der elementare Formalparameter wird mit einem Merker, einem Ein- oder Ausgang aus dem Prozessabbild oder aus dem Lokaldatenstack (L-Stack) des aufrufenden Bausteines versorgt.
      In diesem Fall arbeitet der Code der Funktion mit einem bereichsübergreifenden Zeiger direkt(!) auf diesen elementaren Aktualparametern (z.B. P#E0.0, P#M0.0).
    2. Der elementare Formalparameter wird mit einer Konstanten oder einem Datenbausteinelement versorgt.
      In diesem Fall wird der Wert des Aktualparameters vor dem Aufruf der Funktion in den L-Stack des aufrufenden Bausteines kopiert. Der Code der Funktion arbeitet dann mit einem bereichsübergreifenden Zeiger auf diesen Lokaldatenbereich des aufrufenden Bausteines.
    Oder siehe hier die Zitate aus der Step7 Hilfe zu AWL > Parameterübergabe


    Im übrigen empfehle ich, im Interesse der Lesbarkeit des Codes durchaus die Mehr-Tipparbeit wegen sauberem symbolischen Zugriff auf jeden einzelnen Ausgang zu leisten. Man sieht ja an TIA, daß vollsymbolisches Programmieren die Priorität hat - da sind indirekte absolute Adressierungen häufig unmöglich oder nur noch extrem aufwendig zu realisieren.

    Harald
    Es ist immer wieder überraschend, wie etwas plötzlich funktioniert, sobald man alles richtig macht.

    FAQ: Linkliste SIMATIC-Kommunikation über Ethernet

  13. Folgender Benutzer sagt Danke zu PN/DP für den nützlichen Beitrag:

    RONIN (27.11.2014)

Ähnliche Themen

  1. Antworten: 50
    Letzter Beitrag: 01.08.2011, 12:57
  2. unsetzen indirekte adressierung von S5 auf S7
    Von mknoellner im Forum Simatic
    Antworten: 2
    Letzter Beitrag: 27.04.2009, 16:08
  3. Indirekte Adressierung
    Von hbck im Forum Simatic
    Antworten: 1
    Letzter Beitrag: 29.06.2007, 17:11
  4. Indirekte Adressierung eines Pointers
    Von merlin im Forum Simatic
    Antworten: 2
    Letzter Beitrag: 12.04.2007, 13:30
  5. indirekte Adressierung eines Datenbausteins
    Von linax im Forum Simatic
    Antworten: 1
    Letzter Beitrag: 20.11.2003, 17:12

Lesezeichen

Berechtigungen

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