TIA modulo liefert falsches Ergebnis (V16)

MFreiberger

Level-3
Beiträge
3.343
Reaktionspunkte
955
Zuviel Werbung?
-> Hier kostenlos registrieren
Moin Zusammen,

beim Modulorechnen im TIA-Portal (V16) musste ich erkennen, dass die modulo-Funktion im TIA FALSCH RECHNET!!!

Solange ich positive Zahlen modulo Divisor rechne ist alles gut. Aber bei negativen Zahlen kommt was falsches raus.

Beispiel:
-12 mod 5 = 3
DENN:
-12/5 = -2,4
-3*5 = -15
-12-(-15) = 3
ABER TIA macht daraus:
-12 mod 5 = -2

Eigentlich darf bei einer modulo-rechnung kein negativer Wert rauskommen!

Darauf gestossen bin ich, als ich einen Index dekrementieren und mit modulo den Rest berechnen wollte.
Ich war davon ausgegangen, dass
-1 mod 5 = 4 (was es ja auch sein sollte, damit ich in positiver UND negativer Richtung 0,1,2,3,4,0,1,2,3,4,0,1,2,... habe)
TIA macht:
-1 mod 5 = -1 (sind die doof???
=> poisitv 0,1,2,3,4,0,1,2,3,4,0,1,2,...
=> negativ 4,3,2,1,0,-1 !!!!????)

Wie behebe ich das Problem denn jetzt möglichst elegant?

VG

MFreiberger
 
Hast du mal versucht, den mod 5 -Wert, also die 5 am Ende draufzuaddieren?
Mit deinen vorhandenen Zahlen wäre das korrekt, aber geht das immer?
Also wenn Ergebnis der Modulo-Rechnung negativ, dann 5 addieren bei mod 5.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Eigentlich darf bei einer modulo-rechnung kein negativer Wert rauskommen!
Unabhängig vom eigentlichen Problem, hier mal eine Info aus dem Handbuch TIA V15.1 ( AWL MOD ):
Nach der Ausführung der Anweisung zeigen die Statusbits A0 und A1 an, ob der Divisionsrest negativ, Null oder positiv ist. Wenn das Ergebnis außerhalb des zulässigen Zahlenbereichs liegt, werden die Statusbits OV und OS auf "1" gesetzt.
 
Unabhängig vom eigentlichen Problem, hier mal eine Info aus dem Handbuch TIA V15.1 ( AWL MOD ):
Ok, ich habe dummerweise mit Excel geprüft und dann unter Wiki nachgelesen.
War falsch, ich muss natürlich im S-Universum verbleiben 🙄.

@Ralle: eine Prüfung auf negative Werte ist natürlich möglich und der „letzte Ausweg“, aber ich hoffe auf eine elegantere Möglichkeit in einer Formel.

Nachtrag: Wir nutzen kein AWL, sondern SCL…

VG

Mario
 
Ich habe gerade mal nachgesehen (weil mir das irgendwie bekannt vorkam) - ich habe tatsächlich in meinen Baustein, in denen ich MOD einsetze, IMMER den größt möglichen Wert aufaddiert um eben keinen negativen Eingangswert zu bekommen ... Solltest du vielleicht doch überlegen ...
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Solange ich positive Zahlen modulo Divisor rechne ist alles gut. Aber bei negativen Zahlen kommt was falsches raus.
Das ist doch aber "schon immer" so, da war TIA noch nicht mal in der Welt.
Das ist kein Fehler sondern ein Feature, und ist glaube ich auch so dokumentiert.
Das Problem löse ich auch so, daß ich vor dem MOD den MOD-Wert einmal hinzuaddiere, wenn die Möglichkeit besteht daß der Eingangswert negativ werden kann.

Harald
 
Ich habe gerade mal nachgesehen (weil mir das irgendwie bekannt vorkam) - ich habe tatsächlich in meinen Baustein, in denen ich MOD einsetze, IMMER den größt möglichen Wert aufaddiert um eben keinen negativen Eingangswert zu bekommen ... Solltest du vielleicht doch überlegen ...
Hm, ein Feature, dass etwas in der S-Welt anders funktioniert, als im Rest der Welt?
 
Das ist doch aber "schon immer" so, da war TIA noch nicht mal in der Welt.
Das ist kein Fehler sondern ein Feature, und ist glaube ich auch so dokumentiert.
Das Problem löse ich auch so, daß ich vor dem MOD den MOD-Wert einmal hinzuaddiere, wenn die Möglichkeit besteht daß der Eingangswert negativ werden kann.

Harald
Danke Harald,

da hätte ich selber drauf kommen können. Manchmal kommt man nicht auf das Naheliegendste...

VG

Mario
 
Habe das ganze nicht ganz nachvolliehen können. Aber wäre es nicht möglich den Eingangswert Absolut in die MOD Funktion zu bringen
Code:
X:= ABS(Einganswert) Mod Y
 
Das ist doch aber "schon immer" so, da war TIA noch nicht mal in der Welt.
Das ist kein Fehler sondern ein Feature, und ist glaube ich auch so dokumentiert.
Das Problem löse ich auch so, daß ich vor dem MOD den MOD-Wert einmal hinzuaddiere, wenn die Möglichkeit besteht daß der Eingangswert negativ werden kann.
Ich hab da schon in S7 Classic immer ein ABS drangehängt.
Code:
modulchen := ABS(zahl MOD divisor);
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Code:
modulchen := ABS(zahl MOD divisor);
Ist leider Falsch: da
12 mod 5 = 2 aber
-12 mod 5 =3 ist

Siemens macht das schon Mathematisch stringgent richtig. Der Rest der Welt machts aber anders.
Abhilfe schaft, wie weiter oben bereits gesagt, bei negativem Ergebnis das Modulo addieren.
 
Zuletzt bearbeitet:
Nein nein,
im Rest der Welt funktioniert es anders als bei Siemens ;)
Nicht ganz, hier sind sich Siemens und Codesys mal einig.
Ich addiere auch oft vor dem MOD den MOD-Wert hinzu. Reicht aber nur, wenn der Eingangswert nur um max . 1 Mod-Wert ins Negative rutschen kann. Im Beispiel des TE ist es aber mehr. Da muss man schon (Eingangswert MOD MOD-Wert + MOD-Wert) MOD MOD-Wert rechnen, um unabhängig vom Vorzeichen stets das richtige Ergebnis zu erhalten.
 
Wikipedia sagt dazu ja auch schon:
Neben dieser „mathematischen Variante“ wird oft auch eine ähnliche Funktion als Modulo bezeichnet, die für negative Argumente unterschiedliche Ergebnisse liefert und „symmetrische Variante“ genannt wird:

In Programmiersprachen ist die implementierte Variante nicht einheitlich. So verwenden Ruby, Perl, Python, Excel und der Rechner der Googlesuche die mathematische Variante, wohingegen C, Java, JavaScript und PHP die symmetrische einsetzen, was besonders wichtig bei Portierungen ist.

Also kommt halt drauf an, was man eigentlich machen will...
 
Zurück
Oben