TIA Aus DB zu lesenden Wert per HMI auswählen

blackfield

Level-1
Beiträge
19
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Mahlzeit,

ich steh gerade vor dem Problem das ich aus einem DB einen Wert auslesen muss um ihn dann zu verarbeiten.
Der DB ist mein Empfangspuffer (ModBus TCP). Insgesamt 512 Werte in einem Array. Davon brauch ich aber nur 5 Werte, diese muss ich jedoch übers KTP anwählen können.
Ist sozusagen eine Adresseinstellung.

Wie stell ich das am einfachsten und effizientesten an?

HMI ist ein KTP400 und CPU eine 1214.

Ich hoffe ich hab mich verständlich ausgedrückt und danke schon mal im voraus.

Grüße
 
Vielleicht ist es leichter wenn ich kurz erkläre was da vor sich geht:

Ich bekomme von einem DMX ModBus Gateway 512 Halteregister. In jedem Register steht ein Wert zwischen 0 und 256.

Jetzt brauch ich aber nur 5 dieser Register, je nach dem welchen DMX Kanal ich brauche, möchte ich den auf dem KTP auswählen.

Das mit dem Index klingt gut, ich muss allerdings gestehen das ich keine Ahnung hab wie ich das anstelle.

Ich werde nebenher mal versuchen etwas raus zu finden, wenn mir allerdings jemand die Lösung zur Hand hat bin ich auch nicht böse ;)

Grüße
 
Du könntest es so lösen: Du erstellst in der SPS in einem DB für die HMI 5 Variablen (UINT) für die Eingabe der 5 Registernummern (0..511) und 5 BYTE/WORD/UINT/(Datentyp der Halteregister)-Variablen für die Anzeige der ausgewählten Werte:
- Index_1, Index_2, ... Index_5 <---> und jeweils ein Eingabe/Ausgabe-EA-Feld im HMI zur Eingabe der ausgewählten Registernummern
- Wert_1, Wert_2, ... Wert_5 ---> und jeweils ein Ausgabefeld im HMI für die Anzeige des Wertes der ausgewählten Register

In der SPS programmierst Du für jede der 5 Index_x-Variablen eine Prüfung/Limitierung des Wertes auf 0..511 (bzw. die Array-Grenzen des DMX-Register-Arrays) und kopierst danach aus Deinem Register-Array das Element mit dem Index_x in die Wert_x-Variable.
Pseudocode:
Code:
#temp_Index := LIMIT(0, Index_1, 511);
Index_1     := #temp_Index;
Wert_1      := DMX_Register[#temp_Index];

#temp_Index := LIMIT(0, Index_2, 511);
Index_2     := #temp_Index;
Wert_2      := DMX_Register[#temp_Index];

...
#temp_Index := LIMIT(0, Index_5, 511);
Index_5     := #temp_Index;
Wert_5      := DMX_Register[#temp_Index];
Falls Du die Registernummern lieber von 1..512 nummerieren/eingeben willst (oder Dein DMX-Register-Array ist anders deklariert) dann passe entsprechend an, z.B.
Code:
#temp_Index := LIMIT(1, Index_1, 512);        [COLOR="#008000"]//Eingabewert auf 1..512 begrenzen[/COLOR]
Index_1     := #temp_Index;                   [COLOR="#008000"]//eventuelle Korrektur ans HMI zurückmelden[/COLOR]
Wert_1      := DMX_Register[#temp_Index - 1]; [COLOR="#008000"]//Index 1..512 adressiert DMX_Register[0..511][/COLOR]
...

Harald
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Danke dir! Das ist ja gar nicht mal so kompliziert. Meine Berührung mit SCL war bisher eher gering aber ich kann es soweit nachvollziehen!

Ich hab mich selbst etwas schlau gemacht. Ich könnte doch theoretisch auch den MOVE_BLK_VARIANT benutzen? Wobei das vermutlich mehr Aufwand wäre.

Danke dir nochmal!

Grüße
 
MOVE_BLK_VARIANT brauchst Du nicht. Du kannst das auch in FUP oder KOP programmieren mit ganz normalem MOVE.

Harald
 
Ich habs jetzt mal ausprobieren können und es funktioniert soweit. Mir war das mit dem Index-Zugriff nicht ganz klar aber jetzt hab ich es verstanden.

Bei mir hat er bei dem LIMIT gemault das er es nicht kennt. War eigentlich auch der Meinung das man es in Kurzform schreiben kann aber da wollte er unbedingt
LIMIT(MN:=_sint_in_, IN:=_sint_in_, MX:=_sint_in_)
Stellt zwar kein Problem da ist mir nur aufgefallen

Grüße
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Bei mir hat er bei dem LIMIT gemault das er es nicht kennt. War eigentlich auch der Meinung das man es in Kurzform schreiben kann aber da wollte er unbedingt
LIMIT(MN:=_sint_in_, IN:=_sint_in_, MX:=_sint_in_)
Ich hatte bei dem Beitrag kein TIA zur Verfügung um nachzuschauen wie die Parameternamen vom LIMIT heißen, deshalb hatte ich vorsichtshalber geschrieben "Pseudocode"

Harald
 
Zurück
Oben