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.