TIA Eingangsbyte durch Variablen Wert einlesen

Bluecivic

Level-2
Beiträge
15
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo zusammen,

irgendwie stehe ich im Moment auf dem Schlauch.
Ich möchte in meinem Unified Panel über ein Faceplate dynamisch Digitaleingänge darstellen (Zustand des Hardwareeingangs, Invertieren, Simulieren...Ausgabezustand für das weitere SPS-Programm).
Das habe ich soweit auch fertig. Nur möchte ich in dem Faceplate auch die Hardwareadresse des Eingangsbytes eingeben können und damit in meiner Funktion das entsprechende %EB in meinen DB mit dem UDT für das Faceplate rangieren.

Mir fehlt der Ansatz wie ich den Integerwert meines UDT DBs für die Adresse mit dem %EB verknüpfe.

Beispiel:
Ich möchte das Eingangsbyte 200 verwenden.
Standardmäßiges einlesen: "DB_Digitaleingang.HW_Eingang" := %EB200
Jetzt hab ich aber kein %EB200 sondern die Integervariable "DB_Digitaleingang.HW_Adresse" mit dem Wert 200.

Wie bekomme ich dies verknüpft?

Vielen Dank.
 
Dann am besten das SPS-Programm so schreiben, dass bei einem Wert von 200 das EB200 auf ein Byte eines Datenbausteins geschrieben wird. Diesen liest du dann aus.
Habe ich so schon öfter gesehen, bis jetzt aber nur mit 300er SPS und Pointer/Adressregister.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Dann am besten das SPS-Programm so schreiben, dass bei einem Wert von 200 das EB200 auf ein Byte eines Datenbausteins geschrieben wird. Diesen liest du dann aus.
Habe ich so schon öfter gesehen, bis jetzt aber nur mit 300er SPS und Pointer/Adressregister.
Genau dies wollte ich oben beschreiben.
Bei der 300er ging das mal so in SCL:

#wordVar := %IW(#intVar);

Wenn ich aber jetzt in der 1500er folgenden Code eingebe:

#DB_Digitaleingang.HW_Eingang := %IW(#DB_Digitaleingang.HW_Adresse);

markert mir TIA %IW rot an und schreibt: "Ungültige Funktion oder ungültiger Funktionsbaustein"

PS: Ob ich ein Eingangswort oder Eingangsbyte einlese ist mir gleich.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
schöner fände ich eine Lösung mit optimierten Bausteinen und symbolischem Zugriff.
"Ich will auf beliebige Adressen (auch welche ohne Name) zugreifen - aber bitte mit symbolischem Zugriff!" Wie soll das gehen??? :unsure:
Du könntest mit Variablen-Multiplexen Namen in Adressen übersetzen, aber das ist dir garantiert zu viel Arbeit ;)

Je nachdem, was für eine SPS-CPU du hast, kannst du indirekt auf Adressen im Prozessabbild der Eingänge zugreifen mit PEEK oder einen POINTER. Bei beiden Varianten muss die Adresse aus numerischen Bestandteilen zusammengebastelt werden (Byte-Nummer und Bit-Nummer und Bereichskennung).

Welche CPU hast du?
 
"Ich will auf beliebige Adressen (auch welche ohne Name) zugreifen - aber bitte mit symbolischem Zugriff!" Wie soll das gehen??? :unsure:
Du könntest mit Variablen-Multiplexen Namen in Adressen übersetzen, aber das ist dir garantiert zu viel Arbeit ;)

Je nachdem, was für eine SPS-CPU du hast, kannst du indirekt auf Adressen im Prozessabbild der Eingänge zugreifen mit PEEK oder einen POINTER. Bei beiden Varianten musst die Adresse aus numerischen zusammengebastelt werden.

Ich glaube ich habe mich schlecht ausgedrückt. Ich möchte schon auf die definierten Hardware Adressen der Digitalen Eingänge zugreifen.

z.B. %EW200

Da ich aber sehr viele Eingänge habe möchte ich in meinem DB mit meinem Array of UDT aus meinem Unified Faceplate die zu verwendende Eingangsadresse (200) schreiben, damit dann das Eingangswort in meinen DB geschrieben wird.

Ich habe jetzt einen Workaround programmiert der funktioniert.
Hätte es mir nur komfortabler gewünscht. Bin mir auch sicher, dass es einen besseren Weg gibt, als den den ich gewählt habe.
 
Du erstellst einen SCL-Baustein. Input: "Adr" als Int oder DInt- Output: EW (als Word).
Code: #EW := PEEK_WORD(area:=16#81, dbNumber:=0, byteOffset:=#Adr);

