﻿
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% Device definition for CIRCUTOR CVM-MINI settings
%
% Settings module:
%       Parity:	None
%       Baud:   9600
%       Mode:   RTU
% 
% Author:  Ove Jansson, ABELKO AB Luleå 
% History: 2011-04-05 initial version
%
DEVICETYPE CircutorRead1 NAMED "Circutor Reg1-20" TYPEID 21410 IS 
  
  PARAMETER
    Id       : "Adress";
   
  PUBLIC
    V1       : "L1_Voltage_phase"  	["V"];	% x10
    V2       : "L1_Current"  		["mA"];
    V3       : "L1_Active_power"    	["w"];
    V4       : "L1_Reactive_Power"  	["w"];
    V5       : "L1_Power_factor"       	[""]; 	% x100
    V6       : "L2_Voltage_phase"  	["V"];	% x10
    V7       : "L2_Current"  		["mA"];
    V8       : "L2_Active_power"    	["w"];
    V9       : "L2_Reactive_Power"  	["w"];
    V10      : "L2_Power_factor"       	[""]; 	% x100
    V11      : "L3_Voltage_phase"  	["V"];	% x10
    V12      : "L3_Current"  		["mA"];
    V13      : "L3_Active_power"    	["w"];
    V14      : "L3_Reactive_Power"  	["w"];
    V15      : "L3_Power_factor"       	[""]; 	% x100
    V16      : "Active_power_III"    	["w"];
    V17      : "Inductive_power_III"   	["w"];
    V18      : "Capacitive_power_III"  	["w"];
    V19      : "Cos_psi_III"    	[""];	% x100
    V20      : "Power_factor_III"    	[""];	% x100

    PRIVATE
    Tmp1;

  BAUDRATE 9600;

  CHECKSUM MODBUS SWAPPED;
  
  TELEGRAM AnalogInput1 NAMED "Läs Reg 1-20" IS
    QUESTION
      DATA[0]  := BYTE(Id);      % Modbus unit address
      DATA[1]  := HEX(04);       % Modbus command "04h" Read registers
      DATA[2]  := RWORD(0);      % OBS!! Register adress = Modbusadress in spec
      DATA[4]  := RWORD(40);     % Number of registers

    ANSWER SIZE 85 		  % antal register *2 + 5
      DATA[0]   = BYTE(Id);      % ID
      DATA[1]   = HEX(04);       % Modbus command "04h" Read registers
      DATA[2]   = BYTE(80);      % Byte count
      DATA[3] -> RWORD(Tmp1 := DATA*65536;);
      DATA[5] -> RWORD(V1 := (Tmp1 + DATA) / 10;); 	% V1       : "L1_Voltage_phase"  	["V"];	% x10
      DATA[7] -> RWORD(Tmp1 := DATA*65536;);
      DATA[9] -> RWORD(V2 := (Tmp1 + DATA);); 		% V2       : "L1_Current"  		["mA"];
      DATA[11] -> RWORD(Tmp1 := DATA*65536;);
      DATA[13] -> RWORD(V3 := (Tmp1 + DATA);); 	% V3       : "L1_Active_power"    	["w"];
      DATA[15] -> RWORD(Tmp1 := DATA*65536;);
      DATA[17] -> RWORD(V4 := (Tmp1 + DATA);); 	% V4       : "L1_Reactive_Power"  	["w"];
      DATA[19] -> RWORD(Tmp1 := DATA*65536;);
      DATA[21] -> RWORD(V5 := (Tmp1 + (DATA)) / 100;); 	% V5       : "L1_Power_factor"       	[""]; 	% x100
      DATA[23] -> RWORD(Tmp1 := DATA*65536;);
      DATA[25] -> RWORD(V6 := (Tmp1 + (DATA)) / 10;); 	% V6       : "L2_Voltage_phase"  	["V"];	% x10
      DATA[27] -> RWORD(Tmp1 := DATA*65536;);
      DATA[29] -> RWORD(V7 := (Tmp1 + (DATA));); 	% V7       : "L2_Current"  		["mA"];
      DATA[31] -> RWORD(Tmp1 := DATA*65536;);
      DATA[33] -> RWORD(V8 := (Tmp1 + (DATA));); 	% V8       : "L2_Active_power"    	["w"];
      DATA[35] -> RWORD(Tmp1 := DATA*65536;);
      DATA[37] -> RWORD(V9 := (Tmp1 + (DATA));); 	% V9       : "L2_Reactive_Power"  	["w"];
      DATA[39] -> RWORD(Tmp1 := DATA*65536;);
      DATA[41] -> RWORD(V10 := (Tmp1 + (DATA)) / 100;); 	% V10      : "L2_Power_factor"       	[""]; 	% x100
      DATA[43] -> RWORD(Tmp1 := DATA*65536;);
      DATA[45] -> RWORD(V11 := Tmp1 + (DATA););		% V11      : "L3_Voltage_phase"  	["V"];	% x10
      DATA[47] -> RWORD(Tmp1 := DATA*65536;);
      DATA[49] -> RWORD(V12 := Tmp1 + (DATA););		% V12      : "L3_Current"  		["mA"];
      DATA[51] -> RWORD(Tmp1 := DATA*65536;);
      DATA[53] -> RWORD(V13 := Tmp1 + (DATA););		% V13      : "L3_Active_power"    	["w"];
      DATA[55] -> RWORD(Tmp1 := DATA*65536;);
      DATA[57] -> RWORD(V14 := Tmp1 + (DATA););		% V14      : "L3_Reactive_Power"  	["w"];
      DATA[59] -> RWORD(Tmp1 := DATA*65536;);
      DATA[61] -> RWORD(V15 := (Tmp1 + (DATA)) / 100;);	% V15      : "L3_Power_factor"       	[""]; 	% x100
      DATA[63] -> RWORD(Tmp1 := DATA*65536;);
      DATA[65] -> RWORD(V16 := Tmp1 + (DATA););      	% V16      : "Active_power_III"    	["w"];
      DATA[67] -> RWORD(Tmp1 := DATA*65536;);
      DATA[69] -> RWORD(V17 := Tmp1 + (DATA););		% V17      : "Inductive_power_III"   	["w"];
      DATA[71] -> RWORD(Tmp1 := DATA*65536;);
      DATA[73] -> RWORD(V18 := Tmp1 + (DATA););		% V18      : "Capacitive_power_III"  	["w"];
      DATA[75] -> RWORD(Tmp1 := DATA*65536;);
      DATA[77] -> RWORD(V19 := (Tmp1 + (DATA)) / 100;);	% V19      : "Cos_psi_III"    		[""];	% x100
      DATA[79] -> RWORD(Tmp1 := DATA*65536;);
      DATA[81] -> RWORD(V20 := (Tmp1 + (DATA)) / 100;);	% V20      : "Power_factor_III"    	[""];	% x100	
      
    TIMEOUT 2000

  END;
