Hier der FB Code Teil 1:
(* Leistungsmessklemme KL3403)*
CB0.3 bis CB0.0 ProcDatIdx Tragen Sie hier den Index des Prozessdatums ein, das Sie mit dem Eingangsdatenwort 0 (DataIN0) auslesen wollen.
Es werden folgende Indices unterstützt:
0000bin 0dez Ieff Strom (Effektivwert) Auflösung: 0,001 A - umgerechnet in 0,1 A
0001bin 1dez Ueff Spannung (Effektivwert) Auflösung: 0,1 V
0010bin 2dez P Wirkleistung Auflösung: 0,1 W - umgerechnet in 0,1 kW
0011bin 3dez cos j Leistungsfaktor Auflösung: 0,01
0100bin 4dez W Energieverbrauch Auflösung: 0,01 kWh (default3) - umgerechnet in 1 kWh
0101bin 5dez Imax Spitzenwert des Stroms Auflösung: 0,001 A - umgerechnet in 0.1 A
0110bin 6dez Umax Spitzenwert der Spannung Resolution: 0.1 V
0111bin 7dez Pmax Spitzenwert der Wirkleistung Resolution: 0.1 kW
Sg, Qg, Wg, Pg, in 0.1 xx
weitere reserviert
R7: Kommando-Register
Kommando 0x1004: Energieverbrauch löschen (Anwender-Passwort muss gesetzt sein)
Schreiben Sie den Wert 0x1004 in das Kommandoregister um den in den Prozessdaten gespeicherten Energieverbrauch (Prozessdatenindex 0x4)
und das Überlauf-Register für den Energieverbrauch (R0) zu löschen.
*)
rtrigbDelEnergyConsumption ( clk := bDelEnergyConsumption );
IF diCurrTransFactor <1 THEN diCurrTransFactor := 1; END_IF;
IF diCurrTransFactor > 100000 THEN diCurrTransFactor := 100000; END_IF;
IF NOT rtrigbDelEnergyConsumption.Q AND NOT bDelEnergyConsumption AND iStateDel = 0 THEN
IF eModePowerMeasurement >0 AND eModePowerMeasurement < 9 THEN
j := eModePowerMeasurement -1 ;
ELSE
IF ((bySBL1 AND 16#0F) = byCBL1) AND ( (bySBL2 AND 16#0F) = byCBL2) AND (( bySBL3 AND 16#0F) = byCBL3 ) AND i < 20 THEN
j:= i+1;
END_IF
END_IF
IF j<>i OR i > 19 OR eModePowerMeasurement >0 THEN
CASE i OF
0 : stQ_PowerMeasurement.diIL1:= WORD_TO_DINT (wDataL1) * diCurrTransFactor /100;
stQ_PowerMeasurement.diIL2 := WORD_TO_DINT(wDataL2 ) * diCurrTransFactor/100;
stQ_PowerMeasurement.diIL3 := WORD_TO_DINT(wDataL3 ) * diCurrTransFactor/100 ; cb:=j;
1 : stQ_PowerMeasurement.diUL1:= WORD_TO_DINT(wDataL1);
stQ_PowerMeasurement.diUL2 := WORD_TO_DINT(wDataL2) ;
stQ_PowerMeasurement.diUL3 := WORD_TO_DINT(wDataL3) ; cb:=j;
2 : stQ_PowerMeasurement.diPL1:= WORD_TO_INT( wDataL1) * diCurrTransFactor/1000 ;
stQ_PowerMeasurement.diPL2 := WORD_TO_INT( wDataL2) * diCurrTransFactor/1000 ;
stQ_PowerMeasurement.diPL3 := WORD_TO_INT( wDataL3) * diCurrTransFactor/1000 ; cb:=j;
3 : IF stQ_PowerMeasurement.diIL1 > 0 THEN
stQ_PowerMeasurement.diCosPhiL1:=WORD_TO_INT( wDataL1);
END_IF
IF stQ_PowerMeasurement.diIL2 > 0 THEN
stQ_PowerMeasurement.diCosPhiL2 :=WORD_TO_INT( wDataL2);
END_IF
IF stQ_PowerMeasurement.diIL3 > 0 THEN
stQ_PowerMeasurement.diCosPhiL3 :=WORD_TO_INT( wDataL3);
END_IF
i:=20;
20 : (*Auswertung Überlauf Energieverbrauch L1*)
Registerzugriff( STATE:=bySBL1,
DATAIN:= wDataL1,
REGNO:= 0,
READ:= TRUE,
WRITE:= FALSE,
TMOUT:= t#2s,
NEWREGVALUE:= 0,
CTRL=> byCBL1,
DATAOUT=> iDataOutL1,
CURREGVALUE=>Energieverbrauch_Ueberl_L1);
IF NOT Registerzugriff.BUSY
THEN
Registerzugriff(READ:=FALSE);
i:=21;
END_IF
IF Registerzugriff.Err THEN
i := 1000;
END_IF;
21 : (*Auswertung Überlauf Energieverbrauch L2*)
Registerzugriff( STATE:=bySBL2,
DATAIN:=wDataL2,
REGNO:=0,
READ:=TRUE,
WRITE:=FALSE,
TMOUT:=t#1s,
NEWREGVALUE:=0,
CTRL=> byCBL2,
DATAOUT=> iDataOutL2,
CURREGVALUE=>Energieverbrauch_Ueberl_L2);
IF NOT Registerzugriff.BUSY
THEN
Registerzugriff(READ:=FALSE);
i:=22;
END_IF
IF Registerzugriff.Err THEN
i := 1000;
END_IF;
22 : (*Auswertung Überlauf Energieverbrauch L3*)
Registerzugriff( STATE:=bySBL3,
DATAIN:=wDataL3,
REGNO:=0,
READ:=TRUE,
WRITE:=FALSE,
TMOUT:=t#1s,
NEWREGVALUE:=0,
CTRL=> byCBL3,
DATAOUT=> iDataOutL3,
CURREGVALUE=>Energieverbrauch_Ueberl_L3);
IF NOT Registerzugriff.BUSY
THEN
Registerzugriff(READ:=FALSE);
i := 4; cb := j;
END_IF
IF Registerzugriff.Err THEN
i := 1000;
END_IF;
4 : stQ_PowerMeasurement.diWL1:= (WORD_TO_DINT( wDataL1 ) + SHL( Energieverbrauch_Ueberl_L1,16) )* diCurrTransFactor/100 ;
stQ_PowerMeasurement.diWL2 := (WORD_TO_DINT( wDataL2 ) + SHL( Energieverbrauch_Ueberl_L2,16) )* diCurrTransFactor/100 ;
stQ_PowerMeasurement.diWL3 := (WORD_TO_DINT( wDataL3 ) + SHL( Energieverbrauch_Ueberl_L3,16) )* diCurrTransFactor/100 ; cb := j ;
5 : stQ_PowerMeasurement.diImaxL1:= WORD_TO_DINT( wDataL1 )* diCurrTransFactor /100;
stQ_PowerMeasurement.diImaxL2 := WORD_TO_DINT( wDataL2 )* diCurrTransFactor /100;
stQ_PowerMeasurement.diImaxL3 := WORD_TO_DINT( wDataL3 )* diCurrTransFactor /100; cb:=j;
6 : stQ_PowerMeasurement.diUmaxL1:= WORD_TO_DINT( wDataL1 );
stQ_PowerMeasurement.diUmaxL2 := WORD_TO_DINT( wDataL2);
stQ_PowerMeasurement.diUmaxL3 := WORD_TO_DINT( wDataL3 ); cb:=j;
7 : stQ_PowerMeasurement.diPmaxL1:= WORD_TO_INT( wDataL1 )* diCurrTransFactor / 1000;
stQ_PowerMeasurement.diPmaxL2 := WORD_TO_INT( wDataL2 )* diCurrTransFactor / 1000;
stQ_PowerMeasurement.diPmaxL3 := WORD_TO_INT( wDataL3 )* diCurrTransFactor / 1000; j:=0; cb:=j;
1000:
(* Evt. Fehlerbehandlung einfügen *)
bError:=TRUE;
iErrID := Registerzugriff.ERRID ;
i := 0;
ELSE
i:=0;
END_CASE;
END_IF