Autor Beitrag
IIXOXII
Hält's aus hier
Beiträge: 4



BeitragVerfasst: So 11.01.15 12:28 
Guten Tag.
ich bin neu hier im Forum und möchte mich erst Vorstellen.
Meine name ist Frederik und ich Studiere momentan Maschinenbau-Informatik.
Im moment Programmieren wir in Delphi ein kleines Programm was Fässer per Roboter von einem Laufband auf ein andere Laufband stellen soll.
Das Laufband und die Roboter kommen von Fischertechnik.
Ich hoffe das Bild im Anhang erklärt meine Sitiuation besser.
Jetzt habe ich bzw. meine Gruppe das Problem , dass wir die Roboter nicht zeitgleich ans Laufen bekommen.
Am besten wäre es wenn der Aufbau komplett Synchron verläuft , heißt : Es sind zwei Fässer vorhanden , die jeweils auf einem Laufband laufen , dann greifen die Roboter die Fäser und stellen sie auf das andere Laufband, so soll eine endlosschleife entstehen, bis man einen Button drückt der das ganze beendet.
Ist es klug sowas mit Multithreading zu Programmieren bzw. geht das überhaupt ?

Bin über jede Antwort dankbar.

ps: Ich möchte gerne das die Laufbänder dann parallel laufen und die Roboter die function punkteins erste parallel fahren und anschließend die funktionzwei.

mfg Frederik
Einloggen, um Attachments anzusehen!
Perlsau
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: So 11.01.15 13:53 
Crossposts sollte man stets verlinken, damit hilfsbereite User nicht Lösungen posten, die im anderen Forum bereits gepostet wurden.
Delphi-Laie
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 1600
Erhaltene Danke: 232


Delphi 2 - RAD-Studio 10.1 Berlin
BeitragVerfasst: So 11.01.15 14:55 
user profile iconIIXOXII hat folgendes geschrieben Zum zitierten Posting springen:
Ist es klug sowas mit Multithreading zu Programmieren bzw. geht das überhaupt ?


Möglich i.S. einer (ungefähren) Gleichzeitigkeit ist es, aber ungeschickt, und hinsichtlich einer Synchronizität ist es völlig ungeeignet, weil Windows bestimmt, von welchem Thread es wann wieviel abarbeiten läßt.


Zuletzt bearbeitet von Delphi-Laie am So 11.01.15 16:23, insgesamt 1-mal bearbeitet
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19272
Erhaltene Danke: 1740

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: So 11.01.15 15:59 
Prinzipiell sind Threads eine gute Möglichkeit. Du musst aber sicherstellen, dass du die Steuerung auch parallel ansprechen darfst, ansonsten müssen die Zugriffe synchronisiert werden.

Viel sinnvoller wäre aber eher, wenn das möglich ist, gar nicht auf z.B. das Erreichen der Motorstellung usw. zu warten, sondern in einem Event auf solche Ereignisse zu lauschen.

Dein grundsätzliches Problem ist jedenfalls aktuell, dass du die einzelnen Befehle für eine Operation direkt hintereinander ausführst, so dass derweil nichts anderes passieren kann. Wenn du die einzeln abarbeiten würdest, immer was als nächstes nötig ist, könntest du das auch so hinbekommen.
Die 16000 im Parameter sieht mir auch wie ein Timeout aus. Wenn dem so ist, könntest du das sehr klein halten und in einzelnen Schritten prüfen.

Sprich in einer einzigen Abarbeitungsroutine:
Wenn der Status von Roboter 1 ist warte auf Motor, dann schaue, ob der soweit ist. Wenn nicht, schaue nach Roboter 2. Wenn einer von beiden den aktuellen Status abgearbeitet hat, bekommt er den nächsten Befehl und geht in den nächsten Status. Und dann wird darauf geprüft.
So brauchst du nicht wirklich warten und blockierst nichts.

Das nennt sich endlicher Automat:
de.wikipedia.org/wiki/Endlicher_Automat
OlafSt
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 486
Erhaltene Danke: 99

Win7, Win81, Win10
Tokyo, VS2017
BeitragVerfasst: So 11.01.15 16:33 
Du hast es mit mechanischen Komponenten zu tun. Da machen sich kleine Ungenauigkeiten in Zahnrädern, Motorleistungen, ja irgendwann sogar Leiterwiderstände in unterschiedlichen "Arbeitszeiten" pro Zyklus bemerkbar.

