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]OFSTRING(32);      (*BeinhaltetdieE-MailadressenfürdenVersandderFehlerE-Mails*)
Da über den TERMINAL_MODBUSSLAVE_RTU nur WORD Daten übertragen werden können wollte ich den String über einen Pointer zerlegen.
ascii_word:POINTERTOARRAY[0..14]OFWORD;
(*Übertragen der E-Mailadressen*)  IFSerData[203].11=TRUETHEN    FORi:=0TO3DO      ascii_word:=ADR(E_Mail_Adressen[i]);      FORk:=0TO14DO        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]OFWORD;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.
If you would like to refer to this comment somewhere else in this project, copy and paste the following link:
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:POINTERTOSTRING(32);
  i: INT :=0;    (*Schleifenzählvariable*)
  k: INT :=0;    (*Schleifenzähl-Konstante*)(*ÜbertragenderE-Mailadressen*)
  IFSerData[203].11=TRUETHEN
    FORi:=0TO3DO
      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
If you would like to refer to this comment somewhere else in this project, copy and paste the following link:
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:
Da über den TERMINAL_MODBUSSLAVE_RTU nur WORD Daten übertragen werden können wollte ich den String über einen Pointer zerlegen.
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:
Deshalb vermute ich, das ich beim dereferenzieren etwas falsch mache. Ich habe nur keine Ahnung was.
Ich hoffe das mir jemand weiterhelfen kann.
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
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
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.
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