Step 7 Zähler will nicht hochzählen in SCL!

Tommy843

Level-1
Beiträge
147
Reaktionspunkte
1
Zuviel Werbung?
-> Hier kostenlos registrieren
Moin, ich würde gerne mal wissen ob einer von euch den Fehler bei meinem primitiven Zähler findet. Is nur ein Testprogramm. Das Ding mag einfach nicht hochzählen. In AWL klappts! Ich wills aber in SCL machen weil ich mich da bisschen besser auskenne. Habe das Programm schon mit sämtlichen Vorlagen verglichen die ich habe. Da kann doch auch garnet viel verkehrt gemacht werden. :confused: Null Compiler Fehler, aber das Ding bewegt sich nicht. Ratlosigkeit macht sich breit... Muss leider so gehen, weil ich weder screenshots hochladen noch Anhänge verwalten kann. Der Tag fängt gut an...FUNCTION FC1 : void
VAR_TEMP

END_VAR
IF m7.0 THEN
mw12:=mw12 + 1;
END_IF;
END_FUNCTION
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Baustein aufgerufen?
Geht das so überhaupt, kannst jetzt nicht Testen aber müsste das dann nicht My_INT := Word_To_Int(%MW12) +1 ; sein? Also My_Int dann hald auch dein MW12 aber als INT "deklariert" ...

Und "Begin" fehlt auch, wie Tigerente1974 schon festgestellt hat.

Und M7.0 sollte dann eine Flanke sein, sonst zählt er dauernd hoch
 
Zuletzt bearbeitet:
Der Beginn steht in dem Fall direkt hinter "der Tag fängt gut an" in einer Zeile oben drüber!
Ich weiß, das steht blöd da, aber irgendwie kann ich nie ne neue Zeile anfangen wenn ich ein neues Thema erstelle, warum auch immer!
Baustein wird aufgerufen ja...Das MW12 ist ja in der Symboltabelle richtig deklariert und man muss meines Wissens das dann nicht noch einmal direkt in SCL machen.
 
Sorry Leute, es lag irgendwie an dem Bausteinaufruf. Habe den gerade nochmal gemacht! Nun geht's aber fragt mich bitte nicht warum.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Naja hin oder her... ich würde es so machen:

Code:
FUNCTION_BLOCK FB600
TITLE   = 'ZAEHLER1'
// Baustein für einen Zähler
NAME    : ZAEHLER1
FAMILY  : Familie
AUTHOR  : Firma
VERSION : '0.1'

VAR_INPUT
    Bedingung : BOOL := FALSE;     //Bedingung für das Zählen
END_VAR

VAR_OUTPUT
    Zaehler  : DINT :=0;           //Zählerstand
END_VAR

VAR
    Zaehler_stat  : DINT :=0;      //Zählerstand statische Variable
    Bedingung_old : BOOL := FALSE; //Flankenerkennung
END_VAR    
    
BEGIN;
// Zählen
IF Bedingung AND NOT Bedingung_old THEN
    Zaehler_stat:= Zaehler_stat+1;
END_IF;

// Flankenerkennung
Bedingung_old:= Bedingung;

// Ausgabe an Bausteinausgänge
Zaehler:= Zaehler_stat;
 
END_FUNCTION_BLOCK
 
Kleine Zwischenfrage,
Ich würde jetzt gerne in SCL dividieren und möchte den Endwert beispielsweise als Real in ein MD24 schreiben. Ich muss doch eigentlich das Ergebnis erst in Real wandeln, wenn ich kurz davor stehe es in meinen MD24 zu schreiben. Oder ist das falsch weil durch die Division schon Real entsteht und müsste das dann schon vor der Division in Real wandeln?

Anderes Beispiel als oben:

IF mw10=60 THEN
mw20:=(WORD_TO_INT(mw16+mw18)); //MW20 als Datentyp INT, MW16+MW18 als WORD
md24:=(INT_TO_REAL(mw20/mw12)); //MW 12 als Datentyp INT, MD24 als REAL
END_IF;

Oder hab ich da falsche Konvertierungsbefehle? Der Fehler liegt laut Compiler in der oberen Zeile beim MW18! Was mach ich falsch?
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Irgendwie ist das Käse, so mit den Merkern zu arbeiten. Nimm nen FB und interne Variablen für die ganzen Berechnungen. Und alles was Du von Aussen brauchst mit Baustein/ausgängen.

Bei Dir weiss kein Mensch, was in den Merkern für ein Format steht und ob da die Rechnung sinnvoll ist oder nicht.

Zur Division: wenn Du nicht in REAL dividierst sondern in INT verlierst Du die Kommastellen... ob das so gewollt ist?
Code:
INT_TO_REAL(mw20/mw12)
hier wird zuerst dividiert und dann erst gewandelt.

Gruß.
 
