Step 7 InOut im FC - Werte direkt bearbeiten

Techm3ch

Level-2
Beiträge
65
Reaktionspunkte
2
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo zusammen,

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?

Besten Gruß,
Nate
 
Da fällt mir nur ein, entweder einen FB daraus zumachen oder zusätzliche InOut zu vereinbaren (kann ja auch ein Word sein, das hat ja schließlich 16 Bit und der Zugriff ist mit .%Xyy möglich), die mit Variablen aus einem DB versorgt werden.
Ein FB wäre sicher gerade für eine Bibliothek die solidere Lösung.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
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?
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 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...
 
FB 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.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Ich 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...
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ückt
 
FB 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.
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ürde
 
... mein Chef wünscht sich einen Bibliotheksfähigen Baustein der diese Funktion übernimmt und nur mit einem Word von außen gespeist werden muss.
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.
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.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
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 ...
 
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.
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.
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 bringt
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 ...
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.

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
 
Zuviel Werbung?
-> Hier kostenlos registrieren
in einem DB in einer gut organsierten und beschrifteten Tabelle
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.
 
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 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.
 
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.
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.
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.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
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.
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.
oh stimmt, das ist ein durchaus reelles problem in dieser anlage. danke für den hinweis

gut ja, ich hatte eigentlich geplant das es solide funktioniert aber da gibts natürlich keine garantie für :ROFLMAO:

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
 
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
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 ...
 
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 ...
etwas bezahlen würde ich auch, aber kann grad keine hunderte ausgeben, das mit dem buch klingt aufjedenfall schonmal sehr gut, danke!
alles klar, dann werde ich weiterhin meine fragen hier stellen, gibt davon viele, da so einiges noch unklar ist. bin autodidaktisch unterwegs aber nicht besonders gut darin :')
 
Zuviel Werbung?
-> Hier kostenlos registrieren
der 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.
 
der 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.
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ündeln
 
Zurück
Oben