====== Simatic S7-1500 - IntesisBox Modbus Kommunikationsprogramm ====== {{:de:project_s7:uk.png?16|english}} Simatic S7-1500 - IntesisBox Modbus communication program \\ {{:de:project_s7:de.png?16|deutsch}} Das Programm kommuniziert mit der **intesisBox** und **S7-1500** über **Modbus**. Der **intesisBox Modbus-Server** besteht aus Modbus-Modulgruppen, eine Modulgruppe ist auf 22 Wörter festgelegt. Die Anzahl der zu lesenden Gruppen kann parametriert werden. Da das Programm die Modbus-Blöcke einzeln abfragen muss, ist die Aktualisierungszeit ziemlich langsam (bis zu 40-50 Sekunden). Aber zumindest funktioniert es. Die aktuelle Version von Das Programm liest pro Block zwei Parameter aus der intesisBox: (Der Bereich der Lesesignale kann auf alle 22 Parameter erweitert werden.) - Fehlerstatus (0: ok, 1: Fehler) - Kommunikationsfehlergruppe (0: ok, 1: Fehler) Die gelesenen Fehlersignale sind in der DB //"intesisDB"// im Format //"Bool"// zusammengefasst. **Wichtig!** Das Programm verwendet die direkte Adressierung in der //"intesisDB"//, daher muss der Parameter //DB-Eigenschaften / Attribute / Optimierter Blockzugriff// deaktiviert werden, da sonst KEINE Fehlermeldungen angezeigt werden. **Wichtig!** Bitte überprüfen Sie auch den Parameter "nrOfIntesisDB"! Nach der Installation stürzt das Programm manchmal beim ersten Start ab. In diesem Fall muss die SPS (Stop-Run) neu gestartet werden. Das Programm wurde mit **TIA Portal 16** getestet. {{:de:project_s7:uk.png?16|english}} The program communicates with the **S7-1500** and **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. 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. |{{ :de:project:intesis_01.png?250 |}}|{{ :de:project:intesis_02.png?250 |}}|{{ :de:project:intesis_03.png?250 |}}| |Simatic S7-1500 - IntesisBox Modbus Kommunikation|LinkBoxMB zeigt Kommunikation|Kommunikationssicht in TIA 16| **SCL-Programm download:** {{ :de:project:intesisprgv10.scl |intesisPrgv10.scl}} \\ \\ Der Quellcode enthält eine Beschreibung eines scl-Codes und einer Datenbank (siehe Quellcode unten). Der Code kann im TIA-Portal geöffnet und übersetzt werden. From file (from 2020.10.30) **{{dlcounter>file?de:project_s7:intesisPrgv10.scl}}** downloads. 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 {{page>de:project_s7:foot}}