Neueste Beiträge

#1
oscat.lib fuer Step 7 / S7-1200 T_PLC_ms, T_PLC_us
Letzter Beitrag von mg - 16. Dezember 2025, 06:50:31


//entfällt bei S7-1200: "IDB_STIME"();
#T_PLC_MS := "System_Time_DB".ms_dw;
(* hier muss die korrektur für step7 stattfinden
plctime muss den vollen wertebereich von time ausnutzen:
wenn bei step7 time -24tage bis plus 24 tage ist dann muss der timer auch beim überlauf auf -24tage springen
und auf keinen fall auf 0 !!!!
für siemens muss ein weiterer fb im main eingebunden werden der sicherstellt das alle 32 bits durchgezählt werden.
es kann nur ein fb sein den er muss sich das oberste (32te) bit merken.
oder etwa spring s7 bei überlauf auf -24 tage????? dann wäre keine korrektur nötig.
*)
IF "debug" THEN
    #T_PLC_MS := DINT_TO_DWORD((DWORD_TO_DINT(SHL(IN:=#T_PLC_MS,N:="N") OR SHL(IN:=DWORD#1,N:="N"))-1) + DWORD_TO_DINT("offset_1"));
END_IF;
 
 
(* revision history
hm  14.9.2007   rev 1.0
    original version

hm  12. nov 2007    rev 1.1
    added temporaray variable tx because some compilers could not handle time() as an argument

hm  16. nov. 2008   rev 1.2
    initialized constants with 0 for compatibility reasons
*)





//entfällt bei S7-1200: "IDB_STIME"();
#T_PLC_US := "System_Time_DB".us_dw;
(* hier muss die korrektur für step7 stattfinden
plctime muss den vollen wertebereich von time ausnutzen:
wenn bei step7 time -24tage bis plus 24 tage ist dann muss der timer auch beim überlauf auf -24tage springen
und auf keinen fall auf 0 !!!!
für siemens muss ein weiterer fb im main eingebunden werden der sicherstellt das alle 32 bits durchgezählt werden.
es kann nur ein fb sein den er muss sich das oberste (32te) bit merken.
oder etwa spring s7 bei überlauf auf -24 tage????? dann wäre keine korrektur nötig.
*)
IF "debug" THEN
    #T_PLC_US := DINT_TO_DWORD((DWORD_TO_DINT(SHL(IN:=#T_PLC_US,N:="N") OR SHL(IN:=DWORD#1,N:="N"))-1) + DWORD_TO_DINT("offset_1"));
END_IF;
 
 
(* revision history
hm  14.9.2007   rev 1.0
    original version

hm  12. nov 2007    rev 1.1
    added temporaray variable tx because some compilers could not handle time() as an argument

hm  16. nov. 2008   rev 1.2
    initialized constants with 0 for compatibility reasons

*)
#2
oscat.lib fuer Step 7 / S7-1200 FT_PIWL
Letzter Beitrag von mg - 16. Dezember 2025, 06:43:55

(* initialize at power_up *)
IF NOT #init OR #RST  THEN
    #init := TRUE;
    #in_last := #IN;
    #t_last := "T_PLC_US"();
    #i := 0.0;
    #tc := 0.0;
ELSE
    (* read last cycle time in Microseconds *)
    #tx := "System_Time_DB".us_dw;
    #tc := 1000.0/1024.0*DINT_TO_REAL(DWORD_TO_DINT(#tx) - DWORD_TO_DINT(#t_last));

    #t_last := #tx;

    (* calculate proportional part *)
    #p := #KP * #IN;

    (* run integrator *)
    #i := (#IN + #in_last) * 5.0E-7 * #KI * #tc + #i;
    #in_last := #IN;

    (* calculate output Y *)
    #Y := #p + #i;

    (* check output for limits *)
    IF #Y >= #LIM_H THEN
        #Y := #LIM_H;
        IF #KI <> 0.0 THEN 
            #i := #LIM_H - #p;
        ELSE
            #i := 0.0;
        END_IF;
        #LIM := TRUE;
    ELSIF #Y <= #LIM_L THEN
        #Y := #LIM_L;
        IF #KI <> 0.0 THEN
            #i := #LIM_L - #p;
        ELSE
            #i := 0.0;
        END_IF;
        #LIM := TRUE;
    ELSE
        #LIM := FALSE;
    END_IF;
