Nach Kritik mal was konstruktives
Hallo,
mein Vorschlag zur Lösung Deines Problems (jedenfalls so, wie ich es von Anfang an programmiert hätte) :
Rufe alle Read/Write Aufträge zyklisch auf. Lege ein Merkerwort für alle "REQ" fest., z.B. MW 100 und ordne die Bits wie folgt zu :
Bit 0 = REQ für Ix122.Read_Req
Bit 1 = REQ für Ix123.Read_Req
Bit 2 = Req für Ix133.Write_Req und so weiter ....
Lege ein zweites MW für einen Schiebtakt fest, z.B. MW 102
Setze dieses Merkerwort 102 bei Neustart der CPU auf $0001 (hex)
Wenn M102.0 = "1" dann setze M 100.0 --> "1"
Dadurch wird Auftrag Ix122 bearbeitet.
Wenn Ix122 Done oder Error, schiebe das Merkerwort 102 mit SLW 1 nach links.
Wenn M102.1 = "1" dann setze M 100.1 --> "1"
Dadurch wird Auftrag Ix123 bearbeitet.
Wenn Ix123 Done oder Error, schiebe das Merkerwort 102 mit SLW 1 nach links.
und so weiter ....
Die Bits im MW 100 werden von den "Read" und "Write" Bausteinen sowieso gelöscht, darum brauchst Du dich nicht zu kümmern.
Sagen wir mal, du hast 10 Aufträge (bin zu faul um nachzuzählen
). Dann vergleichst Du Dein Merkerwort nach dem letzten Auftrag (Ix12x) mit der Maske $0200 (hex) und setzt das MW 102 wieder auf $0001 (hex) und das ganze geht wieder von vorne los.
Dadurch ist gewährleistet, dass immer nur ein Auftrag gleichzeitig bearbeitet wird
und auch abgeschlossen ist, bevor der nächste angestossen wird.
Mach das so und es wird funktionieren, aber programmieren darfst Du das selber
Der Vorteil ist dabei, egal was passiert mit den Read/Write Aufträgen, diese Abfolge kriegst Du nicht aus dem Tritt, kann sich nicht aufhängen und läuft sicher durch solange die CPU im RUN-Modus ist.
Gruß
Question_mark