END;

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% Device definition for CIRCUTOR CVM-MINI settings
%
% Settings module:
%       Parity:	None
%       Baud:   9600
%       Mode:   RTU
% 
% Author:  Ove Jansson, ABELKO AB Luleå 
% History: 2011-04-05 initial version
%          
DEVICETYPE CircutorRead2 NAMED "Circutor Reg21-40" TYPEID 21411 IS 
  
  PARAMETER
    Id       : "Adress";
   
  PUBLIC
    V1       : "Frequency"  		["Hz"];	% x10 28
    V2       : "Voltage_line_L1-L2"	["V"];	% x10 2a
    V3       : "Voltage_line_L2-L3"	["V"];	% x10 2c
    V4       : "Voltage_line_L3-L1"	["V"];	% x10 2e
    V5       : "Percent_THD_V_L1"      	["%"]; 	% x10 30
    V6       : "Percent_THD_V_L2"      	["%"]; 	% x10 32
    V7       : "Percent_THD_V_L3"      	["%"]; 	% x10 34
    V8       : "Percent_THD_A_L1"      	["%"]; 	% x10 36
    V9       : "Percent_THD_A_L2"      	["%"]; 	% x10 38
    V10      : "Percent_THD_A_L3"      	["%"]; 	% x10 3a
    V11      : "Active_energy"  	["wh"];	% 3c
    V12      : "Induct_reactive_energy"	["wh"]; % 3e
    V13      : "Capac_reactive_energy" 	["wh"]; % 40
    V14      : "Apparent_Power_III"  	["w"]; 	% 42
    V15      : "Maximum_demand"       	[""];	% w/VA/mA 44 	
    V16      : "3p_current_Avg"    	["mA"]; % 46
    V17      : "Neutral_current"   	["mA"]; % 48
    V18      : "L1_Apparent_power"	["mA"];	% 4a
    V19      : "L2_Apparent_power"    	["mA"]; % 4c
    V20      : "L3_Apparent_power"    	["mA"]; % 4e

    PRIVATE
    Tmp2;

  BAUDRATE 9600;

  CHECKSUM MODBUS SWAPPED;
  
  TELEGRAM AnalogInput2 NAMED "Läs Reg 21-40" IS
    QUESTION
      DATA[0]  := BYTE(Id);      % Modbus unit address
      DATA[1]  := HEX(04);       % Modbus command "04h" Read registers
      DATA[2]  := RWORD(40);      % OBS!! Register adress = Modbusadress in spec
      DATA[4]  := RWORD(40);     % Number of registers

    ANSWER SIZE 85 		  % antal register (2 per värde) *2 + 5
      DATA[0]   = BYTE(Id);      % ID
      DATA[1]   = HEX(04);       % Modbus command "04h" Read registers
      DATA[2]   = BYTE(80);      % Byte count   
      DATA[3] -> RWORD(Tmp2 := DATA*65536;);
      DATA[5] -> RWORD(V1 := (Tmp2 + (DATA)) / 10;); 	% V1       : "Frequency"  		["Hz"];	 x10
      DATA[7] -> RWORD(Tmp2 := DATA*65536;);
      DATA[9] -> RWORD(V2 := (Tmp2 + (DATA)) / 10;); % V2       : "Voltage_line_L1-L2"	["V"];	 x10
      DATA[11] -> RWORD(Tmp2 := DATA*65536;);
      DATA[13] -> RWORD(V3 := (Tmp2 + (DATA)) / 10;); % V3       : "Voltage_line_L2-L3"	["V"];	 x10
      DATA[15] -> RWORD(Tmp2 := DATA*65536;);
      DATA[17] -> RWORD(V4 := (Tmp2 + (DATA)) / 10;); % V4       : "Voltage_line_L3-L1"	["V"];	 x10
      DATA[19] -> RWORD(Tmp2 := DATA*65536;);
      DATA[21] -> RWORD(V5 := (Tmp2 + (DATA)) / 10;); % V5       : "Percent_THD_V_L1"      	["%"]; 	 x10
      DATA[23] -> RWORD(Tmp2 := DATA*65536;);
      DATA[25] -> RWORD(V6 := (Tmp2 + (DATA)) / 10;); % V6       : "Percent_THD_V_L2"      	["%"]; 	 x10
      DATA[27] -> RWORD(Tmp2 := DATA*65536;);
      DATA[29] -> RWORD(V7 := (Tmp2 + (DATA)) / 10;); % V7       : "Percent_THD_V_L3"      	["%"]; 	 x10
      DATA[31] -> RWORD(Tmp2 := DATA*65536;);
      DATA[33] -> RWORD(V8 := (Tmp2 + (DATA)) / 10;); % V8       : "Percent_THD_A_L1"      	["%"]; 	 x10
      DATA[35] -> RWORD(Tmp2 := DATA*65536;);
      DATA[37] -> RWORD(V9 := (Tmp2 + (DATA)) / 10;); % V9       : "Percent_THD_A_L2"      	["%"]; 	 x10
      DATA[39] -> RWORD(Tmp2 := DATA*65536;);
      DATA[41] -> RWORD(V10 := (Tmp2 + (DATA)) / 10;); % V10      : "Percent_THD_A_L3"      	["%"]; 	 x10
      DATA[43] -> RWORD(Tmp2 := DATA*65536;);
      DATA[45] -> RWORD(V11 := Tmp2 + (DATA););	% V11      : "Active_energy"  		["wh"];
      DATA[47] -> RWORD(Tmp2 := DATA*65536;);
      DATA[49] -> RWORD(V12 := Tmp2 + (DATA););	% V12      : "Induct_reactive_energy"	["wh"];
      DATA[51] -> RWORD(Tmp2 := DATA*65536;);
      DATA[53] -> RWORD(V13 := Tmp2 + (DATA););	% V13      : "Capac_reactive_energy" 	["wh"];
      DATA[55] -> RWORD(Tmp2 := DATA*65536;);
      DATA[57] -> RWORD(V14 := Tmp2 + (DATA););	% V14      : "Apparent_Power_III"  	["w"];
      DATA[59] -> RWORD(Tmp2 := DATA*65536;);
      DATA[61] -> RWORD(V15 := Tmp2 + (DATA););	% V15      : "Maximum_demand"       	[""];	 w/VA/mA
      DATA[63] -> RWORD(Tmp2 := DATA*65536;);
      DATA[65] -> RWORD(V16 := Tmp2 + (DATA););      % V16      : "3p_current_Avg"    	["mA"];
      DATA[67] -> RWORD(Tmp2 := DATA*65536;);
      DATA[69] -> RWORD(V17 := Tmp2 + (DATA););	% V17      : "Neutral_current"   	["mA"];
      DATA[71] -> RWORD(Tmp2 := DATA*65536;);
      DATA[73] -> RWORD(V18 := Tmp2 + (DATA););	% V18      : "L1_Apparent_power"	["°w"];	% 4a
      DATA[75] -> RWORD(Tmp2 := DATA*65536;);
      DATA[77] -> RWORD(V19 := Tmp2 + (DATA););	% V19      : "L2_Apparent_power"    	["mA"]; % 4c
      DATA[79] -> RWORD(Tmp2 := DATA*65536;);
      DATA[81] -> RWORD(V20 := Tmp2 + (DATA););	% V20      : "L3_Apparent_power"    	["mA"]; % 4e
      
    TIMEOUT 2000

  END;

