TIA PUT GET Fehler 4

electroniker

Level-1
Beiträge
5
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo,
ich bin S7-Neueinsteiger und habe ein sicher triviales aber für mich momentan unlösbares Problem. Ich versuche eine einseitige Datenübertragung per PUT GET in TIA V14.SP1 zwischen zwei CPU’s 1512C-1PN zu bewerkstelligen. Dazu habe ich mich an die Anleitung vom Siemens Online Support bzw. die Hilfe zum FB PUT gehalten. Die S7-Verbindung steht, PUT GET für beide CPU’s erlaubt. Einseitiger Verbindungsaufbau ist aktiviert. Bei den verwendeten DB (SD_i, Addr_i) wurde „Optimierter Bausteinzugriff“ deaktiviert. Wird die Datenübertragung einmalig angestoßen erscheint Fehler 4. Zu Testzwecken soll nur ein Bit übertragen werden. Zum Fehler 4 sind mehrere Ursachen aufgelistet. Ich konnte bislang alle ausschließen, lediglich „auf SD_i kann nicht zugegriffen werden“ macht mir Sorgen. Was könnte hier die Ursache sein und mit welchem Trick wäre der Fehler zu beheben?
 
Moin electroniker,

konntest Du denn schon alle Erläuterungen zum Fehlerstatus 4, wie sie in der Hilfe stehen ausschließen?

Hier scheint es ein Problem mit der Größe des Bereichs SD_i zu geben.

aus der Hilfe:

Fehler in den Zeigern zur Datenablage:

  • Datentypen der Parameter SD_i und ADDR_i passen nicht zueinander.
  • Die Länge des Bereichs SD_i ist größer als die Länge der zu schreibenden Daten der Parameter ADDR_i.
  • Auf SD_i kann nicht zugegriffen werden.
  • Maximale Nutzdatengröße überschritten.
  • Anzahl der Parameter SD_i und ADDR_i stimmen nicht überein.


    VG

    MFreiberger

Also ist der Speicherbereich, den Du an SD_i übergibst überhaupt vorhanden? Was schreibst Du denn da dran?
 
Zuletzt bearbeitet:
Danke für die schnelle Reaktion.
Ich habe in jeder PLC einen globalen DB angelegt. Gesendet werden soll aus DB5, am FB habe ich am Eingang SD_i P#DB5.DBX0.0 BYTE 1 eingegeben, da ich vorerst nur ein bit testweise übertragen, wäre 1 Byte Datenlänge ausreichend ?
Am Eingang Addr_i habe ich P#DB10.DBX0.0 BYTE 1 angegeben (DB 10 in Empfangs-CPU).
 
Zuletzt bearbeitet:
Moin electroniker,

Zeiger auf diejenigen Bereiche in der eigenen CPU, die die zu versendenden Daten enthalten.
Zulässig sind nur die Datentypen BOOL, BYTE, CHAR, WORD, INT, DWORD, DINT, REAL.
Bei der Übertragung von Datenstrukturen (z. B. Struct) muss an den Parametern SD_i der Datentyp CHAR verwendet werden.

Du willst, so wie ich das sehe, einen Pointer in absoluter Schreibweise an SD_1 antragen. Anscheinend geht das aber nicht, da SD_1 nur VARIANT nimmt. Also die aufgeführten elementaren Datentypen oder, bei einer Struktur, den Datentyp CHAR.
Probier daoch mal aus, ob Du mit dem Byte direkt etwas wirst (DB5.DBB0).

VG

MFreiberger
 
Muss man es so verstehen, trotzdem dass für den Quell-DB optimierter Zugriff abgewählt ist, müssen die Daten in den DB nur mit die elementaren Datentypen definiert werden, oder man schreibt den Pointer als z.B. P#DB5.DBX0.0 CHAR 1 ?
In electroniker's Fall wäre auch P#DB5.DBX0.0 BOOL 1 akseptabel, weil er vermutlich in sein Quell-DB den ersten Addresse als BOOL definiert hat ?

edit: Pointer Adressierung korrigiert !
 
