Liebe Leute, ich habe ein lustiges kleines Problem mit einer Phoenix-Kleinsteuerung ILC 130 ETH unter PCWORX 5.20 (SP 4.45).
Dort habe ich den OSCAT(3v32)-PID-Regler CTRL_PID genutzt (übrigens ein Klasse-Teil!) und mich gewundert, warum er nicht funktioniert. Der Output liefert konsequent 0.0. Weitere Forschungen ergaben, dass die (dort verwendete) Funktion DEAD_ZONE Quelle des Übels ist. Sie spuckt ebenfalls Null aus, egal welche Parameter man ihr übergibt. Da tut sie auch, wenn man sie isoliert einfach im Hauptprogramm aufruft, z.B. ist hier DzOut immer 0.0 statt 2.0:
DzOut := DEAD_ZONE (DzIn, DzLim) mit den Vorbesetzungen DzIn := 2.0; DzLim := 0.1; oder beliebigen anderen Werten.
Der Blick in den Code von DEAD_ZONE zeigt, dass dort mittels ABS() ein Absolutwert berechnet wird. ABS() liefert jedoch immer 0.0, wenn ABS() innerhalb von DEAD_ZONE aufgrufen wird. ABS() funktioniert jedoch, wenn ABS() im Hauptprogramm direkt (also nicht innerhalb einer OSCAT-Bibliotheksfunktion) aufgerufen wird.
Wenn man den (überschaubaren) ST-Code von DEAD_ZONE modifiziert und die ABS()-Funktion dort entfernt bzw. durch funktionsgleiche if-Konstrukte ersetzt, funktioniert alles. Aber das kann's nicht sein.
Schreibt man das gleiche Programm für ein anderes Phonenix-Zielsystem, für das eine PC-Simulation möglich ist (bei der ILC130 gibt's dämlicherweise keine Simu-Möglichkeit), so funktioniert alles (auch mit ABS()) wunderbar.
AÄhhh - ich bin nicht gerade ein Anfänger (wohl schon bei PCWORX), aber dazu fällt mir nix ein... vielleicht hat jemand von euch eine Idee? Demo-Projekt (obiger Dreizeiler) kann zur Verfügung gestellt werden, aber man braucht halt eine ILC130, um das auszuprobieren. Vielen Dank vorab für eure Hilfe.