-> Hier kostenlos registrieren
Hallöchen,
lese interessehalber schon länger bei euch im Forum mit. Doch da ich jetzt selber mal eine SPS-Steuerung (mit TwinCAT PLC also SoftSPS) programmieren darf/muss und auf dem Gebiet noch keine Erfahrung habe, sind mir da einige allgemeine Fragen in den Sinn gekommen.
Erstmal zu mir: Ich bin Informatiker und programmiere schon sehr lange in allen möglichen Sprachen, eben das was am besten passt. Das ist also nicht das Problem bzw. vermutlich doch, denn ich bin objektorientiertes Denken gewöhnt. Von den Segnungen der modernen Hochsprachen findet man im SPS-Gebiet aber leider nicht viel. Jedenfalls empfinde ich das alles als sehr gewöhnungsbedürftig. Und wenn ich AWL sehe fange ich recht schnell an nach Handschellen und Peitsche zu suchen. ;-) Dagegen ist x86 Assembler ja schon ne richtige Hochsprache.
OK genug Balbla, hier mal meine Fragen/Verständnisprobleme, oder wie im Titel geschieben: Was sollte man wie machen bzw. was kann man, aber sollte man auf keinen Fall machen?
1. Ich schreibe gerade einen FB zu Ansteuerung eines Motorventils. Es gibt an EAs die Endschalter AUF und ZU (E_AUF, E_ZU), das Motor-Signal Auffahren und Zufahren (M_AUF, M_ZU) und eine aktuelle Position (ACTPOS) die über eine Poti ausgewertet wird.
Dem Baustein wird zusätzlich noch eine Soll-Position übergeben (SETPOS).
Der FB Kopf würde allgemein also so aussehen:
Ich könnte ihn aber auch so schreiben:
Dann könnte ich die Ein- und Ausgänge direkt in TwinCAT verknüpfen. Andernfalls würde ich alle direktn Ein- und Ausgänge in extra Arrays anlegen und die Werte in den Array entsprechend an den FB übergeben.
Was ist da die "richtige" Lösung?
Die 3. Möglichkeit sieht so aus:
Dann kann ich die Variablen immernoch in TwinCAT verknüpfen aber im Progamm nicht mehr von aussen zugreifen.
Wann deklariert ihr was wie wo? Wo kommen die direkten EA-Variablen hin, wenn der Baustein ein physikalisch vorhandenes Gerät repräsentiert?
Nächste Frage:
Wenn ich eine Variable in einem FB als VAR_INPUT deklariere kann ich sie ja trotzdem innerhalb des FB ändern und die geänderte Variable von aussen Abfragen, also so als wäre es ein VAR_IN_OUT. Hintergrund der Frage ist, dass ich bei obigem FB z.B. noch ein RESET-Eingang als VAR_INPUT deklarieren könnte der alle internen Variablen zurücksetzt. Diesen Eingang könnte ich dann innerhalb des FB, nachdem ich den Reset durchgeführt habe, wieder zurücksetzen.
Warum kann man das? Und "darf" man das machen, bzw. macht es Sinn?
Und noch eine Grundsätzliche Frage:
Ich muss eine Steuerung + Visualisierung am PC schreiben. Was gesteuert wird sind letztlich nur ein Haufen Ventile, der Rest ist reine Steuerungslogik, also wann welches Ventil wie weit öffnet etc.
Würdet ihr die komplette Steuerungslogik auf der SPS implementieren oder nur die Teile, die die Ventile steuern + Sicherheitsabfragen etc. und den "komplexen" Steuerungsteil, also die Logik mit in die Visualisierung packen?
Komplexe Vorgänge lassen sich nunmal wesentlich eleganter in einer objektorietierten Hochsprache implementieren, wodurch auch die Fehleranfälligkeit sinkt. Pro / Contra?
EDIT: In meinem Fall ist letzteres bereits vorhanden, also eine reine PC-Steuerung die die Ventile über exterene proprietäre Hardware ansteuert. Daher soll das jetzt per SPS gemacht werden. Die Software wird aber trotzdem komplett neu entwickelt, es spielt also fast keine Rolle, dass der Programmcode für die Logik eigentlich schon vorhanden ist.
Naja, sind vermutlich sau blöde Fragen aber wenn man im SPS-Bereich noch nichts gemacht hat ist das alles erstmal nicht so klar. Habe leider noch kein Buch "SPS für C++ Pogrammierer" o.ä. gefunden. ;-)
Danke schon mal für eure Hilfe.
Werde aber sicher noch ein paar mehr Fragen haben wenn sie mir wieder einfallen. Aller Anfang ist halt schwer.
lese interessehalber schon länger bei euch im Forum mit. Doch da ich jetzt selber mal eine SPS-Steuerung (mit TwinCAT PLC also SoftSPS) programmieren darf/muss und auf dem Gebiet noch keine Erfahrung habe, sind mir da einige allgemeine Fragen in den Sinn gekommen.
Erstmal zu mir: Ich bin Informatiker und programmiere schon sehr lange in allen möglichen Sprachen, eben das was am besten passt. Das ist also nicht das Problem bzw. vermutlich doch, denn ich bin objektorientiertes Denken gewöhnt. Von den Segnungen der modernen Hochsprachen findet man im SPS-Gebiet aber leider nicht viel. Jedenfalls empfinde ich das alles als sehr gewöhnungsbedürftig. Und wenn ich AWL sehe fange ich recht schnell an nach Handschellen und Peitsche zu suchen. ;-) Dagegen ist x86 Assembler ja schon ne richtige Hochsprache.
OK genug Balbla, hier mal meine Fragen/Verständnisprobleme, oder wie im Titel geschieben: Was sollte man wie machen bzw. was kann man, aber sollte man auf keinen Fall machen?
1. Ich schreibe gerade einen FB zu Ansteuerung eines Motorventils. Es gibt an EAs die Endschalter AUF und ZU (E_AUF, E_ZU), das Motor-Signal Auffahren und Zufahren (M_AUF, M_ZU) und eine aktuelle Position (ACTPOS) die über eine Poti ausgewertet wird.
Dem Baustein wird zusätzlich noch eine Soll-Position übergeben (SETPOS).
Der FB Kopf würde allgemein also so aussehen:
Code:
FUNCTION_BLOCK FB_VxMotor
VAR_INPUT
SETPOS: INT := 0; (* Soll-Position *)
ACTPOS: INT := 0; (* Ist-Position *)
E_AUF: BOOL := FALSE; (* Endschalter AUF Signal *)
E_ZU: BOOL := FALSE; (* Endschalter ZU Signal *)
END_VAR
VAR_OUTPUT
M_Zu: BOOL := FALSE; (* Motor Zufahren Signal *)
M_Auf: BOOL := FALSE; (* Motor Auffahren Signal *)
END_VAR
Code:
FUNCTION_BLOCK FB_VxMotor
VAR_INPUT
SETPOS: INT := 0; (* Soll-Position *)
ACTPOS AT %I*: INT := 0; (* Ist-Position *)
E_AUF AT %I*: BOOL := FALSE; (* Endschalter AUF Signal *)
E_ZU AT %I*: BOOL := FALSE; (* Endschalter ZU Signal *)
END_VAR
VAR_OUTPUT
M_Zu AT %Q*: BOOL := FALSE; (* Motor Zufahren Signal *)
M_Auf AT %Q*: BOOL := FALSE; (* Motor Auffahren Signal *)
END_VAR
Was ist da die "richtige" Lösung?
Die 3. Möglichkeit sieht so aus:
Code:
FUNCTION_BLOCK FB_VxMotor
VAR_INPUT
SETPOS: INT := 0; (* Soll-Position *)
END_VAR
VAR
ACTPOS AT %I*: INT := 0; (* Ist-Position *)
E_AUF AT %I*: BOOL := FALSE; (* Endschalter AUF Signal *)
E_ZU AT %I*: BOOL := FALSE; (* Endschalter ZU Signal *)
M_Zu AT %Q*: BOOL := FALSE; (* Motor Zufahren Signal *)
M_Auf AT %Q*: BOOL := FALSE; (* Motor Auffahren Signal *)
END_VAR
Wann deklariert ihr was wie wo? Wo kommen die direkten EA-Variablen hin, wenn der Baustein ein physikalisch vorhandenes Gerät repräsentiert?
Nächste Frage:
Wenn ich eine Variable in einem FB als VAR_INPUT deklariere kann ich sie ja trotzdem innerhalb des FB ändern und die geänderte Variable von aussen Abfragen, also so als wäre es ein VAR_IN_OUT. Hintergrund der Frage ist, dass ich bei obigem FB z.B. noch ein RESET-Eingang als VAR_INPUT deklarieren könnte der alle internen Variablen zurücksetzt. Diesen Eingang könnte ich dann innerhalb des FB, nachdem ich den Reset durchgeführt habe, wieder zurücksetzen.
Warum kann man das? Und "darf" man das machen, bzw. macht es Sinn?
Und noch eine Grundsätzliche Frage:
Ich muss eine Steuerung + Visualisierung am PC schreiben. Was gesteuert wird sind letztlich nur ein Haufen Ventile, der Rest ist reine Steuerungslogik, also wann welches Ventil wie weit öffnet etc.
Würdet ihr die komplette Steuerungslogik auf der SPS implementieren oder nur die Teile, die die Ventile steuern + Sicherheitsabfragen etc. und den "komplexen" Steuerungsteil, also die Logik mit in die Visualisierung packen?
Komplexe Vorgänge lassen sich nunmal wesentlich eleganter in einer objektorietierten Hochsprache implementieren, wodurch auch die Fehleranfälligkeit sinkt. Pro / Contra?
EDIT: In meinem Fall ist letzteres bereits vorhanden, also eine reine PC-Steuerung die die Ventile über exterene proprietäre Hardware ansteuert. Daher soll das jetzt per SPS gemacht werden. Die Software wird aber trotzdem komplett neu entwickelt, es spielt also fast keine Rolle, dass der Programmcode für die Logik eigentlich schon vorhanden ist.
Naja, sind vermutlich sau blöde Fragen aber wenn man im SPS-Bereich noch nichts gemacht hat ist das alles erstmal nicht so klar. Habe leider noch kein Buch "SPS für C++ Pogrammierer" o.ä. gefunden. ;-)
Danke schon mal für eure Hilfe.
Werde aber sicher noch ein paar mehr Fragen haben wenn sie mir wieder einfallen. Aller Anfang ist halt schwer.

Zuletzt bearbeitet: