Der Diskussion in diesem Thread viewtopic.php?f=24&t=1592 folgend, möchte ich hier Schritt für Schritt eine Lösung entwickeln, um einmal mein Herangehen zu Custom Logiken zu teilen.
Ich hoffe, dass damit anderen der Einstieg erleichtert wird!
Bitte wirklich jeden Schritt mitdenken und einzeln im LE nachvollziehen, dann ist auch der Lerneffekt am größten!!
Schritt 1: Die wichtigsten Ein- und Ausgänge und Variablen anlegen.
Um Fehler schnell zu finden, empfehle ich ein schrittweises Erstellen der Custom Logiken. Als Texteditor verwende ich derzeit Notepad++ und kopiere von dort den Code in den LE.
Zuerst lege ich die wichtigsten Variablen an (zumindest jene, die für die Ein- / Ausgänge zu Beginn benötigt werden). Variabentypen nochmals überprüfen, denn Fehler, die durch Typ-Konvertierung im Code erfolgen zB. => Integer => Bool sind später nur schwer zu entdecken.
Nach dem Speichern sieht die Logik so aus, ist natürlich noch nicht funktional.
Code: Alles auswählen
{
"Level": [
["$Enable","bool",false],
["$Level_Actual","float",0.0],
["$LevelRise_Rate","float",0.0],
["$Output","bool",false],
["$Time","float",0.0],
["$Level_Old","float",0.0],
["$Toleranz","float",0.01],
["$Inhibit","bool",false]
],
"Input": [
["Enable","Freigabe des Bausteins","$Enable","c"],
["Messwert","Eingang Messsignal","$Level_Actual","c"]
],
"Output": [
["Output","Schaltausgang","$Output","c"],
["Anstieg aktuell","Aktuelle Anstiegsrate","$LevelRise_Rate","c"],
["Zeitdifferenz","Zeit seit letztem Wert","$Time","c"]
],
"Module": [
]
}
Leider habe ich derzeit Probleme mit einer Stoppuhr, so dass ich derzeit eine Lösung mit 2 Stoppuhren, die alternierend messen, umgesetzt.
Für das Tutorial trotzdem nicht schlecht, da es gut das Vorgehen zeigt.
Weiters habe ich zusätzliche (temporäre) Ausgänge zum Debuggen hinzugefügt.
Nach dem Speichern und Aktivieren des DokModes kann man durch Ändern des Eingangswertes kontrollieren:
- Die Zeit zwischen dem Ändern der Werte auf Debug_Time1, Debug_Time2, wobei ein Timer immer 0 anzeigt, da er beim Aufruf zurückgesetzt wurde.
- Der Ausgang Zeitdifferenz zeigt immer den letzten Wert, des richtigen Timers an. Dazu wird ein Multiplexer verwendet, der entweder $Time1 oder $Time2 auf den die Variable $Time schreibt und dann am Ausgang "Zeitdifferenz" anzeigt.
- Das kontinuierliche Umschalten von "Debug_Start" von True auf False, das den aktuellen Timer auswählt.
- Output und Anstieg aktuell zeigen noch keine Werte an, da sie mit keinem "Module" verbunden sind.
Code: Alles auswählen
{
"Level": [
["$Enable","bool",false],
["$Level_Actual","float",0.0],
["$LevelRise_Rate","float",0.0],
["$Output","bool",false],
["$Time1","float",1.0],
["$Time2","float",1.0],
["$Time","float",1.0],
["$Konst1","float",1.0],
["$KonstTrue","bool",true],
["$Start","bool",false]
],
"Input": [
["Enable","Freigabe des Bausteins","$Enable","c"],
["Level Actual","Eingang Messsignal","$Level_Actual","a"]
],
"Output": [
["Output","Schaltausgang","$Output","c"],
["Anstieg aktuell","Aktuelle Anstiegsrate","$LevelRise_Rate","c"],
["Zeitdifferenz","Zeit seit letztem Wert","$Time","c"],
["Debug_Time1","Timer1","$Time1","a"],
["Debug_Time2","Timer2","$Time2","a"],
["Debug_Start","Start","$Start","a"]
],
"Module": [
["Stopwatch","$Start","$Time1"],
["Stopwatch","-$Start","$Time2"],
// Aktuellen Timer umkopieren
["Multiplexer",["$Time1","$Time2"],"$Time","-$Start"],
// Variable $Start Toggeln
["Polynomial","$Konst1","$Start",["-$Start"]]
]
}
Im nächsten Schritt habe ich folgende Vorgänge ergänzt:
- Differenz aus aktuellem und letztem Wert berechnen (Polynomfunktion)
- Anstiegsrate berechnen (Ratio Funktion)
- Die Ergebnisse sind am Ausgang "Anstieg aktuell" und "Debug_Delta" zu sehen.
- Aus den 3 Werten Anstieg aktuell", "Debug_Delta und "Zeitdifferenz" kann der berechnet Wert für die Anstiegsrate kontrolliert werden (3°C/4,09s => 0,73°C/s).
Code: Alles auswählen
{
"Level": [
["$Enable","bool",false],
["$Level_Actual","float",0.0],
["$LevelRise_Rate","float",0.0],
["$LevelRise_SwitchRate","float",0.0],
["$SwitchRate_CResult","bool",false],
["$Output","bool",false],
["$Time1","float",0.0],
["$Time2","float",0.0],
["$Time","float",0.0],
["$Level_Old","float",0.0],
["$Delta","float",0.0],
["$Konst1","float",1.0],
["$KonstTrue","bool",true],
["$New","bool",false],
["$Start","bool",false],
["$Inhibit","bool",false]
],
"Input": [
["Enable","Freigabe des Bausteins","$Enable","c"],
["Level Actual","Eingang Messsignal","$Level_Actual","a"]
],
"Output": [
["Output","Schaltausgang","$Output","c"],
["Anstieg aktuell","Aktuelle Anstiegsrate","$LevelRise_Rate","c"],
["Zeitdifferenz","Zeit seit letztem Wert","$Time","c"],
["Debug_Delta","Delta zw. Messwerten","$Delta","a"],
["Debug_Time1","Timer1","$Time1","a"],
["Debug_Time2","Timer2","$Time2","a"],
["Debug_Start","Start","$Start","a"],
["Debug_Comp","SwitchRate_CResult","$SwitchRate_CResult","a"]
],
"Module": [
["Stopwatch","$Start","$Time1"],
["Stopwatch","-$Start","$Time2"],
// Aktuellen Timer umkopieren
["Multiplexer",["$Time1","$Time2"],"$Time","-$Start"],
// Variable $Start Toggeln
["Polynomial","$Konst1","$Start",["-$Start"]],
// Differenz berechnen
["Polynomial","-$Konst1","$Delta",["$Level_Actual", "$Level_Old"]],
// Anstiegsrate berechnen
["Ratio", "$Delta", "$LevelRise_Rate", "$Time"],
//Alten Wert speichern
["Polynomial","$Konst1","$Level_Old",["$Level_Actual"]]
]
}
lg
Robert