20.4. Przykłady reguł

Poniższa reguła sprawdza czy ciśnienie dyspozycyjne jest w widełkach:

<checker:rule checker:name="Sieć:Przepływy:ciśnienie dyspozycyjne w widełkach">
<![CDATA[
function main()
    avg1=0;
    avg2=0;
    avg3=0;
    result=0;
    avg1=avgprobe("Sieć:Przepływy:minimalne ciśnienie dyspozycyjne");
    avg2=avgprobe("Sieć:Przepływy:aktualne ciśnienie dyspozycyjne");
    avg3=avgprobe("Sieć:Przepływy:maksymalne ciśnienie dyspozycyjne");
    result=-1;
    if avg1~=-32768 and avg2~=-32768 and avg3~=-32768 then
    result=0;
    end
    avg1=avg1-1;
    avg3=avg3+1;	 
    if avg2 >= avg1 and avg2 <= avg3 then
     result=1;
    end
   return result; 
end
]]>
</checker:rule>
Poniższa reguła sprawdza czy parametr nie przekroczył z góry zadanej wartości:
<checker:rule checker:name="Kocioł 1:Sterownik:stosunek energia / objętość > 4,0">
<![CDATA[
function main()
	local avg1=0;
	avg1=avgprobe("Kocioł 1:Sterownik:wydajność kotła");
	if avg1==-32768 then
		return -1;
	end
	if avg1 < 50 then
		return 1;
	else
		return checklessthan("Kocioł 1:Sterownik:stosunek energia / objętość",4000);

	end
end
]]<
</checker:rule>
Można również zdefiniować reguły dużo bardziej skomplikowane np. w regule sprawdzającej poprawność pomiaru prędkości rusztu zastosowano algorytm zmodyfikowanego współczynnika korelacji liniowej Pearsona, zdefiniowanego w następujący sposób:

Rysunek 20-1. Definicja współczynnika korelacji Pearsona

Pozwala on określić stopień liniowego odwzorowania zbioru danych X w zbiór Y. Im większa wartość współczynnika, tym większa jest zależność liniowa między zbiorami; rxy = 0 oznacza brak liniowej zależności między cechami, rxy = 1 oznacza dokładną dodatnią liniową zależność między cechami, natomiast rxy = -1, oznacza dokładną ujemną liniową zależność między cechami. Dlatego też doskonale nadaje się do sprawdzania poprawności pomiaru prędkości rusztu. Poniżej przedstawiono dwa wykresy prędkości i wysterowania falownika rusztu. Na pierwszym z nich widać, że prędkość rusztu mimo stałego wysterowania falownika rusztu nie jest stała i ma charakter oscylacyjny:

Rysunek 20-2. Nieprawidłowy pomiar prędkości rusztu

Na drugim z wykresów przedstawiono sytuację, gdy prędkość rusztu zmienia się tylko, gdy następuje zmiana w wysterowaniu falownika rusztu:

Rysunek 20-3. Prawidłowy pomiar prędkości rusztu

W pierwszym przypadku współczynnik korelacji Pearsona będzie znacznie mniejszy od 1 (rzędu setnych miejsc po przecinku), gdyż nie istnieje liniowa zależność między prędkością a wysterowaniem falownika rusztu. W drugim przypadku zależność między prędkością a wysterowaniem falownika rusztu jest praktycznie liniowa i współczynnik korelacji Pearsona osiągnie wartość w przybliżeniu 1 (około 0,9).

Zapis w języku Lua będzie miał następującą postać:

<checker:rule checker:name="Kocioł 1:Sterownik:niezakłócona prędkość rusztu">
<![CDATA[
function main()
	local hpr=0;
	local xsr=0;
	local ysr=0;
	local result=0;
	local sumn=0;
	local sumd1=0;
	local sumd2=0;
	local sumd=0;
	local xdata=0;
	local ydata=0;
	local ptr=0;
	local corr=0;
	hpr=howprobes("Kocioł 1:Sterownik:prędkość rusztu");
	hprnd=howprobesnd("Kocioł 1:Sterownik:prędkość rusztu");
	if hprnd==0 then
		return -1;
	end
      if checkgreaterthan("Kocioł 1:Sterownik:wydajność kotła",50)==1 then
                      return 1;
      end

	if checknoconsthyst("Kocioł 1:Sterownik:prędkość rusztu",50)==0 and checknoconsthyst("Kocioł 1:Sterownik:aktualne wysterowanie falownika rusztu",50)==0 then
		return 1;
	end
	
	xsr=avgprobe("Kocioł 1:Sterownik:prędkość rusztu");
	ysr=avgprobe("Kocioł 1:Sterownik:aktualne wysterowanie falownika rusztu");

	for i=1,hpr do
		ptr=i-1;
		xdata=getprobes("Kocioł 1:Sterownik:prędkość rusztu",ptr);
		ydata=getprobes("Kocioł 1:Sterownik:aktualne wysterowanie falownika rusztu",ptr);
		if xdata~=-32768 and ydata~=-32768 then
			sumn=sumn+(xdata-xsr)*(ydata-ysr);
			sumd1=sumd1+(xdata-xsr)^2;
			sumd2=sumd2+(ydata-ysr)^2;
		end
	end
	sumd=math.sqrt(sumd1)*math.sqrt(sumd2);
	corr=sumn/sumd;
	if corr>0.50 then
	   return 1;
	end
    if checklessthan("Kocioł 1:Sterownik:Czas wypełnienia w regulacji 2 stanowej",0)==1 then
    	return 1;
    end
    return 0; 
 end
 ]]>
</checker:rule>