-> Hier kostenlos registrieren
Hallo, Spezialisten!
Ich habe ein Programm zu programmieren, bei dem etwa 120 digitale Ausgänge anzusteuern sind. Dabei habe ich folgende Problematik:
Ich habe etwa 20 verschiedene Funktionen, die nahezu unabhängig voneinander diese 120 Ausgänge ansteuern können müssen. Wann welcher Ausgang kommen soll, ist durch "Rezepturen" auf dem Bedienpanel festgelegt, wobei die jeder Funktion zugewiesenen 64 Ausgänge zeitlich und in allen möglichen Kombinationen frei programmierbar sind. Im Programmablauf sind auch mehrere dieser Funktionen gleichzeitig aktiv.
Jede Funktion hat einen 2 DWORD (64 bit) breiten Ausgang, wobei die Zuordnung der Funktionsausgänge zu den physikalischen Ausgängen bei jeder Funktion anders ist (Da ich die Ausgänge zeitabhängig takten muß, muß ich das so lösen, um meine Rezepturen nicht "unendlich" aufzublasen!, Pro Rezept 7DWORD mal 20 Funktionen mal 26 Zeitschritte wären 15kB pro Rezeptur... So sind es "nur" 4,5kB).
Die Ausgänge der Funktionen will ich nun in einen globalen DB schreiben, welcher von einem anderen FB ausgewertet wird. Dieser soll
- die 2 DWORD pro Funktion auf die physikalischen Adressen abbilden
- aus diesen Informationen mein Ausgangsabbild der physikalischen Ausgänge erstellen
- nach Möglichkeit widersprüchliche Befehle erkennen und einen Fehler ausgeben.
Im Prinzip brauche ich hier eine dreiwertige Logik, da jeder Ausgang aus Sicht der Funktionen drei Zustände annehmen kann:
1. Ausgang MUSS gesetzt werden
2. Ausgang MUSS rückgesetzt werden
3. Ausgang ist für die Funktion aktuell egal
Um das zweiwertig zu lösen, brauche ich statt zwei ganze vier DWORD pro Funktion, denke ich: Einmal setze ich alle "don`t care" NULL und mache eine UND-Verknüfpung der as auf die physikalischen Adressen gemappten Bits, um die Setzausgänge zu erhalten, dann setze ich alle "don`t care" EINS, und erhalte mit einer ODER-Verknüpfung alle Rücksetzausgänge. Wenn die beiden Ergebnisse EXOR-verknüpft Null ergeben, habe ich keine logischen Widersprüche und die Sache ist ok.
Theoretisch ist das ein möglicher Weg, allerdings habe ich dann folgenden Weg vor mir:
- Jedes DWORD aller aktiven Funktionen mappen: je Funktion 128
Bitoperationen (4x32)
- Alle DWORD-UND-Verknüpfungen durchführen
- Alle DWORD-ODER-Verknüpfungen durchführen
- Konsistenz prüfen
- Ausgangsfeld schreiben
Da ich das ja bei jedem Zyklus machen muß, befürchte ich, daß ich da ellenlange Zykluszeiten bekomme...
Daher meine Frage:
KENNT JEMAND EINEN BESSEREN WEG?
Ich hoffe, man kann meine Problematik einigermaßen verstehen und wäre dankbar für jeden Tip/Hinweis!
Ein schönes Wochenende!
Gruß,
Olav
Ich habe ein Programm zu programmieren, bei dem etwa 120 digitale Ausgänge anzusteuern sind. Dabei habe ich folgende Problematik:
Ich habe etwa 20 verschiedene Funktionen, die nahezu unabhängig voneinander diese 120 Ausgänge ansteuern können müssen. Wann welcher Ausgang kommen soll, ist durch "Rezepturen" auf dem Bedienpanel festgelegt, wobei die jeder Funktion zugewiesenen 64 Ausgänge zeitlich und in allen möglichen Kombinationen frei programmierbar sind. Im Programmablauf sind auch mehrere dieser Funktionen gleichzeitig aktiv.
Jede Funktion hat einen 2 DWORD (64 bit) breiten Ausgang, wobei die Zuordnung der Funktionsausgänge zu den physikalischen Ausgängen bei jeder Funktion anders ist (Da ich die Ausgänge zeitabhängig takten muß, muß ich das so lösen, um meine Rezepturen nicht "unendlich" aufzublasen!, Pro Rezept 7DWORD mal 20 Funktionen mal 26 Zeitschritte wären 15kB pro Rezeptur... So sind es "nur" 4,5kB).
Die Ausgänge der Funktionen will ich nun in einen globalen DB schreiben, welcher von einem anderen FB ausgewertet wird. Dieser soll
- die 2 DWORD pro Funktion auf die physikalischen Adressen abbilden
- aus diesen Informationen mein Ausgangsabbild der physikalischen Ausgänge erstellen
- nach Möglichkeit widersprüchliche Befehle erkennen und einen Fehler ausgeben.
Im Prinzip brauche ich hier eine dreiwertige Logik, da jeder Ausgang aus Sicht der Funktionen drei Zustände annehmen kann:
1. Ausgang MUSS gesetzt werden
2. Ausgang MUSS rückgesetzt werden
3. Ausgang ist für die Funktion aktuell egal
Um das zweiwertig zu lösen, brauche ich statt zwei ganze vier DWORD pro Funktion, denke ich: Einmal setze ich alle "don`t care" NULL und mache eine UND-Verknüfpung der as auf die physikalischen Adressen gemappten Bits, um die Setzausgänge zu erhalten, dann setze ich alle "don`t care" EINS, und erhalte mit einer ODER-Verknüpfung alle Rücksetzausgänge. Wenn die beiden Ergebnisse EXOR-verknüpft Null ergeben, habe ich keine logischen Widersprüche und die Sache ist ok.
Theoretisch ist das ein möglicher Weg, allerdings habe ich dann folgenden Weg vor mir:
- Jedes DWORD aller aktiven Funktionen mappen: je Funktion 128
Bitoperationen (4x32)
- Alle DWORD-UND-Verknüpfungen durchführen
- Alle DWORD-ODER-Verknüpfungen durchführen
- Konsistenz prüfen
- Ausgangsfeld schreiben
Da ich das ja bei jedem Zyklus machen muß, befürchte ich, daß ich da ellenlange Zykluszeiten bekomme...
Daher meine Frage:
KENNT JEMAND EINEN BESSEREN WEG?
Ich hoffe, man kann meine Problematik einigermaßen verstehen und wäre dankbar für jeden Tip/Hinweis!
Ein schönes Wochenende!
Gruß,
Olav