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

Zuviel Werbung?
-> Hier kostenlos registrieren
Mal so rein Informationstechnisch. Das soll dann irgendwann mal zur Anzeige eines Gesamtmaschinentaktes am Panel führen. Ich hab mir das jetzt als Stückzahl pro Minute ausgerechnet, funktioniert auch so einwandfrei. Aber is der Maschinentakt nicht eher die Geschwindigkeit der Maschine an sich? Es gibt nicht zufällig irgendwelche Vorgaben diesbezüglich aus irgendwelchen Normen an die man sich zu halten hat?

Habe gerade meinen Chef nochmal gefragt, ist so wie ich mir das gedacht habe richtig. Würde mich dennoch interessieren ob ihr da andere Varianten kennt ;-)
 
Tja ... also ... Machinentakt = Arbeit.
In Arbeit steckt immer die Zeit mit drin.
Ob du aber nun Stück/Minute oder Stück/Stunde oder Stück/Schicht oder m³/Zeit machst - das bleibt bei dir oder den Forderungen, die du erfüllen sollst ...

Gruß
Larry
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Tja ... also ... Machinentakt = Arbeit.
In Arbeit steckt immer die Zeit mit drin.
Ob du aber nun Stück/Minute oder Stück/Stunde oder Stück/Schicht oder m³/Zeit machst - das bleibt bei dir oder den Forderungen, die du erfüllen sollst ...

Gruß
Larry

Danke Larry,
so in etwa hab ich mir das fast schon gedacht...
 
Sooo Ducati,
was hältst du denn davon? Funktioniert sogar prima! Ich überlege gerade welche Teile meines Programms ich noch genauso übersichtlich umschreiben kann.
Aber danke nochmal für den Denkanstoß...;)

Code:
TITLE = 'Taktzähler'
// Baustein-Kommentar ...
VERSION : '0.1'
AUTHOR  : 'Autor'
NAME    : 'Firma'


// Bausteinparameter
VAR_INPUT
    Takt                :BOOL:=false;        //Takt zum Zählen
    Komplett_Reset      :BOOL:=false;        //Komplettes Rücksetzen der Zähler
END_VAR

VAR_OUTPUT
    MaschinenTakt       :REAL:=0;            //Maschinentakt
END_Var

VAR
    Sekunden            :INT:=0;             //Sekundenzähler
    Minuten             :INT:=0;             //Minutenzähler
    Stueck_Links        :WORD:=0;            //Stückzahl linke Maschine
    Stueck_Rechts       :WORD:=0;            //Stückzahl rechte Maschine
    Stueckzahl          :INT:=0;             //Stückzahl Gesamt
    Geschwindigkeit     :REAL:=0;            //Maschinentakt
    Zaehler_Links       :WORD;
    Zaehler_Rechts      :WORD;
END_VAR

IF Takt THEN Sekunden:=Sekunden+1;           //Sekunden hochzählen bis 60
ELSIF Sekunden=60 OR Komplett_Reset THEN Sekunden:=0;
END_IF;
IF Sekunden=60 THEN Minuten:=Minuten+1;      //Minuten hochzählen bis ?????
ELSIF Komplett_Reset THEN Minuten:=0;
END_IF;

IF Sekunden=60 THEN
    Stueckzahl:=((WORD_TO_INT(Stueck_Links))+(WORD_TO_INT(Stueck_Rechts)));
    Geschwindigkeit:=(INT_TO_REAL(Stueckzahl))/(INT_TO_REAL(Minuten));
END_IF;

//Ausgabe an Bausteinausgänge
MaschinenTakt:=Geschwindigkeit;

//Zähler
Zaehler_Links:=S_CU(C_NO:= Z1, CU:=M9.7, S:=M9.6, PV:=0,R:=M0.1,CV:=Stueck_Links);
Zaehler_Rechts:=S_CU(C_NO:= Z2, CU:=M13.7, S:=M9.6, PV:=0,R:=M0.1,CV:=Stueck_Rechts);

END_FUNCTION_BLOCK
 
Wieso definierst du Variablen die du eh nur Ganzzahlig brauchst nicht direkt als INT?

Dieser Teil:
Code:
//Zähler
Zaehler_Links:=S_CU(C_NO:= Z1, CU:=M9.7, S:=M9.6, PV:=0,R:=M0.1,CV:=Stueck_Links);
Zaehler_Rechts:=S_CU(C_NO:= Z2, CU:=M13.7, S:=M9.6, PV:=0,R:=M0.1,CV:=Stueck_Rechts);

Verhindert das du deinen geschriebenen Baustein mehr als einmal aufrufen kannst.
Erstens sind Zähler Imho nicht nötig. Denn eine simple Zählfunktion ist in SCL wenige Zeilen lang.
Und wenn man diese doch benutzt, nutzt man keine Globalen Merker im Baustein und auch keine globale Zähleradressierung, die sollte über die Schnittstelle kommen.

ABer am besten nutzt du gleich einen IEC Zähler "CTU" "CTD" SFB0 und 1

mfg René
 
