# Maschienen steuern mit delphi



## tycomatze (10 Juli 2007)

ich bin noch ziemlich am anfang mit dem programmieren in delphi.
hab mich bereits etwas eingearbeitet und ein paar kleine pogramme geschrieben.
ich muss eine maschine mit delphi steuern mittel meines WebIO von W&T und stehe nur vor folgenden problemen:

wie kann ich eine zyklische abarbeitung eines programms erreichen wie bei einer sps? denn angenommen ich starte ein programm für eine maschine zu steuern(also führe die .exe aus) nun wird der start-button gedrück und abjetzt soll die maschine ja vollständig alleine weiterarbeiten. angenommen mit dem klickereigniss des start-button setze ich einen ausgang, der den antrieb eines förderbandes einschaltet. an schließen, wenn ein sensor betätig wird, soll der antrieb wieder abgeschaltet werden. ich muss also ständig alle eingäge einsehen, dass auf änderungen reagiert werden kann. und angenommen ich schriebe sinngemäß folgendes program(implementationsteil):

procedure TForm1.Button1Click(Sender: TObject);
begin
ClientSocket1.Socket1.SendText(GET /outputaccess0?PW=&Status=ON&) 
_// setzt ausgang0 des WebIO_

ClientSocket1.Socket.SendText(GET /input3?PW=&) _// ließt dem zustand von eingang 3 ein
_
if ClientSocket1.Socket.ReciveText='input3;ON' _// dies bedingung wird erfüllt, wenn das WebIO den Text 'input3;ON' zurückliefert, also eingang3 ein 1-signal hat_

then
ClientSocket1.Socket1.SendText(GET /outputaccess0?PW=&Status=OFF&) 
_// setzt den Ausgang0 des WebIO zurück_

end;

nun wird also beim betätigen des start-button(button1) der ausgang 0 gesetzt. nun aber das programm wird ja dann sofort weiter abgearbeitet. und es dauert ja noch, bis das band den sensor betätigt und der eingang3 ein 1-signal erhält.

das förderband würde so nicht mehr zum stehen kommen, weil die eingänge nicht städing abgefragt werden und auch nicht drauf reagiert wird.

liegt ich überhaupt richtig mit der annahme, das eine programm beim starten der .exe einmal ausgeführt wird und wenn dieses beendet ist, geschieht solange nichts mehr, bis ein button oder ein timer eine procedure oder function "startet" ?

kann man irgendwie herrausfinden, wie lange die bearbeitungszeit einer bestimmten procedure ist?

ich hoffe man kann verstehen worauf ich hinnaus möchte und hoffe das mir jemand weiterhelfen kann. danke


----------



## Question_mark (10 Juli 2007)

Hallo,



			
				tycomatze schrieb:
			
		

> wie kann ich eine zyklische abarbeitung eines programms erreichen wie bei einer sps?



Überhaupt nicht, ein Windows Rechner mit einer Delphi-Applikation kann keine SPS ersetzen. Man kann zwar mit einer Delphi-Applkation eine Maschine bedienen und visualisieren (also z.B. Förderbänder, Antriebe, Ventile etc. ein/ausschalten), aber die logischen Steuerungsfunktionen (wie z.B. Ausschalten der Antriebe bei Endlage) überlasse bitte einer untergeordneten SPS .... 
Den Notaus machst Du dann auch über das Web, oder  



			
				tycomatze schrieb:
			
		

> ich hoffe man kann verstehen worauf ich hinnaus möchte und hoffe das mir jemand weiterhelfen kann



Ja, das habe ich verstanden. Lass bloss die Finger davon, oder Du wirst in die Geschichte eingehen als gnadenloser Terminator für Maschinen und Anlagenbediener. Andererseits eine gute Chance, sehr berühmt zu werden  



			
				tycomatze schrieb:
			
		

> wie lange die bearbeitungszeit einer bestimmten procedure ist?


Ja, google mal nach dem Delphi Profiler von Hrn. Adolphs.

