SPS absturz nach Pointer dereferenzierung

schmokie
2012-08-24
2024-01-31
  • schmokie - 2012-08-24

    Hallo,

    unsere Wago 750-841 sendet bei Sensor- oder anderen Fehlern eine E-Mail an eine im Programm hinterlegte Adresse. Damit nicht immer das Programm neu aufgespielt werden muss wenn sich die Adresse ändert wollte ich dem Nutzer die Möglichkeit bieten die Adresse über das vorhandene Touch-Panel zu ändern. Dieses ist per Modebus an die SPS angeschlossen. Die Verbindung innerhalb des Programms erfolgt über den TERMINAL_MODBUSSLAVE_RTU (FB).
    Zunächst habe ich die E-Mailadressen deklariert:

    E_Mail_Adressen : ARRAY[0..3] OF STRING(32) ;         (* Beinhaltet die E-Mailadressen für den Versand der Fehler E-Mails*)
    

    Da über den TERMINAL_MODBUSSLAVE_RTU nur WORD Daten übertragen werden können wollte ich den String über einen Pointer zerlegen.

    ascii_word:POINTER TO ARRAY[0..14] OF WORD;
    
    (*Ãœbertragen der E-Mailadressen*)
       IF SerData[203].11 = TRUE THEN
          FOR i:=0 TO 3 DO
             ascii_word := ADR(E_Mail_Adressen[i]);
             FOR k:=0 TO 14 DO
                SerData[36+14*i+k] := ascii_word^[k];  (*Hier Stürzt die SPS ab*)
             END_FOR
          END_FOR
          SerData[203].11 := FALSE;
       END_IF
    

    Es klappt bis an die Stelle, an der ich den Pointer dereferenzieren möchte. An dieser Stelle stürzt die SPS ab und die LEDs blicken rot.

    Das Problem tritt allerdings nur dann auf, wenn ich auf ein Arrayelement des Pointers zugreifen möchte. Es geht wenn ich den kompletten Inhalt verschiebe:

    test:ARRAY[0..14] OF WORD;
    test := ascii_word^;
    

    Deshalb vermute ich, das ich beim dereferenzieren etwas falsch mache. Ich habe nur keine Ahnung was.

    Ich hoffe das mir jemand weiterhelfen kann.

     
  • Erik Böhm - 2012-08-27

    Mahlzeit

    Bei mir funktioniert das einwandfrei. Sowohl in der Simulation als auch auf der RTE.
    Einen Wago Koppler hab ich grad nicht.

    Bei der Berechnung [36+14*i+k] beachtest du schon Punkt vor Strich ?
    Sonst könnte das Array evtl. überschrieben werden.

    Gruß
    Erik

    IMG: PointerTest.png

     
  • schmokie - 2012-09-07

    Hi,

    hat leider etwas länger gedauert, hab nun aber endlich mal wieder die Zeitgefunden weiter zu machen. Danke für die Antwort Erik Böhm.
    Was genau das Problem ist weis ich bis lang leider immer noch nicht. Habe es auch ohne Variablen bei der Indizierung versucht also

    SerData[1] := ascii_word^[1]
    

    aber auch dann stürzt die SPS ab. Ich hab es jetzt einfach anders gelöst. Da es funktioniert hat wenn ich nicht auf die Arrayelemente des Pointers zugegriffen habe, habe ich den Pointer einfach auf die Zieladresse gelegt und die Daten in den Pointer geschrieben.

       ascii_ptr:POINTER TO STRING(32);
       i: INT := 0;      (*Schleifenzählvariable*)
       k: INT := 0;      (*Schleifenzähl-Konstante*)
    (*Ãœbertragen der E-Mailadressen*)
       IF SerData[203].11 = TRUE THEN
          FOR i:=0 TO 3 DO
             ascii_ptr := ADR(SerData[36+15*i]);
             ascii_ptr^:=E_Mail_Adressen[i];
          END_FOR
          SerData[203].11 := FALSE;
       END_IF
    

    Geht jetzt wunderbar. Mich würde allerdings immer noch interessieren warum die SPS abstürzt sobald ich auf Elemente des Arrays, auf das der Pointer zeigt, zugreifen möchte. Falls jemand noch eine Idee hat würde ich mich freuen wenn er diese hier reinschreibt.

    Gruß

    Tobias

     

Log in to post a comment.