Grundfos pumpar, Genibus

Detaljer

Typ
Drivrutin
Upplaggd av
Ove Jansson, Abelko Innovation
Version
4
Uppdaterad
2013-09-02
Skapad
2013-08-27
Kategori
Övrig utrustning, Övriga protokoll, Värme, Vatten och avlopp
Visningar
3551

Beskrivning

Drivrutin för Grundfos pumpar med Genibus

Bruksanvisning

Hur man installerar typdefinitionerna och driftsätter modulerna finns beskrivet i användarmanualen, kapitel 18.7.

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

DEVICETYPE Genibus NAMED "Genibus" TYPEID 15352
IS
  PARAMETER
    Destination :"Destination Address"INT;
    Source      :"Source Address"INT;
    Start       :"Start"INT;
    th          :"Tryckhöjd [%]"DEC2;
    
  PUBLIC
%    i_mo    : "Motorström"["A"]INT;
%    t_mo  : "t_mo"["C"]DEC2;
    t_w     : "Vattentemp."["C"]DEC2;
    speed   : "Varvtal"["RPM"]INT;
    q       : "Vattenflöde"["m3/h"]DEC2;
    h       : "Tryckhöjd"["m"]DEC2;
    p       : "Effekt"["W"]INT;   
    energy  : "Energi"["kWh"]INT;
    time    : "Drifttid"["h"]INT;  
    ALARM   : "Alarm"INT;
    
  PRIVATE
    INFO1;
    ZERO1;
    RANGE1;
    UNIT1;
    INFO2;
    ZERO2;
    RANGE2;
    UNIT2;
    state; 
    p1; % parameter 1
    p2; % parameter 2
    tmp;
    L1;
    L2;
    L3;
    L4;
    L5;
    L6;
    L7;
    L8;
    hi;
    head_unit;

  BAUDRATE 9600;
  %PARITY EVEN;
  CHECKSUM CRC16 SKIP 1 POLY 1021 INIT FFFF XOR FFFF; 
  POSTBYTES 0;

  TELEGRAM Read NAMED "Read" IS
    QUESTION
      DATA[0] := HEX(27); % start delimiter
      DATA[1] := BYTE(10);       % datalength
      DATA[2] := BYTE(Destination+31);    % destination address
      DATA[3] := BYTE(Source); % source address
      
      % variables to be read
      DATA[4] := HEX(02);   % class 2 measured data
      DATA[5] := HEX(C2);    % OS=3(INFO operation), Length=2
      DATA[6] <- BYTE(
state := state + 1;
IF (state < 0) THEN state:=0; ENDIF;
IF (state > 8) THEN state:=0; ENDIF;
IF    (state=0) THEN DATA:=34;  % p, power
ELSIF (state=1) THEN DATA:=37;  % h, pump head
ELSIF (state=2) THEN DATA:=58; % t_w, water temp
ELSIF (state=3) THEN DATA:=34;
ELSIF (state=4) THEN DATA:=34;
ELSIF (state=5) THEN DATA:=34;
ELSIF (state=6) THEN DATA:=34;
ELSIF (state=7) THEN DATA:=152;
ELSIF (state=8) THEN DATA:=24; % INFO time hi
ENDIF;
% DATA := p1; 
      );  
      DATA[7] <- BYTE(
IF    (state=0) THEN DATA:=35; % speed, RPM
ELSIF (state=1) THEN DATA:=39;  % q, flow
ELSIF (state=2) THEN DATA:=32; % i_mo, motor current
ELSIF (state=3) THEN DATA:=34;
ELSIF (state=4) THEN DATA:=34;
ELSIF (state=5) THEN DATA:=34;
ELSIF (state=6) THEN DATA:=34;
ELSIF (state=7) THEN DATA:=152;
ELSIF (state=8) THEN DATA:=24; % INFO time hi
% ELSE p2:=58;
ENDIF;
% DATA := p2;
      );  
      DATA[8] := HEX(02);    % class 2 measured data
      DATA[9] := HEX(02);   % OS=0(GET operation), Length=2
      DATA[10] <- BYTE(
IF    (state=0) THEN DATA:=34;
ELSIF (state=1) THEN DATA:=37;
ELSIF (state=2) THEN DATA:=58;
ELSIF (state=3) THEN DATA:=64;
ELSIF (state=4) THEN DATA:=65;
ELSIF (state=5) THEN DATA:=66;
ELSIF (state=6) THEN DATA:=67;
ELSIF (state=7) THEN DATA:=152; % energy_hi
ELSIF (state=8) THEN DATA:=24; % time hi
ENDIF;
      );  % p
      DATA[11] <- BYTE(
IF    (state=0) THEN DATA:=35;
ELSIF (state=1) THEN DATA:=39;
ELSIF (state=2) THEN DATA:=32;
ELSIF (state=3) THEN DATA:=68;
ELSIF (state=4) THEN DATA:=69;
ELSIF (state=5) THEN DATA:=70;
ELSIF (state=6) THEN DATA:=71;
ELSIF (state=7) THEN DATA:=153; % energy_lo
ELSIF (state=8) THEN DATA:=25; % time hi
% ELSE DATA:= 58;
ENDIF;
      );

      
    ANSWER SIZE 20  % 28 14
      DATA[0] = HEX(24); % start delimiter
      DATA[1] = HEX(10);  % datalength
      DATA[6] -> BYTE(INFO1  := DATA;);
      DATA[7] -> BYTE(UNIT1  := DATA;);
      DATA[8] -> BYTE(ZERO1  := DATA;);
      DATA[9] -> BYTE(RANGE1 := DATA;);
      DATA[10] -> BYTE(INFO2  := DATA;);
      DATA[11] -> BYTE(UNIT2  := DATA;);
      DATA[12] -> BYTE(ZERO2  := DATA;);
      DATA[13] -> BYTE(RANGE2 := DATA;);
      
      DATA[16] -> BYTE(
tmp := (ZERO1+DATA*RANGE1/254);
IF   (state=0) THEN  % power
  p:= tmp;
  IF    (UNIT1 =  8) THEN p:=p*10;
  ELSIF (UNIT1 =  9) THEN p:=p*100;
  ELSIF (UNIT1 = 44) THEN p:=p*1000;
  ELSIF (UNIT1 = 44) THEN p:=p*10000;
  ENDIF;
ELSIF (state=1) THEN % pump head
  h:=tmp;
  IF    (UNIT1 = 91) THEN h:=h*0.0001;
  ELSIF (UNIT1 = 83) THEN h:=h*0.01;
  ELSIF (UNIT1 = 24) THEN h:=h*0.1;
  ELSIF (UNIT1 = 25) THEN h:=h*1;
  ELSIF (UNIT1 = 26) THEN h:=h*10;
  ENDIF;
ELSIF (state=2) THEN % water temp;
  t_w:=tmp;
  IF    (UNIT1 = 20) THEN t_w:=t_w*0.1;
  ELSIF (UNIT1 = 21) THEN t_w:=t_w*1;
  ELSIF (UNIT1 = 57) THEN t_w:=t_w*0.1;
  ELSIF (UNIT1 = 84) THEN t_w:=t_w*0.01-273.15;
    ENDIF;
ELSIF (state=3) THEN
  L1 := DATA;
ELSIF (state=4) THEN
  L2 := DATA;
ELSIF (state=5) THEN
  L3 := DATA;
ELSIF (state=6) THEN
  L4 := DATA;
ELSIF (state=7) THEN
  hi := DATA;
ELSIF (state=8) THEN
  hi := DATA;
ENDIF;


      );
      DATA[17] -> BYTE(
tmp := (ZERO2+DATA*RANGE2/254);
IF (state=0) THEN % rpm
  speed:= tmp;
  IF    (UNIT2 = 18) THEN speed:=speed*12;
  ELSIF (UNIT2 = 19) THEN speed:=speed*100;
  ENDIF;
ELSIF (state=1) THEN % flow
  q:=tmp;
  IF    (UNIT2 = 95) THEN q:=q*0.01;
  ELSIF (UNIT2 = 22) THEN q:=q*0.1;
  ELSIF (UNIT2 = 23) THEN q:=q*1;
  ELSIF (UNIT2 = 41) THEN q:=q*5;
  ELSIF (UNIT2 = 92) THEN q:=q*10;
  ELSIF (UNIT2 = 93) THEN q:=q*100;
  ELSE q := -1;
  ENDIF;
ELSIF (state=2) THEN % motor current
  %i_mo:=tmp;
  %IF    (UNIT2 =  1) THEN i_mo:=i_mo*0.1;
  %ELSIF (UNIT2 = 42) THEN i_mo:=i_mo*0.2;
  %ELSIF (UNIT2 = 62) THEN i_mo:=i_mo*0.5;
  %ELSIF (UNIT2 =  2) THEN i_mo:=i_mo*5;
  %ELSE i_mo := -1;
  %ENDIF;
ELSIF (state=3) THEN
  L5 := DATA;
ELSIF (state=4) THEN
  L6 := DATA;
ELSIF (state=5) THEN
  L7 := DATA;
ELSIF (state=6) THEN
  L8 := DATA;
  ALARM:=L1;
       ALARM:=ALARM+L2*256;
     ALARM:=ALARM+L3*65536;
     ALARM:=ALARM+L4*16777216;
     ALARM:=ALARM+L5*4294967296;
     ALARM:=ALARM+L6*1099511627776;
ELSIF (state=7) THEN
  energy := (ZERO2+(DATA+hi*256)*RANGE2/(254*256));
  IF    (UNIT1 = 87) THEN energy:=energy/1000/3600;
  ELSIF (UNIT1 = 94) THEN energy:=energy/1000;
  ELSIF (UNIT1 = 31) THEN energy:=energy*1;
  ELSIF (UNIT1 = 85) THEN energy:=energy*2;
  ELSIF (UNIT1 = 32) THEN energy:=energy*10;
  ELSIF (UNIT1 = 33) THEN energy:=energy*100;
  ELSIF (UNIT1 = 40) THEN energy:=energy*512;
  ELSIF (UNIT1 = 46) THEN energy:=energy*1000;
  ELSIF (UNIT1 = 47) THEN energy:=energy*10000;
  ELSIF (UNIT1 = 48) THEN energy:=energy*100000;
  ENDIF;
ELSIF (state=8) THEN
  time := (ZERO2+(DATA+hi*256)*RANGE2/(254*256));
  IF    (UNIT1 = 39) THEN time:=time*1024;
  ELSIF (UNIT1 = 81) THEN time:=time*100;
  ELSIF (UNIT1 = 72) THEN time:=time*1024/60;
  ELSIF (UNIT1 = 13) THEN time:=time*2;
  ELSIF (UNIT1 = 35) THEN time:=time*1;

  ENDIF;
ENDIF;

      );


    TIMEOUT 1000
  END;
  TELEGRAM WriteSettings NAMED "WriteSettings" IS
  QUESTION
      DATA[0] := HEX(27);                    % start delimiter
      DATA[1] := BYTE(14);                   % datalength
      DATA[2] := BYTE(Destination+31);       % destination address
      DATA[3] := BYTE(Source);     % source address
      
      % read INFO data
      DATA[4] := HEX(04);   % class 4 data
      DATA[5] := HEX(C1);    % OS=3(INFO operation), Length=1
      DATA[6] := BYTE(83); % Constant pressure minimum pressure 

      % variables to be written
      DATA[7] := HEX(03);      % class 3 command
      DATA[8] := HEX(83);       % OS=2(SET), Length=2
      DATA[9] := HEX(07);       % setting remote mode
      DATA[10] := HEX(25);    % Max mode
      DATA[11] <- BYTE(IF (Start=0) THEN DATA:=5; ELSE DATA:=6; ENDIF;);

      DATA[12] := HEX(05); % class 5 
      DATA[13] := HEX(82); % OS=2(SET), Length=2
      DATA[14] := HEX(01); % remote reference
      DATA[15] <- BYTE(tmp:=th*2.54;  % data
IF tmp > 254 THEN tmp:=254; ENDIF;
IF tmp < 0   THEN tmp:=0;ENDIF;
DATA := tmp;
);
%      DATA[12] := HEX(04);
%      DATA[13] := HEX(84);

%      DATA[14] := HEX(84);
%      DATA[15] <- BYTE(IF (head_unit=91)    THEN tmp := th*0.0001;
%                    ELSIF (head_unit=83) THEN tmp := th*0.01;
%                      ELSIF (head_unit=24) THEN tmp := th*0.1;
%                      ELSIF (head_unit=25) THEN tmp := th;
%                      ELSIF (head_unit=26) THEN tmp := th*10;
%                      ELSIF (head_unit=56) THEN tmp := th*3.28;
%                      ELSIF (head_unit=56) THEN tmp := th*3.28*10;
%                      ENDIF;
%                       DATA:=th;
%                      );
%      DATA[16] := HEX(86);
%      DATA[17] <- BYTE(DATA:=th;);
    ANSWER SIZE 16
      DATA[0] = HEX(24);
      DATA[7] -> BYTE(head_unit:=DATA;); 

    TIMEOUT 1000
  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.