Das die Variablen eines FC ihre Werte nicht nach der Ausführung behalten ist Dir aber bewusst, du müsstest Die Rückgabewerte direkt beim Aufruf verarbeiten.ich versuche momentan einen Bibliotheksfähigen FC zu erstellen. Ich habe 17 x InOut im FC deklariert, 1 x Word und 16 x Bool. Mein Ziel ist es an den Wordeingang von außen einen Wert zu übertragen. z.B. 16#471B, die Bool zeigen mir mit einer internen Logik die einzelnen Bits an.
Jetzt wünsche ich mir diese Bits im FC manipulieren zu können, die Änderung soll dann an den Word übertragen werden. Also praktisch eine Kommunikation in beide Richtungen. Es handelt sich um eine bitgesteuerte Anlage die über bits mir den Zustand anzeigt. z.b. Bit 0 bedeutet die Anlage produziert gerade, wenn ich Bit 10 auf 1 setze wird die Produktion pausiert und die Anlage stoppt.
Ich konnte die Funktion über einen FB mit DB realisieren, mein Chef wünscht sich einen Bibliotheksfähigen Baustein der diese Funktion übernimmt und nur mit einem Word von außen gespeist werden muss. Ich komme aber nicht weiter, ist das überhaupt möglich?
beim fb gehen die infos zuerst an einen db und werden auch nicht an der gleichen stelle wieder zurück gegeben, es gibt praktisch einen In und einen seperaten out, ich hab mich da bisschen schwammig ausgedrücktIch verstehe das nicht so 100%ig. Mit InOut kannst Du doch grundsätzlich dann schon in beide Richtungen agieren.
Aber die Beschaltung ist ja entweder lesend oder schreibend. Du willst also im Baustein erkennen, ob die Bools manipuliert sind?
Das stelle ich mir schwierig vor. Du kannst zwar die Bool gegen den Word vergleichen, aber woher weißt Du, daß das nicht einfach der "alte" Zustand der Variablen ist?
Vielleicht kannst Du einen "Umschalter" an den Baustein machen: True = Bool werden auf Word geschrieben, False = Word wird auf Bool geschrieben.
Wie hast Du das denn im FB realisiert? Zeig doch mal...
ja, das stimmt, da muss ich natürlich drauf achten, ich hatte schon die vermutung das es nur über einen FC nicht so ganz funktionieren würdeFB finde ich auch besser, du wirst ja 2 Flanken benötigen wegen der Konvertierungsrichtung (Word geändert bzw. irgend ein bool geändert). Dafür brauchst du ja noch stat Variabalen (FB) oder InOut Variablen (FC). Das spart dir einen Umschalter.
Du muss dann allerdings bei einer erkannten Flanke die Altwerte für die Flankenerkennung auch in den jeweiligen anderen Bereich kopieren, damit das Spiel bei einer Datenänderung nicht ewig hin und her geht.
Mir würde da ein FC vorschweben, der vier AufrufParameter hat (Wort als InOut, als Input BitNr und CodeNr für Auftrag und BOOL BitWert für Zuweisung) und 1 ReturnValue.... mein Chef wünscht sich einen Bibliotheksfähigen Baustein der diese Funktion übernimmt und nur mit einem Word von außen gespeist werden muss.
ok , ich bin mir nicht sicher ob ich das vollständig verstanden habe aber würde versuchen das umzusetzen und dann sehen ob es mich näher bringtMir würde da ein FC vorschweben, der vier AufrufParameter hat (Wort als InOut, als Input BitNr und CodeNr für Auftrag und BOOL BitWert für Zuweisung) und 1 ReturnValue.
BitNr, INT, 0..15
CodeNr, INT, 0..?
AuftragsCodes:
0: Bit lesen,
1: Bit setzen,
2: Bit rücksetzen,
3: Bit zuweisen (":= BitWert"),
4: Bit invertieren,
(ggfs bei Bedarf noch weitere Funktionen?)
Jeder Aufruf des FC ...
- kann maximal 1 Bit (das per 'BitNr' spezifizierte) lesen bzw. verändern
- liest das Wort und schreibt es nach Veränderung zurück
- ReturnValue ist der Zustand des veränderten Bits bzw. bei "nur Lesen" der unveränderte Zustand.
Eine FlankenErkennung ist NICHT Bestandteil der Funktion.
geplant ist das man den Baustein in seine Steuerung kopiert und an dem WortIn(Out) mit einer Variable verbindet.(soll möglichst unkompliziert und modular ablaufen) Es wird in den meisten fällen bereits eine Zahl an dieser Variable anliegen, denn die Anlage meldet dort z.B. den Status, selbst wenn die Anlage nicht läuft hat sie einen bestimmten Status der z.b. 16#471B lauten könnte. Der Nutzer kann damit nichts anfangen, also soll jedes Bit und die damit verbundene Funktion mit einem klarnamen in verbindung gebracht werden. Wenn der Nutzer dann die klarnamen hat und sich entscheidet bit 2 von FALSE auf TRUE zu setzen dann wird das in das Wort konvertiert und an die Anlage zurückgemeldet. Falls die Anlage den Status ändert wird das dann an der gleichen Stelle angezeigt. Also soll in die Richtung In zu Out zu In umgewandelt werden.Unabhängig von FB oder FC - ohne eine Befehlsvariable wird es nicht gehen.
Hättest du einen FB dann kannst du zwar vergleichen ob sich der aktuelle Wert zum Vorgänger geändert hat - was aber ist am Anfang ? Da passen sowohl deine Bits (sehr sehr wahrscheinlich) nicht zum Word und natürlich umgekehrt genauso - in welche Richtung soll nun gewandelt werden ?
Die Funktion ansich ist simpel und mit einer IN-Variablen, die angibt wer zu wem zu wandeln ist auch lösbar - anders aber nicht ...
Das. Immer bedenken, dass Instandhalter zB nicht die Zeit haben sich durch tausende Hierachien zu klicken.. den Weg rückwärts über Datenbausteine gehen ist dahingehend einfacher zu verstehen was Abhängigkeiten betrifft, finde ich.in einem DB in einer gut organsierten und beschrifteten Tabelle
Das kommt aus meiner Sicht immer auf die Aufgabe an - ich persönlich bin ein Freund vom Kapseln der Funktionen - das hiesse dann also einen FC oder FB. Werden, wie in diesem Beispiel, die Bits irgendwo anders im Programm wieter verwendet dann würde es sich anbieten hierfür Merker oder einen Datenbaustein zu nehmen - Querzugriffe auf die Instanzdaten eines FB's innerhalb des Programms finde ich persönlich nicht so schön - ist aber Geschmackssache ... Etwas Anderes wäre es aber, wenn die HMI darauf zugreift - da habe ich schon des öfteren im Datenbereich meines FB einen Bereich "Visu" angelegt wo dann die Dinge für die HMI bereitgestellt worden sind. Aber auch das macht am Ende wieder jeder so wie es meint - WICHTIG ist es aber, gerade für die Instandhaltung, dass die Variablen GENERELL vernünftig benannt sind.Aber mal ne ganz andere Frage: was ist schöner um Werte bereitzustellen damit man diese an anderer Stelle weiterverwendet: in einem DB in einer gut organsierten und beschrifteten Tabelle oder in mehreren FBs und FCs bei dem man dann die OUTs mit dem verbindet wo man die Variablen braucht
Das ist doch eigentlich die klassische Anwendung "Statuswort" und "Kontrollwort". Die können ja durchaus gleich aufgebaut sein. Aber ich würde sicherlich ungerne mit einem Wort arbeiten, welches Status und Kontrolle gleichzeitig abbildet.geplant ist das man den Baustein in seine Steuerung kopiert und an dem WortIn(Out) mit einer Variable verbindet.(soll möglichst unkompliziert und modular ablaufen) Es wird in den meisten fällen bereits eine Zahl an dieser Variable anliegen, denn die Anlage meldet dort z.B. den Status, selbst wenn die Anlage nicht läuft hat sie einen bestimmten Status der z.b. 16#471B lauten könnte. Der Nutzer kann damit nichts anfangen, also soll jedes Bit und die damit verbundene Funktion mit einem klarnamen in verbindung gebracht werden. Wenn der Nutzer dann die klarnamen hat und sich entscheidet bit 2 von FALSE auf TRUE zu setzen dann wird das in das Wort konvertiert und an die Anlage zurückgemeldet. Falls die Anlage den Status ändert wird das dann an der gleichen Stelle angezeigt. Also soll in die Richtung In zu Out zu In umgewandelt werden.
oh stimmt, das ist ein durchaus reelles problem in dieser anlage. danke für den hinweisDas ist doch eigentlich die klassische Anwendung "Statuswort" und "Kontrollwort". Die können ja durchaus gleich aufgebaut sein. Aber ich würde sicherlich ungerne mit einem Wort arbeiten, welches Status und Kontrolle gleichzeitig abbildet.
Denn: Irgendwo mußt Du dann ja sowieso Flanken bilden, um die Befehle zu starten. Und außerdem können ggf. Zustände auftreten, in denen dann ein Status ausgegeben wird, der überhaupt nicht anliegt (einfaches Beispiel: Befehl gesetzt (= Status), aber Befehl kann aufgrund Fehler nicht ausgeführt werden.) Ich würde einen Status immer erst setzen, wenn er auch tatsächlich vorhanden ist.
So, und wenn Du das in zwei Wörter trennst, kannst Du auch den Wandler entweder in zwei FCs aufteilen (WordToBits und BitsToWord) oder eben mit einem Schalter außen die Funktion umschalten.
Ich würde das nicht in einem Wort vereinen und dann nach irgendwelchen Logiken frei hin- und her konvertieren.
Um in dem Zusammenhang dann nochmal die Wartbarkeit und somit die Instandhaltung mit einzubeziehen: Wie willst Du denn das nachvollziehen, woher ein Befehl kommt, wenn plötzlich die Maschine spinnt? Keiner weiß, ob die Befehle nun aus den Bits, aus dem Wort oder von irgendwo quergeschossen kommen, wenn da ein Baustein plötzlich in beide Richtungen spielen kann.
Einen Guide für Nothing, der etwas taugt, kann ich mir nicht so recht vorstellen.mir fehlt die erfahrung für sowas, kannst du einen guide zur sps programmierung empfehlen (auch in englisch) ? die meisten sachen die ich gefunden habe waren kostenpflichtig oder nicht hilfreich
etwas bezahlen würde ich auch, aber kann grad keine hunderte ausgeben, das mit dem buch klingt aufjedenfall schonmal sehr gut, danke!Einen Guide für Nothing, der etwas taugt, kann ich mir nicht so recht vorstellen.
Es gibt von einem unserer Forums-Mitglieder zu dem Thema ein verfasstes Buch (SPS für Dummies - wobei du den namen nicht sooo ernst nehmen solltest).
Aber ... es gibt ja auch noch dieses Forum - und zu konkreten Fragen wirst du auch immer brauchbare Antworten erhalten ...
sind 16 meldungen, hab das momentan so: 1xFC mit 16xOutputs und 1xInOutput, [Var1] geht in den InOut [WordIn], als nächstes habe ich 16 Netzwerke die auf [WordIn] (den InOut des FC Bausteins) über Slice zugreifen und die Bits an die 16xOutputs verteilen, die 16 Out haben alle einen Namen die zu meiner Statusmeldung passt und werden mit dem jeweiligen Bit intern verknüpft. Man könnte jetzt 16 Variablen anlegen und die an der Stelle abgreifen. Bin momentan aber noch am überlegen das einfach alles in einem DB zu bündelnder FB (FC) soll also Störmeldungen ausgeben.
Um wie viele Meldungen handelt es sich denn < oder > 8?
bei </ würde ich da einfach 8 Bool Ausgänge machen und die sogar händisch einem Störmelde DB zuordnen
Das ist zwar ein bisschen mehr Aufwand, der Instandhalter wird sich aber freuen wenn er Online ist und gleich sieht was da als STOE rauskommt.
Wenn es mehrere sind, dann direkt über Word / DW in DB schreiben und den entsprechend aufbauen das hier Klartext steht. Beides kann man auch gleich super für die HMI verwenden.
We use cookies and similar technologies for the following purposes:
Do you accept cookies and these technologies?
We use cookies and similar technologies for the following purposes:
Do you accept cookies and these technologies?