Systematik Bits in codesys

Mir ist nichts derartiges im Standard Codesys bekannt. Es kann aber sein, dass einer der Hardware Hersteller so etwas für seine PLC mit in die Firmware gepackt hat.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Alle 50ms ein Byte um 1 erhöhen und schon hat man seine 8 Taktmerker Bits.
Völlig unnötig soetwas hardwaremäßig fest zu rammeln, vorallem weil es so nur feste Teiler gibt und man sich sowieso alle anderen Frequenzen zurecht basteln muss.
 
Blink FB aus util.lib

Hi Sy50,

nein gibt es nicht, aber es gibt die Bibliothek "util.lib" da ist ein "blink" FB drin. Den kannst du aufrufen und deinen Takt vorgeben. Du kannst im Prinzip jeden Takt abbilden sofern die Zeitvorgaben im Taskkontext sinnvoll sind. z.B. solltest du nicht eine Task mit 2s aufrufen und den Blink FB mit 10ms blinken lassen das wäre quatsch.

@max203: Siemensprogrammierer nutzen das z.B.: um zyklisch irgend einen Zustand abzuprüfen oder ganz einfach die rote Lampe bei Fehler blinken lassen ala:

U Error
U M0.0
= Lampe an

hier ist das Merkerbyte 0 als Taktmerker definiert. M0.0 bis M0.7 haben eine feste Frequenz bzw. 1Hz, 2Hz,...

Ich hoffe geholfen zu haben.

Gruße excelite

Edit: Von harten Zählern wie vorgeschlagen, die jeden Zyklus hochzuzählen würde ich absehen da du im Falle, dass dein Code wiederverwendet werden soll immer beachten musst, dass die Task gleich aufgerufen wird wie beim letzten Mal. Außerdem kann es bei der Entwicklung eines Projektes dazu kommen dass Codeteile von einer Task ausgelagert werden in eine andere und dann der Ablauf nicht mehr sinnvoll arbeitet da nun eine andere Basis gilt.
OK es gibt Funktionen die dir die aktuelle Taskzeit zurückgeben und du könntest das berücksichtigen beim hochzählen,... aber das macht alles kompliziert. Außerdem funktioniert das nicht bei Freewheel/freilaufenden Tasks.

==> Beste Lösung: Blink FB nehmen oder selbst einen FB schreiben falls man die Bibliothek nicht verwenden möchte.
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
Vielleicht ne dumme Frage, aber wozu braucht man das (bei Siemens) ?
Zur Zeitersparnis beim Erstellen der fast immer benötigten Blink-Bits. Außerdem gibt es nicht wenige Programmierer, welche die einfache Lösung mit dem 8-Bit-Zähler nicht kennen und die Aufgabe furchtbar umständlich lösen.
Außerdem sind die Systemtakt-Bits viel Zeit-genauer als mit Timern erstellte und zueinander phasenstarr. Vergleichbar genaue Taktbits kann man nicht mit Blink-FB in freilaufenden Task erzeugen sondern muß sie in Task mit festem Aufrufraster erzeugen. Und da wird es auch schon wieder komplizierter als einfach fertige Taktbits zu nutzen.

Harald
 
Vielen Dank.
Es amüsiert doch immer wieder, wie "seltsam" bei Siemens manches gelöst ist.
Aber stimmt natürlich, ohne feste Zykluszeit wirds schwer einen solchen Blinker zu realisieren...
Bin da zu sehr in der komfortablen CoDeSys Welt verwurzelt....
 
Jo bei Siemens ist so ein Taktmerker sicher noch sinnvoll weil der Standardzyklus nicht isochron ist. Viele Steuerungen (die meisten ?) arbeiten aber mittlerweile mit festen Taskzyklen deren Jitter max. im 2 stelligem µs Bereich liegt. Da funktionieren Timer schon recht genau.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo,
ich habe eine Funktion entwickelt die den Siemens Taktmerker recht genau und Recourcenschonend nachbildet (100,200,400,500,800,1000,1600,2000 ms) die funktioniert auch in freilaufenden Tasks, da die unterschiedlichen Zykluszeiten ausgeglichen werden. Funktioniert auch in der Simulation mit 65ms Zykluszeit!!! Allerdings ist dann der 100ms Takt relativ unterschiedlich ca. +- 30ms
Bei Interesse bitte Posten dann kann ich die Lib ja mal zum Testen einstellen.
Gruß
 
