Bei einer Funktion mit Merkern oder über die Schnittstelle TEMP programmieren?

EDirk

Level-1
Beiträge
10
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo zusammen

ich habe eine Funktion geschrieben um ein Display anzusteuern aber nun ist mir aufgefallen das ich alles mit Merkern gelöst habe.

Wenn ich nun öfters diese Funktion in anderen FB's benutze überschneiden sich doch die Merker oder?

Sollte ich also die Merker durch diese Temporalen Werte ersetzen die man in der Schnittstelle vorgeben kann oder gibts es keine Überschneidung.

gruß Dirk
 
(Temp)oralen Werte
:p

Hast du einen FC oder FB benutzt?
Über temporäre Variablen zu gehen ist schlecht.
Bei FB´s würde ich dir die statischen Variablen (liegen dann in dem DB) empfehlen.
Die temporären sind zu unsicher bzw. gehen gar nicht wie du dir das eventuell vorstellst.

Oder du bleibst bei den Merkern. Das geht auch.

Gruß wolder
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Wenn ich nun öfters diese Funktion in anderen FB's benutze überschneiden sich doch die Merker oder?
Ja.
Sollte ich also die Merker durch diese Temporalen Werte ersetzen die man in der Schnittstelle vorgeben kann...
Kommt darauf an: Du solltest dabei immer bedenken, dass die temporären Variablen nur innerhalb eines Aufrufs ihre Gültigkeit behalten und zugewiesen werden müssen, bevor man sie verknüpft, da sie sonst undefinierte Zustände haben, deswegen sind sie denkbar ungeeignet um irgendetwas von einem Zyklus / Aufruf in den nächsten mitzunehmen. Dies verdient besondere Beachtung bei SR-Gliedern und Flankenauswertungen, muss aber auch an vielen anderen Stellen bedacht werden.
Du könntest aber auch einen FB verwenden und Deine Variable als STAT anstelle von TEMP deklarieren, dann werden sie im Instanzdatenbaustein abgelegt und stehen beim nächsten Aufruf mit dem selben IDB wieder zur Verfügung.
 
Die Funktion habe ich in einen FC geschrieben und nun möchte ich diese Funktion mehrmals in den FB's verwenden.Aber wenn sich die Merker überschneiden gibt es ja Chaos.

Was ergibt das dann für einen Sinn eine Funktion schreiben zu können wenn man sie dann nicht mehrmals benutzen kann?

Es wäre ja nicht schlimm wenn der Baustein nach einmal aufrufen wieder alles vergisst.

Die Funktion ist für eine Segmentanzeige die Analog angesteuert wird. Es wird also ein Realwert in BCD Code gewandelt und zum Display gegeben.

Die Funktion (Display) muss schon mehrere Zyklen durchlaufen also habe ich da wohl doch ein Problem oder?
 
Zuletzt bearbeitet:
... Also würden mir doch die temporären Daten reichen oder?
Kann ich Dir so genau nicht sagen.
Gibt es irgendetwas in Deinem Baustein, was Du im nächsten Aufruf wieder brauchst?
Wenn nicht, dann hast Du wahrscheinlicht recht.
Du könntest es einfach ausprobieren: Mach eine Kopie von Deinem Baustein, bau ihn auf TEMP um, ruf ihn zweimal mit völlig unterschiedlichen Werten auf und schau Dir an ob er noch sauber arbeitet.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Ja, wenn ein FC mehrmals aufgerufen wird, werden die Merker in diesem entsprechend mehrmals aufgerufen und geändert. Gilt auch für Timer/ Zähler.

Weiterhin: In einem FC wird der Zustand der Temp- Variablen nicht gespeichert, sprich im nächsten Zyklus stehen dort undefinierte Werte. Nimmst du einen FB, dann werden die Temp- Variablen gespeichert, und zwar in den entsprechenden DB, der beim Aufruf des FB angegeben wird.