END_IF;


(* revision history
hm 13. jun. 2008    rev 1.0
    original version

hm  27. oct. 2008   rev 1.1
    integrator will not be adjusted when ki = 0

hm  25. jan 2009    rev 1.2
    module will also work with negative K

hm  11. mar. 2009   rev 1.3
    real constants updated to new systax using dot
*)
#3
oscat.lib fuer Step 7 / S7-1200 Reglerbausteine (SYSTE...
Letzter Beitrag von mg - 16. Dezember 2025, 06:36:59
Da geisterte ca. 2020 eine KORREKT übersetzte Oscat für die S7-1200 rum.
Ich habe sie verwendet. Die ist aber dermaßen falsch, dass ich mich zu diesem Kommentar gezwungen sehe.
Ich veröffentliche hier die Reglerbausteine im Klartext. (anders geht es nicht mehr, UND BITTE TESTEN vor dem Verwenden)
(Für meine Anwendungsfall ging es perfekt)

Verwendet wurde eine S7-1212 (FW 3.1 ist schon ziemlich alt sollte für alle neueren funktionieren)
Die Reglerbausteine (siehe folgende Blogs) wurden im meinem Fall nicht unter dem MAIN-Task verwendet sondern unter CYL (333ms).
Wenns jemand für MAIN verwenden will bitte auch vorher testen.

Dazu wurde erst mal die System_Time aus der besagten nicht funktionierende LIB verändert (im Orig.Oscat gib es dafür die T_PLC_us und die T_PLC_ms)
Systembdingt gibt es T_PLC_us, T_PLC_ms immer noch ABER VERÄNDERT siehe weitere BLOGs
Die SYSTEM_TIME sollte unter dem MAIN Task eingebunden werden


System_Time
Input                               
                                   
Output                               
                                   
InOut                               
                                   
Static                               
    Systemzeit_    DTL    DTL#1970-01-01-00:00:00    True    True    True    True       
    Systemzeit_Err_i    Int    0    True    True    True    False       
    old_systemzeit_    DTL    DTL#1970-01-01-00:00:00    True    True    True    False       
    fast_time_t    Time    T#0ms    True    True    True    False       
    ms_dw    DWord    16#0    True    True    True    False       
    us_dw    DWord    16#0    True    True    True    False       
    old_Systemzeit_MINUTE    UDInt    0    False    False    False    False       
    Minutes_    UDInt    0    False    False    False    False       
    check1_    DTL    DTL#1970-01-01-00:00:00    True    True    True    False       
    check2_    DTL    DTL#1970-01-01-00:00:00    True    True    True    False       
    check3_    Time    T#0ms    True    True    True    False       
    check4_    DWord    16#0    True    True    True    False       
    check5_    Int    0    True    True    True    False       
Temp                               
    T_DIFF_ENO_x    Bool                           
Constant                               
                                   

#Systemzeit_Err_i:=RD_SYS_T(OUT=>#"Systemzeit_");
// ************* MILLISEKUNDEN *****************
IF #"old_systemzeit_"=DTL#1970-01-01-00:00:00 THEN
    #"old_systemzeit_":=#"Systemzeit_";
END_IF;
#fast_time_t:=T_DIFF(IN1:=#"Systemzeit_", IN2:=#"old_systemzeit_", ENO=>#T_DIFF_ENO_x);
IF NOT #T_DIFF_ENO_x THEN
    #"old_systemzeit_":=T_SUB(IN1:=#"old_systemzeit_", IN2:=T#-24d_20h_31m_23s_648ms);
    #"check1_":=#"old_systemzeit_";
    #"old_systemzeit_":=T_ADD(IN1:=#"old_systemzeit_", IN2:=T#24d_20h_31m_23s_647ms);
    #"check2_":=#"old_systemzeit_";
    #"check3_":=T_DIFF(IN1:=#"Systemzeit_", IN2:=#"old_systemzeit_");
    #"check4_":=TIME_TO_DWORD(#fast_time_t);
    #"check5_":=#"check5_"+1;
    #T_DIFF_ENO_x:=TRUE;
END_IF;
#ms_dw:=TIME_TO_DWORD(#fast_time_t);
#us_dw:=SHL(IN:=#ms_dw,N:=10);      // entspricht einer DIV durch 1000, stimmt nicht ganz genau weil das ist [ms]*1024 sollte aber ausreichend sein
#4
oscat.lib fuer TwinCAT/CoDeSys / Nacherhitzer einer Lüftungsanl...
Letzter Beitrag von raicer - 22. November 2025, 09:26:44
Hallo,

ich habe eine zentrale Lüftungsanlage und habe hier im Zuluftkanal ein Heizregister nachgeschaltet womit ich die Zulufttemperatur zu den Räumen etwas anheben möchte.
Zum Aufbau:
-Das Heizregister hat 1,5kW und wird über ein Stellsignal 2-10V Leistungsgeregelt.
-Es gibt einen Temperaturfühler vor dem Heizregister zum messen der Zulufttemperatur (ist aber etwas zu nahe
 dran, daher erhöht sich auch hier beim heizen die Temp.). Dieser Fühler hat quasi keinen Sinn :-)
