FIDELIX Analog inputs
Detaljer
- Typ
- Drivrutin
- Upplaggd av
- Ove Jansson, Abelko Innovation
- Version
- 2
- Uppdaterad
- 2019-01-07
- Skapad
- 2013-08-27
- Kategori
- IO enheter, Modbus
- Visningar
- 3554
Beskrivning
Device definition for FIDELIX Analog inputs
Bruksanvisning
See Fidelix I/O-module specifications (pdf)
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-07 Justerat register för "Aktivering AI" till adress 10.
%
%
DEVICETYPE FidelixAIN NAMED "Fidelix A.IN" TYPEID 21220 IS
PARAMETER
Id : "Adress";
EN1 :"Enable AI1";
EN2 :"Enable AI2";
EN3 :"Enable AI3";
EN4 :"Enable AI4";
EN5 :"Enable AI5";
EN6 :"Enable AI6";
EN7 :"Enable AI7";
EN8 :"Enable AI8";
PUBLIC
AI1 : "Analog in 1" ["V"];
AI2 : "Analog in 2" ["V"];
AI3 : "Analog in 3" ["V"];
AI4 : "Analog in 4" ["V"];
AI5 : "Analog in 5" ["V"];
AI6 : "Analog in 6" ["V"];
AI7 : "Analog in 7" ["V"];
AI8 : "Analog in 8" ["V"];
%AI1 : "Analog in 1" ["A"]; %For current measurement
%AI2 : "Analog in 2" ["A"];
%AI3 : "Analog in 3" ["A"];
%AI4 : "Analog in 4" ["A"];
%AI5 : "Analog in 5" ["A"];
%AI6 : "Analog in 6" ["A"];
%AI7 : "Analog in 7" ["A"];
%AI8 : "Analog in 8" ["A"];
%AI1 : "Analog in 1" ["Ohm"]; % For resistance measurement
%AI2 : "Analog in 2" ["Ohm"];
%AI3 : "Analog in 3" ["Ohm"];
%AI4 : "Analog in 4" ["Ohm"];
%AI5 : "Analog in 5" ["Ohm"];
%AI6 : "Analog in 6" ["Ohm"];
%AI7 : "Analog in 7" ["Ohm"];
%AI8 : "Analog in 8" ["Ohm"];
PRIVATE
Tmp;
LB1;
LB2;
LB3;
LB4;
LB5;
LB6;
LB7;
LB8;
BAUDRATE 9600;
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(AI1 := ((DATA*16) + LB1) / 104857.5;); % For Voltage measurement
DATA[5] -> RWORD(AI2 := ((DATA*16) + LB2) / 104857.5;); % Maxbit = 10V
DATA[7] -> RWORD(AI3 := ((DATA*16) + LB3) / 104857.5;);
DATA[9] -> RWORD(AI4 := ((DATA*16) + LB4) / 104857.5;);
DATA[11] -> RWORD(AI5 := ((DATA*16) + LB5) / 104857.5;);
DATA[13] -> RWORD(AI6 := ((DATA*16) + LB6) / 104857.5;);
DATA[15] -> RWORD(AI7 := ((DATA*16) + LB7) / 104857.5;);
DATA[17] -> RWORD(AI8 := ((DATA*16) + LB8) / 104857.5;);
%DATA[3] -> RWORD(AI1 := (2.5 * (DATA*16) + LB1) / 1048575;); % Maxbit = 2.5V
%DATA[5] -> RWORD(AI2 := (2.5 * (DATA*16) + LB2) / 1048575;); % For current measurement I = U / 100Ohm
%DATA[7] -> RWORD(AI3 := (2.5 * (DATA*16) + LB3) / 1048575;);
%DATA[9] -> RWORD(AI4 := (2.5 * (DATA*16) + LB4) / 1048575;);
%DATA[11] -> RWORD(AI5 := (2.5 * (DATA*16) + LB5) / 1048575;);
%DATA[13] -> RWORD(AI6 := (2.5 * (DATA*16) + LB6) / 1048575;);
%DATA[15] -> RWORD(AI7 := (2.5 * (DATA*16) + LB7) / 1048575;);
%DATA[17] -> RWORD(AI8 := (2.5 * (DATA*16) + LB8) / 1048575;);
%DATA[3] -> RWORD(Tmp := (2.5 * (DATA*16) + LB1) / 1048575; % Maxbit = 2.5V
% IF Tmp<2.5 THEN AI1 := (4700 * Tmp) / (2.5 - Tmp); % For resistance measurement R = 470Ohm * U / (2.5V - U)
% ELSE AI1 := 0;
% ENDIF;
% };
%DATA[5] -> RWORD(Tmp := (2.5 * (DATA*16) + LB2) / 1048575;);
% IF Tmp<2.5 THEN AI2 := (4700 * Tmp) / (2.5 - Tmp);
% ELSE AI2 := 0;
% ENDIF;
% };
%DATA[7] -> RWORD(Tmp := 2.5 * ((DATA*16) + LB3) / 1048575;);
% IF Tmp<2.5 THEN AI3 := (4700 * Tmp) / (2.5 - Tmp);
% ELSE AI3 := 0;
% ENDIF;
% };
%DATA[9] -> RWORD(Tmp := 2.5 * ((DATA*16) + LB4) / 1048575;);
% IF Tmp<2.5 THEN AI4 := (4700 * Tmp) / (2.5 - Tmp);
% ELSE AI4 := 0;
% ENDIF;
% };
%DATA[11] -> RWORD(Tmp := 2.5 * ((DATA*16) + LB5) / 1048575;);
% IF Tmp<2.5 THEN AI5 := (4700 * Tmp) / (2.5 - Tmp);
% ELSE AI5 := 0;
% ENDIF;
% };
%DATA[13] -> RWORD(Tmp := 2.5 * ((DATA*16) + LB6) / 1048575;);
% IF Tmp<2.5 THEN AI6 := (4700 * Tmp) / (2.5 - Tmp);
% ELSE AI6 := 0;
% ENDIF;
% };
%DATA[15] -> RWORD(Tmp := 2.5 * ((DATA*16) + LB7) / 1048575;);
% IF Tmp<2.5 THEN AI7 := (4700 * Tmp) / (2.5 - Tmp);
% ELSE AI7 := 0;
% ENDIF;
% };
%DATA[17] -> RWORD(Tmp := 2.5 * ((DATA*16) + LB8) / 1048575;);
% IF Tmp<2.5 THEN AI8 := (4700 * Tmp) / (2.5 - Tmp);
% ELSE AI8 := 0;
% 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(10); % start register
%DATA[4] = RWORD(1); % number of registers to write
TIMEOUT 300
END;
END;
% 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-07 Justerat register för "Aktivering AI" till adress 10.
%
%
DEVICETYPE FidelixAIN NAMED "Fidelix A.IN" TYPEID 21220 IS
PARAMETER
Id : "Adress";
EN1 :"Enable AI1";
EN2 :"Enable AI2";
EN3 :"Enable AI3";
EN4 :"Enable AI4";
EN5 :"Enable AI5";
EN6 :"Enable AI6";
EN7 :"Enable AI7";
EN8 :"Enable AI8";
PUBLIC
AI1 : "Analog in 1" ["V"];
AI2 : "Analog in 2" ["V"];
AI3 : "Analog in 3" ["V"];
AI4 : "Analog in 4" ["V"];
AI5 : "Analog in 5" ["V"];
AI6 : "Analog in 6" ["V"];
AI7 : "Analog in 7" ["V"];
AI8 : "Analog in 8" ["V"];
%AI1 : "Analog in 1" ["A"]; %For current measurement
%AI2 : "Analog in 2" ["A"];
%AI3 : "Analog in 3" ["A"];
%AI4 : "Analog in 4" ["A"];
%AI5 : "Analog in 5" ["A"];
%AI6 : "Analog in 6" ["A"];
%AI7 : "Analog in 7" ["A"];
%AI8 : "Analog in 8" ["A"];
%AI1 : "Analog in 1" ["Ohm"]; % For resistance measurement
%AI2 : "Analog in 2" ["Ohm"];
%AI3 : "Analog in 3" ["Ohm"];
%AI4 : "Analog in 4" ["Ohm"];
%AI5 : "Analog in 5" ["Ohm"];
%AI6 : "Analog in 6" ["Ohm"];
%AI7 : "Analog in 7" ["Ohm"];
%AI8 : "Analog in 8" ["Ohm"];
PRIVATE
Tmp;
LB1;
LB2;
LB3;
LB4;
LB5;
LB6;
LB7;
LB8;
BAUDRATE 9600;
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(AI1 := ((DATA*16) + LB1) / 104857.5;); % For Voltage measurement
DATA[5] -> RWORD(AI2 := ((DATA*16) + LB2) / 104857.5;); % Maxbit = 10V
DATA[7] -> RWORD(AI3 := ((DATA*16) + LB3) / 104857.5;);
DATA[9] -> RWORD(AI4 := ((DATA*16) + LB4) / 104857.5;);
DATA[11] -> RWORD(AI5 := ((DATA*16) + LB5) / 104857.5;);
DATA[13] -> RWORD(AI6 := ((DATA*16) + LB6) / 104857.5;);
DATA[15] -> RWORD(AI7 := ((DATA*16) + LB7) / 104857.5;);
DATA[17] -> RWORD(AI8 := ((DATA*16) + LB8) / 104857.5;);
%DATA[3] -> RWORD(AI1 := (2.5 * (DATA*16) + LB1) / 1048575;); % Maxbit = 2.5V
%DATA[5] -> RWORD(AI2 := (2.5 * (DATA*16) + LB2) / 1048575;); % For current measurement I = U / 100Ohm
%DATA[7] -> RWORD(AI3 := (2.5 * (DATA*16) + LB3) / 1048575;);
%DATA[9] -> RWORD(AI4 := (2.5 * (DATA*16) + LB4) / 1048575;);
%DATA[11] -> RWORD(AI5 := (2.5 * (DATA*16) + LB5) / 1048575;);
%DATA[13] -> RWORD(AI6 := (2.5 * (DATA*16) + LB6) / 1048575;);
%DATA[15] -> RWORD(AI7 := (2.5 * (DATA*16) + LB7) / 1048575;);
%DATA[17] -> RWORD(AI8 := (2.5 * (DATA*16) + LB8) / 1048575;);
%DATA[3] -> RWORD(Tmp := (2.5 * (DATA*16) + LB1) / 1048575; % Maxbit = 2.5V
% IF Tmp<2.5 THEN AI1 := (4700 * Tmp) / (2.5 - Tmp); % For resistance measurement R = 470Ohm * U / (2.5V - U)
% ELSE AI1 := 0;
% ENDIF;
% };
%DATA[5] -> RWORD(Tmp := (2.5 * (DATA*16) + LB2) / 1048575;);
% IF Tmp<2.5 THEN AI2 := (4700 * Tmp) / (2.5 - Tmp);
% ELSE AI2 := 0;
% ENDIF;
% };
%DATA[7] -> RWORD(Tmp := 2.5 * ((DATA*16) + LB3) / 1048575;);
% IF Tmp<2.5 THEN AI3 := (4700 * Tmp) / (2.5 - Tmp);
% ELSE AI3 := 0;
% ENDIF;
% };
%DATA[9] -> RWORD(Tmp := 2.5 * ((DATA*16) + LB4) / 1048575;);
% IF Tmp<2.5 THEN AI4 := (4700 * Tmp) / (2.5 - Tmp);
% ELSE AI4 := 0;
% ENDIF;
% };
%DATA[11] -> RWORD(Tmp := 2.5 * ((DATA*16) + LB5) / 1048575;);
% IF Tmp<2.5 THEN AI5 := (4700 * Tmp) / (2.5 - Tmp);
% ELSE AI5 := 0;
% ENDIF;
% };
%DATA[13] -> RWORD(Tmp := 2.5 * ((DATA*16) + LB6) / 1048575;);
% IF Tmp<2.5 THEN AI6 := (4700 * Tmp) / (2.5 - Tmp);
% ELSE AI6 := 0;
% ENDIF;
% };
%DATA[15] -> RWORD(Tmp := 2.5 * ((DATA*16) + LB7) / 1048575;);
% IF Tmp<2.5 THEN AI7 := (4700 * Tmp) / (2.5 - Tmp);
% ELSE AI7 := 0;
% ENDIF;
% };
%DATA[17] -> RWORD(Tmp := 2.5 * ((DATA*16) + LB8) / 1048575;);
% IF Tmp<2.5 THEN AI8 := (4700 * Tmp) / (2.5 - Tmp);
% ELSE AI8 := 0;
% 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(10); % start register
%DATA[4] = RWORD(1); % 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.