Und dann google mal danach :  "Real time Betriebssystem". In einer Applikation unter Windows ist leider nicht ganz vorhersehbar, ob die Abfrage z.B. eines Endschalters in 10ms oder erst in 5 Sec. erfolgt. Was Du da vorhast, nenne ich mal "Kamikaze-Programmierung"..., also vergess es lieber.

Gruß

Question_mark


----------



## tycomatze (10 Juli 2007)

nunja, es ist eigentlich nicht so, dass ich das so vorhabe, sondern dass ich mehr oder weniger den auftrag dazu habe. 
den notaus müsste man so oder so hardwaremäßig ausführen.
aber trotzdem danke


----------



## Question_mark (10 Juli 2007)

*Was für eine Aufgabe ...*

Hallo,



			
				tycomatze schrieb:
			
		

> sondern dass ich mehr oder weniger den auftrag dazu habe



Mein Beileid, aber handelt es sich bei dem "Auftrag" um ein reales Projekt oder ist das eher eine Schulaufgabe  

Im ersteren Fall darf sich der Auftraggeber einen anderen Programmierer suchen (ich wohne und lebe recht komfortabel und angenehm und habe daher keine Lust, einige Jahre in einer JVA zu vollbringen), im anderen Fall ..., naja.

In beiden Fällen hat der Auftraggeber nicht alle Latten am Zaun, um solche schwachsinnigen Vorgaben zu machen :twisted: 
Nochmal : Finger weg davon ...

Gruß

Question_mark


----------



## Ralle (11 Juli 2007)

Ich schließ mich qm erstmal an, die ganze Sache ist mit äußerster Vorsicht zu genießen. 
Aber angenommen, es soll zur Demonstration, zum Test oder zur Schulung dienen. Dein Programm muß auf jeden Fall die Eingänge ständig abfragen, die Ausgänge schreiben, also pollen. Dazu würde sich ein eigener Thread wohl kaum umgehen lassen, sonst wird das Programm an sich schlecht zu bedienen sein. Es muß dann immer der vorhergehende mit dem gerade eingelesenen Zustand verglichen werden und, so sich etwas geändert hat, entsprechend reagiert werden. Auch dazu käme ein weiterer Thread in Frage, hier wird das sichere Handeln der einzelnen Threads (main-programm, pollen, logic) schon nicht einfach sein. Echtzeit kann man ohenhin nicht erreichen, dazu benötigt Windows extra Systemzusätze, sie gibts nicht kostenlos und sind sicher áuch nicht mal so ebend eingebunden.

Billiger, sicherer, schneller, ... wäre es garantiert z.Bsp. Twincat auf dem Rechner zu installieren, die SPS die Logic machen zu lassen und, wenns denn sein soll, mit Delphi die Bedienoberfläche und Datenerfassung zu programmieren.


----------



## afk (11 Juli 2007)

Question_mark schrieb:


> Überhaupt nicht, ein Windows Rechner mit einer Delphi-Applikation kann keine SPS ersetzen.


Auf die Gefahr hin, daß Du mich jetzt gleich verbal erschlägst: Es kommt dabei immer darauf an, was man unter einer Maschine versteht. Bei meinem Ex-AG habe ich sowas schon gemacht, das was da aber schon als "Maschine" bezeichnet wurde, bestand gerade mal aus ein paar kleinen Pneumatikzylindern, die man mit dem kleinen Finger anhalten konnte, und einem Schrittmotor, der auch kaum die Wurst vom Butterbrot gezogen hat, an ein Schnitzel vom Teller war gar nicht zu denken.   
Die Hauptaufgabe von dem Konstrukt lag auch vorrangig bei der Meßtechnik.

Bei solch einer gewaltigen Maschine, bei der auch jegliche Sicherheitstechnik überflüssiger Luxus wäre, kann man es dann schon mal wagen, auf eine SPS zu verzichten. In allen anderen Fällen stimme ich Dir hingegen vollständig zu.  


Gruß Axel


----------



## afk (11 Juli 2007)

Ralle schrieb:


