Regin Trådlös Modbus via RCW-M

Detaljer

Typ
Drivrutin
Upplaggd av
Ove Jansson, Abelko Innovation
Version
6
Uppdaterad
2017-11-20
Skapad
2017-03-01
Kategori
IO enheter, Modbus
Visningar
2462

Beskrivning

Drivrutin för Rumsgivare TG-R5W, Utomhusgivare TG-R6W samt DCW dörrkontakt, IRCW takmonterad rörelsesensor samt IRW rörelsesensor med stöd för:
- Medel, max och min värden för rumstemperaturer
- Lägg till eller ta bort givare
- Sätt sovtid (wake up) tid, läs sovtid
- Batteri larm med summalarm batteri
- läs mätartyp och id

Bruksanvisning

Endast Ultra och EW-3

Normal drift:
- Sätt telegram Koppla/Ta bort i Ingen kommunikation
- Sätt telegram Ställ sovtid i Ingen kommunikation
- Sätt modbus adress (sätts med DIP switchar på mottagaren)
- Sätt Tempgräns låg till lägsta rumstemperatur för att räknas. Default är 10
- Sätt Tempgräns hög till högsta rumstemperatur för att räknas. Default är 40

För att lägga till enhet:
- Sätt Välj enhet(1-16) till det enhetsnummer du vill lägga till
- Sätt Operation till Koppla
- Sätt telegram Koppla/Ta bort till 1 sekund
- Alla LED på mottagaren börjar blinka
- Sätt telegram Koppla/Ta bort till Ingen kommunikation
- Tryck ner Test knappen på enhetens som ska läggas till
- LED på mottagaren slutar blinka och det är klart

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

