﻿%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% Device definition for FIDELIX Analog inputs
%
% Settings module:
%       Parity:	None
%       Baud:   9600
%       Mode:   RTU
%
% Analog inputs are measured in Voltage
% To calculate Current use formula I = U / 100ohm
% To calculate Resistance use formula R = 4700ohm * U / (2.5V - U) 
% 
% Author:  Peter Widetun, ABELKO AB Luleå 
% History: 2009-12-14 Ändrat kommando 4 till kommando 3 Read holding registers
% History: 2019-01-04 Satt gap-time och rättat startregister för aktivering AI
% History: 2019-01-15 omräkning till alla enheter Spänning, Ström, resistans för alla ingångar.
%
DEVICETYPE FidelixAIN NAMED "Fidelix A.IN_all" TYPEID 21220 IS 
  
  PARAMETER
    Id  : "Adress" INT;
   
    EN1  :"Enable AI1" INT;
    EN2  :"Enable AI2" INT;
    EN3  :"Enable AI3" INT;
    EN4  :"Enable AI4" INT;
    EN5  :"Enable AI5" INT;
    EN6  :"Enable AI6" INT;
    EN7  :"Enable AI7" INT;
    EN8  :"Enable AI8" INT;
    
  PUBLIC

    AU1 : "Spänning 1" ["V"] DEC2;
    AU2 : "Spänning 2" ["V"] DEC2;
    AU3 : "Spänning 3" ["V"] DEC2;
    AU4 : "Spänning 4" ["V"] DEC2;
    AU5 : "Spänning 5" ["V"] DEC2;
    AU6 : "Spänning 6" ["V"] DEC2;
    AU7 : "Spänning 7" ["V"] DEC2;
    AU8 : "Spänning 8" ["V"] DEC2;

    AI1 : "Ström 1" ["mA"] DEC2;   %For current measurement
    AI2 : "Ström 2" ["mA"] DEC2;
    AI3 : "Ström 3" ["mA"] DEC2;
    AI4 : "Ström 4" ["mA"] DEC2;
    AI5 : "Ström 5" ["mA"] DEC2;
    AI6 : "Ström 6" ["mA"] DEC2;
    AI7 : "Ström 7" ["mA"] DEC2;
    AI8 : "Ström 8" ["mA"] DEC2;

    AR1 : "Resistans 1" ["Ohm"] DEC1; % For resistance measurement
    AR2 : "Resistans 2" ["Ohm"] DEC1;
    AR3 : "Resistans 3" ["Ohm"] DEC1;
    AR4 : "Resistans 4" ["Ohm"] DEC1;
    AR5 : "Resistans 5" ["Ohm"] DEC1;
    AR6 : "Resistans 6" ["Ohm"] DEC1;
    AR7 : "Resistans 7" ["Ohm"] DEC1;
    AR8 : "Resistans 8" ["Ohm"] DEC1;

  PRIVATE
    Tmp;
    LB1;
    LB2;
    LB3;
    LB4;
    LB5;
    LB6;
    LB7;
    LB8;

  BAUDRATE 9600;
  CHRGAPTIMEOUT 5;
  CHECKSUM MODBUS SWAPPED;
  
  TELEGRAM AnalogInput NAMED "Läs 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(Tmp := ((DATA*16) + LB1) / 1048575;     % Input value 0-1
                        AU1 := 10*Tmp;                          % Voltage measurement (maxvoltage = 10)
                        AI1 := 1000 * 2.5*Tmp / 100;            % Current (mA) = 1000 * U/100 (maxvoltage = 2.5)
                        Tmp := 2.5*Tmp;                         % Resistance (maxvoltage = 2.5)
                        IF (Tmp<2.49) THEN
                          AR1 := (4700 * Tmp) / (2.5 - Tmp);    % Resistance = (470Ohm * U) / (2.5V - U)
                        ELSE 
                          AR1 := 1000000;                 
                        ENDIF;
                        );
      DATA[5]  -> RWORD(Tmp := ((DATA*16) + LB2) / 1048575;     % Input value 0-1
                        AU2 := 10*Tmp;                          % Voltage measurement (maxvoltage = 10)
                        AI2 := 1000 * 2.5*Tmp / 100;            % Current (mA) = 1000 * U/100 (maxvoltage = 2.5)
                        Tmp := 2.5*Tmp;                         % Resistance (maxvoltage = 2.5)
                        IF (Tmp<2.49) THEN
                          AR2 := (4700 * Tmp) / (2.5 - Tmp);    % Resistance = (470Ohm * U) / (2.5V - U)
                        ELSE 
                          AR2 := 1000000;                 
                        ENDIF;
                        );
      DATA[7]  -> RWORD(Tmp := ((DATA*16) + LB3) / 1048575;     % Input value 0-1
                        AU3 := 10*Tmp;                          % Voltage measurement (maxvoltage = 10)
                        AI3 := 1000 * 2.5*Tmp / 100;            % Current (mA) = 1000 * U/100 (maxvoltage = 2.5)
                        Tmp := 2.5*Tmp;                         % Resistance (maxvoltage = 2.5)
                        IF (Tmp<2.49) THEN
                          AR3 := (4700 * Tmp) / (2.5 - Tmp);    % Resistance = (470Ohm * U) / (2.5V - U)
                        ELSE 
                          AR3 := 1000000;                 
                        ENDIF;
                        );
      DATA[9]  -> RWORD(Tmp := ((DATA*16) + LB4) / 1048575;     % Input value 0-1
                        AU4 := 10*Tmp;                          % Voltage measurement (maxvoltage = 10)
                        AI4 := 1000 * 2.5*Tmp / 100;            % Current (mA) = 1000 * U/100 (maxvoltage = 2.5)
                        Tmp := 2.5*Tmp;                         % Resistance (maxvoltage = 2.5)
                        IF (Tmp<2.49) THEN
                          AR4 := (4700 * Tmp) / (2.5 - Tmp);    % Resistance = (470Ohm * U) / (2.5V - U)
                        ELSE 
                          AR4 := 1000000;                 
                        ENDIF;
                        );
      DATA[11] -> RWORD(Tmp := ((DATA*16) + LB5) / 1048575;     % Input value 0-1 (20 bitar)
                        AU5 := 10*Tmp;                          % Voltage measurement (maxvoltage = 10)
                        AI5 := 1000 * 2.5*Tmp / 100;            % Current (mA) = 1000 * U/100 (maxvoltage = 2.5)
                        Tmp := 2.5*Tmp;                         % Resistance (maxvoltage = 2.5)
                        IF (Tmp<2.49) THEN
                          AR5 := (4700 * Tmp) / (2.5 - Tmp);    % Resistance = (470Ohm * U) / (2.5V - U)
                        ELSE 
                          AR5 := 1000000;                 
                        ENDIF;
                        );
      DATA[13] -> RWORD(Tmp := ((DATA*16) + LB6) / 1048575;     % Input value 0-1
                        AU6 := 10*Tmp;                          % Voltage measurement (maxvoltage = 10)
                        AI6 := 1000 * 2.5*Tmp / 100;            % Current (mA) = 1000 * U/100 (maxvoltage = 2.5)
                        Tmp := 2.5*Tmp;                         % Resistance (maxvoltage = 2.5)
                        IF (Tmp<2.49) THEN
                          AR6 := (4700 * Tmp) / (2.5 - Tmp);    % Resistance = (470Ohm * U) / (2.5V - U)
                        ELSE 
                          AR6 := 1000000;                 
                        ENDIF;
                        );
      DATA[15] -> RWORD(Tmp := ((DATA*16) + LB7) / 1048575;     % Input value 0-1
                        AU7 := 10*Tmp;                          % Voltage measurement (maxvoltage = 10)
                        AI7 := 1000 * 2.5*Tmp / 100;            % Current (mA) = 1000 * U/100 (maxvoltage = 2.5)
                        Tmp := 2.5*Tmp;                         % Resistance (maxvoltage = 2.5)
                        IF (Tmp<2.49) THEN
                          AR7 := (4700 * Tmp) / (2.5 - Tmp);    % Resistance = (470Ohm * U) / (2.5V - U)
                        ELSE 
                          AR7 := 1000000;                 
                        ENDIF;
                        );
      DATA[17] -> RWORD(Tmp := ((DATA*16) + LB8) / 1048575;     % Input value 0-1
                        AU8 := 10*Tmp;                          % Voltage measurement (maxvoltage = 10)
                        AI8 := 1000 * 2.5*Tmp / 100;            % Current (mA) = 1000 * U/100 (maxvoltage = 2.5)
                        Tmp := 2.5*Tmp;                         % Resistance (maxvoltage = 2.5)
                        IF (Tmp<2.49) THEN
                          AR8 := (4700 * Tmp) / (2.5 - Tmp);    % Resistance = (470Ohm * U) / (2.5V - U)
                        ELSE 
                          AR8 := 1000000;                 
                        ENDIF;
                        );
      
    TIMEOUT 1000

  END;
  
  TELEGRAM AnalogEnable NAMED "Aktivera AI" IS
    
    QUESTION
      DATA[0] := BYTE(Id);  % Modbus unit address
      DATA[1] := HEX(10);   % Modbus command "0x10" write multiple registers
      DATA[2] := RWORD(10); % start register
      DATA[4] := RWORD(1);  % number of registers to write
      DATA[6] := BYTE(2);   % number of bytes
      DATA[7] <- RWORD(
        IF EN1 THEN Tmp := 1; ELSE Tmp := 0; ENDIF;
        IF EN2 THEN Tmp := Tmp + 2;   ENDIF;
        IF EN3 THEN Tmp := Tmp + 4;   ENDIF;
        IF EN4 THEN Tmp := Tmp + 8;   ENDIF;
        IF EN5 THEN Tmp := Tmp + 16;  ENDIF;
        IF EN6 THEN Tmp := Tmp + 32;  ENDIF;
        IF EN7 THEN Tmp := Tmp + 64;  ENDIF;
        IF EN8 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;


