Fidelix general

Detaljer

Typ
Drivrutin
Upplaggd av
Ove Jansson, Abelko Innovation
Version
1
Uppdaterad
2013-04-07
Skapad
2013-04-07
Kategori
IO enheter, Modbus
Visningar
3438

Beskrivning

For Fidelix IO modules

Bruksanvisning

Analog inputs are measured in Voltage
Input not used set "Sensor type" = 0 :bitvalue.
To calculate Voltage set "Sensor type" = 50 :formula.
To calculate Current set "Sensor type" = 40 :formula I = U / 100ohm)
To calculate Resistance set "sensor type" = 30 :formula R = 4700ohm * U / (2.5V - U)
To calculate Temperature set "sensor type" = 1-21,
1 Pt100 EN 50 751 alpha 0.00385,
2 Pt100 alpha 0.00375,
3 Pt100 alpha 0.00392,
4 Pt1000 EN 50 751 alpha 0.00385,
5 Pt1000 alpha 0.00375,
6 Pt1000 alpha 0.00392,
7 Ni1000 DIN,
8 Ni1000 LG,
9 QAC31/32 old,
10 NTC575 (QAC3132),
11 FWT1G,
12 FOT35,
13 TAC ECU,
14 Satchwell DOT,
15 Satchwell DW1204 DWS1202,
16 Satchwell DO2202,
17 IVT,
18 NIBE,
19 KTY 10/7,
20 Bodendammen,
21 T7043 Honywell

Juridisk information

Alla skript tillhandahålls i befintligt skick och all användning sker på eget ansvar. Felaktig använding kan leda till skadad eller förstörd utrustning.