Irgendwie ist das Käse, so mit den Merkern zu arbeiten. Nimm nen FB und interne Variablen für die ganzen Berechnungen.
Gruß.

Is ja alles schön und gut wenn das für dich Käse ist, aber ich bin da noch nicht so fitt drin und hab das bisher immer so gemacht weil ich's nachvollziehen kann!
Aber das mit dem dividieren ist logisch, werd's mir merken.
 
Naja hin oder her... ich würde es so machen:

grundsätzlich funktioniert der Code ja so. Ich persönlich würde allerdings Zählerstände, Betriebsstunden etc nie im Stat speichern sondern immer über In/Out ausgeben. Weil wenn man dann noch Multiinstanzen draus macht und den IDB diverse Male runterladen will.
Jedesmal die Zählerstände verloren gehen.

Ein Globaler Zählerdb der das speichert und den man von Anfang an ausreichend dimensioniert umgeht dieses Risiko.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
... und Ducati hat es ja auch nicht böse gemeint mit seiner Bemerkung sondern dir nur einen Tip gegeben, wie man es besser (für sich selbst und auch für andere) machen kann und vor Allem wie man sich dumme Fehler und endlose Sucherei ersparen kann - mit anderen Worten: er hat versucht dir seine Erfahrungen zu vermitteln ...

Gruß
Larry
 
... und Ducati hat es ja auch nicht böse gemeint mit seiner Bemerkung sondern dir nur einen Tip gegeben, wie man es besser (für sich selbst und auch für andere) machen kann und vor Allem wie man sich dumme Fehler und endlose Sucherei ersparen kann - mit anderen Worten: er hat versucht dir seine Erfahrungen zu vermitteln ...

Gruß
Larry

Weiß ich ja auch, darüber bin ich auch froh und nicht böse drum. Nur ich bin halt erstmal froh wenn ich was alleine hinbekomme und dann gleich wieder umdenken ist nicht so einfach...Nur bräuchte ich mal ein Feedback zu meinem Code! Was daran grundsätzlich falsch ist.
 
Zuletzt bearbeitet:
Hihi... ich bin nicht BÖÖÖÖSEEEEE :)

Es gibt halt (leider?) verschiedene Arten zu programmieren. Oft wird das aber mit den Merkern auch so gelehrt.

Der Vorteil an FBs mit eigenen Variablen ist, das die Zugehörigkeit eindeutig ist. Bei Merkern sieht man auf den ersten Blick nicht, wo wie warum die verwendet werden, und schnell wird auch ein Merker doppelt verwendet...

Weiterhin kannst Du Deine FCs nur schwer mehrfach wiederverwenden ohne am Code zu ändern und somit neu zu testen...

Aber alles Ansichtssache :)
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Nur bräuchte ich mal ein Feedback zu meinem Code! Was daran grundsätzlich falsch ist.

Dein code müsste (diese zeile) mal so aussehen

Code:
mw20:=(WORD_TO_INT(mw16) + WORD_TO_INT(mw18)); //MW20 als Datentyp INT, MW16+MW18 als WORD

Nu siehst du warum eine vernünftige Deklaration und Schnittstelle so wichtig und Arbeitserleichternd ist. Am besten garnicht erst anders lernen.
 
Code:
mw20:=(WORD_TO_INT(mw16) + WORD_TO_INT(mw18)); //MW20 als Datentyp INT, MW16+MW18 als WORD

Einfach Spitze...Jetzt ist der Compiler zufrieden!
Ich dachte irgendwie dass der das auf WORD Ebene addieren kann. Naja, wieder was gelernt dank euch :cool:
 
Hihi... ich bin nicht BÖÖÖÖSEEEEE :)

Es gibt halt (leider?) verschiedene Arten zu programmieren. Oft wird das aber mit den Merkern auch so gelehrt.

Der Vorteil an FBs mit eigenen Variablen ist, das die Zugehörigkeit eindeutig ist. Bei Merkern sieht man auf den ersten Blick nicht, wo wie warum die verwendet werden, und schnell wird auch ein Merker doppelt verwendet...

Weiterhin kannst Du Deine FCs nur schwer mehrfach wiederverwenden ohne am Code zu ändern und somit neu zu testen...

Aber alles Ansichtssache :)


Könntest du vielleicht mal irgendwie wenn du Lust und Zeit hast ein klitzekleines Beispiel geben...Damit ich deine Variante verstehe ;-)
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Einfach Spitze...Jetzt ist der Compiler zufrieden!
Ich dachte irgendwie dass der das auf WORD Ebene addieren kann. Naja, wieder was gelernt dank euch :cool:

Oh das kanner. "AND" dann aber als Wort lassen. Mit einem Zwischenschritt kann dann nach INT konvertiert werden.

eine wortverknüpfung im WORT_TO_INT() geht nicht. Macht ja auch irgendwie keinen Sinn.
 
Zurück
Oben