Hallo,
ich habe eine Funktion entwickelt die den Siemens Taktmerker recht genau und Recourcenschonend nachbildet (100,200,400,500,800,1000,1600,2000 ms) die funktioniert auch in freilaufenden Tasks, da die unterschiedlichen Zykluszeiten ausgeglichen werden. Funktioniert auch in der Simulation mit 65ms Zykluszeit!!! Allerdings ist dann der 100ms Takt relativ unterschiedlich ca. +- 30ms
Bei Interesse bitte Posten dann kann ich die Lib ja mal zum Testen einstellen.
Gruß
Ich habe Interesse, den Quelltext zu sehen, mit dem man "die Siemens Taktmerker recht genau und Recourcenschonend nachbildet" in freilaufenden Tasks.
Zeige uns den doch mal bitte.

Harald
 
hallo harald,
bin heute abend(nachts) wieder an meinem entwicklungsrechner ;-)
werde dann mal ein demoprojekt posten

gruß
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Teil 1:
um und auf ist ein pulsgenerator der einen 100ms impuls liefert.
der impuls muss aber im durchschnitt!!! passen.
anbei eine meiner funktionen die genau das macht,
man kann den durchschnittlichen pulsinterval angeben ;-)

der rest zum taktmerker ist nur bitlogik und in ST ein zweizeiler! :razz::wink::grin:

gruß

Code:
FUNCTION_BLOCK _ah_Pulse_Gen
VAR_INPUT
    tmsec : DWORD;
END_VAR
VAR_OUTPUT
    Q : BOOL;
END_VAR
VAR
    finit : BOOL;
    t_old : BYTE;
    t_sum : DWORD;
END_VAR
VAR_TEMP
    t_now : BYTE;
END_VAR

(*
version 1.0    6. mar. 2013
programmer     horst
tested by    ???

Die Funktion startet mit einer positiven Flanke und erzeugt alle angegebenen Millisekunden wieder eine Flanke
wobei die Zykluszeiten ausgeglichen werden. D.h.z.B. 100+1 Impulse zu 100ms ergeben auch 10 Sekunden;-)  
*)
(* @END_DECLARATION := '0' *)


t_now    := TIME_TO_BYTE(TIME());
t_sum    := t_sum + SEL(finit, tmsec,t_now - t_old);
t_old    := t_now;

Q    := t_sum >= tmsec;

IF Q THEN
    t_sum := t_sum - tmsec;
    finit := TRUE;
END_IF;

END_FUNCTION_BLOCK
 
Anbei die LIB mit 2 Funktionen.
Hoffe es ist selbsterklärend.
bei der Datei einfach das .zip weglöschen.
Schade, daß man um die paar Byte Lib zu sehen erst hunderte Megabyte Software installieren muß.

Ist Dein Programm in ST? Kannst Du das einfach als Textdatei hier hochladen oder direkt posten? Oder ein Bild von dem Quelltext, damit man einen Überblick über den Code bekommt?

Harald
 
habe gestern schon die kernfunktion und eben wieder als code im post eingestellt!!!
aber ich bekomme die meldung das es erst vom admin freigeschalten werden muss?!?
 
FUNCTION_BLOCK _ah_Pulse_Gen

nochmal als *.txt anhang

kernstück ist die funktion die es ermöglicht alle xx millisekunden eine flanke
zu generieren wobei zykluszeiten ausgeglichen werden müssen.
mit der funktion wird ein 100ms takt erzeugt und der rest auf den "taktmerker"
ist nur noch "bitlogik" und in ST ein zweizeiler.
in der realität sind die 100ms zykluszeitabhängig aber der durchschnitt passt.

Anhang anzeigen _AH_PULSE_GEN.txt
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Ah, OK, Du summierst die Zeitdauer des vergangenen freien Zyklus. Die Taktzeit schwankt dann also um bis zu einer Zykluszeit, was aber nicht schlimm ist, weil die Taktmerker ja auch so schwankend abgefragt werden.

Und wie sieht der Zweizeiler aus zur Erzeugung der 8 Taktmerkerbits (100, 200, 400, 500, 800, 1000, 1600, 2000 ms)?

Harald
 
b_500, xtakt : byte;

b_500 := (b_500 OR MUX(b_500 AND 2#0000_0111, 2#0101_0011, 0))+1;
xtakt := (((xtakt OR 2#0010_1000)+1) AND 2#0101_0111) OR (b_500 AND 2#1010_1000);

PS: feedback erwünscht
 
Ah, OK, Du summierst die Zeitdauer des vergangenen freien Zyklus. Die Taktzeit schwankt dann also um bis zu einer Zykluszeit, was aber nicht schlimm ist, weil die Taktmerker ja auch so schwankend abgefragt werden.

wobei aber die mehrzeit für die nächste periode berücksichtigt wird

horst
 
Zurück
Oben