> Dein Programm muß auf jeden Fall die Eingänge ständig abfragen, die Ausgänge schreiben, also pollen. Dazu würde sich ein eigener Thread wohl kaum umgehen lassen, sonst wird das Programm an sich schlecht zu bedienen sein. Es muß dann immer der vorhergehende mit dem gerade eingelesenen Zustand verglichen werden und, so sich etwas geändert hat, entsprechend reagiert werden. Auch dazu käme ein weiterer Thread in Frage, hier wird das sichere Handeln der einzelnen Threads (main-programm, pollen, logic) schon nicht einfach sein.


Mach's doch einem Delphi-Anfänger nicht so schwer, schließlich handelt es sich wohl um ein Azubi-Projekt.

Im einfachsten Fall kann man eine Timer-Komponente nehmen, und je nach Komplexität einfach alles in deren Event ausprogrammieren (Eingänge auslesen, Schrittkette mit Schrittmerkern in globalen Variablen realisieren, boolsche Verknüpfungen in Pascal umsetzen). Für ein Schulprojekt sollte das eigentlich reichen, und zum Sinn bzw. Unsinn von so einem Projekt hat QM eigentlich schon alles gesagt ...  


Gruß Axel


----------



## tycomatze (11 Juli 2007)

es handelt sich hier bei um ein reales projekt.
ich hätte vielleicht dazu sagen sollen, dass es sich bei der "Maschine" um nichts großartiges handelt. 
sie wird wahrscheinlich ein förderband haben, das 4 verschiedene postionen anfahren soll und einen  türkontaktschalter sowie 4 zylinder mit endlagenabfrage. noch ein paar sensoren, das wars.
sicherheitstechnische aspekte können auf grund der größe eigentlich vernachlässigt werden. 
das ganze in eine timerkomponete zu programmieren hab bereits versucht. nur bekomm ich da eben schon ne ziemlich lange procedure zusammen, wodruch ich die timerinterval ziemlich hoch setzen müsste, und somit die reaktion auf eingangsänderungen sehr langsam ist oder erst gar nicht zustande kommt.

liebend gern würde ich eine sps benutzen, 10 minuten und die sache hätte sich erledigt...

was genau versteht ihr unter einem Thread? wie gesagt, ich bin noch ganz am anfang


----------



## afk (11 Juli 2007)

tycomatze schrieb:


> sicherheitstechnische aspekte können auf grund der größe eigentlich vernachlässigt werden.


Ob Sicherheitstechnik benötigt wird, hat mit der Größe der Maschine überhaupt nichts zu tun. Größe zählt bei anderen Dingen, z.B. bei Kugelschreibern ... 

Wenn von der Maschine eine Gefährdung ausgeht (z.B. Quetschgefahr durch die Zylinder), dann muß die durch den Einsatz der entsprechenden Sicherheistechnik eingedämmt werden ! 








tycomatze schrieb:


> das ganze in eine timerkomponete zu programmieren hab bereits versucht. nur bekomm ich da eben schon ne ziemlich lange procedure zusammen, wodruch ich die timerinterval ziemlich hoch setzen müsste, und somit die reaktion auf eingangsänderungen sehr langsam ist oder erst gar nicht zustande kommt.


Das Problem wird wohl vermutlich darin liegen, daß das Einlesen der Eingänge von der WebIO einige Zeit in Anspruch nimmt, das macht dein Programm bestimmt so langsam. An der Verknüpfungslogik dürfte das bei der heutigen Rechnerleistung und so einer einfachen Aufgabe IMHO nicht liegen. Der langsame Zugriff auf die WebIO bleibt Dir beim Einsatz von Threads aber erhalten, das dürfte Dein Problem also wohl kaum lösen.

Bau Dir doch einfach mal ein paar Debug-Meldungen mit Zeitstempel in Deine Procedure ein (such mal in der Hilfe nach OutputDebugString), ggf. hilft Dir das schon weiter bei der Suche nach dem Performance-Killer.


Gruß Axel


----------



## kiestumpe (11 Juli 2007)

Hallo tycomatze,

also mein Beileid hast du auch. Theoretisch ist es möglich mit Delphi Real-Time zu machen - der Aufwand steht jedoch in keinem Verhältnis zum Nutzen, für einen Delphi-Anfänger schon zweimal nicht.
Mache deinem Arbeitgeber klar, dass du in Delphi für diese Vorgehensweise minimum ein Halbes Jahr brauchst. Mit der SPS jedoch wenige Tage oder Stunden, Minuten, je nach Geschick!
Der Weg z.B. mit TwinCat und einem BK ist ja ansich auch ne "günstige" Lösung.

