Step 7 FC aufruf klappt nicht

Zuviel Werbung?
-> Hier kostenlos registrieren
Du sollst doch nicht im FC auf globale Merker zugreifen!
Den M2000.1 kannst Du als VAR_INPUT übergeben.
Das Zuweisen des #Fehler an M2000.0 hat meiner Meinung nach nichts mit der Funktion des (mehrfach aufgerufenen!) FC zu tun und sollte außerhalb des FC realisiert werden.

Harald
 
Hallo Harald,
das mit den globalen Merkern hab ich mir gemerkt. Allerdings wollte ich den Merker nicht 40 mal an den FC dran schreiben und mir so die Arbeit sparen.
Das was du mir genannt hast, mit VAR_INPUT den Merker zu übergeben, dann müsste ich ihn doch jedesmal dran schreiben oder?
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Ja, jedes mal übergeben. Aber nur so machst Du den Baustein wiederverwendbar und unabhängig von den Adressen globaler Variablen. Wer soll sich die ganzen undokumentierten Zugriffe auf globale Variablen merken? Glaube mir, professionell programmiert man so nicht.

Nächstens fragst Du noch, daß es Dir zu viel Arbeit ist den FC 40 mal aufzurufen ... ;)

Harald
 
Das mit dem wiederverwenden des Baustein macht natürlich wieder Sinn. Hab die Merker jetzt an der Schnittstelle übergeben.
Ist es denn ok vergleicher zahlen (vergleiche auf 3) im fc zu programmeiren oder sollte man die Zahl auch übergeben?
 
Das kommt drauf an, ob du immer nur auf 3 Vergleichen willst.

Wenn du z.B. diese Zahl auch an den FC übergibst könnte der FC zwei beliebige Zahlen vergleichen. Du könntest diese etwa aus einer Visualisierung übergeben, falls etwa in der Zukunft der Wert auf etwa 5 gesteigert werden soll und nicht extra ein Programmierer gerufen werden soll der nur diesen einen FC ändert.

Sowas kann manchmal Stundenlange Anfahrt sparen.
Und bevor jemand meckert, natürlich krieg ich für die Anfahrt Geld wenn der Kunde sich umentscheidet, aber ich hab auch besseres zu tun als mich Stundenlang hinters Steuer zu quetschen.

Ich muss aber noch anmerken, dass du dir das Leben wesentlich einfacher machen würdest, wenn du einen FB bauen würdest und ihn dann als Multiinstanz aufrufst.
 
Zuletzt bearbeitet:
Im Grunde genommen hättest Du im FB den selben Code, Du könntest aber ein paar INOUT stattdessen als STAT anlegen, nämlich alle, die Du nur deshalb herausführst, damit sie im nächsten Zyklus noch ihren Wert haben, in Deinem Fall also #DB_Zaehlen und #FlankeP. Ich weiß nicht, ob ich tatsächlich wegen 2 statischer Variablen aus dem FC einen FB machen würde. Der Ersparnis an der Schnittstelle steht der zusätzliche Speicherverbrauch durch die (oder den) IDB entgegen. Ich wäge das immer ein Bisschen ab. Wenn Du mehr INOUT-Variablen im Baustein hättest, die Du zu statischen Variablen machen kannst, würde ich Dir aber auch immer zu FBs raten.
 
Hier ein beispiel mit FB's In FB150 wurde 16 kreisse beobachtet via indirecte adressierung in ein LOOP , wieter wurde die Fehlerbits umrangiert (bytes wurde gewechselt) so dass Die erste melding ins HMI auch die erste fehelr ist) In FB140 wurde FB150 4 x wie INSTANDS aufgeruffen.
Die HMI fehler Meldungen wurde nach output von FB140kopieert. Wieter an output Dass sammelfehler bit und via INput dass max anzahl fehlers (standard=3) und dass Bit fur ventielpruffung eingelesen. IN FC 140 wurde FB140 mit DB140 aufgeruffen.

Ins 2e bloch habe ich mit ein paar Merkers ein pruff gemacht auf kreis 6 (Merker noch da)

Die code ist Zu gross um direkt zu posten in beilage ein archieve von programm

Anhang anzeigen Test_ube.zip

gruss Joop.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Ich sehe erstmal wegen dem Speicherplatz kein Problem. Ich habe zwar schon Programme gesehen die alles brauchten was die SPS hatte, aber in der Regel ist da etwas Speicherplatz frei.
Natürlich hat es auch Nutzen diese Variablen nach außen zu führen, denn sie sind dann außerhalb des Bausteins verfügbar, was ohne Verstoß gegen bestimmte Etiquetten nicht machbar ist.

