-> Hier kostenlos registrieren
Hallo Leute
Ich bin gerade dabei eine Art Detektionsalgorithmus für Instabilitäten zu entwickeln. Dieser wurde zunächst in MATLAB geschrieben und getestet nun soll er noch auf eine SPS implementieren werden. Hatte zwar vor einigen Jahren ein wenig in FUP, KOP und AWL gelernt aber das hab ich seit dem nie wieder gebraucht und somit auch das meiste vergessen. Da ich aber case Anweisungen benötige muss ich hier auf scl zurückgreifen was für mich totales Neuland ist.
Dabei geht es um Folgendes, eine Prozessgröße soll gemessen werden und hinsichtlich ihrer Stabilität überwacht werden, dh. die Einhaltung einer oberen und unteren Grenze wird überwacht. Werden obere und untere Grenze innerhalb eines bestimmten Zeitintervalls verletzt, ist das ein Zeichen für die Instabilität der Prozessgröße. Die Grenzwerte sollen darüber hinaus der Prozessgröße folgen, dh. wird zB. die untere Grenze unterschritten, wird die neue untere Grenze (also für den nächsten Messwert) auf den aktuellen Wert gesetzt und die obere Grenze entsprechend dazu angepasst.
Wenn ein Grenzwert mehrmals hintereinander verletzt wird soll die Zeit immer wieder neu gestartet werden. Je nach Zustand werden dann verschiedene Anweisungen durchgeführt und ein neuer Zustand gesetzt.
Dabei stellen sich mir ein paar Fragen:
Was für Bausteine brauche ich dafür, und was gehört wo rein?
Wie muss ich die Zeit/Intervallüberprüfung implementieren?
Hab mich da schon mal umgeschaut, was es denn für Zeitfunktionen gibt und ich denke ein verlängerter Impuls sollte der richtige für meine Anwendung sein. Wie kann ich dann in meiner case Anweisung prüfen ob die Zeit bereits abgelaufen ist oder nicht?
Hier mal der Code-Auszug aus Matlab:
Ich bin gerade dabei eine Art Detektionsalgorithmus für Instabilitäten zu entwickeln. Dieser wurde zunächst in MATLAB geschrieben und getestet nun soll er noch auf eine SPS implementieren werden. Hatte zwar vor einigen Jahren ein wenig in FUP, KOP und AWL gelernt aber das hab ich seit dem nie wieder gebraucht und somit auch das meiste vergessen. Da ich aber case Anweisungen benötige muss ich hier auf scl zurückgreifen was für mich totales Neuland ist.
Dabei geht es um Folgendes, eine Prozessgröße soll gemessen werden und hinsichtlich ihrer Stabilität überwacht werden, dh. die Einhaltung einer oberen und unteren Grenze wird überwacht. Werden obere und untere Grenze innerhalb eines bestimmten Zeitintervalls verletzt, ist das ein Zeichen für die Instabilität der Prozessgröße. Die Grenzwerte sollen darüber hinaus der Prozessgröße folgen, dh. wird zB. die untere Grenze unterschritten, wird die neue untere Grenze (also für den nächsten Messwert) auf den aktuellen Wert gesetzt und die obere Grenze entsprechend dazu angepasst.
Wenn ein Grenzwert mehrmals hintereinander verletzt wird soll die Zeit immer wieder neu gestartet werden. Je nach Zustand werden dann verschiedene Anweisungen durchgeführt und ein neuer Zustand gesetzt.
Dabei stellen sich mir ein paar Fragen:
Was für Bausteine brauche ich dafür, und was gehört wo rein?
Wie muss ich die Zeit/Intervallüberprüfung implementieren?
Hab mich da schon mal umgeschaut, was es denn für Zeitfunktionen gibt und ich denke ein verlängerter Impuls sollte der richtige für meine Anwendung sein. Wie kann ich dann in meiner case Anweisung prüfen ob die Zeit bereits abgelaufen ist oder nicht?
Hier mal der Code-Auszug aus Matlab:
Code:
% Variablen & Signale
% oG_alarm = Merker/Alarm das obere Grenze verletzt
% uG_alarm = Merker/Alarm das untere Grenze verletzt
% Bd = halbe Bandbreite = halbe Differenz zwischen oberer und unterer Grenze (fester Wert)
% oberer_Grenzwert = obere Grenze (Gleitkomma)
% unterer_Grenzwert = untere Grenze (Gleitkomma)
% Messwert = aktueller Messwert der Prozessgröße (Gleitkomma)
% Zustand = Zustand (0...4) normaler Betrieb, obere Grenze wurde verletzt, untere Grenze wurde verletzt, Instabilität
% time = Zeit
% time_end = Intervallgrenze der Zeit = max. Zeit zwischen 2 Verletzungen der Grenzen.
oG_alarm = 0;
uG_alarm = 0;
% Grenzwertnachfuehrung
If Messwert < unterer_Grenzwert
unterer_Grenzwert = Messwert;
oberer_Grenzwert = unterer_Grenzwert + 2*Bd;
uG_alarm = 1;
oG_alarm = 0;
elseif Messwert > oberer_Grenzwert
oberer_Grenzwert = Messwert;
unterer_Grenzwert = oberer_Grenzwert - 2*Bd;
uG_alarm = 0;
oG_alarm = 1;
end
if (time > time_end)
time= 0;
Zustand= 0;
elseif Zustand==1 || Zustand==2 || Zustand==3 || % Zustand ist 1 oder 2 oder 3
time=time +1
end
switch Zustand
case 0
if oG_alarm == 1
Zustand =1;
elseif uG_alarm ==1
Zustand == 2;
elseif Zustand == 1
Zustand = 1;
elseif Zustand == 2
Zustand = 2;
elseif Zustand == 3
Zustand = 3;
end
case 1
if oG_alarm == 1 % wenn erneut Alarm (oben) ausgelöst wird bleibe in Zustand 1 und starte Intervall neu
Zustand = 1;
time = 0;
elseif uG_alarm ==1 % wenn Alarm (unten) ausgelöst wird, wechsle in Zustand 3
time = 0;
Zustand == 3;
elseif time > time_end % wenn Zeit abgelaufen ist gehe zurück in (normalen) Zustand 0
time = 0;
Zustand = 0;
elseif oG_alarm == 0 && time< time_end % solange kein neuer Alarm (oben) ausgelöst wurde und die Zeit noch nicht abgelaufen ist bleibe in % Zustand 1
Zustand = 1;
else
Zustand = 0;
end
case 2
if uG_alarm == 1
Zustand = 2;
time = 0;
elseif oG_alarm ==1
time = 0;
Zustand = 3;
elseif time > time_end
time = 0;
Zustand = 0;
elseif uG_alarm == 0 && time < time_end
Zustand = 2;
else
Zustand = 0;
end
case 3
if time < time_end;
Zustand = 3;
else
time = 0;
Zustand = 0;
end
end