hth
kiestumpe


----------



## ge_org (11 Juli 2007)

Hallo,
habe 4 Anlagen in meinem Produktionsbereich, die mit Delphi laufen (vorher TurboPascal). Die Delphi-Applikation verwendet Wago-EthernetController als Datenschleudern, die Schrittkette kann man selber zusammenstöpseln.

Im Prinzip genial programmiert, im Prinzip deshalb, da das deterministische Verhalten einer SPS nicht erreicht wird, meine Bedenken dahingehend wurden als nichtig (von der Firmenleitung) abgetan.

Wenn was nicht mehr funktioniert-vor kurzem Problem mit Ein/Ausschalten Druckluftventile, d.h. mehrere Ventile schalteten im Halbsekundentakt Ein/Aus (gab'ne schöne Melodie)-wird einfach AEG durchgeführt (PC herunterfahren, Hauptschalter AUS, dann wieder einschalten-->Ausschalten-Einschalten-Geht).

Eine SPS oder SoftSPS (Beckhoff....) ist da besser!

Ausserdem mag ich auch keine Anlage im Produktionsbetrieb die LabView verwenden, ist die gleiche Scheisse!

Georg


----------



## tycomatze (11 Juli 2007)

gut ich hab mich vielleicht etwas unglücklich ausgedrückt.
jedenfalls geht von der maschine eigentlich keiner lei gefahr aus...


----------



## afk (12 Juli 2007)

tycomatze schrieb:


> jedenfalls geht von der maschine *eigentlich* keiner lei gefahr aus...


Satz mit eigentlich ...  

Die Frage ist nicht, ob davon bei normaler Funktion eine Gefahr ausgeht, sondern ob die die Maschine in irgendeiner beliebigen, möglichen Situation (also auch bei Fehlfunktion irgendeines Bestandteils der Maschine) gefährlich sein kann.


Gruß Axel


----------



## kiestumpe (12 Juli 2007)

ge_org schrieb:


> Hallo,
> habe 4 Anlagen in meinem Produktionsbereich, die mit Delphi laufen (vorher TurboPascal). Die Delphi-Applikation verwendet Wago-EthernetController als Datenschleudern, die Schrittkette kann man selber zusammenstöpseln.


Wirklich Controller? Dann hast du doch bereits die SPS.



ge_org schrieb:


> Ausserdem mag ich auch keine Anlage im Produktionsbetrieb die LabView verwenden, ist die gleiche Scheisse!
> 
> Georg


100% ACK


----------



## Cliff (13 Juli 2007)

Hallo.
und herzliches Beileid zu der Aufgabe!

Wir haben einmal vor Jahren versucht für einfachste Anwendungen (Ein Förderband mit einer Lichtschranke) aus Kostengründen versucht dieses durch einen in der Anlage vorhandenen Roboter steuern zu lassen. Der Roboter wurde mit einer Hochsprache programmiert und sollte als Nebentätigkeit dieses eine Band mit steuern (Um eine SPS wegzusparen).

1.) Die Applikation läuft bis heute nicht sehr stabil (Z.B. Wiederanlauf nach
     Störungen)
2.) Es steigt kein Mensch durch dieses Programm durch
3.) Es wurde durch die aufgewendeten Stunden erheblich teuerer als wenn
     wir gleich eine SPS eingesetzt hätten

Fazit: Nie wieder!


Zur Frage:
Wir sind zuletzt beigegangen im Roboter eine zyklische Task einzurichten, welche im Grunde eine SPS simuliert. Erst dadurch wurde das ganze steuerbar.
Bei Delphi würde ich ähnlich verfahren:
Einfach eine schnell laufende zweite Task aufmachen (Aufpassen das genügende System- Ressourcen für den Rest des Rechners übrig bleiben) und hierin eine zyklisch arbeitende SPS abbilden. Diese dann von der Haupt- Task mit den Informationen des graphischen Front- Ends füttern.
Auf jeden Fall: Zuerst einmal das ganze tolle 'Wie schreibe ich ein gutes Windows- Programm' Know- How verwerfen ;-)

