Reihenfolge einer Abarbeitung nach Reihenfolge der Abarbeitung

bludie

Level-2
Beiträge
45
Reaktionspunkte
10
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo Forum User,:confused:
habe ein kleines Lösungsproblem beim Arbeiten mit indirekter Adressierung bzw. Schleifen.
Folgende Aufgabe soll ich realisieren:
4 versch. Anlagen greifen auf eine Peripherie zu und es darf immer nur eine Anlage gerade auf die Peripherie zugreifen.
Die Reihenfolge des Zugriffs soll durch die Reihenfolge der Anmeldung erfolgen.
Ich wollte diese Aufgabe mit einer Pointer Adressierung und einem Db mit 4 DW`s lösen. Der gültige Wert der Reihenfolge soll immer im DW0 stehen. (z.B. dbx0.0 für Anlage 1 , dbx0.1 für Anlage 2 , dbx0.2 für Anlage 3 und dbx0.3 für Anlage 4).
Nach Fertigmeldung einer Anlage soll der nächst gültige Wert ins DW 0 rutschen.
Ich habe es mit einem Filo aus dem Forum versucht, welcher aber die Eigenschaft hat zuerst das letze wort zu
beschreiben und danach die Wörter aufrücken zu lassen, sa dass erst nach dem 4. Mal beschreiben der gültige Wert Im DW0 liegt.
Mein Schleifen und Pointer Know How ist nun mal sehr begrenzt, deshalb wende ich mich mal ans Forum. Vielleicht kann jemand meinen Filo mal tunen bzw. mir auf die Sprünge helfen.
Gruß bludie
 
Zuletzt bearbeitet:
Hallo,
ich würde das Problem gar nicht so kompliziert lösen.

Du hast einen DB mit 5 Speicherplätzen (im 5. Platz steht eine 0 drin).
Meldet sich eine Anlage an, so sucht sie die erste Stelle im Speicher, wo eine "0" drin steht. Dort trägt sie dann ihre Index-Nummer ein.
Arbeiten darf die Anlage mit der Index-Nummer an Platz 1.
Ist diese Anlage fertig, so überträgst du die Daten von Platz 2-> 1, Platz 3 -> 2 , Platz 4 -> 3 , Platz 5 -> 4.
Hat der erste Speicherplatz "0", so hat keine Anlage etwas zu tun ...
Das wars ...

Gruß
LL
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Eine Version ohne Pointer, wo immer der aktuelle Wert(MW10) ins DBW 2 geschrieben wird und die anderen Werte weitergeschoben werden.
Geht natürlich auch mit indirekter Adressierung

Code:
U     E      0.0
      O(    
      L     MW    10
      L     0
      ==I   
      )     
      SPB   end1
      AUF   DB 1
      L     DBW    8
      T     DBW   10
      L     DBW    6
      T     DBW    8
      L     DBW    4
      T     DBW    6
      L     DBW    2
      T     DBW    4
      L     MW    10
      T     DBW    2
end1: U     E      0.0
      FN    M     20.0
      SPBN  end2
      L     0
      T     MW    10
end2: NOP   0
Mußt ihn halt auf deine Bedürfnisse anpassen.
 
Nachtrag :
Das Anmelden der Anlage bzw. deren Abmelden kann man dann natürlich mit einer Schleife machen - aber vielleicht später ...
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Ja Gerhard,
die Idee mit dem Schieberegister ist in diesem Fall wahrscheinlich besser. Aber der neueste Wert wird immer ins DW2 geschrieben und wenn ich den Inhalt vom DW8 auslese, dann habe ich aber erst nach dem 4. mal schieben dort einen Wert stehen. Muss ich mir denn einen Pointer bauen, der vorher die Inhalte der Daten wörter auf "Null" vergleicht und dann evtl. erst bei 8 anfängt reinzuschreiben oder wie kann man das am elegantesten lösen?
mfg bludie
 
larry hat das ja schon gut beschrieben.
Arbeiten darf die Anlage mit der Index-Nummer an Platz 1.
Ist diese Anlage fertig, so überträgst du die Daten von Platz 2-> 1, Platz 3 -> 2 , Platz 4 -> 3 , Platz 5 -> 4.
Hat der erste Speicherplatz "0", so hat keine Anlage etwas zu tun ...
Das wars ...

wenn du dich daran hältst kann nichts passieren.
 
:confused::confused::confused:
wie ich es geschrieben habe ...
Meldet sich eine Anlage an, so sucht sie die erste Stelle im Speicher, wo eine "0" drin steht. Dort trägt sie dann ihre Index-Nummer ein.
das könnte dann so aussehen :
Code:
Chk1:L DB10.DBw 2
L 0
>I
SPBN Chk2
 
L #Anlagen_Nummer
T DB10.DBW2
SPA Ende
 
Chk2:L DB10.DBw 4
L 0
>I
SPBN Chk2
 
L #Anlagen_Nummer
T DB10.DBW4
SPA Ende
 
usw.

und
Arbeiten darf die Anlage mit der Index-Nummer an Platz 1.
Also das erste Speicherplatz-DBW auslesen und die Nummer da drin gibt die Anlagen-Freigabe ...

Gruß
LL
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Du wirst beim Eintragen, auch in das SR, eine Prüfung auf "0" vornehmen müssen um die Reihenfolge halten zu können.

Gerhard hat ja schon geschrieben das Du das SR noch anpassen musst.

Ich würde der Einfachheit halber so vorgehen:

1. Eingangswert auf Änderung prüfen
2. Bei erfolgter Änderung freien Platz im SR suchen
3. dort eintragen
4. Mit dem "ENDE"-Signal das SR eins weitertakten.

Probiers mal und poste Deinen Code, dann schau'n mer mal

dtsclipper
 
Hallo Larry,
ich stell mich da noch ein bisschen doof an.
Der Indexschreibauftrag funktioniert soweit solange bis alle DW´s gefüllt sind. Er beginnt bei DW8 und nach dem 4. mal schreiben ist auch DW 2 gefüllt. Soweit wunderbar.
Wenn jetzt wieder ein Auftrag kommt soll er das SR einfach weiter schieben und das DW2 mit dem neuen Indexwert belegen.
In meinem code wird nach dem vollen Eintrag ( DW2 bis DW8 gefüllt) bei einem neuen Schreibauftrag sofort DW 2 und DW 4 gefüllt.
Code:
      AUF   "DB 110"
      UN    M    113.4                  //Flankenmerker für Index eintragen
      O(    
      L     MW   114                    // Indexwert
      L     0
      ==I   
      )     
      SPB   end1

m000: L     DBW    8
      L     0
      >I    
      SPB   m001
      L     MW   114
      T     DBW    8
      SPA   ende
m001: L     DBW    6
      L     0
      >I    
      SPB   m002
      L     MW   114
      T     DBW    6
      SPA   ende
m002: L     DBW    4
      L     0
      >I    
      SPB   m003
      L     MW   114
      T     DBW    4
      SPA   ende
m003: L     DBW    2
      L     0
      >I    
      SPB   m004
      L     MW   114
      T     DBW    2
      SPA   ende

      L     DBW    8
      T     DBW   10
      L     DBW    6
      T     DBW    8
      L     DBW    4
      T     DBW    6
      L     DBW    2
      T     DBW    4
m004: L     MW   114
      T     DBW    2

ende: NOP   0
end1: U     M    113.4
      FN    M    113.5
      SPBN  end2
      L     0
      T     MW   114
end2: NOP   0
Wenn alles gefüllt ist, soll er aber nur noch Dw 2 mit dem neuen Schreibauftrag beschreiben. DW 4 soll dann den alten Wert aus DW 2 erhalten.
Wahrscheinlich ganz einfach, aber habe irgendwie den Kopf vernagelt.
Vielleicht kann ja einer die Nägel herausziehen.
Gruß bludie
 
MAl schaun ob ich Nägel ziehen kann...

Code:
m002: L     DBW    4
      L     0
      >I    
      SPB   m003
      L     MW   114
      T     DBW    4
      SPA   ende
m003: NOP 0
      
      L     MW   114
      T     DBW    2
      SPA   ende

      L     DBW    8
      T     DBW   10
      L     DBW    6
      T     DBW    8
      L     DBW    4
      T     DBW    6
      L     DBW    2
      T     DBW    4

ende: NOP   0
end1: U     M    113.4
      FN    M    113.5
      SPBN  end2
      L     0
      T     MW   114
end2: NOP   0

Da Du den Wert eigentlich immer im DBW2 ablegst, egal ob schon was drinsteht oder nicht WENN die anderen gefüllt sind brauchst Du die Marke M004 nicht mehr.

Nur Brauchst Du glaube ich noch eine Bedingung mit der Du das SR antriggerst...

griele Füße dtsclipper
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo Bludie,
ich häng mich da auch noch mal mit dran ...

Bei meinem Vorschlag bin ich von der Überlegung ausgegangen, dass schon gearbeitet werden kann, wenn sich eine Maschine in die Liste eingetragen hat.
Daraus ergibt sich dann :
1.) Ich scanne die Liste nach dem ersten Leer-Eintrag und trage dort meinen Index ein.
2.) Es arbeitet immer die Station am Anfang der Liste.
3.) hat die Station zu Ende gearbeitet, so trägt sie sich aus der Liste aus. Dies geschieht dann durch "herunterschieben" der Liste.

Weiterhin habe ich angenommen, dass eine Station sich nicht noch einmal in die Liste eintragen kann, wenn sie sich schon eingetragen hat.
Ergo benötigst du genau soviele Speicherplätze, wie du Stationen hast plus 1 (den zusätzlichen, wegen dem herunterschieben der "0").

Wenn ich deinen Vorschlag richtig interpretiert habe, so beginnst du erst mit dem Arbeiten, wenn deine Liste voll ist. Außerdem startest du anscheinend mit der Station am Ende der Liste.
Willst du das auch so, oder ist das jetzt quasi zufällig so entstanden ?

Gruß
LL
 
Nach Fertigmeldung einer Anlage soll der nächst gültige Wert ins DW 0 rutschen.

Habe mal einen Vorschlag zur Trennung von Schreiben und schieben

Code:
m002: L     DBW    4
      L     0
      >I    
      SPB   m003
      L     MW   114
      T     DBW    4
      SPA   ende
m003: NOP 0
      
      L     MW   114
      T     DBW    2
      SPA   ende

ende: NOP   0
end1: U     M    113.4
      FN    M    113.5
      SPBN  end2
      L     0
      T     MW   114
end2: NOP   0

// Registersteuerung

      ON #Anlage_Fertig
      O  M99.7   // Daten geschoben
SPB NoSR
      L     DBW    8
      T     DBW   10
      L     DBW    6
      T     DBW    8
      L     DBW    4
      T     DBW    6
      L     DBW    2
      T     DBW    4
      L     0
      T     DBW    2

      SET
      S M 99.7

NoSR: nop 0

      UN #Anlage_fertig
      R  M99.7

Hoffentlich kann ich damit weiterhelfen...

dtsclipper
 
Danke erstmal an dtsclippe.
Zu larry:
Mit dem Arbeiten beginne ich schon mit dem ersten Eintrag. Nur soll der 1. eintrag, der ja dann der aktuellste ist in einem DWx stehen. Die nächste Eintragung soll dann im DBx +2 stehen usw.
Nach jeder Fertigmeldung sollen dann die Werte ein DW aufrücken,so das in der Reihenfolge der Anmeldung immer der Aktuellste Wert im DBx steht:
z.B: Wert 1= Dbx8.0= Stat.1 dran
Wert 2= Dbx8.1= Stat.2 dran
Wert 4= Dbx8.2= Stat.3 dran
Wert 8= Dbx8.3= Stat.4 dran
 
Zuviel Werbung?
-> Hier kostenlos registrieren
OK ... dann meinen wir beide das Gleiche ... :p
Dann sähe meine Lösung dazu so aus :
Code:
U #Station_fertig_gearbeitet
UN #FM_Schieben_OK 
spbn Ende
 
L DBW4
T DBW2
L DBW6
T DBW4
L DBW8
T DBW6
L DBW10
T DBW8
L 0
T DBW10
 
Ende: 
U #Station_fertig_gearbeitet
= #FM_Schieben_OK
Arbeiten würde nun selbstverständlich die Station deren Index in DBw2 steht ...

Gruß
LL
 
Zurück
Oben