# Rundtisch



## drfunfrock (11 Juni 2008)

Ich habe hier einen Rundtisch fertig programmiert, aber manche Konstruktionen gefallen mir nicht. So werden mit jeder Positionsänderung 6 Prozesse gestartet, die jeweils mit einem FB implementiert wurden. Jeder dieser FBs hat einen Start-Eingang und einen Ready-Ausgang. Um zu testen, ob jeder dieser FBs fertig ist, muss ich für jeden FB eine Zeile schreiben. 

Geht es nicht auch anders, vielleicht in einer Schleifenkonstruktion?


----------



## Larry Laffer (11 Juni 2008)

drfunfrock schrieb:


> Geht es nicht auch anders, vielleicht in einer Schleifenkonstruktion?


 
Klar ...
Ist bei mir sehr ähnlich. Ich übergebe jedem Baustein einen eigenen Daten-Bereich aus einem DB. In diesem Datenbereich sind Info's wie "Ablauf gestartet", "Ablauf beendet", "TimeOut" uvm. hinterlegt.
Da diese immer die gleiche Struktur haben werde ich das Ganze hintergher in einem Sammel-FB aus, dem ich aus Übergabe-Parameter lediglich die Anzahl der Station übergebe. Der DB ist bei mir auf die max. vorstellbare Anzahl von Stationen (bei mir 50) dimensioniert - entsprechend der FB ...

Gruß
LL


----------



## jabba (11 Juni 2008)

drfunfrock schrieb:


> Ich habe hier einen Rundtisch fertig programmiert, aber manche Konstruktionen gefallen mir nicht. So werden mit jeder Positionsänderung 6 Prozesse gestartet, die jeweils mit einem FB implementiert wurden. Jeder dieser FBs hat einen Start-Eingang und einen Ready-Ausgang. Um zu testen, ob jeder dieser FBs fertig ist, muss ich für jeden FB eine Zeile schreiben.
> 
> Geht es nicht auch anders, vielleicht in einer Schleifenkonstruktion?


 
Zum einen verstehe ich nicht , warum immer alles in einen FB sein muss?
Andererseits sehe ich das wie Larry.
Wo ist das Problem, im FB einen Sprung zu deklarieren ?
Wenn die Station nach dem Takten eine Freigabe bekommt und nicht arbeiten soll, gibt es einen Sprung , der direkt ans Ende springt und sagt "
Bearbeitung fertig".

Du kannst natürlich vorher Global abfragen ob denn eine Station arbeiten soll, ist aber für die Fehlersuche und Analyse nicht so geeignet.
Ich hab immer einen Baustein der den Tisch dreht, wenn alle Stationen "Fertig melden". Jede Station schaut für sich auf den Tisch, und bearbeitet oder setzt sofort das Signal "Station Ende"


----------



## drfunfrock (12 Juni 2008)

Das so etwas in einem FB liegen muss, liegt auf der Hand, weil so eine Prozessteuerung als Automat implementiert wird und das geht nur über FBs, es sei denn, man implementiert den Automaten mit globalen Variablen, welches nun überhaupt sehr problematisch wäre. 

Die Idee, dass die FBs sich selbst starten, ist besser als mein Ansatz. Beim nächsten mal, werde ich das so machen. 

Es fehlt ST einfach so etwas wie eine Objektorientierung. Da könnte man die Referenzen von FB einfach in einem Array speichern, wenn diese eine gemeinsame Basisklasse hätten.


----------



## MarkusP (12 Juni 2008)

drfunfrock schrieb:


> Es fehlt ST einfach so etwas wie eine Objektorientierung. Da könnte man die Referenzen von FB einfach in einem Array speichern, wenn diese eine gemeinsame Basisklasse hätten.



Bei Codesys V3.0 gibt's das schon. Bei Beckhoff dauert's noch ein bisserl. (lt. Support)
Ein "normaler" SPS-Programmierer wird sowas wie Objektorientierung bestimmt nicht vermissen, ist halt eher was für Hochsprachenfreaks. Ich bin zwar auch nur ein SPS-Programmierer, aber ich freu' mich schon darauf.

LG


----------



## Ralle (12 Juni 2008)

drfunfrock schrieb:


> Das so etwas in einem FB liegen muss, liegt auf der Hand, weil so eine Prozessteuerung als Automat implementiert wird und das geht nur über FBs, es sei denn, man implementiert den Automaten mit globalen Variablen, welches nun überhaupt sehr problematisch wäre.
> 
> Die Idee, dass die FBs sich selbst starten, ist besser als mein Ansatz. Beim nächsten mal, werde ich das so machen.
> 
> Es fehlt ST einfach so etwas wie eine Objektorientierung. Da könnte man die Referenzen von FB einfach in einem Array speichern, wenn diese eine gemeinsame Basisklasse hätten.



Ich hab schon X Rundtische programmiert, aber irgendwie kann ich deinen Aussagen keinen logischen Inhalt abgewinnen. Schein so, als ob du eher aus der Uni-Programmiererecke kommst, oder?  Niemand muß zwingend Automaten programmieren und niemand muß FB einsetzen und warum soll das mit FC unmöglich sein?


----------



## drfunfrock (13 Juni 2008)

Ob du nun explizit so einen Automaten programmierst oder implizit: Es ist einer, sobald eine chronologische Folge von Schritten notwendig ist und dein Code funktioniert. 

Zu einem Automaten gehört immer ein Zustandsspeicher, z.B. binäre Merker oder eine Variable vom Typ Integer und ein Eintscheidungsnetzwerk (if then else) in welchen Zustand als nächstes verzweigt werden soll, abhängig von Zustand und Eingangssignalen. 

Das kann man mit globalen Variablen machen und das Entscheidungsnetzwerk für die Zustandswahl liegt in einer Funktion oder man kapselt das ganze und legt es in einen FB. Ich bevorzuge letzteres, damit ich die diversen Automaten getrennt voneinander testen kann und der Code ist leichter zu pflegen. 

Siehe auch 
> http://de.wikipedia.org/wiki/Endlicher_Automat

Du magst das als theoretisch betrachten, für mich ist es nützlich.


----------



## drfunfrock (13 Juni 2008)

MarkusP schrieb:


> Ein "normaler" SPS-Programmierer wird sowas wie Objektorientierung bestimmt nicht vermissen, ist halt eher was für Hochsprachenfreaks. Ich bin zwar auch nur ein SPS-Programmierer, aber ich freu' mich schon darauf.
> 
> LG




Das glaube ich nicht. Wenn ersteinmal der Vorteil erkannt wird, dann nutzt es jeder SPS-Programmierer (Es sei denn er bezahlt extra wie bei Siemens mit SCL  )


----------



## Ralle (13 Juni 2008)

drfunfrock schrieb:


> Das glaube ich nicht. Wenn ersteinmal der Vorteil erkannt wird, dann nutzt es jeder SPS-Programmierer (Es sei denn er bezahlt extra wie bei Siemens mit SCL  )



Das mag sein, das Problem wird ganz sicher sein, daß noch weniger SPS-Programmierer wirklich wissen, was in ihrem Programm eigentlich genau vor sich geht. Da hilft dann auch nicht, daß man mit Fachbegriffen nur so um sich wirft, nichts für ungut. Ich "freu" mich schon auf die Montageeinsätze, um fremde Programme zum laufen zu bringen, bzw. komplett zu eliminieren.


----------



## drfunfrock (13 Juni 2008)

Ralle schrieb:


> Das mag sein, das Problem wird ganz sicher sein, daß noch weniger SPS-Programmierer wirklich wissen, was in ihrem Programm eigentlich genau vor sich geht. Da hilft dann auch nicht, daß man mit Fachbegriffen nur so um sich wirft, nichts für ungut. Ich "freu" mich schon auf die Montageeinsätze, um fremde Programme zum laufen zu bringen, bzw. komplett zu eliminieren.



Ich glaube den Streit um Fachbegriffe hatten wir schon einmal. Ich lasse daher lieber davon ab, weil wir beide verlieren würden. 