Gruss Cliff


----------



## marcengbarth (18 Juli 2007)

Du kannst bei der Aufgabe eigentlich nicht mit Timern arbeiten, du solltest die Logikfunktionen in einen oder mehrere Threads auslagern.
Um eine relativ zyklische Abarbeitung zu bekommen, kannst du versuchen den Thread einer hohen Priorität zu zuordnen, vielleicht geht sogar Realtime.
Hängt aber davon ab, was dein PC sonst noch so im Hintergrund anstellt.


----------



## tycomatze (18 Juli 2007)

das 1. große problem ist, dass ich bei einer physikalischen eingangsänderung kein signal zum PC geschickt bekomme, wo sagt: " der eingang hat sich geändert" sondern ich muss immer wieder vom PC aus fragen " wie sieht denn der Status des eingangs aus? " und die WEB IO meldet das dann dem PC. diese Daten kann ich dann auswerten. Ich hab das ganze mal mit den ClientSockets ( aus delphi5 ) versucht.
mit einer WEB IO funktioniert das sogar einigermaßen.

das 2. große problem ist, dass ich 2 WEB IO verweden muss, die hab ich über einen switch angeschlossen.
nur bekomm ich da probleme. unregelmäßig drehten die fehler "Verbindung wurde vom Remotehost getrennt" fehler nummer 10054. auf. manchmal läufts ne halbe stunde, manchmal nur ein paar sekunden bis der fehler austritt.

noch was anderes:
ich hab für die 2 Web io 2 ClientSockets eingefügt, was passiert jetzt, wenn ich beispielsweiße in einem clickereigniss folgendes ausführe:

ClientSocket1.Socket.SendText('GET /outputaccess?PW=&State0001&')
ClientSocket2.Socket.SendText('GET /outputaccess?PW=&State0014&') 

funktioniert das, wenn ich die zwei "sendebefehle" direkt nacheinander schreibe?!


----------



## ge_org (18 Juli 2007)

Vergiss es!
Unser Delphi-Programm greift per 2.Ethernet Karte direkt auf den WagoController (nach wie vor reine Datenschleuder-->O-Ton Wago Support) zu. Damit hast Du auch keine Probleme mit irgendwelchen umherirrenden Datenpaketen (geht LabView Anwendern nicht anders, die glauben sie kaufen eine EthernetIO und stöpseln diese auf irgendeinen Hub/Switch und wundern sich, dass sie Daten nicht schneller als mit RS232 ablesen können).
Habe jetzt eine Anlage aufs Aug gedrückt bekommen, die meiner Meinung nach mit LabView erstellt wurde, egal, jedenfalls versucht der IB-Techniker seit 2 Tagen den PID-Regler vom Servoventil bzw. die Druckaufnehmer richtig hinzubekommen!

Darum Hände weg von proprietärer Software, im Produktionsprozess kann man sich eine Vorgehensweise wie in der IT-Abteilung nicht leisten (Sauteurer Wartungsvertrag, garantierte Instandsetzung...), bzw. darf man sich aufgrund der Vorgaben der Vorgesetzten nicht leisten (IT darf immer mehr als Produktion, ist ja auch wichtiger).

Jede Software, die von einem Instandhalter nicht gewartet werden kann bzw. Hardware die nicht innerhalb küzester Zeit beschafft werden kann, sollte tunlichst vermieden werden!

Georg


----------



## Bossi (31 Juli 2007)

Hallo,

ich würde ein Timerobjekt nehmen. Am anfang des Ereignisses immer alle Relevanten Daten lesen und darauf dann dementsprechend reagieren. Ich Denke das sollte in Delphi selbst für anfänger kein Problem sein.

Hab solche Steuerungen schon häufiger realisiert, aber das immer mit VB6 /VB.NET in zusammenarbeit mit Prodave. Habe dort eine aktualisierungszeit im durchschnitt von 80 ms max.


mfg Bossi


----------