Wieso definierst du Variablen die du eh nur Ganzzahlig brauchst nicht direkt als INT?

Ich würde mal sagen, Gewohnheit oder Aufgrund von Erfahrungen wo ich dachte das es anders nicht geht.
Dieser Teil:
Code:
//Zähler
Zaehler_Links:=S_CU(C_NO:= Z1, CU:=M9.7, S:=M9.6, PV:=0,R:=M0.1,CV:=Stueck_Links);
Zaehler_Rechts:=S_CU(C_NO:= Z2, CU:=M13.7, S:=M9.6, PV:=0,R:=M0.1,CV:=Stueck_Rechts);

Verhindert das du deinen geschriebenen Baustein mehr als einmal aufrufen kannst.
Erstens sind Zähler Imho nicht nötig. Denn eine simple Zählfunktion ist in SCL wenige Zeilen lang.
Und wenn man diese doch benutzt, nutzt man keine Globalen Merker im Baustein und auch keine globale Zähleradressierung, die sollte über die Schnittstelle kommen.

ABer am besten nutzt du gleich einen IEC Zähler "CTU" "CTD" SFB0 und 1

mfg René

Was meinst du mit verhindert? Könntest du das genauer erläutern...
Aber mit der Zählfunktion hast du echt recht! :ROFLMAO:
Ich glaub das bau ich nochmal um, hab wohl einfach nicht nachgedacht und die Sachen stumpf übertragen...:D

MFG
 
IWas meinst du mit verhindert? Könntest du das genauer erläutern...

Da z.B. Z1 systemweit nur einmal verwenden kann. Gibt es konflikte wenn du den Baustein zweimal aufrufst (weil du z.B. mit einer SPS zwei Bänder zählen willst) Denn jedesmal wird auf Z1 zugegriffen, von beiden Aufrufen.

Ich nehme an die Merker sind irgendwelche Rückmeldungen von Aktoren oder Sensoren? Dann werden die von aussen an den Baustein angeklemmt, entweder bei IN einen Eingang dafür deklakrieren oder halt mit INOUT eine Schnittstelle definieren auf die du dann auch schreiben kannst.

Wie weiter vorne schon erwähnt, ziehe ich INOUT auch als Speicherschnittstelle für den Zählerstand vor, da könntest du dann auch einen Remanenten DB oder Merker anhängen damit du den Zählerstand beim konsistenten Laden deines FB und IDB verlierst.

mfG René
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Leute, ich hab noch ein kleines Problem, die Flankenerkennung von ducati will nicht...

Code:
FUNCTION_BLOCK FB1
TITLE = 'Taktzähler'
// Baustein-Kommentar ...
VERSION : '0.1'
AUTHOR  : 'Autor'
NAME    : 'Firma'


// Bausteinparameter
VAR_INPUT
    Maschine_Links_ein  :BOOL:=false;        //Maschine Links Ein
    Maschine_Rechts_ein :BOOL:=false;        //Maschine Rechts Ein
    Teil_Links_fertig   :BOOL:=false;        //Teil fertig Maschine links
    Teil_Rechts_fertig  :BOOL:=false;        //Teil fertig Maschine Rechts
    Takt                :BOOL:=false;        //Takt zum Zählen
    Komplett_Reset      :BOOL:=false;        //Komplettes Rücksetzen der Zähler
END_VAR

VAR_OUTPUT
    MaschinenTakt       :REAL:=0;            //Maschinentakt
END_Var

VAR
    Sekunden            :INT:=0;             //Sekundenzähler
    Minuten             :INT:=0;             //Minutenzähler
    Stueck_Links        :INT:=0;             //Stückzahl linke Maschine
    Stueck_Rechts       :INT:=0;             //Stückzahl rechte Maschine
    Stueckzahl          :INT:=0;             //Stückzahl Gesamt
    Geschwindigkeit     :REAL:=0;            //Maschinentakt
    Teil_Links          :BOOL:=false;        //Flanke
    Teil_Rechts         :BOOL:=false;        //Flanke
END_VAR

IF Maschine_Links_ein AND NOT Teil_Links THEN Stueck_Links:=Stueck_Links+1;     //Teile Links zählen
ELSIF Komplett_Reset THEN Stueck_Links:=0;
END_IF;

IF Maschine_Rechts_ein AND NOT Teil_Rechts THEN Stueck_Rechts:=Stueck_Rechts+1; //Teile Rechts zählen
ELSIF Komplett_Reset THEN Stueck_Rechts:=0;
END_IF;

IF Takt THEN Sekunden:=Sekunden+1;           //Sekunden hochzählen bis 60
ELSIF Sekunden=60 OR Komplett_Reset THEN Sekunden:=0;
END_IF;
IF Sekunden=60 THEN Minuten:=Minuten+1;      //Minuten hochzählen bis ?????
ELSIF Komplett_Reset THEN Minuten:=0;
END_IF;

IF Sekunden=60 THEN
    Stueckzahl:=Stueck_Links+Stueck_Rechts;
    Geschwindigkeit:=(INT_TO_REAL(Stueckzahl))/(INT_TO_REAL(Minuten));
