TIA Neuling - Hilfe bei Indirekte Adressierung

Paule79

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

ich bin neu in der Welt der SPS. Habe mich auch schon versucht in andere Threads einzulesen, leider ohne Erfolg
Aktuell arbeite ich mich mit der S7-1212C, einem HMI Comfort und einem IO-Module ein.

Jetzt habe ich eine Frage:

Es ist so das mein IO-Module mehrere Parameter an die SPS weitergeben kann. Im Modul gibt es Steckplätze die belegt sind und den auszulesenden Grössen sind Adressen hinterlegt.
--> z.B. Temperatur ... Steckplatz1 ... E-Adresse "256...260" .... A-Adresse "keine"
Einlesen kann ich den Parameter wenn ich eine PLC-Variable mit "%ID256" deklariere. Jetzt suche ich aber nach einer Option, dass ich die Adresse also "256" nach belieben ändern kann.
Sprich wenn ich in meinem Programmcode sehe, dass Temperatur auf einmal die Anfangsadresse 270 hat, dass dann sich die PLC-Variable oder ähnliches auf "%ID270" einstellt.
Ist so etwas grundsätzlich möglich? Bin ich mit indirekter Adresse richtig?

Ich bin hingegangen und habe die Anfangsadresse mittels "RD_ADDR" ausgelesen. Das hat auch gut funktioniert. Jetzt habe ich eine Variable mit dem Wert "256". Nun komme ich aber nicht weiter.
Wenn ich diesen Wert mit meinem HMI verknüpfe sehe ich lediglich den Wert "256" und nicht den gewünschten Messerwert.
Falls ihr mir helfen könnt, bitte ich um eine ausführliche Beschreibung :)


Falls etwas unverständlich sein sollte, bitte einfach melden.
Ich danke euch jetzt schon mal herzlich!


Viele Grüsse
Paul
 
Ich bin hingegangen und habe die Anfangsadresse mittels "RD_ADDR" ausgelesen. Das hat auch gut funktioniert. Jetzt habe ich eine Variable mit dem Wert "256". Nun komme ich aber nicht weiter.
Wenn ich diesen Wert mit meinem HMI verknüpfe sehe ich lediglich den Wert "256" und nicht den gewünschten Messerwert.
Falls ihr mir helfen könnt, bitte ich um eine ausführliche Beschreibung :)

Ich empfehle dir mit der HMI nicht direkt auf Hardwareadressen zuzugreifen. Greife mit der HMI auf Symbolische Variablen z.B. in einem DB zu. Und kopiere per Software die Werte von der Hardware in den DB.
Da hast du dann was indirekt angeht, viel mehr Möglichkeiten.
z.B. könntest du mit PEEK

