TIA Problem beim Lesen von Eingangswerten mit DPRD_DAT

Carnefix

Level-2
Beiträge
9
Reaktionspunkte
1
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo,

ich arbeite gerade mit einer alten Steuerung (CPU 315-2) und möchte von einem Gateway die Eingangsdaten in ein DB schreiben.
Leider bin ich noch nicht ganz so erfahren mit AWL.

Meine Eingangsdaten sind entsprechend 32-Byte Lang mit der Anfangsadresse 392. Keine weiteren Ein- oder Ausgange vorhanden.
Dementsprechend lese ich die Daten vom Eingang:

Code:
// ---------------------------------------------------------
//   Daten konsistent lesen nach DB 205 "Input"
// ---------------------------------------------------------
      CALL  DPRD_DAT
         LADDR   :=W#16#188      // ==> EB 392
         RET_VAL :="CLV490_Scanner".Decoded.SFC14_RET_VAL// RET_VAL==0 ==> ok
         RECORD  :="CLV490_Scanner".Input.Data// 32 Byte

Im DB ist der Input als Struct mit der Variable Data | Array[1..32] of Byte definiert.

Der Rückgabewert RET_VAL ist jedoch -32591.

Aktuelle teste ich das Gerät in TIA V16, werde es später jedoch in Step7 einsetzen.

Habe ich vielleicht etwas übersehen? Freue mich über jeden Ratschlag.
 

Anhänge

  • DB.png
    DB.png
    6,3 KB · Aufrufe: 22
  • Eingang.png
    Eingang.png
    13,8 KB · Aufrufe: 22