Gehst du davon aus, das beide Robbis stets absolut synchron laufen, gibts nach ein paar Minuten auf sicher Chaos. Besser ist es, diese Ungenauigkeiten gleich zu berücksichtigen, so das der ganze Ablauf auch stundenlang laufen kann, ohne das es zu Behinderungen oder Ausfällen kommt.

_________________
Lies, was da steht. Denk dann drüber nach. Dann erst fragen.
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19272
Erhaltene Danke: 1740

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: So 11.01.15 18:09 
Darum geht es gar nicht. Wenn du mal in den Quelltext geschaut hättest, hättest du gesehen, dass der gesamte Ablauf des Transports eines Fasses in einer einzelnen Methode ist, inklusive Warten usw., so dass die beiden sich gar nicht gleichzeitig bewegen.

Aber mit dem Modell eines endlichen Automaten wie von mir vorgeschlagen lässt sich das ganze ohne Threads und auch mit Berücksichtigung deines Einwands umsetzen. ;-)
IIXOXII Threadstarter
Hält's aus hier
Beiträge: 4



BeitragVerfasst: Mo 12.01.15 13:03 
Hey .
Danke für eure Antworten.
@ Jaenicke
Dein vorschlag hört sich echt gut an allerdings versteh ich noch nicht ganz was du mit "Viel sinnvoller wäre aber eher, wenn das möglich ist, gar nicht auf z.B. das Erreichen der Motorstellung usw. zu warten, sondern in einem Event auf solche Ereignisse zu lauschen. " meinst.
Kannst du mir vielleicht ein Beispiel geben?


mfg
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19272
Erhaltene Danke: 1740

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Mo 12.01.15 14:37 
Das Prinzip ist das gleiche wie bei einem Buttonklick in einem normalen Fenster. Da wartest du ja auch nicht darauf, dass der gedrückt ist, sondern reagierst auf das Ereignis OnClick.

Wie das in deinem konkreten Fall aussieht, kann ich dir leider nicht sagen, da ich deine Bibliothek nicht kenne. ;-)
Konkret sollte das in der Unit FishFace40 zu finden sein, ob es da irgendwelche Events gibt.
GuaAck
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 376
Erhaltene Danke: 32

Windows 8.1
Delphi 10.4 Comm. Edition
BeitragVerfasst: Di 13.01.15 01:49 
Liebe Leute,

"mit Kanonen nach Spatzen schießen" fällt mir bei der Diskussion ein, in der einige Beiträge das auch sinngemäß so darstellen.

Die Aufgabe würde ein einfacher Mikrocontroller mit 16 MHz und 16 kB Programmspeicher in C programmiert locker lösen. 9x% seiner Zeit wäre er in einer Warteschleife.

Standard-PCs sind um mehr als den Faktor 100 schneller, da ist Reserve für Betriebssystem und Compiler drin.

Also:
REPEAT
.. alles was gemacht werden muss, passiert zur Mechanik hin alles fast gleichzeitig
Application.Processmessages(..); <<< das ist wichtig
Until Abbruch;

Abbruch wird dann in einer Methode TButtonAbruchClick bei einem Click einfach auf TRUE gesetzt. Oder man kann dan auch andere Variablen per Button (oder sonst was) setzen.

Gruß
GuaAck
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19272
Erhaltene Danke: 1740

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Di 13.01.15 07:36 
Und um das so umzusetzen braucht man einen endlichen Automaten, den Weg hatte ich ja oben auch schon beschrieben.
IIXOXII Threadstarter
Hält's aus hier
Beiträge: 4



BeitragVerfasst: Di 27.01.15 11:08 
Guten Tag.
Leider hatte ich in letzter Zeit kaum zeit für das Projekt und somit konnte ich kaum was ausprobieren.
Ich habe jetzt mein Problem doch teilweise mit Multithreading gelöst.
Nur die Laufbänder wollten nicht so wie ich wollte.
Ich hab wieder meinen Quelltext angehängt.
Ich führe jetzt alle meine schritte die das Laufband bzw der Roboter machen soll in der Main aus.