Skript kod

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% Device definition for FIDELIX Analog inputs
%
% Settings module:
%       Parity: None
%       Baud:   9600
%       Mode:   RTU
%
% Analog inputs are measured in Voltage
% Input not used           set "Sensor type" = 0  :bitvalue 
% To calculate Voltage     set "Sensor type" = 50 :formula
% To calculate Current     set "Sensor type" = 40 :formula I = U / 100ohm)
% To calculate Resistance  set "sensor type" = 30 :formula R = 4700ohm * U / (2.5V - U) 
% To calculate Temperature set "sensor type" = 1-21 
%                      1  Pt100 EN 50 751 alpha 0.00385
%                      2  Pt100 alpha 0.00375
%                      3  Pt100 alpha 0.00392
%                      4  Pt1000 EN 50 751 alpha 0.00385
%                      5  Pt1000 alpha 0.00375
%                      6  Pt1000 alpha 0.00392
%                      7  Ni1000 DIN
%                      8  Ni1000 LG
%                      9  QAC31/32 old
%                      10 NTC575 (QAC3132)
%                      11 FWT1G
%                      12 FOT35
%                      13 TAC ECU
%                      14 Satchwell DOT
%                      15 Satchwell DW1204 DWS1202
%                      16 Satchwell DO2202
%                      17 IVT
%                      18 NIBE
%                      19 KTY 10/7
%                      20 Bodendammen
%                      21 T7043 Honywell
%
% Author:  Peter Widetun, ABELKO AB Luleå 
% History: 2011-12-08 Adjusted for individual settings for analog inputs
%
DEVICETYPE FidelixAIN NAMED "Fidelix A.IN" TYPEID 21220 IS 
  
  PARAMETER
    Id  : "Address";

    % Sensor type    0 = OFF
    % Sensor type 1-21 = Temperatur
    % Sensor type   30 = Ohm
    % Sensor type   40 = milliAmpere
    % Sensor type   50 = Volt
    Type_T1 :"Sensor type 1" [""] INT;
    Type_T2 :"Sensor type 2" [""] INT;
    Type_T3 :"Sensor type 3" [""] INT;
    Type_T4 :"Sensor type 4" [""] INT;
    Type_T5 :"Sensor type 5" [""] INT;
    Type_T6 :"Sensor type 6" [""] INT;
    Type_T7 :"Sensor type 7" [""] INT;
    Type_T8 :"Sensor type 8" [""] INT;
    
  PUBLIC

   I1 : "Analog input 1" [""];
   I2 : "Analog input 2" [""];
   I3 : "Analog input 3" [""];
   I4 : "Analog input 4" [""];
   I5 : "Analog input 5" [""];
   I6 : "Analog input 6" [""];
   I7 : "Analog input 7" [""];
   I8 : "Analog input 8" [""];

  PRIVATE
    Tmp;
    LB1;
    LB2;
    LB3;
    LB4;
    LB5;
    LB6;
    LB7;
    LB8;

    AI1;
    AI2;
    AI3;
    AI4;
    AI5;
    AI6;
    AI7;
    AI8;

    Input;
    R;
    T;
    Type;
    R2;
    R3;
    R5;
    R7;
    LNR;

  BAUDRATE 9600;

  CHECKSUM MODBUS SWAPPED;
  
  TELEGRAM AnalogInput NAMED "Read AI" IS
    
    QUESTION
      DATA[0]  := BYTE(Id);      % Modbus unit address
      DATA[1]  := HEX(03);       % Modbus command "03h" Read holding registers
      DATA[2]  := RWORD(0);      % Start address register
      DATA[4]  := RWORD(10);     % Number of registers

    ANSWER SIZE 25
      DATA[0]   = BYTE(Id);      % ID
      DATA[1]   = HEX(03);       % Modbus command "03h" Read holding registers
      DATA[2]   = BYTE(20);      % Byte count
      DATA[19] -> RWORD(
        LB1 := (DATA & 15);
        LB2 := (DATA & 240)  / 16;
        LB3 := (DATA & 3840) / 256;
        LB4 := (DATA & 61440)/ 4096;
      );
      DATA[21] -> RWORD(
        LB5 := (DATA & 15);
        LB6 := (DATA & 240)  / 16;
        LB7 := (DATA & 3840) / 256;
        LB8 := (DATA & 61440)/ 4096;
      );
      
      DATA[3]  -> RWORD(IF    (Type_T1 = 0)  THEN                   % OFF
                          AI1 := 0;                                 % Set value to 0
                        ELSIF (Type_T1 = 50) THEN                   % Voltage measurement
                          AI1 := ((DATA*16) + LB1) / 104857.5;      % Maxbit=10V
                        ELSIF (Type_T1 = 40) THEN                   % Current measurement I=U/100Ohm
                          AI1 := (2.5 * (DATA*16) + LB1) / 1048575; % Maxbit=2.5V
                        ELSE                                        % Resistance measurement R = 470Ohm * U / (2.5V - U)
                          Tmp := (2.5 * (DATA*16) + LB1) / 1048575; % Maxbit = 2.5V
                          IF Tmp<2.5 THEN AI1 := (4700 * Tmp) / (2.5 - Tmp);
                          ELSE            AI1 := 0;
                          ENDIF;
                        ENDIF;
                        );
      DATA[5]  -> RWORD(IF    (Type_T2 = 0)  THEN                   % OFF
                          AI2 := 0;                                 % Set value to 0
                        ELSIF (Type_T2 = 50) THEN                   % Voltage measurement
                          AI2 := ((DATA*16) + LB2) / 104857.5;      % Maxbit=10V
                        ELSIF (Type_T2 = 40) THEN                   % Current measurement I=U/100Ohm
                          AI2 := (2.5 * (DATA*16) + LB2) / 1048575; % Maxbit=2.5V
                        ELSE                                        % Resistance measurement R = 470Ohm * U / (2.5V - U)
                          Tmp := (2.5 * (DATA*16) + LB2) / 1048575; % Maxbit = 2.5V
                          IF Tmp<2.5 THEN AI2 := (4700 * Tmp) / (2.5 - Tmp);
                          ELSE            AI2 := 0;
                          ENDIF;
                        ENDIF;
                        );
      DATA[7]  -> RWORD(IF    (Type_T3 = 0)  THEN                   % OFF
                          AI3 := 0;                                 % Set value to 0
                        ELSIF (Type_T3 = 50) THEN                   % Voltage measurement
                          AI3 := ((DATA*16) + LB3) / 104857.5;      % Maxbit=10V
                        ELSIF (Type_T3 = 40) THEN                   % Current measurement I=U/100Ohm
                          AI3 := (2.5 * (DATA*16) + LB3) / 1048575; % Maxbit=2.5V
                        ELSE                                        % Resistance measurement R = 470Ohm * U / (2.5V - U)
                          Tmp := (2.5 * (DATA*16) + LB3) / 1048575; % Maxbit = 2.5V
                          IF Tmp<2.5 THEN AI3 := (4700 * Tmp) / (2.5 - Tmp);
                          ELSE            AI3 := 0;
                          ENDIF;
                        ENDIF;
                        );
      DATA[9]  -> RWORD(IF    (Type_T4 = 0)  THEN                   % OFF
                          AI4 := 0;                                 % Set value to 0
                        ELSIF (Type_T4 = 50) THEN                   % Voltage measurement
                          AI4 := ((DATA*16) + LB4) / 104857.5;      % Maxbit=10V
                        ELSIF (Type_T4 = 40) THEN                   % Current measurement I=U/100Ohm
                          AI4 := (2.5 * (DATA*16) + LB4) / 1048575; % Maxbit=2.5V
                        ELSE                                        % Resistance measurement R = 470Ohm * U / (2.5V - U)
                          Tmp := (2.5 * (DATA*16) + LB4) / 1048575; % Maxbit = 2.5V
                          IF Tmp<2.5 THEN AI4 := (4700 * Tmp) / (2.5 - Tmp);
                          ELSE            AI4 := 0;
                          ENDIF;
                        ENDIF;
                        );
      DATA[11] -> RWORD(IF    (Type_T5 = 0)  THEN                   % OFF
                          AI5 := 0;                                 % Set value to 0
                        ELSIF (Type_T5 = 50) THEN                   % Voltage measurement
                          AI5 := ((DATA*16) + LB5) / 104857.5;      % Maxbit=10V
                        ELSIF (Type_T5 = 40) THEN                   % Current measurement I=U/100Ohm
                          AI5 := (2.5 * (DATA*16) + LB5) / 1048575; % Maxbit=2.5V
                        ELSE                                        % Resistance measurement R = 470Ohm * U / (2.5V - U)
                          Tmp := (2.5 * (DATA*16) + LB5) / 1048575; % Maxbit = 2.5V
                          IF Tmp<2.5 THEN AI5 := (4700 * Tmp) / (2.5 - Tmp);
                          ELSE            AI5 := 0;
                          ENDIF;
                        ENDIF;
                        );
      DATA[13] -> RWORD(IF    (Type_T6 = 0)  THEN                   % OFF
                          AI6 := 0;                                 % Set value to 0
                        ELSIF (Type_T6 = 50) THEN                   % Voltage measurement
                          AI6 := ((DATA*16) + LB6) / 104857.5;      % Maxbit=10V
                        ELSIF (Type_T6 = 40) THEN                   % Current measurement I=U/100Ohm
                          AI6 := (2.5 * (DATA*16) + LB6) / 1048575; % Maxbit=2.5V
                        ELSE                                        % Resistance measurement R = 470Ohm * U / (2.5V - U)
                          Tmp := (2.5 * (DATA*16) + LB6) / 1048575; % Maxbit = 2.5V
                          IF Tmp<2.5 THEN AI6 := (4700 * Tmp) / (2.5 - Tmp);
                          ELSE            AI6 := 0;
                          ENDIF;
                        ENDIF;
                        );
      DATA[15] -> RWORD(IF    (Type_T7 = 0)  THEN                   % OFF
                          AI7 := 0;                                 % Set value to 0
                        ELSIF (Type_T7 = 50) THEN                   % Voltage measurement
                          AI7 := ((DATA*16) + LB7) / 104857.5;      % Maxbit=10V
                        ELSIF (Type_T7 = 40) THEN                   % Current measurement I=U/100Ohm
                          AI7 := (2.5 * (DATA*16) + LB7) / 1048575; % Maxbit=2.5V
                        ELSE                                        % Resistance measurement R = 470Ohm * U / (2.5V - U)
                          Tmp := (2.5 * (DATA*16) + LB7) / 1048575; % Maxbit = 2.5V
                          IF Tmp<2.5 THEN AI7 := (4700 * Tmp) / (2.5 - Tmp);
                          ELSE            AI7 := 0;
                          ENDIF;
                        ENDIF;
                        );
      DATA[17] -> RWORD(IF    (Type_T8 = 0)  THEN                   % OFF
                          AI8 := 0;                                 % Set value to 0
                        ELSIF (Type_T8 = 50) THEN                   % Voltage measurement
                          AI8 := ((DATA*16) + LB8) / 104857.5;      % Maxbit=10V
                        ELSIF (Type_T8 = 40) THEN                   % Current measurement I=U/100Ohm
                          AI8 := (2.5 * (DATA*16) + LB8) / 1048575; % Maxbit=2.5V
                        ELSE                                        % Resistance measurement R = 470Ohm * U / (2.5V - U)
                          Tmp := (2.5 * (DATA*16) + LB8) / 1048575; % Maxbit = 2.5V
                          IF Tmp<2.5 THEN AI8 := (4700 * Tmp) / (2.5 - Tmp);
                          ELSE            AI8 := 0;
                          ENDIF;
                        ENDIF;
                        );

    TIMEOUT 1000

  END;
  
  TELEGRAM AnalogEnable NAMED "Activate inputs" IS
    
    QUESTION
      DATA[0] := BYTE(Id);  % Modbus unit address
      DATA[1] := HEX(10);   % Modbus command "0x10" write multiple registers
      DATA[2] := RWORD(0);  % start register
      DATA[4] := RWORD(1);  % number of registers to write
      DATA[6] := BYTE(2);   % number of bytes
      DATA[7] <- RWORD(
        IF Type_T1 THEN Tmp := 1; ELSE Tmp := 0; ENDIF;
        IF Type_T2 THEN Tmp := Tmp + 2;   ENDIF;
        IF Type_T3 THEN Tmp := Tmp + 4;   ENDIF;
        IF Type_T4 THEN Tmp := Tmp + 8;   ENDIF;
        IF Type_T5 THEN Tmp := Tmp + 16;  ENDIF;
        IF Type_T6 THEN Tmp := Tmp + 32;  ENDIF;
        IF Type_T7 THEN Tmp := Tmp + 64;  ENDIF;
        IF Type_T8 THEN Tmp := Tmp + 128; ENDIF;
        DATA := Tmp;
      );

    ANSWER SIZE 8
      DATA[0] = BYTE(Id);
      DATA[1] = HEX(10);
     %DATA[2] = RWORD(0);     % start register
     %DATA[4] = RWORD(8);     % number of registers to write
   
    TIMEOUT 300

  END;
