FUNCTION_BLOCK "call_modbus_intesis"
{ S7_Optimized_Access := 'TRUE' }
VERSION : 0.1
VAR
nrOfReadGroup : Int := 23; // number of group of read from Intesis
nrOfIntesisDB : ULInt := 1; // DB Number of intesisDB
modbusParameters {InstructionName := 'TCON_IP_v4'; LibVersion := '1.0'; S7_SetPoint := 'False'} : TCON_IP_v4 := (64, 16#1, 16#0B, TRUE, ([16#C0, 16#A8, 16#00, 16#5F]), 502, 503);
mbIntesis {InstructionName := 'MB_CLIENT'; LibVersion := '4.1'} : MB_CLIENT;
tme {InstructionName := 'TON_TIME'; LibVersion := '1.0'; S7_SetPoint := 'False'} : TON_TIME;
tmeQ { S7_SetPoint := 'True'} : Bool;
tmeChg { S7_SetPoint := 'True'} : Bool;
pos : Int := 1;
rec : Array[0..22] of Word;
addr : LInt := 30113;
step : Int := 0;
busy : Bool;
read : Bool;
stepTm4 {InstructionName := 'TON_TIME'; LibVersion := '1.0'; S7_SetPoint := 'False'} : TON_TIME;
stepTm6 {InstructionName := 'TON_TIME'; LibVersion := '1.0'; S7_SetPoint := 'False'} : TON_TIME;
tm4Q { S7_SetPoint := 'True'} : Bool;
byteOffset : Int;
bitOffset : Int;
offset : Int;
bit1 : Bool;
bit2 : Bool;
END_VAR
VAR_TEMP
done : Bool;
error : Bool;
status : Word;
no : Bool;
tempw : Word;
rest : Time;
END_VAR
BEGIN
// Simatic S7-1500 - IntesisBox Modbus communication program
// Sándor Vámos / 2020
//
// The program communicates with the intesisBox via modbus. The intesisBox modbus-server consists of
// modbus module groups, a module group is fixed at 22 words.
// The number of groups to be read can be parameterized (see below)
//
// Because the program has to query the modbus blocks one by one,
// the update time is quite slow (up to 40-50s). But at least it works.
//
// The current version of The program reads two parameters from the intesisBox per block:
// (The range of read signals can be expanded up to all 22 parameters)
//
// - error status (0: ok, 1: error)
// - Communication error Group (0: ok, 1: error)
//
// The readed error signals are summarized in The "intesisDB" DB in "Bool" format.
//
// Important! The program uses direct addressing in the "intesisDB", so the
// DB Properties / Attributes / Optimized block access parameter must be switched off,
// otherwise it will NOT display error messages.
//
// Important! Please check "nrOfIntesisDB" parameter, too!
//
// After installation, the program sometimes crashes during the first start-up,
// in which case The PLC (stop-run) must be restarted.
//
// ------- Parameters TO be set -------------------
//
// #nrOfReadGroup (Int, def: 23): Number OF Intesis blocks to Read (cf. number of climas)
// #nrOfIntesisDB (ULInt, def:1, -> DB1): Number of generated DB, see: intesisDB[DBxx]
// #addr (LInt, def: 30113): Start address for read from IntesisBox (113: first error status)
// #modbusParameters.InterfaceId (HW_ANY, def: 64): modbus HW module ID
// #modbusParameters.RemoteAddress.ADDR (def: C0, A8,00,5F - 192.168.0.95): intesisBox IP
// #modbusParameters.RemoteAddress.RemotePort (def: 502): The modbus PORT OF The intesisBox
// #modbusParameters.RemoteAddress.RemotePort (def: 502): modbus PORT OF The Simatic S7
// Steps for state-machine for read:
// step0: init; est:0, pos:1
// step1 : set ID, addr
// step2 : est 0-> 1
// step3: wait for busy
// step4: wait for end of busy
// step5: copy data
// step6: est 1-> 0
// step7: next pos
//
#stepTm4(IN := (#step = 4), // waiting time in step 4
PT := t#1s,
Q => #tm4Q,
ET => #rest);
#stepTm6(IN := (#step = 6), // waiting time in step 6
PT := t#200ms,
ET=>#rest);
IF #step = 0 THEN // first step (only by newstart): init
#read := FALSE;
#modbusParameters.ActiveEstablished := FALSE; // ActiveEstablished lock
#pos := 1;
#step := 1;
GOTO end;
END_IF;
IF #step = 1 THEN // step1 : set ID, addr
#modbusParameters.ID := INT_TO_WORD(#pos);
#addr := 30013 + #pos * 100;
#step := 2;
GOTO end;
END_IF;
IF #step = 2 THEN // step2 : est 0-> 1
#modbusParameters.ActiveEstablished := TRUE; // ActiveEstablished enable
#step := 3;
GOTO end;
END_IF;
IF #step = 3 THEN // step3: wait for busy
#read := TRUE; // read from Intesisbox start
IF #busy THEN // wait for busy (modbus modul works)
#step := 4;
END_IF;
GOTO end;
END_IF;
IF #step = 4 THEN // step4: wait for end of busy
IF #tm4Q THEN // wait a little bit
#step := 5;
END_IF;
GOTO end;
END_IF;
IF #step = 5 THEN // step5: copy data
// copy data
//
#offset := (#pos * 2) - 2; // write offset in intesisDb in bits
#byteOffset := SHR (IN:=#offset, N:=3); // offset in byte (bit / 8)
#bitOffset := #offset - (#byteOffset * 8); // rest bits
#bit1 := WORD_TO_BOOL(#rec[0]); // error status (word) from modbus
#bit2 := WORD_TO_BOOL(#rec[4]); // communcation error (word) from modbus
POKE_BOOL(area := 16#84, // write error status (bit) to intesisDb
dbNumber := #nrOfIntesisDB, // dbNumber from intesisDB
byteOffset := #byteOffset, // byte and bit offset
bitOffset := #bitOffset,
value := #bit1);
POKE_BOOL(area := 16#84, // write communication error (bit) to intesisDb
dbNumber := #nrOfIntesisDB, // dbNumber from intesisDB
byteOffset := #byteOffset, // byte and bit offset + 1
bitOffset := #bitOffset + 1,
value := #bit2);
#step := 6;
GOTO end;
END_IF;
IF #step = 6 THEN // step6: est 1-> 0
#modbusParameters.ActiveEstablished := FALSE; // ActiveEstablished lock
#read:=FALSE;
IF #stepTm6.Q THEN // wait a little bit
#step := 7;
END_IF;
GOTO end;
END_IF;
IF #step = 7 THEN // step7: next pos
#pos := #pos + 1;
IF #pos > #nrOfReadGroup THEN // read loop start again
#pos := 1;
END_IF;
#step := 1;
GOTO end;
END_IF;
end:
;
// call modbus modul mit multi-instants
#mbIntesis(REQ := #read,
DISCONNECT := FALSE,
MB_MODE := 0,
MB_DATA_ADDR := #addr,
MB_DATA_LEN := 6,
DONE => #done,
BUSY => #busy,
ERROR => #error,
STATUS => #status,
MB_DATA_PTR := #rec,
CONNECT := #modbusParameters);
// monitor for pos and step
#pos:= #pos;
#step := #step;
// monitor for readed data
#tempw := #rec[0];
#tempw := #rec[1];
#tempw := #rec[2];
#tempw := #rec[3];
#tempw := #rec[4];
#tempw := #rec[5];
#tempw := #rec[6];
#tempw := #rec[7];
// Status error codes:
// 0000: Instruction executed without errors.
// 0001: Connection established.
// 0003: Connection terminated.
// 7000: #no job active AND no connection established (REQ=0, DISCONNECT=1).
// 7001: Connection establishment triggered.
// 7002: Intermediate call. Connection is being established.
// 7003: Connection is being terminated.
// 7004: Connection established AND monitored. No job processing active.
// 7005: data is being sent.
// 7006: data is being received.
// 80BB: Invalid value at ActiveEstablished parameter
// 80C8: #no response OF the server in the defined period.
// 8187: the MB_HOLD_REG parameter has an Invalid Pointer. Data area is too small.
// 8380: received Modbus frame has incorrect format OR too few bytes were received.
// 8381: Function code is NOT supported.
// 8382: the length OF the Modbus frame in the frame header does NOT match the number OF received bytes.
// 8383: #error reading OR writing data OR access outside the address area
// 8384: Invalid exception code received.
// 8385: Diagnostics code NOT supported.
// 8386: received function code does NOT match the one sent originally.
// 8387: the protocol ID OF the Modbus TCP frame received BY the server is NOT "0".
// 8388: the Modbus server sent a different data length than was requested.
// 8389: Invalid data area definition
// 80B6: Invalid connection type, only TCP connections are supported.
// 80BB: Invalid value at ActiveEstablished parameter
// 8188: the MB_MODE parameter has an Invalid value.
// 8189: Invalid addressing OF data at the MB_DATA_ADDR parameter.
// 818A: Invalid data length at the MB_DATA_LEN parameter.
// 818B: the MB_DATA_PTR parameter has an Invalid Pointer.
// 818C: Timeout at parameter BLOCKED_PROC_TIMEOUT OR RCV_TIMEOUT
// 8200: A different Modbus request is currently being processed via the PORT.
END_FUNCTION_BLOCK
DATA_BLOCK "intesisDB"
{ S7_Optimized_Access := 'FALSE' }
VERSION : 0.1
NON_RETAIN
STRUCT
meld00 : Bool; // MBAddr: 113, Klimadeckengerät 1 Raum 2
meld01 : Bool; // MBAddr: 117, Klimadeckengerät 1 Raum 2
meld02 : Bool; // MBAddr: 213, Klimadeckengerät 1 Raum 3
meld03 : Bool; // MBAddr: 217, Klimadeckengerät 1 Raum 3
meld04 : Bool; // MBAddr: 313, Klimadeckengerät 2 Raum 3
meld05 : Bool; // MBAddr: 317, Klimadeckengerät 2 Raum 3
meld06 : Bool; // MBAddr: 413, Klimaschrank 1 Raum 6
meld07 : Bool; // MBAddr: 417, Klimaschrank 1 Raum 6
meld08 : Bool; // MBAddr: 513, Klimaschrank 2 Raum 7
meld09 : Bool; // MBAddr: 517, Klimaschrank 2 Raum 7
meld10 : Bool; // MBAddr: 613, Klimaschrank 1 Raum 8
meld11 : Bool; // MBAddr: 617, Klimaschrank 1 Raum 8
meld12 : Bool; // MBAddr: 713, Klimaschrank 2 Raum 9
meld13 : Bool; // MBAddr: 717, Klimaschrank 2 Raum 9
meld14 : Bool; // MBAddr: 813, Klimaschrank 3 Raum 10
meld15 : Bool; // MBAddr: 817, Klimaschrank 3 Raum 10
meld16 : Bool; // MBAddr: 913, Klimaschrank 4 Raum 11
meld17 : Bool; // MBAddr: 917, Klimaschrank 4 Raum 11
meld18 : Bool; // MBAddr: 1013, Klimadeckengerät 1 Raum 12
meld19 : Bool; // MBAddr: 1017, Klimadeckengerät 1 Raum 12
meld20 : Bool; // MBAddr: 1113, Klimadeckengerät 2 Raum 13
meld21 : Bool; // MBAddr: 1117, Klimadeckengerät 2 Raum 13
meld22 : Bool; // MBAddr: 1213, Gebäudeklima Kühler 1 Dach
meld23 : Bool; // MBAddr: 1217, Gebäudeklima Kühler 1 Dach
meld24 : Bool; // MBAddr: 1313, Gebäudeklima Kühler 2 Dach
meld25 : Bool; // MBAddr: 1317, Gebäudeklima Kühler 2 Dach
meld26 : Bool; // MBAddr: 1413, Gebäudeklima Kühler 3 Dach
meld27 : Bool; // MBAddr: 1417, Gebäudeklima Kühler 3 Dach
meld28 : Bool; // MBAddr: 1513, Gebäudeklima Kühler 4 Dach
meld29 : Bool; // MBAddr: 1517, Gebäudeklima Kühler 4 Dach
meld30 : Bool; // MBAddr: 1613, Gebäudeklima Kühler 5 Dach
meld31 : Bool; // MBAddr: 1617, Gebäudeklima Kühler 5 Dach
meld32 : Bool; // MBAddr: 1713, Gebäudeklima Kühler 6 Dach
meld33 : Bool; // MBAddr: 1717, Gebäudeklima Kühler 6 Dach
meld34 : Bool; // MBAddr: 1813, Gebäudeklima Kühler 7 Dach
meld35 : Bool; // MBAddr: 1817, Gebäudeklima Kühler 7 Dach
meld36 : Bool; // MBAddr: 1913, Gebäudeklima Kühler 8 Dach
meld37 : Bool; // MBAddr: 1917, Gebäudeklima Kühler 8 Dach
meld38 : Bool; // MBAddr: 2013, Gebäudeklima Kühler 9 Dach
meld39 : Bool; // MBAddr: 2017, Gebäudeklima Kühler 9 Dach
meld40 : Bool; // MBAddr: 2113, Gebäudeklima Kühler 10 Dach
meld41 : Bool; // MBAddr: 2117, Gebäudeklima Kühler 10 Dach
meld42 : Bool; // MBAddr: 2213, Gebäudeklima Kühler 11 Dach
meld43 : Bool; // MBAddr: 2217, Gebäudeklima Kühler 11 Dach
meld44 : Bool; // res
meld45 : Bool; // res
meld46 : Bool; // res
meld47 : Bool; // res
END_STRUCT;
BEGIN
END_DATA_BLOCK