-Einen Temperaturfühler nach dem Erhitzer zum messen der Temp. nach Erwärmung. Dieser soll die maximale
 Zuluft-Temp im Lüftungssystem begrenzen, erstmal auf 40°C.
-Einen Fühler direkt im Zuluft-Einlasskanal vom Raum zum messen der Zuluft-Raumtemp. Das ist die Temperatur
 welche aktiv angehoben werden soll, hier von 18 auf 20°C.

Mit der Programmierung kenne ich mich recht gut aus, allerdings nur im Bezug auf Steuerungen.
Nun versuche ich zum ersten mal mein Glück mit der Regelung. Bisher mäßig erfolgreich...

Aus meinen Versuchen ergibt sich das es sehr lange dauert bis sich die Raumtemp. beginnt zu erhöhen während die Heizung am selbst gesetzten Limit von 45° heizt. Ist aufgrund der Leitungsführung und der Systemgröße auch nachvollziehbar, dauert schließlich bis alles ausreichend aufgeheizt ist damit am Ende noch was ankommt.

Das Funktionsprinzip das ich anstrebe ist also:
Regle den Raum auf Solltemp. 20°C (Führungsgröße Raumfühler, System sehr träge)
Begrenze und regle dabei die max. Temp. im Lüftungssystem auf 45°C (Führungsgröße Fühler nach Erhitzer, reagiert recht direkt: Temp.-Erhöhung nach wenigen Sekunden, Abkühlen dauert etwa 30s bis sich ein Effekt einstellt wenn der Sollwert weit genug runter genommen wird)


Aktuell versuche ich erstmal mit einem Regler "CTRL_PID" die maximale Temp. auf 45°C zu begrenzen.
Es scheitert hier vermutlich an der korrekten Parametrierung da ich die Zieltemp. von 40°C immer um ca. 5°C überschreite weil der Regler offenbar zu spät zurückregelt.
Anschließend sinkt meine Temp. auf ca. 35°C bevor sie wieder steigt, offenbar auch aufgrund falscher Parameter...

Die Beschaltung des Bausteins CTRL_PID sieht aktuell folgendermaßen aus:
ACT:= Temperaturfühler nach Erhitzer
SET:= 40°C
OFS:= 0.0
KP := 0.01
TN := 5.0
TV := 1.0
LL := 0.0
LH := SET + 5 (=45.0)