Du hast natürlich recht, dass so mancher nicht weiss, wie er es zum laufen bekommen hat, was aber kein Grund ist, den Missbrauch von etwas Gutem anzuklagen und es selbst nicht zu verwenden. Und wenn du Einnahmen hast, weil einer Mist baute, ist das ja so schlecht nicht. Ich stelle mir z.B. einen FB vor, der das Starten eines Prozesses von einer Basisklasse erbte, so dass ich bei Änderungen in diesem Startcode nur noch einmal etwas zu ändern habe, anstatt in allen FBs die so gestartet werden. Jedenfalls hätte ich manches mit einer Objektorientierung eleganter und einfacher geschrieben.


----------



## Larry Laffer (13 Juni 2008)

Aus diesem Thema eine Grundsatz-Diskussion zu machen bringt (glaube ich) niemanden weiter.

@drfunfrock:
Wenn du Eigenschaften oder Befehle "vereben" willst, dann ist das doch grundsätzlich kein Problem. Man muss sich nur darüber klar werden, wie das normalerweise geschieht : Ich übergebe einen Datenblock (mit definierter Struktur oder Inhalt) an eine andere Prozedur. Das geht doch in der SPS-Programmierung vom Prinzip her auch zu machen. Die Sache mit den lokalen und globalen Variablen würde ich dabei mal außer Acht lassen, denn die gibt es auch in der Hochsprachen-Programmierung nicht wirklich (der Compiler tut nur so - letztlich kommt alles aus dem gleichen Speicher - bezogen auf die SPS: ein FB schützt sein STAT-Varaiblen auch nicht vor anderen Bausteinen). Das Hauptthema hier wäre also Disziplin - und das ist doch recht einfach zu erreichen. Man kann sich hier natürlich fürchterlich einen ausklinken und dann landet man da, worauf Ralle sich (mit Recht) bezogen hat und wovor er eigentlich nur warnen wollte.

In diesem Sinne
Gruß
LL


----------



## drfunfrock (13 Juni 2008)

Ok, dann sind wir uns einig


----------



## Ralle (13 Juni 2008)

drfunfrock schrieb:


> Ok, dann sind wir uns einig



Aber sicher doch !


----------



## drfunfrock (13 Juni 2008)

Das letzte Wort habe ich


----------



## Markus (13 Juni 2008)

habe was ähnliches gelöst so gelöst:

ich hatte letztes jahr eine große anlage mit vielen rohren, ventilen und pumpen.

es gab durch das rohleiungsgedöns viele wege, aber egal welchen die sps bassierend auf benutzereingaben (quelle und ziehl) gewählt hat, es mussten erst alle ventile offen sein bevor die pumpen angelaufen sind (überdruck).

die pumpe musste also wissen ob alle ventile offen sind, das konnten aber jedensmal anderen sein. dehlab sah das in etwa so aus:


Pumpen-Bustein
============

U FRG_EXT_VENTILE_P1
U PUMPE_EIN_P1
= A_PUMPE_P1

SET
= FRG_EXT_VENTILE_P1



Ventil-Baustein
===========

U VENTIL_AUF_Y28
= A_VENTIL_Y28

U VENTIL_AUF_Y28
UN VENITIL_IST_AUF_Y28
R FRG_EXT_Ventile_P1




U VENTIL_AUF_Y17
= A_VENTIL_Y17

U VENTIL_AUF_Y17
UN VENITIL_IST_AUF_Y17
R FRG_EXT_Ventile_P1



der code sah wesentlich anders aus, aber ich denke das prinzip wird klar.
die freigabe (für den tisch oder die pumpe oder was weiß ich was) ist quasi immer TRUE, nur wenn eine station (oder ein ventile oder eine benutzereingabe oder sonst was) etwas dagegen hat wird gesperrt.


vorteil, ich kann weiteren stationen (oder ventile oder sonst was) in die "freigabekette" einbauen ohne am bestehen code zu ändern. es gibt nur eine weitere zeile die ebenfalls die freigabe zurücksetzen kann...

einziger nachteil:
suche ich die station die die freigabe sperrt, dann muss ich über den querverweis alle stellen wo das freigabebit resetet wird anspringen.
aber diesen nachteil sollte eine vernünftige visualisierung wieder ausbügeln...


----------



## drfunfrock (16 Juni 2008)

Kannst du das nocheinmal in ST formulieren? Ich kann kein AWL, weil mir dazu einfach die Doku fehlt. Und Siemen AWL ist schon gar nicht Fall ;-)


----------

