fertiger Sinusgenerator Baustein?

Geisti

Level-1
Beiträge
23
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo Leute,
kann mir jemand weiterhelfen?

Hat jemand von euch schon mal einen Sinusgenerator programmiert (zb in AWL)?

Möchte eine Frequenz vorgeben und die oberer Schwelle sowie die untere Schwelle frei eingeben können.

Habe schon gegooglet, aber leider erfolglos.

Gruß
Daniel
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Habe mir die ZIP Datei für Step7 runtergeladen und mit SIMATIC Manager geöffnet,
aber leider finde ich nicht den benötigten Baustein (laut Doku sollte der Funktionsbaustein "GEN_SIN" der Richtige sein) nicht in der Bibliothek. Wie bekomme ich dieses FB?
 
Hier haben Kollegen aus Dänemark und der Ukraine was für dich: http://www.plctalk.net/qanda/showthread.php?p=241300

Ich persönlich bin kein Freund von Oscat obwohl die da was wirklich tolles machen.
Aber ich wollte mal eben einen kleinen Baustein in ein bestehendes Projekt einbinden - kann man fast vergessen - für eine kleine Funktion (Sommerzeit / Winterzeit) muss man ca. 15 Bausteine in das Projekt einbinden - die natürlich alle Bausteinnummern verwenden die ich schon hatte.

Ich denke wenn man mit Oscat arbeiten will, muss man erst ALLE Bausteine in das Projekt holen und die freien Bereiche mit seinem eigenen Programm ausfüllen.

Viel Erfolg mit einem Generator!
 
Habe mir die ZIP Datei für Step7 runtergeladen und mit SIMATIC Manager geöffnet,

Welch Version hast du denn?`Bei mir in der 3.11 ist er dabei FB100

Code:
FUNCTION_BLOCK GEN_SIN
TITLE = 'GEN_SIN'
//
//this signal generator generates a sine wave output. The sine wave signal is defined by period time (PT), 
//amplitude (AM), offset (OS) and a specific delay for the output signal (DL).
//The Output waveform will have its max peak at AM/2 + OS and its minimum peak at -AM/2 + OS. 
//The delay input can delay a signal up to PT, this can be useful to synchronize different generators 
//and generate interleaving signals. A Cos wave can be generated accordingly.
//in addition to a analog output Out there is a second boolean output Q with the corresponding binary signal.
// 
//uses: T_PLC_MS [FC64]
//      STIME [FB64],IDB_STIME [DB64]
//      MODR [FC97]
//      FLOOR2 [FC82] 
//      MULTIME [FC203]
//      SIGN_R [FC109]
//
VERSION : '1.6'
AUTHOR  : oscat
NAME    : GEN_SIN
FAMILY  : SIGGEN

VAR_INPUT
    PT : TIME;
    AM : REAL := 1.0;
    OS : REAL;
    DL : REAL;
END_VAR
VAR_OUTPUT
    Q : BOOL;
    OUT : REAL;
END_VAR
CONST
    PI2 := 6.28318530717958647692528676655900576;    (* PI * 2 *)
END_CONST
VAR
    tx : TIME;
    last : TIME;
    init : BOOL;
    temp : REAL;
END_VAR

BEGIN

(* read system time and prepare input data *)
tx := DINT_TO_TIME(DWORD_TO_DINT(T_PLC_MS())) - last;
DL := modR(in:=dl,divi:=1.0);
IF dl < 0.0 THEN dl := 1.0 - dl; END_IF;
  
(* init section *)
IF NOT init THEN
    init := TRUE;
    last := tx;
    tx := t#0s;
END_IF;
  
(* add last if one cycle is finished *)
IF tx >= pt THEN
    last := last + pt;
    tx := tx - pt;
END_IF;
  
(* generate sine wave *)
IF pt > t#0s THEN temp := SIN(PI2 * DINT_TO_REAL(TIME_TO_DINT(tx + multime(t:=pt,M:=dl))) / DINT_TO_REAL(TIME_TO_DINT(pt))); END_IF;
out := am * 0.5 *  temp + os;

(* boolean output Q *)
q := NOT sign_R(temp);
  
  
(* revision history
hm  22. jan 2007    rev 1.0
    original version

hm  17 sep 2007 rev 1.1
    replaced time() with t_plc_ms for compatibilitx reasons

hm  27. nov 2007    rev 1.2
    avoid divide by 0 when pt = 0

hm  6. jan 2008     rev 1.3
    improved performance

hm  16. mar. 2008   rev 1.4
    added type conversion to avoid warnings under codesys 3.0

hm  18. oct. 2008   rev 1.5
    using math constants

hm  11. mar. 2009   rev 1.6
    changed real constants to use dot syntax

*)
END_FUNCTION_BLOCK
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
...Aber ich wollte mal eben einen kleinen Baustein in ein bestehendes Projekt einbinden - kann man fast vergessen - für eine kleine Funktion (Sommerzeit / Winterzeit) muss man ca. 15 Bausteine in das Projekt einbinden - die natürlich alle Bausteinnummern verwenden die ich schon hatte.

Ich denke wenn man mit Oscat arbeiten will, muss man erst ALLE Bausteine in das Projekt holen und die freien Bereiche mit seinem eigenen Programm ausfüllen...

Hi,

die Bausteinnummern lassen sich am einfachsten mit SCL ändern, dazu einfach die entsprechende Nummer im Symboleditor ändern und den Baustein mit SCL neu übersetzen.

Gruss Daniel
 
Hallo


Da gibts ne lib von Goetz da wär so ein Taktgenerator drinnen


Lg Backdoor
 

Anhänge

  • Goetz_li.zip
    103,6 KB · Aufrufe: 95
@Dalbi

Ja danke -ist klar! :) Aber ich habe kein SCL da es bei unseren Kunden eigentlich nie erlaubt ist.

Aber wenn man mal sieht was der FB100 alles braucht:
Code:
//uses: T_PLC_MS [FC64]
//      STIME [FB64],IDB_STIME [DB64]
//      MODR [FC97]
//      FLOOR2 [FC82] 
//      MULTIME [FC203]
//      SIGN_R [FC109]
6 Bausteine und 1 DB und davon 4 in einem Bereich den fasst jeder eh schon verwendet hat.

Hier mal die Lösung vom Kollegen Jesper:
Code:
What is stopping you ?
 
Oh well, here we go:
 
Set the setpoint for an IEC timer to whatever full period the sinus curve must have. Then program it to restart when it times up.
If it is set to 30 seconds for example, it will go through 0-30000 milliseconds.
 
//This is the part where you calculate the radians:
//(TimedTime/Fullcycletime) x 2 x Pi
L "Timer".ET
DTR
L "Timer".PT
DTR
/R
L 6.2831853 // 2 x pi
*R
T "rRadians"
 
// this is the part where you generate the sinus value
L "rRadians"
SIN
T "rAmplitude"

Das sind nur 11 Zeilen Code ohne 6 andere Bausteine (stimmt nicht ganz - da auch ein IEC-Timer hergenommen wird) zu benötigen.
11 Zeilen (kann man sogar noch kürzen) + 1 IEC Timer finde ich deutlich effektiver.

Aber ich sage es nochmal - die Oscat Leute machen eine Tolle Sache - aber mal eben eine Funktion ins eigene Projekt übernehmen ist so fast nicht möglich.

cu
 
Zuletzt bearbeitet:
Zurück
Oben