Wie wäre es, wenn du den FC (oder FB) mit IN / Out- Variablen ansteuerst, sprich alle Eingangssignale des FC über IN-Variablen, alle Ausgangszustände über OUT- Variablen übergeben. Im FC dann nur Merker oder TEPM- Variablen für interne Signale verwenden. Dann sollte es keine Probleme geben.
 
Die Funktion habe ich in einen FC geschrieben und nun möchte ich diese Funktion mehrmals in den FB's verwenden.Aber wenn sich die Merker überschneiden gibt es ja Chaos.

Was ergibt das dann für einen Sinn eine Funktion schreiben zu können wenn man sie dann nicht mehrmals benutzen kann?

Es wäre ja nicht schlimm wenn der Baustein nach einmal aufrufen wieder alles vergisst.

Die Funktion ist für eine Segmentanzeige die Analog angesteuert wird. Es wird also ein Realwert in BCD Code gewandelt und zum Display gegeben.

Die Funktion (Display) muss schon mehrere Zyklen durchlaufen also habe ich da wohl doch ein Problem oder?

Beispiel für einen FC: Berechnung eines Volumens aus Länge, Breite und Höhe...
Werte vorn rein, hinten wieder raus und der Fall ist erledigt.

Beispiel für einen FB: Stern-Dreieck-Anlauf:
Start und Sternzeit vorn rein, Schütze hinten raus UND mittlerweile verstrichende Sternzeit im Instanz-DB merken weil man sie ja nächstes Mal wieder braucht.
 
Du kannst ja vor der Bearbeitung deiner neuen Funktion die verwendeten Merker zuerst temporär speichern und nach der Bearbeitung die temporären Werte wieder auf die Merker zurückschreiben. Daann musst du an deinem Baustein nichts ändern.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Ja In/Out benutze ich so das die Ein und Ausgänge Flexibel sind.
Ich habe in der Funktion einen Zähler der bis 20 zählen muss . Zählt der dann normal durch oder fängt der immer dann wieder bei 0 an?

Weil dann würde das Display nicht funktionieren.

---------------------------------------------------------------------------------------------------

Werde sonst einfach die Funktion vom FC in einen FB packen und diesem dann bei jedem neuen Aufruf einen anderen DB zuordnen.
Ist glaub ich auch eine Lösung
 
Zuletzt bearbeitet:
Vielleicht noch eine "Entscheidungshilfe" ob FC oder FB:

Für den FC muss man keinen IDB anlegen, dafür kann der FC aber auch nichts "speichern". Das Anlegen von IDB´s kann man mit Multiinstanzen etwas vereinfachen, ist aber irgendwie nicht jedermanns Sache.
Soll die "Ausgangsvariable" mehrfach im Programm benutzt werden, ist es sinnvoll einen FC zu nehmen und eine globale Variable an die IN/OUT-Schnittstelle anzuschließen. Nachteil: Man muss bei jedem Aufruf des Bausteins eine Variable antragen, das kann schon mal in Schreibarbeit ausarten...

Für den FB spricht ganz klar, dass er Werte über mehr als einen Zyklus "abspeichern" kann. Die beschriebene Variante eine Globalvariable an IN/OUT zu deklarieren geht natürlich auch, macht aber den Vorteil eines FB zunichte.

Es kommt also im wesentlichen darauf an, ob:
- die Variable mehrfach (in weiteren Bausteinen) gebraucht wird
- die Variable länger als 1 Zyklus gespeichert werden muss.
 
