Regin Läs/skriv Holding Register
Detaljer
- Typ
- Drivrutin
- Upplaggd av
- Ove Jansson, Abelko Innovation
- Version
- 2
- Uppdaterad
- 2014-01-08
- Skapad
- 2014-01-07
- Kategori
- Modbus, Värme, Ventilation
- Visningar
- 3216
Beskrivning
Läs och skrivning till Holding register på en regin uppsatt enligt:
{ BPac
; MODBUS Slave Protocol
; Revision 2.0-0-12, Date: 2010-06-01
; (c) AB REGIN, Landskrona, Sweden
BlkSize = 12
Def_L = 0
Def_X = 0
Def_I = 0
Def_R = 0
}
{ Values
; Input & Holding Register types (Type)
; 0: no decoding or manuf. spec. format
; 1: One index variable to LSB of one register
; 2: Two index variables to LSB & MSB of one register
; 3: Integer variable to one register. No scaling
; 4: Real variable to one register. Scale and Offset used
; 5:
; 6: Real variable to two registers (IEEE)
; 7: Real variable in BPac to one register. Scale and Offset used
; Example: #305 DPacLn(TimeDp) ModVaraddr(TimeDp.Posts(0).T1) 7 100 *
; 8: Index variable in BPac to one register.
; Example: #306 DPacLn(TimeGrp) ModVaraddr(TimeGrp.Posts(0).P1) 8 * *
( No :X Ldn :I Cell :X Type :R Scale :R Offs )
;----- Input Status Registers ----------------------------------------------------
#0 DPacLn(InputOutput) ModVaraddr(InputOutput.FA1_Larm_Ind) * * *
#1 DPacLn(InputOutput) ModVaraddr(InputOutput.FF1_Ind) * * *
#2 DPacLn(InputOutput) ModVaraddr(InputOutput.SPJ3_SPJ4_Stängt_Öppet_Ind) * * *
#3 DPacLn(InputOutput) ModVaraddr(InputOutput.SPJ3_SPJ4_Öppet_Stängt_Ind) * * *
#4 DPacLn(InputOutput) ModVaraddr(InputOutput.Test_Omk_på_Skåp_Ind) * * *
#5 DPacLn(InputOutput) ModVaraddr(InputOutput.Service_Omk_Ind) * * *
#6 DPacLn(InputOutput) ModVaraddr(InputOutput.FF1_Man) * * *
#7 DPacLn(InputOutput) ModVaraddr(InputOutput.SPJ3_SPJ4_Man) * * *
#8 DPacLn(InputOutput) ModVaraddr(InputOutput.VP_Steg1_Man) * * *
#9 DPacLn(InputOutput) ModVaraddr(InputOutput.VP_Steg2_Man) * * *
#10 DPacLn(InputOutput) ModVaraddr(InputOutput.AS_H2_SA_Larm_A_Man) * * *
#11 DPacLn(InputOutput) ModVaraddr(InputOutput.AS_H2_SA_Larm_B_Man) * * *
#12 DPacLn(InputOutput) ModVaraddr(InputOutput.AS_H2_SA_Larm_C_Man) * * *
;----- Coil Status Registers -----------------------------------------------------
#100 DPacLn(StdObjs1) ModVaraddr(StdObjs1.FA1_Start_Stopp_Input5) * * *
#101 DPacLn(StdObjs1) ModVaraddr(StdObjs1.VP1_Start_Stopp_Input5) * * *
#102 DPacLn(StdObjs1) ModVaraddr(StdObjs1.FF1_Start_Stopp_Input5) * * *
;----- Input Registers -----------------------------------------------------------
#200 DPacLn(InputOutput) ModVaraddr(InputOutput.FA1_GP1) 4 10 *
#202 DPacLn(InputOutput) ModVaraddr(InputOutput.FA1_GT1) 4 10 *
#204 DPacLn(InputOutput) ModVaraddr(InputOutput.UTE_GT3) 4 10 *
#206 DPacLn(InputOutput) ModVaraddr(InputOutput.FA1_FO) 4 10 *
#208 DPacLn(StdObjs1) ModVaraddr(StdObjs1.FA1_Tryckstyrning_SetP) 4 10 *
;----- Holding Registers ---------------------------------------------------------
#300 DPacLn(StdObjs1) ModVaraddr(StdObjs1.FF1_Brandfläkt_Select) 1 * *
#301 DPacLn(StdObjs1) ModVaraddr(StdObjs1.VP1_Steg_1_Manöver_Select) 1 * *
#302 DPacLn(StdObjs1) ModVaraddr(StdObjs1.VP1_Steg_2_Manöver_Select) 1 * *
#303 DPacLn(StdObjs1) ModVaraddr(StdObjs1.FA1_Börvärde_Input0) 4 10 *
#305 DPacLn(StdObjs1) ModVaraddr(StdObjs1.FA1_Börvärde_Input1) 4 10 *
#307 DPacLn(StdObjs1) ModVaraddr(StdObjs1.FA1_Block_Helfart_via_UTE_Temp_Setp) 4 10 *
;----- End -----------------------------------------------------------------------
#308 255 * * * *
}
Bruksanvisning
Värt att notera är att i Regins RegMap.txt fil betyder adress 200 Input register 0 och att adress 300 betyder Holding register 0
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 ReginHolding NAMED "ReginHolding" TYPEID 21426 IS
PARAMETER
Id : "Adress";
V7 : "FF1_Brandfläkt_Select" [""];
V8 : "VP1_Steg_1_Manöver_Select" [""];
V9 : "VP1_Steg_2_Manöver_Select" [""];
V10 : "FA1_BVIn0" ["Pa"]DEC1;
V11 : "FA1_BVIn1" ["Pa"]DEC1;
V12 : "FA1_Block_Helfart_via_UTE_Temp_Setp" ["°C"]DEC1;
PUBLIC
V1 : "FF1_Brandfläkt_Select" [""];
V2 : "VP1_Steg_1_Manöver_Select" [""];
V3 : "VP1_Steg_2_Manöver_Select" [""];
V4 : "FA1_BVIn0" ["Pa"]DEC1;
V5 : "FA1_BVIn1" ["Pa"]DEC1;
V6 : "FA1_Block_Helfart_via_UTE_Temp_Setp" ["°C"]DEC1;
PRIVATE
count4;
count6;
tmp;
BAUDRATE 9600;
CHECKSUM MODBUS SWAPPED;
TELEGRAM Read4 NAMED "Read 4" IS
QUESTION
DATA[0] := BYTE(Id); % Enhetens Modbus adress
DATA[1] := HEX(03); % Modbus kommando för att läsa register kod 04
DATA[2] <- RWORD(
IF(count4>5) THEN count4 := 0; ENDIF;
IF(count4=0) THEN tmp := 0;
ELSIF(count4=1) THEN tmp :=1;
ELSIF(count4=2) THEN tmp :=2;
ELSIF(count4=3) THEN tmp :=3;
ELSIF(count4=4) THEN tmp :=5;
ELSIF(count4=5) THEN tmp :=7;
ENDIF;
DATA := tmp;
); % Start address
DATA[4] := RWORD(1); % Antal register att läsa
ANSWER SIZE 7 % (Antal register * 2) + 5
DATA[0] = BYTE(Id);
DATA[1] = BYTE(03);
DATA[3] -> RWORD(
IF(count4=0) THEN V1 := (DATA );
ELSIF(count4=1) THEN V2:=(DATA);
ELSIF(count4=2) THEN V3:=(DATA);
ELSIF(count4=3) THEN IF (DATA>=32768) THEN V4:=(DATA-65536)/10; ELSE V4:=DATA/10; ENDIF;
ELSIF(count4=4) THEN IF (DATA>=32768) THEN V5:=(DATA-65536)/10; ELSE V5:=DATA/10; ENDIF;
ELSIF(count4=5) THEN IF (DATA>=32768) THEN V6:=(DATA-65536)/10; ELSE V6:=DATA/10; ENDIF;
ENDIF;
count4 := count4 + 1;
);
TIMEOUT 2000
END;
TELEGRAM WriteRegister NAMED "Write Register" IS
QUESTION
DATA[0] := BYTE(Id); % Enhetens Modbus adress
DATA[1] := HEX(06); % Modbus kommando för att skriva ett register
DATA[2] <- RWORD(
IF(count6>5) THEN count6 := 0; ENDIF;
IF (count6=0) THEN DATA := 0;
ELSIF (count6=1) THEN DATA := 1;
ELSIF (count6=2) THEN DATA := 2;
ELSIF (count6=3) THEN DATA := 3;
ELSIF (count6=4) THEN DATA := 5;
ELSIF (count6=5) THEN DATA := 7;
ENDIF;
); % Register adress
DATA[4] <- RWORD(
IF (count6=0) THEN DATA := V7;
ELSIF (count6=1) THEN DATA := V8;
ELSIF (count6=2) THEN DATA := V9;
ELSIF (count6=3) THEN DATA := V10*10;
ELSIF (count6=4) THEN DATA := V11*10;
ELSIF (count6=5) THEN DATA := V12*10;
ENDIF;
count6 := count6+1;
);
ANSWER SIZE 8
DATA[0] = BYTE(Id);
DATA[1] = BYTE(06);
TIMEOUT 2000
END;
END;
PARAMETER
Id : "Adress";
V7 : "FF1_Brandfläkt_Select" [""];
V8 : "VP1_Steg_1_Manöver_Select" [""];
V9 : "VP1_Steg_2_Manöver_Select" [""];
V10 : "FA1_BVIn0" ["Pa"]DEC1;
V11 : "FA1_BVIn1" ["Pa"]DEC1;
V12 : "FA1_Block_Helfart_via_UTE_Temp_Setp" ["°C"]DEC1;
PUBLIC
V1 : "FF1_Brandfläkt_Select" [""];
V2 : "VP1_Steg_1_Manöver_Select" [""];
V3 : "VP1_Steg_2_Manöver_Select" [""];
V4 : "FA1_BVIn0" ["Pa"]DEC1;
V5 : "FA1_BVIn1" ["Pa"]DEC1;
V6 : "FA1_Block_Helfart_via_UTE_Temp_Setp" ["°C"]DEC1;
PRIVATE
count4;
count6;
tmp;
BAUDRATE 9600;
CHECKSUM MODBUS SWAPPED;
TELEGRAM Read4 NAMED "Read 4" IS
QUESTION
DATA[0] := BYTE(Id); % Enhetens Modbus adress
DATA[1] := HEX(03); % Modbus kommando för att läsa register kod 04
DATA[2] <- RWORD(
IF(count4>5) THEN count4 := 0; ENDIF;
IF(count4=0) THEN tmp := 0;
ELSIF(count4=1) THEN tmp :=1;
ELSIF(count4=2) THEN tmp :=2;
ELSIF(count4=3) THEN tmp :=3;
ELSIF(count4=4) THEN tmp :=5;
ELSIF(count4=5) THEN tmp :=7;
ENDIF;
DATA := tmp;
); % Start address
DATA[4] := RWORD(1); % Antal register att läsa
ANSWER SIZE 7 % (Antal register * 2) + 5
DATA[0] = BYTE(Id);
DATA[1] = BYTE(03);
DATA[3] -> RWORD(
IF(count4=0) THEN V1 := (DATA );
ELSIF(count4=1) THEN V2:=(DATA);
ELSIF(count4=2) THEN V3:=(DATA);
ELSIF(count4=3) THEN IF (DATA>=32768) THEN V4:=(DATA-65536)/10; ELSE V4:=DATA/10; ENDIF;
ELSIF(count4=4) THEN IF (DATA>=32768) THEN V5:=(DATA-65536)/10; ELSE V5:=DATA/10; ENDIF;
ELSIF(count4=5) THEN IF (DATA>=32768) THEN V6:=(DATA-65536)/10; ELSE V6:=DATA/10; ENDIF;
ENDIF;
count4 := count4 + 1;
);
TIMEOUT 2000
END;
TELEGRAM WriteRegister NAMED "Write Register" IS
QUESTION
DATA[0] := BYTE(Id); % Enhetens Modbus adress
DATA[1] := HEX(06); % Modbus kommando för att skriva ett register
DATA[2] <- RWORD(
IF(count6>5) THEN count6 := 0; ENDIF;
IF (count6=0) THEN DATA := 0;
ELSIF (count6=1) THEN DATA := 1;
ELSIF (count6=2) THEN DATA := 2;
ELSIF (count6=3) THEN DATA := 3;
ELSIF (count6=4) THEN DATA := 5;
ELSIF (count6=5) THEN DATA := 7;
ENDIF;
); % Register adress
DATA[4] <- RWORD(
IF (count6=0) THEN DATA := V7;
ELSIF (count6=1) THEN DATA := V8;
ELSIF (count6=2) THEN DATA := V9;
ELSIF (count6=3) THEN DATA := V10*10;
ELSIF (count6=4) THEN DATA := V11*10;
ELSIF (count6=5) THEN DATA := V12*10;
ENDIF;
count6 := count6+1;
);
ANSWER SIZE 8
DATA[0] = BYTE(Id);
DATA[1] = BYTE(06);
TIMEOUT 2000
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.