Code:
"GDB_HMI".Messwert := PEEK(area := 16#81, // 16#81 für Input
                           dbNumber := 0, // 0 Weil kein DB
                           byteOffset := #Byteoffset); // byteadresse des eingangs)
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Danke für deine Antwort.

Jetzt ist es aber so, dass ich nicht nur 1 Byte einlesen will sondern mein Messwert aus 4 Bytes besteht.
Wenn ich es richtig verstehe kann ich mit PEEK den Messwert erkennen, lediglich jedoch für maximal 2 Bytes (16 Bit).

Was kann ich also tun?
 
Dafür gibts dann die möglichkeit
Code:
"GDB_HMI".Messwert.%B0 := PEEK(area := 16#81, // 16#81 für Input
                               dbNumber := 0, // 0 Weil kein DB
                           byteOffset := #Byteoffset); // byteadresse des eingangs)


"GDB_HMI".Messwert.%B1 := PEEK(area := 16#81, // 16#81 für Input
                               dbNumber := 0, // 0 Weil kein DB
                               byteOffset := #Byteoffset + 1); // byteadresse des eingangs)


"GDB_HMI".Messwert.%B2 := PEEK(area := 16#81, // 16#81 für Input
                               dbNumber := 0, // 0 Weil kein DB
                               byteOffset := #Byteoffset + 2); // byteadresse des eingangs)


"GDB_HMI".Messwert.%B3 := PEEK(area := 16#81, // 16#81 für Input
                               dbNumber := 0, // 0 Weil kein DB
                               byteOffset := #Byteoffset + 3); // byteadresse des eingangs)

Ist immernoch Symbolisch und der ZielDB kann Optimiert sein. Das Konstrukt könnte man in einen Baustein Packen extra für DINT oder REAL etc.

oder halt so.

Code:
POKE_BLK(area_src := 16#81, // 16#81 für Input
         dbNumber_src := 0, // 0 Weil kein DB
         byteOffset_src := #Byteoffset, // byteadresse des eingangs
         area_dest := 16#84, // 16#84 für DB
         dbNumber_dest := 20, //für DB 20
         byteOffset_dest := #Byteoffset_DB, // Byteoffset für zielbereich im DB
         count := 4); // vier Byte

Dann darf der Zieldb nicht mehr optimiert sein und man muss irgendwie die DB Nummer und den Offsett des DBziels übergeben. Läuft also wieder auf ANY oder sowas raus.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Würde dir empfehlen das ganze mit der Hardwarekennung zu machen, so ist die Adresse recht egal.

Das habe ich doch schon versucht mittels: RD_ADDR. Gibt es noch eine andere Möglichkeit.


@vollmi:

Vielen Dank für die ausführliche Hilfe.
Das mit den Adressen erweitern habe ich schon gemacht. Ich habe an meinem Messgerät also dem IO-Modul einen Messwert von 500 Simuliert.

Ich bekomme folgendes:
- Messwert.B0: 67
- Messwert.B1: 250
- Messwert.B2: 0
- Messwert.B3: 1

- Messwert.B4: 188 --> Das ist aber nur das Status Byte... 188dez. bedeutet Good.

Wie komme ich aber von den Messwerten.B0-B3 auf meinen Ursprungswert von 500?
 
Guten Morgen.

Danke für die Antwort jat. Ich möchte halt die Adresse nicht nur einlesen, sonder den Wert, welcher hinter der Adresse steckt.
Leider ist bei mir "RD_ADDR = 0" nur in der Funktion von RD_ADDR erkennt er Anhand der HW-Kennung, die Anfangsadresse. Nun habe ich aber ein 4 Byte (32Bit) Grösse.
Sprich ich muss nicht nur Adresse 256 für den Wert, sondern noch 257, 258 und 259, auslesen.


Kann ich die 4 Bytes irgendwie wieder zu einem Real/Float zusammenführen? Möglichst in TIA Portal

Oder gibt es einen anderen Weg?
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Messwert ohne %B0-B3 wäre der Wert in Real. Den Bitinhalt also in eine Realvariable schreiben.
Allerdings deuchen mich die Werte komisch. Sicher das der Messwert in REAL ausgegeben wird? nicht irgendwie als DINT oder sowas?

realmesswert := messwert;
 
Wenn es so ist wie angegeben, ist es kein REAL.
Könnte man es nicht irgendwie mit AT überlagerung anstellen? PEW256 > DWORD[0] PEW258 > DWORD[1] ergibt dann "PEDW256" usw?

Gibt es überhaupt EIngangskarten oder normale Sensoren die einen Wert als REAL ausgeben/aufnehmen können? Mal abgesehen von IO-Link
 
Danke euch beiden.

@ vollmi: Leider kann ich dir nicht ganz folgen...

@ Credofire:

Gerät.PNG


also wenn ich das nicht ganz falsch interpretiere, handelt es sich hierbei um einen Real bei Sensor.


Habe mal ein Bild als kleines Beispiel angefügt.
Auch von meinem bisherigen Code...

Test.PNG

Programm.jpg


Ich hoffe es hilft und ihr könnt mir weiterhelfen.
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
Jetzt ist es aber so, dass ich nicht nur 1 Byte einlesen will sondern mein Messwert aus 4 Bytes besteht.
Wenn ich es richtig verstehe kann ich mit PEEK den Messwert erkennen, lediglich jedoch für maximal 2 Bytes (16 Bit).

Was kann ich also tun?
Mit PEEK kann man 8-/16-/32-/64-Bit-Werte lesen (BYTE, WORD, DWORD, LWORD):
Code:
"GDB_HMI".Real_Messwert := DWORD_TO_REAL(PEEK_DWORD(area := 16#81,            // 16#81 für Input
                                                    dbNumber := 0,            // 0 weil kein DB
                                                    byteOffset := #Adresse)); // Anfangsadresse

"GDB_HMI".DInt_Messwert := DWORD_TO_DINT(PEEK_DWORD(area := 16#81,
                                                    dbNumber := 0,
                                                    byteOffset := #Adresse));

"GDB_HMI".Int_Messwert  := WORD_TO_INT(PEEK_WORD(area := 16#81,
                                                 dbNumber := 0,
                                                 byteOffset := #Adresse));

Harald
 
Hallo Harald,

vielen Dank. Das ist die Lösung für mein Problem.
Ich wusste nicht das man "PEEK_DWORD(...)" auch schreiben kann, da das TIA standartmässig nur "PEEK(...)" angibt.

Muss ich so etwas wissen oder gibt es irgendwo ein Regelhandbuch, etc. dafür?
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Ich wusste nicht das man "PEEK_DWORD(...)" auch schreiben kann, da das TIA standartmässig nur "PEEK(...)" angibt.

Muss ich so etwas wissen oder gibt es irgendwo ein Regelhandbuch, etc. dafür?
Man sieht es im SCL-Editor beim eintippen von PEEK, oder wenn man SEHR aufmerksam die relativ kurz gefasste TIA-Hilfe zu PEEK liest (Beschreibung zu "_<Datentyp>", allerdings ist die Möglichkeit DWORD da nicht explizit erwähnt).

Harald
 
Hallo zusammen... hätte noch eine Frage...

Da ich nun Adressen auslesen kann und dies auch wunderbar funktioniert, würde ich gerne noch etwas wissen.
Ich kann in meinem IO-Modul Parameter hinzufügen. Sprich ich kann Slot 1-14 frei belegen.

Mein Modul hat die HW-Kennung 288, jenachdem welchen Parameter ich eingebe dann fortlaufend, also "Mass flow_1" hätte dann HW-Kennung 289.
Slots.PNG

Gibt es eine Möglichkeit egal wo ich welchen Parameter hinsetze ich immer die Adresse von ihm weiss?

z.B. könnte ich "Temperatur" auf Slot 6 legen und diese hätte die HW-Kennung 290, danach z.B. "Dichte" auf 4 und diese hätte dann HW-Kennung 291.
Wenn ich nun Temperatur wieder entferne und etwas anderes hinzufüge, dann hat dieser Parameter auf einmal die HW-Kennung 290.
--> Also ich kan nicht aus der HW-Kennung der Parameter (Submodule) erkennen, was was ist...

Ich wollte das dann über Slots generieren... die mir die HW-Kennung Rückmelden und dann die E/A-Adresse ausgelesen wird.
Das ganze mit GEO2LOG... aber leider komme ich nicht weiter.


Fehler.jpg

Danke schon mal für eure Hilfe.
 

Anhänge

  • Fehler.jpg
    Fehler.jpg
    55,7 KB · Aufrufe: 8
Zuletzt bearbeitet:
Zurück
Oben