END;

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% Device definition for CIRCUTOR CVM-MINI settings
%
% Settings module:
%       Parity:	None
%       Baud:   9600
%       Mode:   RTU
% 
% Author:  Ove Jansson, ABELKO AB Luleå 
% History: 2011-04-05 initial version
%
DEVICETYPE CircutorRead3 NAMED "Circutor Reg41-48" TYPEID 21412 IS 
  
  PARAMETER
    Id       : "Adress";
   
  PUBLIC
    V1       : "Temperature" 		["°C"];	% x10 50	
    V2       : "Maximum_demand_A2"	["mA"];	% 52
    V3       : "Maximum_demand_A3"	["mA"];	% 54
    V4       : "Apparent_energy" 	["wh"];	% 56
    V5       : "Active_energy_gen"	["wh"]; % 58
    V6       : "Induct_energy_gen"	["wh"];	% 5a
    V7       : "Capacitiv_energy_gen"	["wh"];	% 5c
    V8       : "Apparent_energy_gen"   	["wh"]; % 5e

    PRIVATE
    Tmp3;

  BAUDRATE 9600;

  CHECKSUM MODBUS SWAPPED;
  
  TELEGRAM AnalogInput3 NAMED "Läs Reg 41-48" IS
    QUESTION
      DATA[0]  := BYTE(Id);      % Modbus unit address
      DATA[1]  := HEX(04);       % Modbus command "04h" Read registers
      DATA[2]  := RWORD(80);      % OBS!! Register adress = Modbusadress in spec
      DATA[4]  := RWORD(16);     % Number of registers

    ANSWER SIZE 21 		  % antal register *2 + 5
      DATA[0]   = BYTE(Id);      % ID
      DATA[1]   = HEX(04);       % Modbus command "04h" Read registers
      DATA[2]   = BYTE(32);      % Byte count
      
      DATA[3] -> RWORD(Tmp3 := DATA*65536;);
      DATA[5] -> RWORD(Tmp3 := Tmp3 + DATA; IF Tmp3 > 2147483647 THEN V1 := (Tmp3-4294967296) / 10; ELSE V1 := Tmp3 / 10; ENDIF;); % V18      : "Temperature"  		["°C"];	 x10    
      DATA[7] -> RWORD(Tmp3 := DATA*65536;);
      DATA[9] -> RWORD(V2 := Tmp3 + DATA;); 	% V2       : "Maximum_demand_A2"	["mA"];	 52
      DATA[11] -> RWORD(Tmp3 := DATA*65536;);
      DATA[13] -> RWORD(V3 := Tmp3 + DATA;); 	% V3       : "Maximum_demand_A3"	["mA"];	
      DATA[15] -> RWORD(Tmp3 := DATA*65536;);
      DATA[17] -> RWORD(V4 := Tmp3 + DATA;); 	% 	V4       : "Apparent_energy" 	["wh"];
      DATA[19] -> RWORD(Tmp3 := DATA*65536;);
      DATA[21] -> RWORD(V5 := Tmp3 + DATA;); 	% V5       : "Active_energy_gen"	["wh"];
      DATA[23] -> RWORD(Tmp3 := DATA*65536;);
      DATA[25] -> RWORD(V6 := Tmp3 + DATA;); 	% V6       : "Induct_energy_gen"	["wh"];
      DATA[27] -> RWORD(Tmp3 := DATA*65536;);
      DATA[29] -> RWORD(V7 := Tmp3 + DATA;); 	% V7       : "Capacitiv_energy_gen"	["wh"];
      DATA[31] -> RWORD(Tmp3 := DATA*65536;);
      DATA[33] -> RWORD(V8 := Tmp3 + DATA;); 	% V8       : "Apparent_energy_gen"   	["wh"];
     
    TIMEOUT 2000

  END;

END;