IF ((PV_FroniusLicznik_Total-PV_FroniusLicznik_Total_prev) >= PV_FroniusCounterStep) THEN
PV_FroniusCounterChange := DWORD_TO_INT(PV_FroniusLicznik_Total-PV_FroniusLicznik_Total_prev);
PV_FroniusLicznik_CurrentAvg := REAL_TO_INT(3600000.0/PV_FroniusLicznik_Total_prev_duration * PV_FroniusCounterChange);
PV_FroniusLicznik_Total_prev := PV_FroniusLicznik_Total;
PV_FroniusLicznik_Total_prev_time := TIME();
(* spowolnienie usredniania jezli produkcja jest wysoka, a impulsy zbyt czeste *)
CASE (DWORD_TO_INT(PV_FroniusLicznik_CurrentAvg)) OF
0..800:
PV_FroniusCounterStep := 1;
801..1400:
PV_FroniusCounterStep := 2;
1401..2000:
PV_FroniusCounterStep := 3;
2001..3000:
PV_FroniusCounterStep := 4;
ELSE
PV_FroniusCounterStep := 5;
END_CASE;
END_IF;
Energy_All_Trigger(CLK:=xIN_Licznik_Energii_All);
IF Energy_All_Trigger.Q THEN
Energy_All_Meter := Energy_All_Meter + 0.001;
END_IF;
IF (Energy_All_Meter - Energy_All_Meter_prev >= Energy_All_Meter_step / 1000) THEN
(*
Energy_All_Meter_prev := Energy_All_Meter;
tutaj wszystkie obliczenia
*)
CASE (DWORD_TO_INT(Energy_All_ConsumAvg)) OF
0..800:
Energy_All_Meter_step := 1;
801..1400:
Energy_All_Meter_step := 2;
1401..2000:
Energy_All_Meter_step := 3;
2001..3000:
Energy_All_Meter_step := 4;
ELSE
Energy_All_Meter_step := 5;
END_CASE;
END_IF;
jak przekonwertować wartość REAL na dwa Wordy
Water_All_Trigger(CLK:=xIN_Licznik_Wody_All); IF Water_All_Trigger.Q THEN Water_All_Duration:=TIME_TO_REAL(TIME()-Water_All_Time); Water_All_Time:= TIME(); Water_All_Consum:=60000/(Water_All_Duration); END IF |
IF (Water_All_Consum>0 AND TIME_TO_REAL(TIME()-Water_All_Time) > 5000) THEN
Water_All_Consum := 0;
END_IF;
X := REAL_TO_WORD((T+100)*100);
Co do wysyłania typu REAL przed modbusa, to możesz to zrobić jeszcze np. tak: X := REAL_TO_WORD(T+100)*100; Gdzie T to temperatura.
Czyli temperatura T=-32.55 stopnia zamieni się na 6745. A po drugiej stronie zrobisz odwrotną konwersję T := WORD_TO_REAL(X)/100-100;
Tutaj tak samo, typy zmiennych i parametry do dopracowania.
Water_All_Duration: DWORD;
Water_All_Time: TIME;
Water_All_Consum: REAL;
Water_All_Consum := 60000/DWORD_TO_REAL(Water_All_Duration);