Die Wait functionen ist nur dafür da , dass die Roboter warten bis der Motor aufhört zu laufen bevor er in eine andere Richtung fährt.
Das einzige Problem was ich jetzt noch habe ist, dass meine Function von den Laufbändern nicht nach einer bestimmten Zeit abbricht.
Ich möchte gerne , dass wenn z.B. ein Tönnchen vom Laufband fällt, bzw der Prof es vom Band klaut , dass das System nach einer gewissen Zeit diese FUnction einfach Überspringt.
Geht das?

Er läuft die Schleife immer wieder durch bis beide Lichtschranken erreicht werden.
Die Laufbänder laufen gleichzeitig und halten Nacheinander an .
In der function sind 100 schritte die, dass Laufband laufen soll. Falls die Lichtschranke ehr erreicht wied, wird das Laufband gestoppt.

Wenn man momentan das Tönnchen klaut läuft es seine 100 schritte und wartet dann auf die Bestätigung der Lichtschranke, die leider nicht bestätigt werden kann.


Das ist die Function um welche es sich Handelt.
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
  LbLauf1.Caption := ('Laufband 1 fährt los');
  LbLauf2.Caption := ('Laufband 2 fährt los');
  F1 := true;
  F2 := true;
  if (Laufband2.isOpen) and (Laufband.isOpen) then
    begin
      Laufband2.lichtschrankeerreichen ();
      Laufband.lichtschrankeerreichen();
      while F1 or F2 do
        begin
          Sleep(10);
          if Laufband.tonne_ziel_erreicht = false then
            begin
              F1:=false;
              Laufband.Laufband_stoppen ();
            end;
          if Laufband2.tonne_ziel_erreicht = false then
            begin
              F2 := false;
              Laufband2.Laufband_stoppen ();

            end;
        end;
    end;


Danke schonmal .


mfg Frederik

Moderiert von user profile iconNarses: Delphi-Tags hinzugefügt
OlafSt
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 486
Erhaltene Danke: 99

Win7, Win81, Win10
Tokyo, VS2017
BeitragVerfasst: Di 27.01.15 11:10 
Delphi-Tags wären sehr nett. Macht das ganze echt lesbarer.

_________________
Lies, was da steht. Denk dann drüber nach. Dann erst fragen.
IIXOXII Threadstarter
Hält's aus hier
Beiträge: 4



BeitragVerfasst: Di 27.01.15 13:10 
Ich hoffe so ist es besser.

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
  LbLauf1.Caption := ('Laufband 1 fährt los');
  LbLauf2.Caption := ('Laufband 2 fährt los');
  F1 := true;
  F2 := true;
  if (Laufband2.isOpen) and (Laufband.isOpen) then
    begin
      Laufband2.lichtschrankeerreichen ();
      Laufband.lichtschrankeerreichen();
      while F1 or F2 do
        begin
          Sleep(10);
          if Laufband.tonne_ziel_erreicht = false then
            begin
              F1:=false;
              Laufband.Laufband_stoppen ();
            end;
          if Laufband2.tonne_ziel_erreicht = false then
            begin
              F2 := false;
              Laufband2.Laufband_stoppen ();

            end;
        end;
    end;



mfg







Edit:



kann es vielleicht so funktionieren ? Oder ergibt das keinen sinn?

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
    LbLauf1.Caption := ('Laufband 1 fährt los');
    LbLauf2.Caption := ('Laufband 2 fährt los');
    lbton1.Caption := (inttostr(i));
    lbton2.Caption := (inttostr(i));
    F1 := true;
    F2 := true;
    if (Laufband2.isOpen) and (Laufband.isOpen) then
      begin
        Laufband2.lichtschrankeerreichen ();
        Laufband.lichtschrankeerreichen();
        while (F1 or F2) and (q<40do
          begin
            Sleep(10);
            q := q+1;
            if Laufband.tonne_ziel_erreicht = false then
              begin
                F1:=false;
                Laufband.Laufband_stoppen ();
              end;
            if Laufband2.tonne_ziel_erreicht = false then
              begin
                F2 := false;
                Laufband2.Laufband_stoppen ();
              end;
            if q<40 then
              break;
          end;
      end;
Delphi-Laie
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 1600
Erhaltene Danke: 232


Delphi 2 - RAD-Studio 10.1 Berlin
BeitragVerfasst: Di 27.01.15 16:01 
Statt ... = false kann gleich if not ... verwendet werden.