# 128 binäre Ausgänge taktzeitökonomisch verknüpfen?



## Olav (12 August 2005)

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


----------



## Unreal (25 August 2005)

Servus,

Ich muß jetzt mal ganz blöd fragen:
wenn ich dich richtig verstanden habe kommen die Ausgänge je nach 
Rezeptur zu einem unterschiedlichen Zeitpunkt bzw. es werden andere
Ausgänge aktiv zu diesem Zeitpunkt???

1.Kommst du mit deiner Anzahl von SPS-Ausgängen hin oder soll diese 
erhöht werden???

2.Welche Verbraucher mußt du schalten??

3. Wolltest du das Ganze mit einem (oder mehreren) Zähler lösen
(SPS-intern), welche dann die einzelnen Ausgänge oder Ausgangsgruppen 
einschalten???

4. müssen alle Ausgänge gleichzeitg gesetzt bzw. rückgesetzt werden???

Ich habe da auch mal was in diese Richtung gehend programmiert.
Damals habe ich das gelöst, indem ich eine SPS-interne Taktzeit für alle
Funktionen generiert habe und alle Ausgänge über Zähler an versch. 
Zeitpunkten (Zählerständen) ein- oder ausgeschaltet habe. (ganz einfach
gesprochen).

MfG Unreal


----------



## Olav (26 August 2005)

Hallo, Unreal!

Danke erstmal für Deine Antwort!



> wenn ich dich richtig verstanden habe kommen die Ausgänge je nach
> Rezeptur zu einem unterschiedlichen Zeitpunkt bzw. es werden andere
> Ausgänge aktiv zu diesem Zeitpunkt???



Also, ich habe etwa 20 FB`s, welche jeweils ein Wort oder Doppelwort (16 bzw. 32 Ausgänge) in einem "Sammel-DB" ablegen. Es geht also darum, aus etwa 10 16-bit-Worten und 10 32-bit-Worten ein Ausgangsabbild für 7 Ventilinseln a 16 Ventilen zu "basteln".

Das Blöde ich, daß die Bitfolgen nicht die "realen" Ausgänge abbilden, sondern z.B. das Bit 3 des FB 12 den Ausgang A12.0 ansteuern soll, das Bit 4 desselben FB aber dem Ausgang A8.4 zugeordnet ist. 

Weiterhin kann dasselbe Ventil durchaus von zwei oder mehr FB`s angesprochen werden, wobei im optimalen Fall eine Konrolle realisiert werden müßte, on ein Ventil "widersprüchliche" Anweisungen bekommt. Bei "simpler" Oder-Verknüpfung aller Ausgänge hat eben ein Setzbefehl Vorrang vor einem Rücksetzbefehl, der dann ja ignoriert wird. Eigentlich muß ich jeden Ausgang wowohl UND- als auch ODER-verknüpfen und dann schauen ob dasselbe rauskommt... 
Und da ich jetzt schon 70% meines Arbeitsspeichers belegt habe und mir noch einige Funktionen fehlen, darf der Baustein möglichst nicht größer als 10kB werden... 




> 1.Kommst du mit deiner Anzahl von SPS-Ausgängen hin oder soll diese
> erhöht werden???



Das reicht mir schon, so viel ist es ja nicht. Außerdem hängen die Ausgänge eh an Profibus DP



> 2.Welche Verbraucher mußt du schalten??



Ventilinseln und Freigabe für zwei Servomotoren



> 3. Wolltest du das Ganze mit einem (oder mehreren) Zähler lösen
> (SPS-intern), welche dann die einzelnen Ausgänge oder Ausgangsgruppen
> einschalten???



Nö, ich habe das mittels Taktmerkerbyte 0 (f=10Hz) und Zählern für jeden FB gelöst. Der Bereich "vor" meinem Verknüpfungsbaustein steht soweit und funzt!



> 4. müssen alle Ausgänge gleichzeitg gesetzt bzw. rückgesetzt werden???