Dann Baustein aufrufen, dein Int aus dem HMI als Input verknüpfen, dein Ziel-Word im DB als Out, fertig.

Zumindest wenn deine CPU das kann. Wir wissen ja immer noch nicht, welche Steuerung du hast.
 
Ich habe jetzt einen Workaround programmiert der funktioniert.
Hätte es mir nur komfortabler gewünscht. Bin mir auch sicher, dass es einen besseren Weg gibt, als den den ich gewählt habe.
Ist dein Workaround so dirty, dass du sicher bist, das der hier nicht gezeigt werden kann? ;)
Verrate blos nicht zuviel. Aber erwarte viel und perfekte Lösungen von den freiwilligen Helfern.
 
Wäre eine Variante, aber schöner fände ich eine Lösung mit optimierten Bausteinen und symbolischem Zugriff.
Ich glaube, deine Verwirrung bezieht sich auf den nachgefügten Satz in dem verlinkten Beitrag. Das bezieht sich aber auf das Lesen aus dem DB. Du willst ja nicht aus einem DB lesen, sondern aus dem PAE. Wenn du auf die Eingänge lesend zugreifst und den Wert in einen DB schreibst, kannst du selbstverfreilich symbolisch und optimiert arbeiten.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Ich glaube, deine Verwirrung bezieht sich auf den nachgefügten Satz in dem verlinkten Beitrag. Das bezieht sich aber auf das Lesen aus dem DB. Du willst ja nicht aus einem DB lesen, sondern aus dem PAE. Wenn du auf die Eingänge lesend zugreifst und den Wert in einen DB schreibst, kannst du selbstverfreilich symbolisch und optimiert arbeiten.

Vielen Dank für diese Ausführung. (y)

Mein Workaround war das EW in den DB zu schreiben (#DB_Digitaleingang.HW_Eingang := %IW200) und von dort verwendet mein Standard-FC symbolisch alles weiter. Ich wollte mir diesen Zwischenschritt und Codemenge sparen.

@PN/DP warum schwingt in Deinen Antworten soviel negative Stimmung mit? Ich erwarte keine perfekten Lösungen, nur Denkanstöße an einem langen Arbeitstag, wenn ich auf dem Schlauch stehe. Ich war immer der Meinung, dies sei der Sinn eines Forums.
Zur Frage der CPU: Da ich in einem oberen Post von einer 1500er CPU gesprochen habe, macht es doch keinen Unterschied für mein Problem ob eine 1512 oder 1515.

Also nochmals vielen Dank.
 
Vielen Dank für diese Ausführung. (y)
Bitte, gern.

Mein Workaround war das EW in den DB zu schreiben (#DB_Digitaleingang.HW_Eingang := %IW200) und von dort verwendet mein Standard-FC symbolisch alles weiter. Ich wollte mir diesen Zwischenschritt und Codemenge sparen.
Mein Verständnis war, dass du die "200" aus dem HMI bekommst und darüber dann das EW200 lesen willst. Oder eben EW42, wenn du "42" eingibst. Inwieweit hast du einen Workaround, wenn du jetzt trotzdem fest auf EW200 zugreifst?
 
Hallo Bluecivic,

für die von dir gewünschten Funktionen Anzeige, invertieren, simulieren wirst du natürlich auch in der SPS einen Baustein brauchen.

Wenn du jedoch beliebige E's, EB's, A's ... nur anzeigen möchtest, brauchst du kein SPS Programm (bei WinCCflex, unified kenne ich nicht).
Das Stichwort ist (wie schon von PN/DP angesprochen): Multiplexen

1721207242280.png

1721207424346.png 1721207447943.png
 
Zuviel Werbung?
-> Hier kostenlos registrieren
@PN/DP warum schwingt in Deinen Antworten soviel negative Stimmung mit?
In welchen meiner 3 Antworten "schwingt soviel negative Stimmung mit"?

Zur Frage der CPU: Da ich in einem oberen Post von einer 1500er CPU gesprochen habe, macht es doch keinen Unterschied für mein Problem ob eine 1512 oder 1515.
Du hast in Beitrag #3 beiläufig von einer S7-300 und einer S7-1500 gesprochen. Soll ich mir nun aussuchen, welche der CPUs du jetzt hast? Ist das wirklich so schlimm, einfach zu antworten "Ich habe eine S7-1500"? Muss da ein Drama draus gemacht werden?

Du brauchst nicht antworten, deine Empfindlichkeiten gehören eh nicht zum Thema.
 
Zurück
Oben