# Fehler: Laufzeit-Ausnahmefehler! Division durch Null



## Aiman (13 Februar 2020)

Hallo,

ich hab ein mal das Projekt geladen an der Steuerung ILC 151 ETH, und ging alles gut

aber irgendwie zeigt mir jetzt ein Fehler *( Fehler: Laufzeit-Ausnahmefehler! Division durch Null ) *beim Senden und wird immer die Steuerung jetzt auf Stop gezeigt.

könnte mir jemand bitte Sagen was dieser Fehler ist und wie man beheben kann ??


Danke


----------



## Fireman_Frank (13 Februar 2020)

Die Fehlermeldung ist doch eigentlich selbsterklärend?


----------



## Aiman (13 Februar 2020)

aber ich weiß nicht wie man dieser Fehler beheben kann


----------



## MFreiberger (13 Februar 2020)

Moin Aiman,

das kann ja nur passieren, wenn man eine Division hat, bei der der Divisor 0 ist. Da man das ja so eigentlich nicht mit einer festen 0 programmiert cool, ist von einer Variablen auszugehen, die den Wert 0 annehmen kann. Man muss abfangen, das der Wert der Variablen 0 ist, wenn die Division durchgeführt werden soll.
Durchsuch mal Dein Programm nach allen Stellen, wo dividiert wird. Dann jeweils prüfen, ob die Möglichkeit besteht, dass der Divisor 0 sein kann.

VG

MFreiberger


----------



## PN/DP (13 Februar 2020)

Gehe zu der Programmstelle wo der Fehler auftritt, und sorge dafür daß der Divisor nicht mehr 0 ist, besser: nie mehr 0 werden kann.
Vermutlich ist an der Stelle eine Variable (z.B. Einstellwert) verwendet, deren Wert durch das Programm laden mit 0 initialisiert wurde.

Wenn Du magst dann zeige uns mal die Programmstelle.

Harald


----------



## Aiman (13 Februar 2020)

ich hab die ganze zeit gesucht aber ich finde nur diese stelle wo dividiert wird
bitte sieehe die Bilder


----------



## PN/DP (13 Februar 2020)

Das erste und dritte Bild sind jeweils unkritisch.

Das zweite Bild: wenn ME = MA dann kommt es zur Division durch 0 !

Möglicherweise kann man die Formel auch so umformen, daß sie ohne Division auskommt?

Harald


----------



## Aiman (13 Februar 2020)

danke dir Harald für deine Hilfe

ich weiß nicht ob man umformen kann 

also davor gibt es ein Real-Max baustein und sie nimmt die maxmale werte ( im Breich von 30 bis 100) siehe bild bitte


----------



## Heinileini (13 Februar 2020)

Aiman schrieb:


> ich hab die ganze zeit gesucht aber ich finde nur diese stelle wo dividiert wird


Der Vollständigkeit halber: hast Du auch nach dem Operator MOD gesucht?


----------



## PN/DP (13 Februar 2020)

Ich kenne die ILC 151 ETH nicht - sagt die nicht genauer, wo der Fehler "Division durch 0" passiert? Kann man nicht zur Fehlerstelle springen?
Wird der AOUT0_20 Baustein mehrmals aufgerufen? Ist bei einem Aufruf ME oder MA mit einer Variable beschaltet?

Harald


----------



## DeltaMikeAir (13 Februar 2020)

PN/DP schrieb:


> Ich kenne die ILC 151 ETH nicht - sagt die nicht genauer, wo der Fehler "Division durch 0" passiert? Kann man nicht zur Fehlerstelle springen?
> Wird der AOUT0_20 Baustein mehrmals aufgerufen? Ist bei einem Aufruf ME oder MA mit einer Variable beschaltet?
> 
> Harald



Nicht unbedingt. Ich habe mal erlebt, wie sich ein Programmierer einen Wolf gesucht hat mit diesem Fehler ( TwinCat 2 mit Visu ).
Ständig kam an der Visu die Meldung "ausgeloggt" SPS-Programm war in Stop und es gab keinen Hinweis wo die Division /0 aufgetreten ist.

Evtl. geht es mit TC3


----------



## Onkel Dagobert (13 Februar 2020)

Aiman schrieb:


> .. siehe bild bitte
> 
> 
> 
> ...


Auf dem Bild sind MA und ME mit Konstanten beschaltet. Das kann die Fehlerstelle nicht sein.


----------



## Heinileini (13 Februar 2020)

PN/DP schrieb:


> ... sagt die nicht genauer, wo der Fehler "Division durch 0" passiert? ...


Wie genau ist überhaupt die Aussage "Division durch 0"? Vermutlich zu weit hergeholt, aber könnte das evtl. eine "SammelMeldung" auch für "ähnliche" Fälle sein, wie Logarithmus von 0 oder QuadratWurzel aus negativer Zahl?


----------



## Aiman (14 Februar 2020)

Hallo Harald,

*sagt die nicht genauer, wo der Fehler "Division durch 0" passiert?*
leider nicht 

*Kann man nicht zur Fehlerstelle springen?*
kann die Steuerung starten nur wenn der Fehler behoben wurde

*Wird der AOUT0_20 Baustein mehrmals aufgerufen?
*Ja wird schon

*Ist bei einem Aufruf ME oder MA mit einer Variable beschaltet?
*Ja einmal den Druck und ein Mal den Drehzahl, siehe bild


----------



## Fireman_Frank (14 Februar 2020)