Nein, nur die Ausgänge der einzelnen FB`s sollten gleichzeitig kommen



> Ich habe da auch mal was in diese Richtung gehend programmiert.
> Damals habe ich das gelöst, indem ich eine SPS-interne Taktzeit für alle
> Funktionen generiert habe und alle Ausgänge über Zähler an versch.
> Zeitpunkten (Zählerständen) ein- oder ausgeschaltet habe. (ganz einfach
> gesprochen).



Wie gesagt, das meiste "vor" der Verknüpfung ist schon realisiert bzw. im Groben projektiert... Deine Lösung geht wohl nicht, da ich die Ein- und Ausschaltzeiten sowie Intervalltakte für die Ausgänge über ein MP370 projektieren muß. das wird dann übrigens auch noch einigen Spaß bringen... Außerdem habe ich eh nur 64 Zähler, aber über 100 Ausgangsbits!

Wenn`s einfach wäre, könnt`s ja jeder... 

Schönes Wochenende!

Olav[/quote]


----------



## kpeter (29 August 2005)

so jetzt muss ich dumm fragen wass wilslt du machen

du hast 10 x 16 ausgänge
und      10 x 32 ausgänge

die willst du auf 120 ausgänge schalten ok?

Wieso willst du das ganze mit setzen rücksetzen machen 
Mach doch nur eine oder Verküpfung aller infragekommender Ausgänge deine FC's oder FB's.

womit sollte das ganze nicht allzu lang sein.

oder ich hab das ganze falsch verstanden.


----------



## Olav (29 August 2005)

Hallo!



> du hast 10 x 16 ausgänge
> und 10 x 32 ausgänge



Jo!



> die willst du auf 120 ausgänge schalten ok?



Jo!



> Wieso willst du das ganze mit setzen rücksetzen machen
> Mach doch nur eine oder Verküpfung aller infragekommender Ausgänge deine FC's oder FB's.



Beides ist prinzipiell gleich "schlecht", weil:

Jede Funktion bekommt sozusagen "Zugriff" auf 16 bzw. 32 Ausgänge, die für diese Funktion irgendwann im Ablauf relevant sind. Hierbei gibt es, wie schon geschrieben, prinzipiell drei mögliche Zustände, die ein Ausgang annehmen kann:

- muß true sein
- muß false sein
- ist (in dem aktuellen Schritt!) egal

Der Anlagen-Inbetriebnehmer bzw. Technologie-"Spezialist" kann die jeweils zugeordneten Ausgänge im jeweiligen Zyklus frei setzen und rücksetzen.

Daher kann es bei fehlerhafter Konfiguration passieren, daß ein physikalischer Ausgang von der einen Funktion gesetzt wird, aber für eine andere Funktion "false" sein muß!

Daher suche ich eine vernünftige Lösung, dies zu verhindern bzw. zumindest diese Fehlkonfiguration zu erkennen und zu melden...

Ich weiß, das geht mit einem einzigen  Bit pro Ausgang gar  nicht, weil ich damit nur zwei Zustände darstellen kann. Also brauche ich jeweils zwei Bit pro Ausgang: Das erste ist "normal false" und wird nur dann gesetzt, wenn er Ausgang "true" sein muß, das zweite ist "normal true" ist nur dann false, wenn der Ausgang "false" sein muß. Wenn ich dann die jeweils "ersten" Bits eines jeden Ausgangs ODER-verknüpfe und die jeweils beiden "zweiten" Bits desAusgangs "UND"-verknüpfe, bekomme ich nur dann dasselbe Ergebnis, wenn es keine Widersprüche gibt...

Aber das ist bei der besagten Anzahl von Ausgängen eine "unendliche" Menge von Verknüpfungen, daher werde ich das wohl eh seinlassen und dem Inbetriebnehmer vertrauen müssen...



> Somit sollte das ganze nicht allzu lang sein.



Na ja, rechnen wer ma:



Etwa 100 Ausgänge sind dann schon mal 100 Netzwerke.
10 mal 16 bit und 10 mal 32 bit sind 480 einzelne Bits, gibt "im Schnitt" 5 "Oder"-Verknüpfungen pro Ausgang. Somit sind wir bei 500 binären Operationen und 100 Zuweisungen. Für `ne SPS eigentlich nicht viel, aber das ist ja "nur" ein relativ kleiner "Baustein" meiner Programms.  Ich denke mal, daß da schon wieder 2 bis 3 kB meiner verbleibenden 15 kB "Rest-Arbeitsspeicher" bei draufgehen. Aber eine andere Möglichkeit sehe ich bei der absolut "verkorksten" Aufteilung meiner Ausgänge nicht. Wenn die wenigstens halbwegs "geordnet" vergeben worden wären, könnte ich mir ja mit Wort-Opeationen helfen, aber so...

Sehe schon, ich werde nicht drumrum kommen, es per einzelnen Zuweisungen zu lösen!

Trotzdem erstmal Danke für die Antwort!

Gruß, Olav[/quote]


----------



## kpeter (29 August 2005)

ok machen wir uns mal langsam an die arbeit

wie komme deine bits aus deinen bausteinen raus 

auch kraut und rüben durcheinander

wenn ja dann hast du ein problem

wenn nein ....


gehen wir mal davon aus das deine bausteine die richtigen werte liefern dann kannst du alles einfach oder verknüpfen weil es dir ja egal sein kann wenn der eine sagt ein der andere sagt aus.

entweder die wollen denn sch...s so oder es ist ein fehler in der projektierung.

aber ich versteh das problem einfach noch nicht richtig

bist du sicher das du nicht einenen denkfehler weiter oben hast und du kannst das ganze nicht ganz anders lösen.


----------