END;

GROUP Fidelix OF MAX 5 DEVICE TYPEID 21220
  % Fidelix AI Group script
  SELECT ALL
  ITERATOR CalcAI
  ALIAS
  BEGIN
    IF Input = 1 THEN
      Type := Type_T1;
      R := AI1;
    ELSIF Input = 2 THEN
      Type := Type_T2;
      R := AI2;
    ELSIF Input = 3 THEN
      Type := Type_T3;
      R := AI3;
    ELSIF Input = 4 THEN
      Type := Type_T4;
      R := AI4;
    ELSIF Input = 5 THEN
      Type := Type_T5;
      R := AI5;
    ELSIF Input = 6 THEN
      Type := Type_T6;
      R := AI6;
    ELSIF Input = 7 THEN
      Type := Type_T7;
      R := AI7;
    ELSE
      Type := Type_T8;
      R := AI8;
      Input := 0;
    ENDIF;

    % Calculate for temperature for Type 1-21
    IF Type = 1 THEN %Pt100 EN 50 751 alpha 0.00385
      T := 3383.809524 - 0.08658008660 * (1758480889 - 2310000 * R)^0.5;
    ELSIF Type = 2 THEN %Pt100 alpha 0.00375
      T := 3164.451827 - 8305.647840 * (0.169241 - 0.000240800 * R)^0.5;
    ELSIF Type = 3 THEN %Pt100 alpha 0.00392
      T := 3392.940594 - 8527.911855 * (0.1817473668 - 0.00023452400 * R)^0.5;
    ELSIF Type = 4 THEN %Pt1000 EN 50 751 alpha 0.00385
      T := 3383.809524 - 865.8008660 * (17.58480889 - 0.00231 * R)^0.5;
    ELSIF Type = 5 THEN %Pt1000 alpha 0.00375
      T := 3164.451827 - 830.5647840 * (16.9241 - 0.002408 * R)^0.5;
    ELSIF Type = 6 THEN %Pt1000 alpha 0.00392
      T := 3392.940594 - 852.7911855 * (18.17473668 - 0.00234524 * R)^0.5;
    ELSIF Type = 7 THEN %Ni1000 DIN
      R5:= R*R*R*R*R;
      R7:= R5*R*R;
      T := (-412.6) + (140.41 * (1 + (0.00764 * R))^0.5) - (0.0000000000000000625 * R5) - (0.00000000000000000000000125 * R7);
    ELSIF Type = 8 THEN %Ni1000 LG
      R2:= R*R;
      R3:= R2*R;
      T := (-300.0187) + (R * 0.3888) - (R2 * 0.00010355) + (R3 * 0.000000014749);
    ELSIF Type = 9 THEN %QAC31/32 old
      R2:= R*R;
      R3:= R2*R;
      IF R <= 622.27 THEN
        T :=  1840.822526461981 - (8.81283638032425 * R) + (0.01481833026842 * R2) - (0.000008693645718129028 * R3);
      ELSIF R <= 655.74 THEN
        T :=  18284.57180623524 - (87.53497076730491 * R) + (0.14047361791540 * R2) - (0.00007556728104760220 * R3);
      ELSE
        T :=  447598.5593294129 - (2034.707401563966 * R) + (3.08435262703205 * R2) - (0.00155918519608 * R3);      
      ENDIF;  
    ELSIF Type = 10 THEN %NTC575 (QAC3132)
      R2:= R*R;
      R3:= R2*R;
      IF R <= 616.7 THEN
        T :=  1984.368236149433 - (9.45847603610924 * R) + (0.01577267911992 * R2) - (0.000009153756833227248 * R3);
      ELSIF R <= 675.5 THEN
        T :=  13500.31890121417 - (64.89024643188350 * R) + (0.10472492893027 * R2) - (0.00005674169841769381 * R3);
      ELSE
        T :=  -8135.044676629710 + (25.40018648262130 * R) - (0.01986043031034 * R2);      
      ENDIF;  
    ELSIF Type = 11 THEN %FWT1G
      T := (-264.6311531847244) + (R * 0.13733939226662) - (R * R * 0.000008300189626466234);
    ELSIF Type = 12 THEN %FOT35
      LNR:= LN(R);
      T := 245.7686957352614 - (R * 0.0002180214076186565) + (R * R * 0.000000001160703041443256) + (0.07334532481221 * LNR * LNR * LNR) - (34.06632737942485 * LNR);
    ELSIF Type = 13 THEN %TAC ECU
      LNR:= LN(R);
      T := (-273.15) + (1 / (0.00114944558407 + (0.0002941176088004037 * LNR) - (0.0000000000002525998855897292 * LNR* LNR* LNR)));

    ELSIF Type = 14 THEN %Satchwell DOT
      R2 := R*R;
      R3 := R2*R;
      IF R >= 7661 THEN
        T :=  508885.1065949351 - (19.71706149035526 * R) + (0.001301247481832191 * R2) - (0.00000003594831664363352 * R3) - (3738912.809188366 / LN(R));
      ELSIF R >= 1193 THEN
        T :=  (-128.4611061637296) - (0.007002012490937275 * R) + (0.0000006986512762901833 * R2) - (0.00000000006639391744752032 * R3) + (1529.490359465714 / LN(R));
      ELSE
        T :=  (-339.6118638033802) + (0.09063945312481900 * R) - (0.00006415896542404209 * R2) + (0.00000001784096838726073 * R3) + (2639.015168861766 / LN(R));
      ENDIF;  
    ELSIF Type = 15 THEN %Satchwell DW1204 DWS1202
      R2 := R*R;
      R3 := R2*R;
      IF R >= 2236 THEN
        T :=  39382.90132075548 - (6.021252248143583 * R) + (0.0013733544102798 * R2) - (0.0000001313622917888568 * R3) - (241223.6906016618 / LN(R));
      ELSIF R >= 974 THEN
        T :=  (-888.2657030489725) + (0.1056691176426888 * R) - (0.00002987131417113171 * R2) + (0.000000002522599122874649 * R3) + (6271.371860366971 / LN(R));
      ELSE
        T :=  (-9517.677682528738) + (4.164299211339042 * R) - (0.002604874308355931 * R2) + (0.0000006794599871065049 * R3) + (50956.91507092444 / LN(R));
      ENDIF;  
    ELSIF Type = 16 THEN %Satchwell DO2202
      R2 := R*R;
      R3 := R2*R;
      T :=  (-1021.199118881201) + (0.04569968689660045 * R) + (0.00002069764420667956 * R2) - (0.00000000981645089002807 * R3) + (6869.504979681983 / LN(R));
    ELSIF Type = 17 THEN %IVT
      LNR:= LN(R);
      T := (-273.15) + (1 / (0.001311184263438729 + (0.0002338997792885658 * LNR) + (0.0000001077046283506101 * LNR * LNR * LNR)));
    ELSIF Type = 18 THEN %NIBE
      LNR:= LN(R);
      T := (-273.15) + (1 / (0.001387800349275742 + (0.0002400761437010071 * LNR) + (0.00000008613539226217632 * LNR * LNR * LNR)));
    ELSIF Type = 19 THEN %KTY 10/7
      R2 := R*R;
      R3 := R2*R;
      T :=  311.5439406854249 + (0.04844211701143084 * R) - (0.000002908837846165819 * R2) + (0.0000000001362467604839759 * R3) - (2848.566087438425 / LN(R));
    ELSIF Type = 20 THEN %Bodendammen
      LNR:= LN(R);
      T := (-273.15) + (1 / (0.001466426327478712 + (0.0002385193263772018 * LNR) + (0.0000001006014722395608 * LNR * LNR * LNR)));
    ELSIF Type = 21 THEN %T7043 Honywell
      LNR:= LN(R);
      T := (-273.15) + (1 / (0.001705367599798446 + (0.0002527653342936799 * LNR) + (0.0000000005227580950721076 * LNR * LNR * LNR)));
    ELSE
      T := R;
    ENDIF;
    
    IF    Input = 1 THEN
      I1 := T;
    ELSIF Input = 2 THEN
      I2 := T;
    ELSIF Input = 3 THEN
      I3 := T;
    ELSIF Input = 4 THEN
      I4 := T;
    ELSIF Input = 5 THEN
      I5 := T;
    ELSIF Input = 6 THEN
      I6 := T;
    ELSIF Input = 7 THEN
      I7 := T;
    ELSE
      I8 := T;
    ENDIF;

    Input := Input + 1;

  END;
END;  

ROUTINE UpdateTemp
%Calls Fidelix.CalcAI to calculate temperatures from resistance measurements
BEGIN
  %One call for each input
  CALL Fidelix.CalcAI;    % Analog Input 1
  CALL Fidelix.CalcAI;   % Analog Input 2
  CALL Fidelix.CalcAI;   % Analog Input 3
  CALL Fidelix.CalcAI;   % Analog Input 4
  CALL Fidelix.CalcAI;   % Analog Input 5
  CALL Fidelix.CalcAI;   % Analog Input 6
  CALL Fidelix.CalcAI;   % Analog Input 7
  CALL Fidelix.CalcAI;   % Analog Input 8
END;

Användarnas noteringar

Du måste vara inloggad för att göra en notering. Bli medlem eller logga in. Vi använder en moderator som godkänner noteringarna innan de visas.