FIDELIX Analog inputs UltraBase

Detaljer

Typ
Drivrutin
Upplaggd av
Ove Jansson, Abelko Innovation
Version
6
Uppdaterad
2019-01-15
Skapad
2013-04-07
Kategori
IO enheter, Modbus
Visningar
4754

Beskrivning

Stöd för Fidelix analoga inputs enheter i Ultra Base

Bruksanvisning

All inputs are calculated for Voltage, Current and Resistance.
Use value due to selected input type.

Aktivera telegram "Läs AI" för att uppdatera värden. Sätt lämpligt uppdateringsintervall t.ex 5 sekunder.
Aktivera telegram "Aktivera AI" för att aktivera ingångar. Lämpligt uppdateringsintervall 60 sekunder eller mer.

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
% 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;


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.