Zuletzt bearbeitet:
Moin JesperMP,

Muss man es so verstehen, trotzdem dass für den Quell-DB optimierter Zugriff abgewählt ist, müssen die Daten in den DB nur mit die elementaren Datentypen definiert werden, oder man schreibt den Pointer als z.B. #DB5.DBX0.0 CHAR 1 ?
In electroniker's Fall wäre auch #DB5.DBX0.0 BOOL 1 akseptabel, weil er vermutlich in sein Quell-DB den ersten Addresse als BOOL definiert hat ?

Ich weiß es nicht. Ich hätte es so verstanden, dass der Eingang SD_i keinen Pointer akzeptiert.
Die Schreibweise '#DB5.DBX0.0 CHAR 1' kenne ich auch nicht. Ich kenne nur 'P#DB5.DBX0.0 CHAR 1'

VG

MFreiberger
 
Zuviel Werbung?
-> Hier kostenlos registrieren
In den Online Hilfe zu PUT wird ein Beispiel angezeigt mit ein Pointer mit absoluten Addressierung.

Aus die Online Hilfe (für SD_1, SD_2, SD_3 und SD_4):
Pointers to the areas on the local CPU which contain the data to be sent.Only the data types BOOL, BYTE, CHAR, WORD, INT, DWORD, DINT, REAL are permitted.
When transferring data structures (e.g., Struct) the data type CHAR must be used at the SD_i parameters.

edit: In mein vorigen Antwort hatte ich den "P" vergessen !
Es muss meines Wissen P#DB5DBX0.0 CHAR 1 oder P#DB5DBX0.0 BOOL 1 heissen.
 
Zuletzt bearbeitet:
Gesendet werden soll aus DB5, am FB habe ich am Eingang SD_i P#DB5.DBX0.0 BYTE 1 eingegeben, da ich vorerst nur ein bit testweise übertragen, wäre 1 Byte Datenlänge ausreichend ?
Am Eingang Addr_i habe ich P#DB10.DBX0.0 BYTE 1 angegeben (DB 10 in Empfangs-CPU).
Ist Dein DB5 online auch mindestens 1 Byte groß? Oder ist da nur das eine Bit an DBX0.0 deklariert?
Ist Dein DB10 in der Ziel-SPS auch mindestens 1 Byte groß?

Tip1: Schreibe an SD_i das Bit (die Variable) symbolisch.

Ein einzelnes Bit übertragen ist nicht ökonomisch/effizient - mit dem selben Aufwand kann man auch 16 Bit übertragen.
Tip2: erstelle im DB5 eine Struktur aus 16 Bit oder 1 Word und übertrage alle 16 Bit, auch wenn Du vorerst nur 1 Bit Nutzdaten haben willst.

Harald
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Zuvor allen vielen Dank für die Hinweise. Kleiner Anfängerfehler mit lästiger Wirkung. Die am Eingang SD_i angegebene Datengröße muss auch mit der im zu übertragenen DB enthaltenen Anzahl an Bits, Bytes usw. übereinstimmen. Die Übertragung funktioniert jetzt.

VG
 
Eigentlich war das Problem das Fehler Code 4 fünf unterschiedliche Ursachen haben kann.
Warum generiert der PUT Befehl nicht fünf eigenständige Fehlercodes ?
Das hätten die Fehlersuche abkürzen können.
 
Die am Eingang SD_i angegebene Datengröße muss auch mit der im zu übertragenen DB enthaltenen Anzahl an Bits, Bytes usw. übereinstimmen.
Das stimmt so nicht. In einem DB können hunderte Bits, Bytes, usw. enthalten sein und man kann trotzdem nur 1 Bit übertragen. ABER NICHT umgekehrt: der DB enthält nur ein Bit, man will aber 1 Byte = 8 Bit übertragen - das kann natürlich nicht gehen.
Wenn man die zu übertragende Variable (Bit, Byte, Struct, ...) an SD_i symbolisch angibt, dann passiert dieser Fehler nicht.

Harald
 
Zurück
Oben