Ich habe in der Funktion einen Zähler der bis 20 zählen muss . Zählt der dann normal durch oder fängt der immer dann wieder bei 0 an?
mir selbst schrieb:
Gibt es irgendetwas in Deinem Baustein, was Du IM NÄCHSTEN AUFRUF WIEDER BRAUCHST?
Wenn NICHT, dann hast Du wahrscheinlicht recht.
Was sagt Dir das? Einfach so geht es nicht, weil Du Deinen Zählerstand im nächsten Aufruf wieder brauchst.
Du musst also den Zähler retten. Entweder (bei Siemens-Zählern) Du machst eine IN-Variable vom Typ COUNTER (heißt so, glaube ich) an die Du bei jedem Aufruf einen anderen Zähler hängst (wäre dann als IN-Variable z.B. Z 1, Z 2, Z3,...) oder Du hast eigene Zähler, dann müsstest Du den entsprechenden Zählerstaand als INOUT anlegen und beim Aufruf mit der passenden Variablen beschalten. So bräuchtest Du für eine einzige Variable keinen FB / IDB.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Ja In/Out benutze ich so das die Ein und Ausgänge Flexibel sind.
Ich habe in der Funktion einen Zähler der bis 20 zählen muss . Zählt der dann normal durch oder fängt der immer dann wieder bei 0 an?
egal ob FC oder FB, wenn du dort einen Zähler, z.B. Z10 drin hast, zählt dieser jedes mal hoch,wenn er im FC angesteuert wird. Sprich wenn du den FC in 1 Zyklus 5x aufrufst und pro Aufruf dieser einmal hochzählt, dann hast du am Ende des Zyklus eine 5 drin stehen, obwohl du dort für jeden FC eine 1 erwartest. Hier würde ich zu einem FB raten, in dem du die Zählfunktion "von Hand" mit ADD- Befehl und lokalen Variablen realisierst (ich hab noch nie einen Siemens- Zähler verwendet, die Add- Funktion geht genauso)
 
Wie wärs, wenn du deine Lösung mal präsentierst, damit wir dir besser helfen können?!
Vielleicht wirds dann einfacher für dich und uns.
Ich schätze mal, dass der TE von den parametrierbaren Bausteinen noch nicht wirklich Ahnung hat.
Und von den temporären bzw. statischen Variablen genauso wenig.

Es ist vielleicht einfacher dir das anhand deines Programmes zu erklären.

Gruß wolder
 
egal ob FC oder FB, wenn du dort einen Zähler, z.B. Z10 drin hast, zählt dieser jedes mal hoch,wenn er im FC angesteuert wird. Sprich wenn du den FC in 1 Zyklus 5x aufrufst und pro Aufruf dieser einmal hochzählt, dann hast du am Ende des Zyklus eine 5 drin stehen, obwohl du dort für jeden FC eine 1 erwartest. Hier würde ich zu einem FB raten, in dem du die Zählfunktion "von Hand" mit ADD- Befehl und lokalen Variablen realisierst (ich hab noch nie einen Siemens- Zähler verwendet, die Add- Funktion geht genauso)

Dann kommt noch erschwerend das Flanken-Thema beim Zähler dazu, da du ja den gleichen Zähler mehrmals pro Zyklus bearbeitest.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
So ich habe mal den besagten FC angehangen.

Folgende Segmentanzeige soll damit betrieben werden.
http://www.link-systemtechnik.com/pdf/DB_7Segmentanzeige_ser_Anstrg.pdf

Programmerklärung:
Uebergabewert :fc 105 gibt realwert der verarbeitet wird
M 80.2 gibt die Freigabe für das Display das es 20 Signale (über clk) abwarten soll
M100.0: wird als Taktmerkerbit benutzt
M 61.3: ist die ausgesuchte Stelle wo immer das Signal abgefragt wird
Punkt setzen: damit definiere ich wo ich den Punkt im Display setzen möchte.

Schonmal danke für die vielen Anregungen.

Dirk
 

Anhänge

  • FC1.pdf
    13,3 KB · Aufrufe: 25
Du verwendest in dem Baustein mehrere Dinge, deren Zustand Du im nächten Zyklus wieder brauchst:
  • SR-Glieder (hattest Du meinen Beitrag bezüglich SR-Glieder nicht gelesen?)
  • Zähler
  • Flankenauswertung
  • SHL_DW