% Skapad med Modbus Creator
% - OBS! Användaren ansvarar själv för att samma TYPID inte används flera gånger i samma apparat.
%   TYPID 10000-19999 är för användardefinierade enheter
DEVICETYPE RCWMv2 NAMED "RCW-M v2" TYPEID 11083 IS

 PARAMETER
  Id : "Adress" INT;
  Device : "Välj enhet(1-16)" INT;
  Oper : "Operation" ["Ingen,Koppla,Ta bort"]ENUM;
  LowLimit : "Tempgräns låg" ["°C"]DEC2;
  HighLimit : "Tempgräns hög" ["°C"]DEC2;
  DeviceZ : "Sovtid enhet(1-16)" INT;
  WakeUpTime : "Sovtid att skriva" ["x10 sek"]INT;
  
 PUBLIC
  T1 : "Tempgivare 1" ["°C"]DEC2;
  T2 : "Tempgivare 2" ["°C"]DEC2;
  T3 : "Tempgivare 3" ["°C"]DEC2;
  T4 : "Tempgivare 4" ["°C"]DEC2;
  T5 : "Tempgivare 5" ["°C"]DEC2;
  T6 : "Tempgivare 6" ["°C"]DEC2;
  T7 : "Tempgivare 7" ["°C"]DEC2;
  T8 : "Tempgivare 8" ["°C"]DEC2;
  T9 : "Tempgivare 9" ["°C"]DEC2;
  T10 : "Tempgivare 10" ["°C"]DEC2;
  T11 : "Tempgivare 11" ["°C"]DEC2;
  T12 : "Tempgivare 12" ["°C"]DEC2;
  T13 : "Tempgivare 13" ["°C"]DEC2;
  T14 : "Tempgivare 14" ["°C"]DEC2;
  T15 : "Tempgivare 15" ["°C"]DEC2;
  T16 : "Tempgivare 16" ["°C"]DEC2;
  TMean : "Rumstemp medel" ["°C"]DEC2;
  TMin : "Rumstemp min" ["°C"]DEC2;
  TMax : "Rumstemp max" ["°C"]DEC2;
  
  E1 : "Enhet 1 Typ" ["Ingen,Dörr,Närvaro,Rumtemp,Utetemp,Opt,Okänd"]ENUM;
  E2 : "Enhet 2 Typ" ["Ingen,Dörr,Närvaro,Rumtemp,Utetemp,Opt,Okänd"]ENUM;
  E3 : "Enhet 3 Typ" ["Ingen,Dörr,Närvaro,Rumtemp,Utetemp,Opt,Okänd"]ENUM;
  E4 : "Enhet 4 Typ" ["Ingen,Dörr,Närvaro,Rumtemp,Utetemp,Opt,Okänd"]ENUM;
  E5 : "Enhet 5 Typ" ["Ingen,Dörr,Närvaro,Rumtemp,Utetemp,Opt,Okänd"]ENUM;
  E6 : "Enhet 6 Typ" ["Ingen,Dörr,Närvaro,Rumtemp,Utetemp,Opt,Okänd"]ENUM;
  E7 : "Enhet 7 Typ" ["Ingen,Dörr,Närvaro,Rumtemp,Utetemp,Opt,Okänd"]ENUM;
  E8 : "Enhet 8 Typ" ["Ingen,Dörr,Närvaro,Rumtemp,Utetemp,Opt,Okänd"]ENUM;
  E9 : "Enhet 9 Typ" ["Ingen,Dörr,Närvaro,Rumtemp,Utetemp,Opt,Okänd"]ENUM;
  E10 : "Enhet 10 Typ" ["Ingen,Dörr,Närvaro,Rumtemp,Utetemp,Opt,Okänd"]ENUM;
  E11 : "Enhet 11 Typ" ["Ingen,Dörr,Närvaro,Rumtemp,Utetemp,Opt,Okänd"]ENUM;
  E12 : "Enhet 12 Typ" ["Ingen,Dörr,Närvaro,Rumtemp,Utetemp,Opt,Okänd"]ENUM;
  E13 : "Enhet 13 Typ" ["Ingen,Dörr,Närvaro,Rumtemp,Utetemp,Opt,Okänd"]ENUM;
  E14 : "Enhet 14 Typ" ["Ingen,Dörr,Närvaro,Rumtemp,Utetemp,Opt,Okänd"]ENUM;
  E15 : "Enhet 15 Typ" ["Ingen,Dörr,Närvaro,Rumtemp,Utetemp,Opt,Okänd"]ENUM;
  E16 : "Enhet 16 Typ" ["Ingen,Dörr,Närvaro,Rumtemp,Utetemp,Opt,Okänd"]ENUM;
  
  S1 : "Signal 1" ["dB"]INT; 
  S2 : "Signal 2" ["dB"]INT; 
  S3 : "Signal 3" ["dB"]INT; 
  S4 : "Signal 4" ["dB"]INT; 
  S5 : "Signal 5" ["dB"]INT; 
  S6 : "Signal 6" ["dB"]INT; 
  S7 : "Signal 7" ["dB"]INT; 
  S8 : "Signal 8" ["dB"]INT; 
  S9 : "Signal 9" ["dB"]INT; 
  S10 : "Signal 10" ["dB"]INT; 
  S11 : "Signal 11" ["dB"]INT; 
  S12 : "Signal 12" ["dB"]INT; 
  S13 : "Signal 13" ["dB"]INT; 
  S14 : "Signal 14" ["dB"]INT; 
  S15 : "Signal 15" ["dB"]INT; 
  S16 : "Signal 16" ["dB"]INT; 
  
  V1 : "Enhet 1 ID" [""]INT;
  V2 : "Enhet 2 ID" [""]INT;
  V3 : "Enhet 3 ID" [""]INT;
  V4 : "Enhet 4 ID" [""]INT;
  V5 : "Enhet 5 ID" [""]INT;
  V6 : "Enhet 6 ID" [""]INT;
  V7 : "Enhet 7 ID" [""]INT;
  V8 : "Enhet 8 ID" [""]INT;
  V9 : "Enhet 9 ID" [""]INT;
  V10 : "Enhet 10 ID" [""]INT;
  V11 : "Enhet 11 ID" [""]INT;
  V12 : "Enhet 12 ID" [""]INT;
  V13 : "Enhet 13 ID" [""]INT;
  V14 : "Enhet 14 ID" [""]INT;
  V15 : "Enhet 15 ID" [""]INT;
  V16 : "Enhet 16 ID" [""]INT;

  ASum : "Summalarm Batteri" INT;
  A1 : "Enhet 1 larm Batteri" INT;
  A2 : "Enhet 2 larm Batteri" INT;
  A3 : "Enhet 3 larm Batteri" INT;
  A4 : "Enhet 4 larm Batteri" INT;
  A5 : "Enhet 5 larm Batteri" INT;
  A6 : "Enhet 6 larm Batteri" INT;
  A7 : "Enhet 7 larm Batteri" INT;
  A8 : "Enhet 8 larm Batteri" INT;
  A9 : "Enhet 9 larm Batteri" INT;
  A10 : "Enhet 10 larm Batteri" INT;
  A11 : "Enhet 11 larm Batteri" INT;
  A12 : "Enhet 12 larm Batteri" INT;
  A13 : "Enhet 13 larm Batteri" INT;
  A14 : "Enhet 14 larm Batteri" INT;
  A15 : "Enhet 15 larm Batteri" INT;
  A16 : "Enhet 16 larm Batteri" INT;
  
  Z1 : "Sovtid 1" ["sek"]INT;
  Z2 : "Sovtid 2" ["sek"]INT;
  Z3 : "Sovtid 3" ["sek"]INT;
  Z4 : "Sovtid 4" ["sek"]INT;
  Z5 : "Sovtid 5" ["sek"]INT;
  Z6 : "Sovtid 6" ["sek"]INT;
  Z7 : "Sovtid 7" ["sek"]INT;
  Z8 : "Sovtid 8" ["sek"]INT;
  Z9 : "Sovtid 9" ["sek"]INT;
  Z10 : "Sovtid 10" ["sek"]INT;
  Z11 : "Sovtid 11" ["sek"]INT;
  Z12 : "Sovtid 12" ["sek"]INT;
  Z13 : "Sovtid 13" ["sek"]INT;
  Z14 : "Sovtid 14" ["sek"]INT;
  Z15 : "Sovtid 15" ["sek"]INT;
  Z16 : "Sovtid 16" ["sek"]INT;
  
  P1 : "Närvaro/Dörr 1" INT;
  P2 : "Närvaro/Dörr 2" INT;
  P3 : "Närvaro/Dörr 3" INT;
  P4 : "Närvaro/Dörr 4" INT;
  P5 : "Närvaro/Dörr 5" INT;
  P6 : "Närvaro/Dörr 6" INT;
  P7 : "Närvaro/Dörr 7" INT;
  P8 : "Närvaro/Dörr 8" INT;
  P9 : "Närvaro/Dörr 9" INT;
  P10 : "Närvaro/Dörr 10" INT;
  P11 : "Närvaro/Dörr 11" INT;
  P12 : "Närvaro/Dörr 12" INT;
  P13 : "Närvaro/Dörr 13" INT;
  P14 : "Närvaro/Dörr 14" INT;
  P15 : "Närvaro/Dörr 15" INT;
  P16 : "Närvaro/Dörr 16" INT;
  
 PRIVATE
  Tmp;
  Sum;
  Count;
  TLow;
  THigh;

 BAUDRATE 19200;
 PARITY EVEN;
 CHECKSUM MODBUS SWAPPED;

 
 
 TELEGRAM ReadTemp NAMED "Läs temperatur" IS
  QUESTION
   DATA[0] := BYTE(Id); % Enhetens Modbus adress
   DATA[1] :=  HEX(04); % Modbus kommando för att läsa register kod 04
   DATA[2] := RWORD(0); % Start address
   DATA[4] := RWORD(16); % Antal register att läsa
  ANSWER SIZE 37 % (Antal register * 2) + 5
   DATA[0] = BYTE(Id);
   DATA[1] = BYTE(04);
   DATA[2] = BYTE(32); % Antal Bytes
   DATA[3] -> RWORD(
    Count:=0;
Sum:=0;
TLow:=LowLimit;
THigh:=HighLimit;
    IF TLow=0 AND THigh=0 THEN TLow:=10; THigh:=40; ENDIF;
    IF (DATA>=32768) THEN Tmp:=(DATA-65536)/100; ELSE Tmp:=DATA/100; ENDIF;
IF(E1=3 AND Tmp>TLow AND Tmp<THigh) THEN Sum:=Sum+Tmp; Count:=Count+1; TMin:=Tmp; TMax:=Tmp; ENDIF;
    T1:=Tmp;
   );
   DATA[5] -> RWORD(IF (DATA>=32768) THEN Tmp:=(DATA-65536)/100; ELSE Tmp:=DATA/100; ENDIF;
IF(E2=3 AND Tmp>TLow AND Tmp<THigh) THEN Sum:=Sum+Tmp; Count:=Count+1; IF Tmp<TMin THEN TMin:=Tmp; ENDIF; IF Tmp>TMax THEN TMax:=Tmp; ENDIF; ENDIF;
    T2:=Tmp;
   );
   DATA[7] -> RWORD(IF (DATA>=32768) THEN Tmp:=(DATA-65536)/100; ELSE Tmp:=DATA/100; ENDIF;
IF(E3=3 AND Tmp>TLow AND Tmp<THigh) THEN Sum:=Sum+Tmp; Count:=Count+1; IF Tmp<TMin THEN TMin:=Tmp; ENDIF; IF Tmp>TMax THEN TMax:=Tmp; ENDIF; ENDIF;
    T3:=Tmp;
   );
   DATA[9] -> RWORD(IF (DATA>=32768) THEN Tmp:=(DATA-65536)/100; ELSE Tmp:=DATA/100; ENDIF;
IF(E4=3 AND Tmp>TLow AND Tmp<THigh) THEN Sum:=Sum+Tmp; Count:=Count+1; IF Tmp<TMin THEN TMin:=Tmp; ENDIF; IF Tmp>TMax THEN TMax:=Tmp; ENDIF; ENDIF;
    T4:=Tmp;
   );
   DATA[11] -> RWORD(IF (DATA>=32768) THEN Tmp:=(DATA-65536)/100; ELSE Tmp:=DATA/100; ENDIF;
IF(E5=3 AND Tmp>TLow AND Tmp<THigh) THEN Sum:=Sum+Tmp; Count:=Count+1; IF Tmp<TMin THEN TMin:=Tmp; ENDIF; IF Tmp>TMax THEN TMax:=Tmp; ENDIF; ENDIF;
    T5:=Tmp;
   );
   DATA[13] -> RWORD(IF (DATA>=32768) THEN Tmp:=(DATA-65536)/100; ELSE Tmp:=DATA/100; ENDIF;
IF(E6=3 AND Tmp>TLow AND Tmp<THigh) THEN Sum:=Sum+Tmp; Count:=Count+1; IF Tmp<TMin THEN TMin:=Tmp; ENDIF; IF Tmp>TMax THEN TMax:=Tmp; ENDIF; ENDIF;
    T6:=Tmp;
   );
   DATA[15] -> RWORD(IF (DATA>=32768) THEN Tmp:=(DATA-65536)/100; ELSE Tmp:=DATA/100; ENDIF;
IF(E7=3 AND Tmp>TLow AND Tmp<THigh) THEN Sum:=Sum+Tmp; Count:=Count+1; IF Tmp<TMin THEN TMin:=Tmp; ENDIF; IF Tmp>TMax THEN TMax:=Tmp; ENDIF; ENDIF;
    T7:=Tmp;
   );
   DATA[17] -> RWORD(IF (DATA>=32768) THEN Tmp:=(DATA-65536)/100; ELSE Tmp:=DATA/100; ENDIF;
IF(E8=3 AND Tmp>TLow AND Tmp<THigh) THEN Sum:=Sum+Tmp; Count:=Count+1; IF Tmp<TMin THEN TMin:=Tmp; ENDIF; IF Tmp>TMax THEN TMax:=Tmp; ENDIF; ENDIF;
    T8:=Tmp;
   );
   DATA[19] -> RWORD(IF (DATA>=32768) THEN Tmp:=(DATA-65536)/100; ELSE Tmp:=DATA/100; ENDIF;
IF(E9=3 AND Tmp>TLow AND Tmp<THigh) THEN Sum:=Sum+Tmp; Count:=Count+1; IF Tmp<TMin THEN TMin:=Tmp; ENDIF; IF Tmp>TMax THEN TMax:=Tmp; ENDIF; ENDIF;
    T9:=Tmp;
   );
   DATA[21] -> RWORD(IF (DATA>=32768) THEN Tmp:=(DATA-65536)/100; ELSE Tmp:=DATA/100; ENDIF;
IF(E10=3 AND Tmp>TLow AND Tmp<THigh) THEN Sum:=Sum+Tmp; Count:=Count+1; IF Tmp<TMin THEN TMin:=Tmp; ENDIF; IF Tmp>TMax THEN TMax:=Tmp; ENDIF; ENDIF;
    T10:=Tmp;
   );
   DATA[23] -> RWORD(IF (DATA>=32768) THEN Tmp:=(DATA-65536)/100; ELSE Tmp:=DATA/100; ENDIF;
IF(E11=3 AND Tmp>TLow AND Tmp<THigh) THEN Sum:=Sum+Tmp; Count:=Count+1; IF Tmp<TMin THEN TMin:=Tmp; ENDIF; IF Tmp>TMax THEN TMax:=Tmp; ENDIF; ENDIF;
    T11:=Tmp;
   );
   DATA[25] -> RWORD(IF (DATA>=32768) THEN Tmp:=(DATA-65536)/100; ELSE Tmp:=DATA/100; ENDIF;
IF(E12=3 AND Tmp>TLow AND Tmp<THigh) THEN Sum:=Sum+Tmp; Count:=Count+1; IF Tmp<TMin THEN TMin:=Tmp; ENDIF; IF Tmp>TMax THEN TMax:=Tmp; ENDIF; ENDIF;
    T12:=Tmp;
   );
   DATA[27] -> RWORD(IF (DATA>=32768) THEN Tmp:=(DATA-65536)/100; ELSE Tmp:=DATA/100; ENDIF;
IF(E13=3 AND Tmp>TLow AND Tmp<THigh) THEN Sum:=Sum+Tmp; Count:=Count+1; IF Tmp<TMin THEN TMin:=Tmp; ENDIF; IF Tmp>TMax THEN TMax:=Tmp; ENDIF; ENDIF;
    T13:=Tmp;
   );
   DATA[29] -> RWORD(IF (DATA>=32768) THEN Tmp:=(DATA-65536)/100; ELSE Tmp:=DATA/100; ENDIF;
IF(E14=3 AND Tmp>TLow AND Tmp<THigh) THEN Sum:=Sum+Tmp; Count:=Count+1; IF Tmp<TMin THEN TMin:=Tmp; ENDIF; IF Tmp>TMax THEN TMax:=Tmp; ENDIF; ENDIF;
    T14:=Tmp;
   );
   DATA[31] -> RWORD(IF (DATA>=32768) THEN Tmp:=(DATA-65536)/100; ELSE Tmp:=DATA/100; ENDIF;
IF(E15=3 AND Tmp>TLow AND Tmp<THigh) THEN Sum:=Sum+Tmp; Count:=Count+1; IF Tmp<TMin THEN TMin:=Tmp; ENDIF; IF Tmp>TMax THEN TMax:=Tmp; ENDIF; ENDIF;
    T15:=Tmp;
   );
   DATA[33] -> RWORD(IF (DATA>=32768) THEN Tmp:=(DATA-65536)/100; ELSE Tmp:=DATA/100; ENDIF;
IF(E16=3 AND Tmp>TLow AND Tmp<THigh) THEN Sum:=Sum+Tmp; Count:=Count+1; IF Tmp<TMin THEN TMin:=Tmp; ENDIF; IF Tmp>TMax THEN TMax:=Tmp; ENDIF; ENDIF;
    T16:=Tmp;
    TMean:=Sum/Count;
   );
  TIMEOUT 300
 END;
 
 TELEGRAM ReadType NAMED "Läs typ" IS
  QUESTION
   DATA[0] := BYTE(Id); % Enhetens Modbus adress
   DATA[1] :=  HEX(04); % Modbus kommando för att läsa register kod 04
   DATA[2] := RWORD(7000); % Start address
   DATA[4] := RWORD(16); % Antal register att läsa
  ANSWER SIZE 37 % (Antal register * 2) + 5
   DATA[0] = BYTE(Id);
   DATA[1] = BYTE(04);
   DATA[2] = BYTE(32); % Antal Bytes
   DATA[3] -> RWORD(Tmp := 6; IF DATA=10 THEN Tmp:=1; ELSIF DATA=21 THEN Tmp:=2; ELSIF DATA=100 THEN Tmp:=3; ELSIF DATA=120 THEN Tmp:=4; ELSIF DATA=200 THEN Tmp:=5; ENDIF; E1:=Tmp;);
   DATA[5] -> RWORD(Tmp := 6; IF DATA=10 THEN Tmp:=1; ELSIF DATA=21 THEN Tmp:=2; ELSIF DATA=100 THEN Tmp:=3; ELSIF DATA=120 THEN Tmp:=4; ELSIF DATA=200 THEN Tmp:=5; ENDIF; E2:=Tmp;);
   DATA[7] -> RWORD(Tmp := 6; IF DATA=10 THEN Tmp:=1; ELSIF DATA=21 THEN Tmp:=2; ELSIF DATA=100 THEN Tmp:=3; ELSIF DATA=120 THEN Tmp:=4; ELSIF DATA=200 THEN Tmp:=5; ENDIF; E3:=Tmp;);
   DATA[9] -> RWORD(Tmp := 6; IF DATA=10 THEN Tmp:=1; ELSIF DATA=21 THEN Tmp:=2; ELSIF DATA=100 THEN Tmp:=3; ELSIF DATA=120 THEN Tmp:=4; ELSIF DATA=200 THEN Tmp:=5; ENDIF; E4:=Tmp;);
   DATA[11] -> RWORD(Tmp := 6; IF DATA=10 THEN Tmp:=1; ELSIF DATA=21 THEN Tmp:=2; ELSIF DATA=100 THEN Tmp:=3; ELSIF DATA=120 THEN Tmp:=4; ELSIF DATA=200 THEN Tmp:=5; ENDIF; E5:=Tmp;);
   DATA[13] -> RWORD(Tmp := 6; IF DATA=10 THEN Tmp:=1; ELSIF DATA=21 THEN Tmp:=2; ELSIF DATA=100 THEN Tmp:=3; ELSIF DATA=120 THEN Tmp:=4; ELSIF DATA=200 THEN Tmp:=5; ENDIF; E6:=Tmp;);
   DATA[15] -> RWORD(Tmp := 6; IF DATA=10 THEN Tmp:=1; ELSIF DATA=21 THEN Tmp:=2; ELSIF DATA=100 THEN Tmp:=3; ELSIF DATA=120 THEN Tmp:=4; ELSIF DATA=200 THEN Tmp:=5; ENDIF; E7:=Tmp;);
   DATA[17] -> RWORD(Tmp := 6; IF DATA=10 THEN Tmp:=1; ELSIF DATA=21 THEN Tmp:=2; ELSIF DATA=100 THEN Tmp:=3; ELSIF DATA=120 THEN Tmp:=4; ELSIF DATA=200 THEN Tmp:=5; ENDIF; E8:=Tmp;);
   DATA[19] -> RWORD(Tmp := 6; IF DATA=10 THEN Tmp:=1; ELSIF DATA=21 THEN Tmp:=2; ELSIF DATA=100 THEN Tmp:=3; ELSIF DATA=120 THEN Tmp:=4; ELSIF DATA=200 THEN Tmp:=5; ENDIF; E9:=Tmp;);
   DATA[21] -> RWORD(Tmp := 6; IF DATA=10 THEN Tmp:=1; ELSIF DATA=21 THEN Tmp:=2; ELSIF DATA=100 THEN Tmp:=3; ELSIF DATA=120 THEN Tmp:=4; ELSIF DATA=200 THEN Tmp:=5; ENDIF; E10:=Tmp;);
   DATA[23] -> RWORD(Tmp := 6; IF DATA=10 THEN Tmp:=1; ELSIF DATA=21 THEN Tmp:=2; ELSIF DATA=100 THEN Tmp:=3; ELSIF DATA=120 THEN Tmp:=4; ELSIF DATA=200 THEN Tmp:=5; ENDIF; E11:=Tmp;);
   DATA[25] -> RWORD(Tmp := 6; IF DATA=10 THEN Tmp:=1; ELSIF DATA=21 THEN Tmp:=2; ELSIF DATA=100 THEN Tmp:=3; ELSIF DATA=120 THEN Tmp:=4; ELSIF DATA=200 THEN Tmp:=5; ENDIF; E12:=Tmp;);
   DATA[27] -> RWORD(Tmp := 6; IF DATA=10 THEN Tmp:=1; ELSIF DATA=21 THEN Tmp:=2; ELSIF DATA=100 THEN Tmp:=3; ELSIF DATA=120 THEN Tmp:=4; ELSIF DATA=200 THEN Tmp:=5; ENDIF; E13:=Tmp;);
   DATA[29] -> RWORD(Tmp := 6; IF DATA=10 THEN Tmp:=1; ELSIF DATA=21 THEN Tmp:=2; ELSIF DATA=100 THEN Tmp:=3; ELSIF DATA=120 THEN Tmp:=4; ELSIF DATA=200 THEN Tmp:=5; ENDIF; E14:=Tmp;);
   DATA[31] -> RWORD(Tmp := 6; IF DATA=10 THEN Tmp:=1; ELSIF DATA=21 THEN Tmp:=2; ELSIF DATA=100 THEN Tmp:=3; ELSIF DATA=120 THEN Tmp:=4; ELSIF DATA=200 THEN Tmp:=5; ENDIF; E15:=Tmp;);
   DATA[33] -> RWORD(Tmp := 6; IF DATA=10 THEN Tmp:=1; ELSIF DATA=21 THEN Tmp:=2; ELSIF DATA=100 THEN Tmp:=3; ELSIF DATA=120 THEN Tmp:=4; ELSIF DATA=200 THEN Tmp:=5; ENDIF; E16:=Tmp;);
  TIMEOUT 300
 END;
 
 TELEGRAM ReadSignal NAMED "Läs signal" IS
  QUESTION
   DATA[0] := BYTE(Id); % Enhetens Modbus adress
   DATA[1] :=  HEX(04); % Modbus kommando för att läsa register kod 04
   DATA[2] := RWORD(7200); % Start address
   DATA[4] := RWORD(16); % Antal register att läsa
  ANSWER SIZE 37 % (Antal register * 2) + 5
   DATA[0] = BYTE(Id);
   DATA[1] = BYTE(04);
   DATA[2] = BYTE(32); % Antal Bytes
   DATA[3] ->RWORD(S1:=DATA;);
   DATA[5] ->RWORD(S2:=DATA;);
   DATA[7] ->RWORD(S3:=DATA;);
   DATA[9] ->RWORD(S4:=DATA;);
   DATA[11] ->RWORD(S5:=DATA;);
   DATA[13] ->RWORD(S6:=DATA;);
   DATA[15] ->RWORD(S7:=DATA;);
   DATA[17] ->RWORD(S8:=DATA;);
   DATA[19] ->RWORD(S9:=DATA;);
   DATA[21] ->RWORD(S10:=DATA;);
   DATA[23] ->RWORD(S11:=DATA;);
   DATA[25] ->RWORD(S12:=DATA;);
   DATA[27] ->RWORD(S13:=DATA;);
   DATA[29] ->RWORD(S14:=DATA;);
   DATA[31] ->RWORD(S15:=DATA;);
   DATA[33] ->RWORD(S16:=DATA;);
  TIMEOUT 300
 END;
 
 TELEGRAM ReadID NAMED "Läs id" IS
  QUESTION
   DATA[0] := BYTE(Id); % Enhetens Modbus adress
   DATA[1] :=  HEX(04); % Modbus kommando för att läsa register kod 04
   DATA[2] := RWORD(7100); % Start address
   DATA[4] := RWORD(16); % Antal register att läsa
  ANSWER SIZE 37 % (Antal register * 2) + 5
   DATA[0] = BYTE(Id);
   DATA[1] = BYTE(04);
   DATA[2] = BYTE(32); % Antal Bytes
   DATA[3] -> RWORD(V1 := DATA;);
   DATA[5] -> RWORD(V2 := DATA;);
   DATA[7] -> RWORD(V3 := DATA;);
   DATA[9] -> RWORD(V4 := DATA;);
   DATA[11] -> RWORD(V5 := DATA;);
   DATA[13] -> RWORD(V6 := DATA;);
   DATA[15] -> RWORD(V7 := DATA;);
   DATA[17] -> RWORD(V8 := DATA;);
   DATA[19] -> RWORD(V9 := DATA;);
   DATA[21] -> RWORD(V10 := DATA;);
   DATA[23] -> RWORD(V11 := DATA;);
   DATA[25] -> RWORD(V12 := DATA;);
   DATA[27] -> RWORD(V13 := DATA;);
   DATA[29] -> RWORD(V14 := DATA;);
   DATA[31] -> RWORD(V15 := DATA;);
   DATA[33] -> RWORD(V16 := DATA;);
  TIMEOUT 300
 END;
 
 TELEGRAM WriteProgram NAMED "Koppla/Ta bort" IS
  QUESTION
   DATA[0] := BYTE(Id); % Enhetens Modbus adress
   DATA[1] := HEX(10); % Modbus kommando för att skriva flera register
   DATA[2] <- RWORD(IF Device<1 OR Device>16 THEN DATA:=7000; ELSE DATA:=6999+Device; ENDIF; ); % Register adress
   DATA[4] := RWORD(1); % Antal register
   DATA[6] := BYTE(2); % Antal byte
   DATA[7] <- RWORD(
    IF Device<1 OR Device>16 THEN DATA:=0; ELSIF Oper=1 THEN DATA:=1; ELSIF Oper=2 THEN DATA:=3; ELSE DATA:=0; ENDIF;
   );
  ANSWER SIZE 8
   DATA[0] = BYTE(Id);
   DATA[1] = HEX(10);
  TIMEOUT 300
 END;
 
 TELEGRAM ReadBatry NAMED "Läs batterilarm" IS
  QUESTION
   DATA[0] := BYTE(Id); % Enhetens Modbus adress
   DATA[1] :=  HEX(02); % Modbus kommando för att läsa register kod 02
   DATA[2] := RWORD(100); % Start address
   DATA[4] := RWORD(16); % Antal register att läsa
  ANSWER SIZE 7 % (Antal register / 8) avrundat uppåt + 5
   DATA[0] = BYTE(Id);
   DATA[1] = BYTE(02);
   DATA[2] = BYTE(2); % Antal Bytes
   DATA[3] -> BYTE(
    ASum:=0;
IF DATA>0 THEN ASum:=1; ENDIF;
    IF (DATA & 1) THEN A1 := 1; ELSE A1 := 0; ENDIF;
    IF (DATA & 2) THEN A2 := 1; ELSE A2 := 0; ENDIF;
    IF (DATA & 4) THEN A3 := 1; ELSE A3 := 0; ENDIF;
    IF (DATA & 8) THEN A4 := 1; ELSE A4 := 0; ENDIF;
    IF (DATA & 16) THEN A5 := 1; ELSE A5 := 0; ENDIF;
    IF (DATA & 32) THEN A6 := 1; ELSE A6 := 0; ENDIF;
    IF (DATA & 64) THEN A7 := 1; ELSE A7 := 0; ENDIF;
    IF (DATA & 128) THEN A8 := 1; ELSE A8 := 0; ENDIF;
   );
   DATA[4] -> BYTE(
    IF DATA>0 THEN ASum:=1; ENDIF;
    IF (DATA & 1) THEN A9 := 1; ELSE A9 := 0; ENDIF;
    IF (DATA & 2) THEN A10 := 1; ELSE A10 := 0; ENDIF;
    IF (DATA & 4) THEN A11 := 1; ELSE A11 := 0; ENDIF;
    IF (DATA & 8) THEN A12 := 1; ELSE A12 := 0; ENDIF;
    IF (DATA & 16) THEN A13 := 1; ELSE A13 := 0; ENDIF;
    IF (DATA & 32) THEN A14 := 1; ELSE A14 := 0; ENDIF;
    IF (DATA & 64) THEN A15 := 1; ELSE A15 := 0; ENDIF;
    IF (DATA & 128) THEN A16 := 1; ELSE A16 := 0; ENDIF;
   );
  TIMEOUT 300
 END;
 
 TELEGRAM ReadPD NAMED "Läs närvaro och dörr" IS
  QUESTION
   DATA[0] := BYTE(Id); % Enhetens Modbus adress
   DATA[1] :=  HEX(02); % Modbus kommando för att läsa register kod 02
   DATA[2] := RWORD(0); % Start address
   DATA[4] := RWORD(16); % Antal register att läsa
  ANSWER SIZE 7 % (Antal register / 8) avrundat uppåt + 5
   DATA[0] = BYTE(Id);
   DATA[1] = BYTE(02);
   DATA[2] = BYTE(2); % Antal Bytes
   DATA[3] -> BYTE(
    IF (DATA & 1) THEN P1 := 1; ELSE P1 := 0; ENDIF;
    IF (DATA & 2) THEN P2 := 1; ELSE P2 := 0; ENDIF;
    IF (DATA & 4) THEN P3 := 1; ELSE P3 := 0; ENDIF;
    IF (DATA & 8) THEN P4 := 1; ELSE P4 := 0; ENDIF;
    IF (DATA & 16) THEN P5 := 1; ELSE P5 := 0; ENDIF;
    IF (DATA & 32) THEN P6 := 1; ELSE P6 := 0; ENDIF;
    IF (DATA & 64) THEN P7 := 1; ELSE P7 := 0; ENDIF;
    IF (DATA & 128) THEN P8 := 1; ELSE P8 := 0; ENDIF;
   );
   DATA[4] -> BYTE(
    
    IF (DATA & 1) THEN P9 := 1; ELSE P9 := 0; ENDIF;
    IF (DATA & 2) THEN P10 := 1; ELSE P10 := 0; ENDIF;
    IF (DATA & 4) THEN P11 := 1; ELSE P11 := 0; ENDIF;
    IF (DATA & 8) THEN P12 := 1; ELSE P12 := 0; ENDIF;
    IF (DATA & 16) THEN P13 := 1; ELSE P13 := 0; ENDIF;
    IF (DATA & 32) THEN P14 := 1; ELSE P14 := 0; ENDIF;
    IF (DATA & 64) THEN P15 := 1; ELSE P15 := 0; ENDIF;
    IF (DATA & 128) THEN P16 := 1; ELSE P16 := 0; ENDIF;
   );
  TIMEOUT 300
 END;
 
 TELEGRAM ReadSleep NAMED "Läs Sovtid" IS
  QUESTION
   DATA[0] := BYTE(Id); % Enhetens Modbus adress
   DATA[1] :=  BYTE(3); % Modbus kommando för att läsa register kod 3
   DATA[2] := RWORD(100); % Start address
   DATA[4] := RWORD(16); % Antal register att läsa
  ANSWER SIZE 37 % (Antal register * 2) + 5
   DATA[0] = BYTE(Id);
   DATA[1] = BYTE(3);
   DATA[2] = BYTE(32); % Antal Bytes
   DATA[3] ->RWORD(Z1:=DATA*10;);
   DATA[5] ->RWORD(Z2:=DATA*10;);
   DATA[7] ->RWORD(Z3:=DATA*10;);
   DATA[9] ->RWORD(Z4:=DATA*10;);
   DATA[11] ->RWORD(Z5:=DATA*10;);
   DATA[13] ->RWORD(Z6:=DATA*10;);
   DATA[15] ->RWORD(Z7:=DATA*10;);
   DATA[17] ->RWORD(Z8:=DATA*10;);
   DATA[19] ->RWORD(Z9:=DATA*10;);
   DATA[21] ->RWORD(Z10:=DATA*10;);
   DATA[23] ->RWORD(Z11:=DATA*10;);
   DATA[25] ->RWORD(Z12:=DATA*10;);
   DATA[27] ->RWORD(Z13:=DATA*10;);
   DATA[29] ->RWORD(Z14:=DATA*10;);
   DATA[31] ->RWORD(Z15:=DATA*10;);
   DATA[33] ->RWORD(Z16:=DATA*10;);
  TIMEOUT 300
 END;
 
 TELEGRAM WriteWakeUp NAMED "Ställ sovtid" IS
  QUESTION
   DATA[0] := BYTE(Id); % Enhetens Modbus adress
   DATA[1] := HEX(10); % Modbus kommando för att skriva flera register
   DATA[2] <- RWORD(IF DeviceZ<1 OR Device>16 THEN DATA:=100; ELSE DATA:=99+DeviceZ; ENDIF; ); % Register adress
   DATA[4] := RWORD(1); % Antal register
   DATA[6] := BYTE(2); % Antal byte
   DATA[7] <- RWORD(
    IF Device<1 OR Device>16 THEN DATA:=12; ELSE DATA:=WakeUpTime; ENDIF;
   );
  ANSWER SIZE 8
   DATA[0] = BYTE(Id);
   DATA[1] = HEX(10);
  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.