END_IF;

//Flankenerkennung
Teil_Links:=Teil_Links_fertig;
Teil_Rechts:=Teil_Rechts_fertig;

//Ausgabe an Bausteinausgänge
MaschinenTakt:=Geschwindigkeit;
END_FUNCTION_BLOCK
Die Zähler rennen ohne Ende, soviel Stückzahl wird die Maschine in 100 Jahren nicht produzieren können :ROFLMAO:
Wenn das jetzt noch gehen würde...TOP!:cool:
 
wenn Du die richtigen Variablen verwendest, geht das auch:

Code:
IF [COLOR=#ff0000]Maschine_Links_ein AND NOT Teil_Links [/COLOR]THEN Stueck_Links:=Stueck_Links+1;     //Teile Links zählen
ELSIF Komplett_Reset THEN Stueck_Links:=0;
END_IF;

IF [COLOR=#ff0000]Maschine_Rechts_ein AND NOT Teil_Rechts [/COLOR]THEN Stueck_Rechts:=Stueck_Rechts+1; //Teile Rechts zählen
ELSIF Komplett_Reset THEN Stueck_Rechts:=0;
END_IF;


//Flankenerkennung
Teil_Links:=Teil_Links_fertig;
Teil_Rechts:=Teil_Rechts_fertig;

weiterhin finde ich es nicht gut, den Reset-Teil ins ELSIF zu legen, da Reset dann nur funktioniert, wenn IF grad nicht erfüllt ist...
 
Zuletzt bearbeitet:
wenn Du die richtigen Variablen verwendest, geht das auch:

Code:
IF [COLOR=#ff0000]Maschine_Links_ein AND NOT Teil_Links [/COLOR]THEN Stueck_Links:=Stueck_Links+1;     //Teile Links zählen
ELSIF Komplett_Reset THEN Stueck_Links:=0;
END_IF;

IF [COLOR=#ff0000]Maschine_Rechts_ein AND NOT Teil_Rechts [/COLOR]THEN Stueck_Rechts:=Stueck_Rechts+1; //Teile Rechts zählen
ELSIF Komplett_Reset THEN Stueck_Rechts:=0;
END_IF;


//Flankenerkennung
Teil_Links:=Teil_Links_fertig;
Teil_Rechts:=Teil_Rechts_fertig;

weiterhin finde ich es nicht gut, den Reset-Teil ins ELSIF zu legen, da Reset dann nur funktioniert, wenn IF grad nicht erfüllt ist...

Stimmt, da hast du recht, da hab ich wohl falsch drüber nachgedacht...Aber warum ich meinen Fehler oben wieder nicht selbst gesehen habe regt mich gerade auf!:-x
Versteh ich manchmal echt nicht warum man seine eigenen Fehler nicht erkennt. Naja, zum Glück muss man nicht alles verstehen! :)
 
Ich hätte da gerade noch einmal ne Frage im Bezug auf den Zähler.

Ich würde das gerne auf dem Panel in einem E/A Feld darstellen lassen und hätte gerne einen Bereich im zweistelligen Millionenbereich. Mit welchem Format kann ich das bewerkstelligen? Weil meines Erachtens ist dann Dezimal und konsorten Bereichstechnisch erschöpft. Integer kann das Ding ja scheinbar gar nicht anzeigen, leider! Oder Gibt's da irgendwo andere Felder die das können?

Grüße
 
Dint +/- 2Mia sollten wohl reichen. :)

Grad gelesen. Dein Panel kann kein Integer? Was für ein Hersteller soll das sein?
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
Dint +/- 2Mia sollten wohl reichen. :)

Grad gelesen. Dein Panel kann kein Integer? Was für ein Hersteller soll das sein?

Falsch, da hätte ich mich aber auch eventuell präziser Ausdrücken können :roll:...
Mit "Ding" meinte ich das E/A Feld. Ich arbeite mit Flexible und habe ein OP177B. Es geht mir lediglich um das richtige Instrument für das Anzeigen. Das DINT dafür reichen würde is mir völlig klar, nur leider fehlt genau das dem E/A Feld in der Darstellungsauswahl.
Da gibt's nur: "Binär, Datum, Datum/Uhrzeit, Dezimal, Hexadezimal, Uhrzeit und Zeichenkette" :-(

Grüße
 
Hä? Darstellungsformat Dezimal! Die DINT Variable auswählen. s99999999 oder 999999 im Darstellungsformat auswählen. und das wars?

DINT ist Dezimal

mfg René
 
Hä? Darstellungsformat Dezimal! Die DINT Variable auswählen. s99999999 oder 999999 im Darstellungsformat auswählen. und das wars?

DINT ist Dezimal

mfg René

Hmm, ja irgendwie verwechsel ich das mit der Breite was rein passt immernoch mit dem was man rein schreiben kann. Sorry! ;)
Ja dann würde das ja passen. Aber geht das überhaupt wenn ich die Millionen überschreite? Weil bei Dezimal stehen ja maximal 6 Stellen. Ich bräuchte aber 8.

Grüße
 
Zurück
Oben