Erste Frage wäre wie beschalte ich den Baustein korrekt?
für LL und LH habe ich die Temperaturwerte Min/Max eingetragen. Für KP; TN, TV habe ich nach Beschreibung und Einstellanleitungen von google herumexperimentiert mit unterschiedlichsten Werten, allerdings recht erfolglos.
Trotz allem bin ich leider nicht in der Lage diesen so zu Parametrieren das er sich brauchbar auf den Sollwert einregelt. Egal ob ich KP größer wähle, TN verändere,... bei mir ergibt sich immer eine riesige Schwankung :-(

Der nächste Punkt wäre, wenn ich die Einhaltung der Max. Temp. im System geschafft habe, wie ich dem ganzen System erkläre das nicht nur die max. Temp. im Heizsystem eingehalten werden muss sondern auch auf die Zieltemp. geregelt werden muss sobald sich die Raumtemp. merklich beginnt zu erhöhen.
Dabei muss ich im Blick behalten das ich nicht das komplette Lüftungssystem auf 30° oder so erhitzen möchte...
Sobald sich das Lüftungssystem ausreichend erwärmt hat muss ich die Temp. ja deutlich reduzieren?
Hier habe ich gar keine Ahnung wie ich das umsetzen muss.

Ich hoffe ihr könnt mir ein paar Tipps geben wie ich das Ganze aufbauen und beschalten muss.
#5
oscat.lib fuer CoDeSys 3 / Eine Bibliothek darf kein Pers...
Letzter Beitrag von Andy - 12. November 2025, 14:09:56
Hallo,

die Warnung aus dem Betreff kommt beim Kompilieren von Projekten mit Oscat Building aus dem Codesys Store. Bisher nur bei Building und ich hab es einfach ignoriert.
Jetzt hab ich die Basic von 3.3.4 auf 3.3.5 upgegradet. Und nun ist auch dort eine leere PV eingebunden. Ist nur ein Schönheitsfehler aber ich habe gern alle Warnungen weg.
Wurde das einfach übersehen oder hat es einen Hintergrund? Ist eine Korrektur geplant?

Gruß
Andy
#7
oscat.lib fuer Step 7 / Aw: OSCAT BUFFER_TO_STRING
Letzter Beitrag von mactoolz - 07. November 2025, 06:43:11
Morgen,

ich bin da auch an diesem Baustein dran. Hoffentlich kann jemand ein Feedback dazu geben.

Ich bin mir total unsicher wie man den Pointer aufbaut und dann an den FB übergibt.

Vielleicht kann sich jemand nochmal dem Thema annehmen. Das wäre super ...

Gruß
#8
Modulentwicklung / Aw: Umstieg von Codesys 2.3 au...
Letzter Beitrag von AntonZan - 27. Oktober 2025, 08:53:10
Zitat von: AntonZan in 11. September 2025, 12:49:22As of now there is no port to 64-bit controllers for the Oscat libraries that I know of. Most of the OSCAT_BASIC library will work on both 32-bit as well as 64-bit controllers. Only the _BUFFER_CLEAR() and _BUFFER_INIT() functions are very specifically optimised for 32-bit alignment of bytes and will not work correctly on 64-bit.

Going back over this I think I was wrong here. I lack time for extensive testing but I think the original code for _BUFFER_CLEAR() and _BUFFER_INIT() will work on 64-bit. It is just not as efficient as it can be. I have adapted versions using the __XWORD datatype and compiler pragma's so the same code is optimized for both 32-bit and 64-bit. No code changes required. One library can still be used on both 32b and 64b controllers. If someone wants to test these or just review what I did, I can post the code.
#9
Modulentwicklung / Module Development / Aw: Rezepturverwaltung -> 2025
Letzter Beitrag von Mel_Aut_Rob - 24. Oktober 2025, 09:17:59
Ich wollte nachfragen, in wieweit sich die Thematik mit der Rezeptursteuerung in der Zwischenzeit konkretisiert hat? - Gibt es ev. Tipps und Tricks (oder auch links) zur Umsetzung von Rezepturaufbauten nach ISA 88 unter OSCAT/ Codesys/ TwinCAT? - Besten Dank für die Rückinfo.
#10
Modulentwicklung / Aw: Umstieg von Codesys 2.3 au...
Letzter Beitrag von mg - 29. September 2025, 13:36:48
I have the same time-problem. I will write you a private Message with my email. If you like maybe we can do something but I think it is NOT easy. ... maybe next year when the economy works like the last 12 months ...
Hint: I have done a lot of work for the SIEMENS oscat already (in the beginning we had a good forum, now it is not interested to report a fault) ... only for around 30-oscat functions of the SIEMENS / BASIC OSCAT I needed years to make it really 100% working.

* AND here we discuss about the OSCAT NETWORK (much more complcated)

Mg