Kann bei der Drehzahl die Variable mScal_Drehzahl 0 sein/werden?


----------



## PN/DP (14 Februar 2020)

Aiman schrieb:


> *Ist bei einem Aufruf ME oder MA mit einer Variable beschaltet?
> *Ja einmal den Druck und ein Mal den Drehzahl, siehe bild
> [/COLOR]
> 
> ...


Schau mal beim oberen Aufruf wie der Wert von mScal_Drehzahl gebildet wird, und sorge dafür daß der nicht 0.0 sein kann. Ist der Wert gerade 0.0? Warum?
Besser wäre noch, wenn in dem Baustein AOUT0_20 generell eine Reaktion programmiert wäre für den Fall daß ME = MA bzw. daß (ME-MA) = 0 ergibt.

Harald


----------



## Aiman (14 Februar 2020)

nein diese variable ist mit Vorgabe an der VISU  mit 2900.0 eingegeben


----------



## PN/DP (14 Februar 2020)

PN/DP schrieb:


> Besser wäre noch, wenn in dem Baustein AOUT0_20 generell eine Reaktion programmiert wäre für den Fall daß ME = MA bzw. daß (ME-MA) = 0 ergibt.


Ändere mal in AOUT0_20 die letzte Zeile 7 wie nachfolgend - verschwindet der "Division durch 0"-Fehler dann?

```
IF (ME-MA) = 0.0 THEN
   AOUT := 0; 
ELSE 
   AOUT := REAL_TO_WORD(LIMIT_REAL(0.0, ((INP-MA)*AUFL)/(ME-MA) ,AUFL));
END_IF;
```

Wo ich gerade beim Programmverbessern dabei bin: die Werte für die Auflösung des Analogausgangs sind für mich ziemlich ungewöhnlich - Sind das schnell hingetippselte Ungefähr-Werte oder sind die korrekt so? Welche Werte stehen im Gerätehandbuch der Analogausgangs-Hardware?

```
IF IL THEN
   AUFL := [COLOR="#FF0000"]65520.0[/COLOR];
   ELSE
   AUFL := [COLOR="#FF0000"]32760.0[/COLOR];
END_IF;
```

Harald


----------



## Aiman (14 Februar 2020)

Hallo Harald,

die werte ja sind für Skalierung korrekt, und ich hab das Programmcode wie du beschrieben hast aber leider immer das gleiche Fehler

Danke danke für deine Hilfe


----------



## PN/DP (14 Februar 2020)

Dann suche weiter nach weiteren Stellen wo dividiert wird.
Vielleicht kann auch der Support von Phoenix Contact helfen bzw. Tipps geben, wie man die Fehlerstelle findet. Ruf da mal an:

PHOENIX CONTACT Deutschland GmbH
Hotline: 05281-946-2888
automation-service@phoenixcontact.com
www.phoenixcontact.de

Harald


----------



## ralfh02 (14 Februar 2020)

Hallo Aimann,
klappt es bei dir nicht im "Meldefenster" Tab "SPS-Fehler" die Fehlermeldung "Divison durch 0" mit der rechten Maustaste anklicken und "Gehe zu Fehler" klicken?
Bei mir hat das eigentlich immer funktioniert.
Gruß Geralf


----------



## Aiman (14 Februar 2020)

Hallo Geralf,

leider bei mir ist diese Funktion ausgeblendet, siehe bitte das Bild

Gruß


----------



## Onkel Dagobert (14 Februar 2020)

Hallo Aimann,

allgemein bei solchen Programmfehlern, die man mit Diagnosemitteln nicht finden kann, kann man z.Bsp. ein "BE" in den Code einfügen oder auch Bausteinaufrufe auskommentieren, und dadurch die Fehlerstelle eingrenzen.

​


----------



## Aiman (14 Februar 2020)

Danke euch alle für die nette ausreichende Hilfe, ich endlich den fehler behoben wo ich einfach ein Code geschrieben:


RESULT := Continue(True)


----------



## PN/DP (15 Februar 2020)

Aiman schrieb:


> ich endlich den fehler behoben wo ich einfach ein Code geschrieben:
> 
> 
> RESULT := Continue(True)


Das ist jetzt total unbefriedigend, eine Lösung so ganz ohne einleuchtende Erklärung :sad:

Wie sah der Code vorher aus, wieso hat der eine "Division durch 0" verursacht?

Wie hast Du den Problem-Code gefunden? Weil es Code war, den Du kurz vorher selber programmiert hattest, oder war der schon vorher drin?

Harald


----------



## ralfh02 (16 Februar 2020)

Moin , 
ich denke mal der Code : "RESULT := Continue(True)" steht in einem POE der durch einen Systemtask aufgerufen wird um den CPU-Stop bei "Division durch 0" zu unterbinden.
Somit ist der eigentliche Programmfehler nicht beseitigt. Aber vielleicht ist jetzt im Fenster "SPS Fehler" die Funktion " Gehe zu" aktiv....... und man findet die Stelle.
Schönen Sonntag


----------



## Aiman (16 Februar 2020)

Der Fehler entstanden, weil ich den code for die AI0-20, zuweit zuholen geschrieben habe, deswegen kann das Programm nicht so weit lesen


----------



## Heinileini (16 Februar 2020)

Aiman schrieb:


> Der Fehler entstanden, weil ich den code for die AI0-20, zuweit zuholen geschrieben habe, deswegen kann das Programm nicht so weit lesen


 . . . . . .


----------