An sich hab ich das mit der Laufvariable an InOut auch schon gemacht. Z.B. als Abfrage an andere Bausteine die bei einer Übereinstimmung der Laufvariable mit ihrem Index etwas tun, wie z.B. Daten senden oder ähnliches.

In meiner Firma gibt es ein paar Grundregeln nach denen wir Programmieren müssen, z.B. kein direkter DB Zugriff in einem Baustein der andere Funktionen erfüllt als andere Bausteine aufzurufen.
DB Variablen müssen z.B. über Ein und Ausgänge an den Baustein übergeben werden und Zugriffe auf Instanzdatenbaustein- Variablen in einem anderen Baustein als dem FB zu dem er gehört sind komplett verboten, etc, etc.

So kommt man dann um die Herausgabe über Ein und Ausgänge nicht drum rum. Besser man lernt das gleich von Anfang an und muss sich nicht mühsam dran gewöhnen wie ich es damals musste als ich von der Uni kam.
 
Erstmal vielen Dank für die ganze Hilfe.
Ich werde es jetzt erstmal bei dem Programm belassen.

Ich habe mich mal in das Thema fb und multiinstanz db eingelesen. Das erscheint mir noch etwas kompliziert. Nicht das ich die ganze Maschine lahm lege. [emoji1]
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Wenn der Fehler aufgetreten ist und der Zähler abgelaufen ist, wird doch ein Ausgang an dem FC gesetzt, oder habe ich das falsch verstanden?

Außen an den Ausgang schreibst du einen globalen Merker ran, z.B. an den ersten M700.0, an den zweiten M700.1 und an den dritten M700.2, usw. bis M701.7 am 16ten FC, falls du mehr davon hast gehts es mit M702.0 weiter.

Nach dem Aufruf der ganzen FCs erstellst du ein zusätzliches Netzwerk in dem du ein Move Befehl erstellst der MW700 in ein DBWort und MW702 in ein weiteres DBWort schreibt.

In der HMI erstellst du dann 16+ Bitmeldungen die als Trigger allesamt diese DBWörter haben.
Beachte, dass du bei der Erstellung die Bytes des Wortes vertauschen musst. Ansonsten triggert der erste Fehler die 8te Meldung.
 
Zuletzt bearbeitet:
Naja jedes mal wenn der Fehler kommt wird hoch gezählt und bei 3 Fehlern gibt es einen taktstopp und eine Fehlermeldung in den db. Ich muss also nur das dbw im hmi auslesen wie du sagst
 
Nunja, so leicht ist es dann doch nicht. Du kannst keine Fehlermeldung einer Boolschen Variable zuordnen. Flexible lässt nur Word oder Integer Variablen als Trigger zu.

Mit dem von mir beschriebenen Wert müsste es aber gehen.

U "VKE1"
= L 4.0
U L 4.0
U #ixWart
= "txStoBit01"
S #FG.Fgwart
U L 4.0
U #FG.Fgsterl
UN #ixMoschu
= "txStoBit02"
U L 4.0
U #ixStoext
= "txStoBit03"
U L 4.0
U #ixFuok
= "txStoBit04"
U L 4.0
U #ixNa
= "txStoBit05"
U L 4.0
U #sxB1Sto
= "txStoBit06"
U L 4.0
U #sxB2Sto
= "txStoBit07"

L "twSto"
T "DBV_ERROR".AB_Error[1].Error[1]
NOP 0


txStoBit07 ist zum Beispiel M700.7
twSto ist MW 700
und "DBV_ERROR".AB_Error[1].Error[1] ist die entsprechende Word Variable im DB in die ich das Fehlerwort kopiere.
Das ist jetzt nur Beispielsweise, die Zahlen in der DB Variable sind eigentlich Indexvariablen die ich in einer Schleife beschreibe, aber wenn du DB1.DBW0 als Ziel angibst, gehts auch.
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
Danke Zomie für die mühe. Aber wenn ich mir den Code von dir so anschaue verstehe ich fast nur Bahnhof. Da wird mir erst klar wie wenig ich in der Ausbildung dazu gelernt habe. :)
Ich habe mir das hmi Programm mal angeschaut was in der Maschine ist. Dort werden die Daten aus einem db geladen. In diesen db habe ich meine Meldungen über einen move Befehl kopiert.
 
Zurück
Oben