Die Ergebnisse dieser Operationen benötigst Du für den nächsten Durchlauf.
Wäre es wirklich nur der Zähler gewesen, hätte man den bequem auf einen IN legen können aber so empfehle auch ich Dir, einen FB zu verwenden.
 
Nur mal so als Hinweis:
- Verwende einen FB dafür
- Lies dich über parametrierbare Bausteine ein
- Benutze keine festen Größen

Erst dann hast du einen Baustein, den du öfters verwenden kannst.
Ja ich weiß. Auch mit festen Größen kann man einen wiederverwendbaren Baustein erstellen, aber es ist besser keine festen Größen zu haben.

Der M80.2 wird nur durchgeschleift. Was macht das für einen Sinn?
Genau wie der M61.5!

MD40 und MD50 kannst du beruhigt in Temporäre Daten ändern.
MD60 kapier ich noch nicht.
Außerdem MD60 -> M61.5 !!!! MD60 -> M60.0-M63.7
Die Flankenmerker in statische ändern...

Es gibt noch viel zu tun!

Gruß wolder

P.S.: Warum benutzt du den DEZ-Ausgang und nicht den DUAL-Ausgang des Zählers? Dann könntest du auch auf 20 Vergleichen. Das MW25 (ungerade?!?) kannst du auch in eine temporäre Variable ändern.
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
Ok ich bin gerade dabei alles im FB anzupassen.

Der M80.2 ist nur durchgeschleift damit ich alle 3 Ausgänge am Anfang des Programmes habe. Ist halt für meine Übersicht.

M 61.5 ( M 61.3 meinst du wohl) ist ein Abgriff vom MD 60. Ich möchte immer eine Stelle am Ausgang ausgeben und das ist in dem Fall der M 61.3 . Das Schieberegister schiebt ja immer um eins Weiter und so ändert sich der Wert immer entsprechend.

Wenn ich jetzt eh einen FB Programmiere kann ich ja gar keine Temp benutzen.Also müsste ich die alle als STAT dann angeben.

Warum ich jetzt den DEZ Ausgang genommen hab weiß ich nicht :) , wohl etwas zu umständlich Gedacht.


Wenn ich jetzt alles in STAT Werte umändere, wie kann ich das dann mit dem MD 60 realisieren? Ich möchte den 32 Bit Wert speichern und eine bestimmte Stelle (M61.3) dann aus dem DB heraus abfragen und Ausgeben.
 
Wenn ich jetzt eh einen FB Programmiere kann ich ja gar keine Temp benutzen.Also müsste ich die alle als STAT dann angeben.
:confused: Hä? Wer hat Dir denn das erzählt? Natürlich gehen TEMP in einem FB.
Wenn ich jetzt alles in STAT Werte umändere, wie kann ich das dann mit dem MD 60 realisieren? Ich möchte den 32 Bit Wert speichern und eine bestimmte Stelle (M61.3) dann aus dem DB heraus abfragen und Ausgeben.
Solltest Du mit indirekter Adressierung machen (kann man auch einfach mit absoluter Adressierung machen, sollte man aber nicht). Ich habe leider gerade wenig Zeit, sonst würde ich Dir auch ein Beispiel schreiben.

Ich frage mich gerade, ob nicht besser erstmal einen Blick in diverse Schulungsunterlagen werfen solltest.
http://www.automation.siemens.com/m...oad_ausbildungsunterlagen/Seiten/Default.aspx
 
Wenn ich jetzt alles in STAT Werte umändere, wie kann ich
das dann mit dem MD 60 realisieren? Ich möchte den 32 Bit Wert speichern und
eine bestimmte Stelle (M61.3) dann aus dem DB heraus abfragen und
Ausgeben.

wie wärs mit Doppelwort laden, Maskieren und vergleichen?

Code:
    L     #VariableDW
    L     2#10000000000000000000 // Wenn ich mich nicht verzählt hab ;-)
    UD 
    U     >0
    =     #VariableBool
 
Zuletzt bearbeitet:
Zurück
Oben