Fallstricke bei der Verwendung der Traceanalyse¶
Signale mit unterschiedlichen Zeitachsen
Werden Signale mit unterschiedlichen Zeitachsen in einem Ausdruck verwendet, wird dieser zu jedem Zeitpunkt, zu dem mindestens ein Signal einen Wert hat ausgewertet. Von Signalen, die zum betreffenden Zeitpunkt gerade keinen Wert haben wird der Hold-Wert verwendet. Wenn die Signale am Traceanfang zu unterschiedlichen Zeitpunkten starten, gibt es jedoch noch keinen Hold-Wert für alle Signale. Deshalb werden Ausdrücke erst ab dem Zeitpunkt des am spätesten beginnenden Signals ausgewertet.
Weiterhin kann die Verwendung von Funktionen den Zeitpunkt der ersten Auswertung beeinflussen. Wenn eine Funktion bspw. erst ab dem zweiten Signalwert ausgewertet werden kann, kann der Ausdruck erst ab dem zweiten Wert des betreffenden Signals erstmalig ausgewertet werden. Andererseits kann die Funktion HasValue bspw. ausgewertet werden, wenn das Signal (noch) keine Werte hat.
Arithmetischer Überlauf
Abhängig vom Datentyp eines Signals kann es zu einem arithmetischen Überlauf kommen. Insbesondere
bei kleinen oder vorzeichenlosen (unsigned) Datentypen (z.B. uint8) kann diese Situation schnell
auftreten. Bspw. führt der Ausdruck Signal - 1 in einem Berechnungsschritt zu einem
Überlauf, wenn das Signal vom Typ uint8 den Wert 0 hat. Man erhält dann nicht -1 sondern 255 als
Ergebnis. Ebenso kommt es zu einem Überlauf, wenn man 1 zu einem Signal vom Typ uint8 addiert,
wenn das Signal den Wert 255 aufweist. Man erhält dann nicht 256, sondern 0.
Man kann Überläufe vermeiden, indem man einen Operanden in einen Typ umwandelt, der das eigentliche
Ergebnis abbilden kann; im Beispiel also float(Signal) - 1 oder Signal - 1.0.
Traceanfang und Traceende
Traceanfang und Traceende werden durch alle in einer Episode verwendeten Signale bestimmt. Somit hängt auch die Länge eines Triggerbereiches, der erst am Ende des Traces stoppt, von den in der Episode verwendeten Signalen ab.
Wenn in einem Traceschritt eine Funktion verwendet wird, die von Traceanfang bzw. Traceende abhängig ist, dann wird der Traceschritt von anderen Traceschritten der Episode beeinflusst. So wird die Value-Funktion bspw. nur für Zeitpunkte ausgewertet, für die der mit deltaT errechnete Zeitpunkt vor dem Traceende liegt.
Logische Operatoren in Ausdrücken von Berechnungsschritten und Triggerblöcken
Auch wenn die Ausdrücke in Python-Syntax anzugeben sind, erfolgt die Auswertung durch einen eigenen
Interpreter, der ein abweichendes Verhalten bei der Auswertung logischer Operatoren aufweist:
Es werden stets beide Seiten des Ausdrucks ausgewertet. Dies führt beispielsweise bei dem Ausdruck
Signal != 0 and 1 / Signal < 3 dazu, dass selbst wenn der der Teilausdruck Signal != 0 eine
Nullstelle erkennt, auch 1 / Signal < 3 ausgewertet wird und dann einen ZeroDivisionError
liefert.