Hallo,
in der Lehrwerkstatt haben wir uns ein wenig mit der S7-200 beschäftigt. Wir programmieren nur in FUP. Dabei habe ich folgende Probleme mit der Variabelübergabe von OB1 an Unterprogramm (SBR1):
Ich möchte meine Unterprogramm flexibel halten, so dass man es problemlos in andere Programme einfügen kann. Deshalb sollen globale Variablen nicht direkt verändert werden, sondern über ein Eingang übergeben. Also alle globalen Variablen, die im Unterprogramm verändert werden, sollen im OB1 and SBR1 übergeben werden. Für Bytes funktioniert das mit Pointer ganz gut. Allerdings nicht für Bits! So musste ich ziemlich aufwendig programmieren.
Beispiel: Das Bit A0.5 soll in einem Unterprogram gesetzt, bzw. rückgesetzt werden. Ich habe keinen anderen Weg gefunden als gleich zwei Werte an das Unterprogramm zu übergeben: Die Adresse von AB0 (&AB0) und das Bit (hier 5).
Um jetzt A0.5 zu setzen, habe ich in einer Hilfsvariable (byte) eine 2#00000001 übertragen und um die übergebenen Stellen (hier im Beispiel 5) nach links geschoben (SHL_B). Dann habe ich die Hilfvariable mit dem lokalen Pointer auf AB0 (z.B. *LD0) ODER verknüpft um den Ausgang zu setzen (Ergebnis direkt wieder nach *LD0 = AB0).
Rücksetzen ist nach meiner Methode noch aufwendiger: Ich schiebe wieder Bit-Stellen eine 2#00000001 und invertiere das Byte anschließend. Zuletzt verknüpfe ich das invertierte Byte mit dem AB0-Pointer UND, so dass A0.5 zurückgesetzt wird.
Gibt es da eine einfachere Methode? Kann ich nicht irgendwie z.B. A0.5 an ein Unterprogramm übergeben, so dass ich direkt mit A0.5 weiterarbeiten kann?
Noch komplizierter mache ich es, wenn der Status von Bits im Unterprogramm ausgelesen werden sollen, um ein Netzwerk zu triggern (meist an EN-Eingang von Bausteinen). Beispiel: Je nachdem ob A0.5 gesetzt ist, soll eine Aktion im Unterprogramm ausgeführt werden.
Wieder muss ich beide Werte (Pointer auf AB0 und Bitnummer) übergeben. Wieder eine Byte-Hilfsvariable mit 1 um Bitnummer Stellen schieben. Diese verknüpfe ich dann logisch UND mit dem Inhalt von AB0 (wo der Pointer drauf zeigt) und lege das Ergebnis wieder in der Hilfsvariable. Nun prüfe ich ob das Byte der Hilfsvariable 0 oder NICHT-0 ist (mit dem =B-Baustein, eventuell kann man nach der UND-Verknüpfung auch direkt ein Zero-Flag aus dem Sondermerkern auswerten?). Hiermit triggere ich dann die eigentliche Aktion.
Geht das nicht alles irgendwie auch einfacher? Ansonsten machen Unterprogramme ja wenig Sinn, wenn man die globalen Variablen fest einprogrammiert. Ich will ein Unterprogramm ja schließlich mehrfach für unterschiedliche Variablen verwenden.
TIA,
Dominik
in der Lehrwerkstatt haben wir uns ein wenig mit der S7-200 beschäftigt. Wir programmieren nur in FUP. Dabei habe ich folgende Probleme mit der Variabelübergabe von OB1 an Unterprogramm (SBR1):
Ich möchte meine Unterprogramm flexibel halten, so dass man es problemlos in andere Programme einfügen kann. Deshalb sollen globale Variablen nicht direkt verändert werden, sondern über ein Eingang übergeben. Also alle globalen Variablen, die im Unterprogramm verändert werden, sollen im OB1 and SBR1 übergeben werden. Für Bytes funktioniert das mit Pointer ganz gut. Allerdings nicht für Bits! So musste ich ziemlich aufwendig programmieren.
Beispiel: Das Bit A0.5 soll in einem Unterprogram gesetzt, bzw. rückgesetzt werden. Ich habe keinen anderen Weg gefunden als gleich zwei Werte an das Unterprogramm zu übergeben: Die Adresse von AB0 (&AB0) und das Bit (hier 5).
Um jetzt A0.5 zu setzen, habe ich in einer Hilfsvariable (byte) eine 2#00000001 übertragen und um die übergebenen Stellen (hier im Beispiel 5) nach links geschoben (SHL_B). Dann habe ich die Hilfvariable mit dem lokalen Pointer auf AB0 (z.B. *LD0) ODER verknüpft um den Ausgang zu setzen (Ergebnis direkt wieder nach *LD0 = AB0).
Rücksetzen ist nach meiner Methode noch aufwendiger: Ich schiebe wieder Bit-Stellen eine 2#00000001 und invertiere das Byte anschließend. Zuletzt verknüpfe ich das invertierte Byte mit dem AB0-Pointer UND, so dass A0.5 zurückgesetzt wird.
Gibt es da eine einfachere Methode? Kann ich nicht irgendwie z.B. A0.5 an ein Unterprogramm übergeben, so dass ich direkt mit A0.5 weiterarbeiten kann?
Noch komplizierter mache ich es, wenn der Status von Bits im Unterprogramm ausgelesen werden sollen, um ein Netzwerk zu triggern (meist an EN-Eingang von Bausteinen). Beispiel: Je nachdem ob A0.5 gesetzt ist, soll eine Aktion im Unterprogramm ausgeführt werden.
Wieder muss ich beide Werte (Pointer auf AB0 und Bitnummer) übergeben. Wieder eine Byte-Hilfsvariable mit 1 um Bitnummer Stellen schieben. Diese verknüpfe ich dann logisch UND mit dem Inhalt von AB0 (wo der Pointer drauf zeigt) und lege das Ergebnis wieder in der Hilfsvariable. Nun prüfe ich ob das Byte der Hilfsvariable 0 oder NICHT-0 ist (mit dem =B-Baustein, eventuell kann man nach der UND-Verknüpfung auch direkt ein Zero-Flag aus dem Sondermerkern auswerten?). Hiermit triggere ich dann die eigentliche Aktion.
Geht das nicht alles irgendwie auch einfacher? Ansonsten machen Unterprogramme ja wenig Sinn, wenn man die globalen Variablen fest einprogrammiert. Ich will ein Unterprogramm ja schließlich mehrfach für unterschiedliche Variablen verwenden.
TIA,
Dominik