Zuviel Werbung?
-> Hier kostenlos registrieren
Der Rückgabewert RET_VAL ist jedoch -32591.
-32591 = 16#80B1
TIA-Hilfe zu DPRD_DAT (S7-300, S7-400)
Fehlercode (W#16#...) : 80B1 Die Länge des angegebenen Zielbereichs ist ungleich der projektierten Nutzdatenlänge.

Du hast Konsistenz über "Einheit" und Einheit "Byte" projektiert. Du müsstest auf Konsistenz über "Gesamt" umstellen - wenn der Partner das auch kann. Oder mit Ladebefehlen direkt auf die Peripherie zugreifen, z.B.
Code:
L PEB 392
L PEW 392
L PED 392

Oder liegen die E-Adressen 392 .. 423 im Prozessabbild der Eingänge (PAE)? Dann könntest du SFC20 BLKMOV verwenden (anstatt DPRD_DAT).
 
-32591 = 16#80B1
TIA-Hilfe zu DPRD_DAT (S7-300, S7-400)
Fehlercode (W#16#...) : 80B1 Die Länge des angegebenen Zielbereichs ist ungleich der projektierten Nutzdatenlänge.

Du hast Konsistenz über "Einheit" und Einheit "Byte" projektiert. Du müsstest auf Konsistenz über "Gesamt" umstellen - wenn der Partner das auch kann. Oder mit Ladebefehlen direkt auf die Peripherie zugreifen, z.B.
Code:
L PEB 392
L PEW 392
L PED 392

Oder liegen die E-Adressen 392 .. 423 im Prozessabbild der Eingänge (PAE)? Dann könntest du SFC20 BLKMOV verwenden (anstatt DPRD_DAT).
Danke dir. Ich werde es morgen früh gleich testen.
Ich wollte am alten Code so wenig wie möglich ändern und hatte diesen Schnipsel entsprechend übernommen.

BLKMOV wäre meine Alternative gewesen jedoch ich wollte den Fehler verstehen, um daraus zu lernen und es zukünftig zu vermeiden.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Ich wollte am alten Code so wenig wie möglich ändern und hatte diesen Schnipsel entsprechend übernommen.
bei S7-300 geht DPRD_DAT nur für Datenlängen 3 Byte und >= 5 Byte, und nur für kopieren aus Peripherie-Adressen mit projektierter "Gesamt"-Konsistenz

BLKMOV wäre meine Alternative gewesen
BLKMOV kann nicht aus Peripherie-Adressen kopieren, sondern Eingänge nur aus dem Prozessabbild der Eingänge
 
bei S7-300 geht DPRD_DAT nur für Datenlängen 3 Byte und >= 5 Byte, und nur für kopieren aus Peripherie-Adressen mit projektierter "Gesamt"-Konsistenz
Genau das hatte ich auch gelesen. Nur die Gesamt Konsistenz was mir bis jetzt fremd, dass es solch eine Rolle spiele kann.

BLKMOV kann nicht aus Peripherie-Adressen kopieren, sondern Eingänge nur aus dem Prozessabbild der Eingänge
Danke für die Info.
 
Nur die Gesamt Konsistenz was mir bis jetzt fremd, dass es solch eine Rolle spiele kann.
DPRD_DAT ist nicht einfach nur ein spezieller BLKMOV, der aus/in Peripherie kopieren kann. Die Anweisung DPRD_DAT heißt "Konsistente Daten eines DP-Normslaves lesen" und ist dazu da, um als "konsistent" projektierte Datenblöcke wirklich konsistent zu lesen/kopieren. Bei Konsistenz über "Einheit" (Byte, Word, DWord) kann man die einzelnen Einheiten einfach mit L/T-Anweisungen und entsprechender Datenbreite konsistent kopieren. Für Blockgrößen "Gesamt" >= 5 Byte (und 3 Byte) gibt es keine einfache Anweisung, die den Datenblock garantiert unterbrechungsfrei am Stück ("atomar") kopiert, daher gibt es dafür (und nur dafür) extra die Anweisungen DPRD_DAT und DPWR_DAT.

Bei vielen CPU kann man den Aufruf von DPRD_DAT und DPWR_DAT weglassen, indem man die E/A-Adressen jeweils im Prozessabbild PAE/PAA projektiert (oder das PAE/PAA soweit vergrößert, dass die E/A-Adressen im PAE/PAA liegen), dann händelt die CPU selbständig das konsistente Kopieren zwischen Peripherie und Prozessabbild. Will man die E/A zusätzlich in/aus DB kopieren, kann man dann ganz normal BLKMOV verwenden oder beliebig L/T oder Schleifen mit L/T.
Oder liegen die E-Adressen 392 .. 423 im Prozessabbild der Eingänge (PAE)? Dann könntest du SFC20 BLKMOV verwenden (anstatt DPRD_DAT).
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Bei vielen CPU kann man den Aufruf von DPRD_DAT und DPWR_DAT weglassen, indem man die E/A-Adressen jeweils im Prozessabbild PAE/PAA projektiert (oder das PAE/PAA soweit vergrößert, dass die E/A-Adressen im PAE/PAA liegen), dann händelt die CPU selbständig das konsistente Kopieren zwischen Peripherie und Prozessabbild.
Wie aus aussieht geht das Gateway, welche ich nutzen will in den Fehler, wenn ich "Gesamte Länge" einstelle.

Für mich ist es neu, den PAE extra zu projektieren. Ich konnte jetzt speziell dazu nichts finden.
Gibt es dafür eine spezielle Funktion die aufgerufen werden muss? Oder genügt es die Daten in eine Globalen Variablentabelle zu referenzieren und die für die BLKMOV zu nutzen?
 
Für mich ist es neu, den PAE extra zu projektieren. Ich konnte jetzt speziell dazu nichts finden.
In den Gerätekonfig-Eigenschaften der CPU bei Zyklus: Größe des Prozessabbildes der Eingänge und Größe des Prozessabbildes der Ausgänge
Kommt drauf an, welche CPU du hast. Z.B. bei der CPU 315-2AH14 ist es jeweils einstellbar bis max 2048 Bytes (voreingestellt 128 Bytes). Bei der 315-2AG10 ist es fest auf 128 Byte Eingänge und 128 Byte Ausgänge (nicht einstellbar).
 
In den Gerätekonfig-Eigenschaften der CPU bei Zyklus: Größe des Prozessabbildes der Eingänge und Größe des Prozessabbildes der Ausgänge
Kommt drauf an, welche CPU du hast. Z.B. bei der CPU 315-2AH14 ist es jeweils einstellbar bis max 2048 Bytes (voreingestellt 128 Bytes). Bei der 315-2AG10 ist es fest auf 128 Byte Eingänge und 128 Byte Ausgänge (nicht einstellbar).
Habe es. In der 317-2 PN/DP, die beim Kunden eingesetzt wird sind bereits 256 eingestellt und es werden kaum welche verwendet.

1747820739899.png

Nochmals danke für deine Geduld mit mir und danke für die tolle Erklärung. :)
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Wie aus aussieht geht das Gateway, welche ich nutzen will in den Fehler, wenn ich "Gesamte Länge" einstelle.
Die Größe der Konsistenz (also auch "Einheit" oder "Gesamt") muss bei DP-Master und -Slave gleich eingestellt sein. Wenn unterschiedlich, dann geht der Slave nicht in den zyklischen Datenaustausch mit dem Master und signalisiert üblicherweise Busfehler.
Kann das unbekannte Gateway entsprechend eingestellt werden oder ist das fest eingestellt?

PS: Wenn der Bereich bei dem Gateway nicht auf Konsistenz "Gesamt" eingestellt werden kann, dann bleibt dir nur, entweder die Adressen im PAE projektieren und mit BLKMOV oder 8x L/T in den DB kopieren, oder mit z.B. 8x L/T DWordweise aus den Peripherieadressen in den DB kopieren. Man könnte auch eine Schleife mit indirekter Adressierung machen, bei so kleinen Bereichen schreibt man aber üblicherweise übersichtlich die L/T linear nacheinander hin (ist auch gut für die Referenzdaten/Querverweisliste).
Code:
L PED 392
T DB1.DBD0
L PED 396
T DB1.DBD4
...
 
Zuletzt bearbeitet:
Die Größe der Konsistenz (also auch "Einheit" oder "Gesamt") muss bei DP-Master und -Slave gleich eingestellt sein. Wenn unterschiedlich, dann geht der Slave nicht in den zyklischen Datenaustausch mit dem Master und signalisiert üblicherweise Busfehler.
Kann das unbekannte Gateway entsprechend eingestellt werden oder ist das fest eingestellt?
Am Gateway direkt kann man nichts einstellen. Ich habe ein universalmodul konfiguriert und die Länge selber definiert.

Jedoch habe ich es auch mit einem festen 32 Byte In Modul getestet ohne Erfolg.

Der Support konnte mir da auch nicht weiterhelfen.
 

Anhänge

Ich erhalte jetzt entsprechend Daten von der Kamera und kann diese am Eingang sehen. Eingestellt ist Einheit und übers PAE.
Morgen kann ich wieder an die Anlage und würde es entsprechend die Daten so Zyklisch in den DB schieben;
Code:
//TIA
      CALL  BLKMOV
         blk_type:=Any
         SRCBLK  :=P#I192.0 BYTE 32 // Eingang ab E192.0
         RET_VAL :="CLV490_Scanner".Decoded.SFC14_RET_VAL// Rückgabewert
         DSTBLK  :=P#DB205.DBX0.0 BYTE 32 // Datenbaustein ab Byte 0
       
//S7
      CALL  "BLKMOV"
       SRCBLK :=P#E 192.0 BYTE 32       // Eingang ab E192.0
       RET_VAL:="CLV490_Scanner".Input.SFC14_RET_VAL    // Rückgabewert
       DSTBLK :="CLV490_Scanner".Input.Data    // Datenbaustein ab Byte 0
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
Am Gateway direkt kann man nichts einstellen. Ich habe ein universalmodul konfiguriert und die Länge selber definiert.
(...)
Der Support konnte mir da auch nicht weiterhelfen.
Anbei die Anleitungen.
Hier der Link zur Homepage:

da kann man auch die GSD-Datei WENG0C23.gsd (Product_Description_File_GSD_ZAG73AN01.zip) downloaden
Die habe ich in meinem TIA V16 installiert und kann da auch ein Universalmodul 32 Bytes Eingang mit Konsistenz über "Gesamte Länge" konfigurieren. So kann man die E-Adressen außerhalb des PAE projektieren und mit DPRD_DAT in einen DB einlesen.
 
Zurück
Oben