{"id":28335,"date":"2025-01-17T12:57:47","date_gmt":"2025-01-17T12:57:47","guid":{"rendered":"https:\/\/www.horter.de\/blog\/?p=28335"},"modified":"2026-01-08T18:14:32","modified_gmt":"2026-01-08T18:14:32","slug":"i2c-modbus-tcp-server","status":"publish","type":"post","link":"https:\/\/www.horter.de\/blog\/i2c-modbus-tcp-server\/","title":{"rendered":"I2C-Arduino-Master als Modbus TCP-Server"},"content":{"rendered":"<p>In diesem Beitrag zeige ich, wie ein Arduino als <strong>I2C\u2011Master<\/strong> arbeitet und gleichzeitig als <strong>Modbus\u2011TCP\u2011Server<\/strong> fungiert. Damit lassen sich Daten von I2C\u2011Modulen einfach auslesen und \u00fcber das Netzwerk an eine SPS oder andere Steuerungen weitergeben.<\/p>\n<p>Ein praktisches Beispielprogramm zeigt, wie die Messwerte \u00fcbertragen werden, sodass du direkt loslegen kannst \u2013 ideal f\u00fcr Projekte, bei denen I2C\u2011Sensoren in industrielle Netzwerke integriert werden sollen.<\/p>\n\n<h2>Hardware<\/h2>\n<div id=\"attachment_28362\" style=\"width: 310px\" class=\"wp-caption alignnone\"><a href=\"https:\/\/www.horter.de\/blog\/wp-content\/uploads\/2025\/01\/I2ARL_ArduinoMasterLan.jpg\"><img loading=\"lazy\" decoding=\"async\" aria-describedby=\"caption-attachment-28362\" class=\"size-medium wp-image-28362\" src=\"https:\/\/www.horter.de\/blog\/wp-content\/uploads\/2025\/01\/I2ARL_ArduinoMasterLan-300x300.jpg\" alt=\"I2C-Arduino-Master f\u00fcr die Hutschiene\" width=\"300\" height=\"300\" srcset=\"https:\/\/www.horter.de\/blog\/wp-content\/uploads\/2025\/01\/I2ARL_ArduinoMasterLan-300x300.jpg 300w, https:\/\/www.horter.de\/blog\/wp-content\/uploads\/2025\/01\/I2ARL_ArduinoMasterLan-150x150.jpg 150w, https:\/\/www.horter.de\/blog\/wp-content\/uploads\/2025\/01\/I2ARL_ArduinoMasterLan-125x125.jpg 125w, https:\/\/www.horter.de\/blog\/wp-content\/uploads\/2025\/01\/I2ARL_ArduinoMasterLan.jpg 760w\" sizes=\"auto, (max-width: 300px) 100vw, 300px\" \/><\/a><p id=\"caption-attachment-28362\" class=\"wp-caption-text\">I2C-Arduino-Master f\u00fcr die Hutschiene<\/p><\/div>\n<p>F\u00fcr diese Applikation wird das I2C-Master Modul verwendet.<\/p>\n<p>&#8211; Frei programmierbar mit Arduino-IDE<br \/>&#8211; Status-LED f\u00fcr SDA, SCL und INT<br \/>&#8211; Jumper zum aktivieren der Terminierung<br \/>&#8211; Blaue LED frei programmierbar. Z.B. f\u00fcr Status der LAN-Verbindung<br \/>&#8211; Steckplatz f\u00fcr WizNET W5500 LAN-Modul<br \/>&#8211; BUS-Stecker zum Anschluss weiterer I2C-Module<br \/>&#8211; Steckplatz f\u00fcr USB-RS232 Programmieradapter<\/p>\n<h2>Aufbau<\/h2>\n<div id=\"attachment_28340\" style=\"width: 502px\" class=\"wp-caption alignnone\"><a href=\"https:\/\/www.horter.de\/blog\/wp-content\/uploads\/2025\/01\/Modbus-Aufbau.png\"><img loading=\"lazy\" decoding=\"async\" aria-describedby=\"caption-attachment-28340\" class=\"wp-image-28340\" src=\"https:\/\/www.horter.de\/blog\/wp-content\/uploads\/2025\/01\/Modbus-Aufbau.png\" alt=\"\" width=\"492\" height=\"238\" srcset=\"https:\/\/www.horter.de\/blog\/wp-content\/uploads\/2025\/01\/Modbus-Aufbau.png 984w, https:\/\/www.horter.de\/blog\/wp-content\/uploads\/2025\/01\/Modbus-Aufbau-300x145.png 300w, https:\/\/www.horter.de\/blog\/wp-content\/uploads\/2025\/01\/Modbus-Aufbau-768x372.png 768w, https:\/\/www.horter.de\/blog\/wp-content\/uploads\/2025\/01\/Modbus-Aufbau-150x73.png 150w\" sizes=\"auto, (max-width: 492px) 100vw, 492px\" \/><\/a><p id=\"caption-attachment-28340\" class=\"wp-caption-text\">Beispiel Hardware f\u00fcr den I2C-Modbus-TCP-Server<\/p><\/div>\n<p>F\u00fcr unser Beispiel ist als Kopf der Arduino-I2C-Master mit gestecktem WizNET W5500 LAN-Modul. Daneben folgende Module<br \/>&#8211; Digitale I2C-Eingangskarte I2HE (Slave-Adresse 112)<br \/>&#8211; Digitale I2C-Ausgangskarte I2HA (Slave-Adresse 64)<br \/>&#8211; Analoge I2C-Eingangskarte I2HAE (Slave Adresse 16)<br \/>&#8211; Analoge I2C-Ausgangskarte I2HAA (Slave Adresse 176)<\/p>\n<h2>Software Modbus-TCP-Server<\/h2>\n<p>Die Modbus-TCP-Bibliothek f\u00fcr den Arduino kommt von Andr\u00e9 Sarmento Barbosa<br \/><a href=\"http:\/\/github.com\/andresarmento\/modbus-arduino\" target=\"_blank\" rel=\"noopener\">http:\/\/github.com\/andresarmento\/modbus-arduino<\/a><\/p>\n<p>Ich habe in paar verschiedene Bibliotheken ausprobiert und diese hat auf Anhieb super funktioniert.<\/p>\n<p>Diese Bibliotheken werden ben\u00f6tigt:<\/p>\n<pre><span style=\"color: #008000;\">#include<\/span> <span style=\"color: #008080;\">&lt;Wire.h&gt;<\/span> \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 <span style=\"color: #808080;\">\/\/ I2C-Lib<\/span>\n<span style=\"color: #008000;\">#include<\/span> <span style=\"color: #008080;\">&lt;avr\/wdt.h&gt;<\/span> \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0<span style=\"color: #808080;\">\/\/ Watchdog<\/span>\n<span style=\"color: #008000;\">#include<\/span> <span style=\"color: #008080;\">&lt;Modbus.h&gt;<\/span> \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 <span style=\"color: #808080;\">\/\/ ArduinoRS485 library<\/span>\n<span style=\"color: #008000;\">#include<\/span> <span style=\"color: #008080;\">&lt;ModbusIP.h&gt;<\/span> \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 <span style=\"color: #808080;\">\/\/ Modbus<\/span><\/pre>\n<div>Dann muss die IP-Adresse angegeben werden, \u00fcber die Der I2C-Master mit der SPS-Steuerung kommuniziert<\/div>\n<div>\n<div>\n<pre><span style=\"color: #808080;\">\/\/ModbusIP object<\/span>\nModbusIP mb;\nbyte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };  \nbyte ip[] = \u00a0{ 192, 168, 1, 7};<\/pre>\n<p>Dann definieren wir die Variablen f\u00fcr die verwendeten Raspberry-SPS-Baugruppen.<br \/>Sollen mehrere Eingangskarten verwendet werden, einfach die drei Zeilen eines Blocks kopieren und aus der 1 eine 2 machen u.s.w.<\/p>\n<\/div>\n<div>\n<div>\n<pre>\/\/ I2C-Baugruppen definieren und globale Variablen anlegen\n<span style=\"color: #008000;\">#define<\/span> <span style=\"color: #ff9900;\">I2E1_ADDR<\/span> \u00a0112 &gt;&gt; 1 \u00a0 <span style=\"color: #808080;\">\/\/ I2C-Digital INPUT \u00a0Addresse als 7 Bit<\/span>\n<span style=\"color: #008080;\">int<\/span> \u00a0I2E1_WERT=0;\n<span style=\"color: #008080;\">bool<\/span> I2E1_OK;\n<span style=\"color: #008000;\">#define<\/span> <span style=\"color: #ff9900;\">I2A1_ADDR<\/span> \u00a0 64 &gt;&gt; 1 \u00a0 <span style=\"color: #808080;\">\/\/ I2C-Digital OUTPUT Addresse als 7 Bit<\/span>\n<span style=\"color: #008080;\">int<\/span> I2A1_WERT=0;\n<span style=\"color: #008080;\">bool<\/span> I2A1_OK;\n<span style=\"color: #008000;\">#define<\/span> <span style=\"color: #ff9900;\">I2AE1_ADDR<\/span> \u00a016 &gt;&gt; 1 \u00a0 <span style=\"color: #808080;\">\/\/ I2C-Analog \u00a0INPUT \u00a0Addresse als 7 Bit<\/span>\n<span style=\"color: #008080;\">int<\/span> I2AE1_WERT[5];\n<span style=\"color: #008080;\">bool<\/span> I2AE1_OK;\n<span style=\"color: #008000;\">#define<\/span> <span style=\"color: #ff9900;\">I2AA1_ADDR<\/span> 176 &gt;&gt; 1 \u00a0 <span style=\"color: #808080;\">\/\/ I2C-Analog \u00a0OUTPUT Addresse als 7 Bit<\/span>\n<span style=\"color: #339966;\">int<\/span> I2AA1_WERT[4];\n<span style=\"color: #008080;\">bool<\/span> I2AA1_OK;<\/pre>\n<\/div>\n<\/div>\n<\/div>\n<p>Im Bereich Setup werden die Pin-Modes und die serielle Schnittstelle eingestellt.<br \/>Weiter unten kommt der Start und die Konfiguration vom Modbus-Server.<br \/>Die input-Register k\u00f6nnen von der SPS nur gelesen werden. In die Holding-Register kann die SPS Werte schreiben, die dann vom Modbus-TCP-Server gelesen und verarbeitet werden k\u00f6nnen.<\/p>\n<div>\n<pre><span style=\"color: #808080;\">\u00a0 \/\/ Modbus-TCP Server starten<\/span>\n<span style=\"color: #808080;\">  \/\/ -------------------------<\/span>\n  <span style=\"color: #ff6600;\">Serial.println<\/span>(<span style=\"color: #008080;\">\"Modbus TCP Server\"<\/span>);\n  <span style=\"color: #ff6600;\">mb.config<\/span>(mac, ip);\n\n  <span style=\"color: #808080;\">\/\/ Input-Register anlegen (Server -&gt; SPS)<\/span>\n  <span style=\"color: #ff6600;\">mb.addIreg<\/span>(0); \u00a0<span style=\"color: #808080;\">\/\/ Input-Register 0 = 30001 in der SPS<\/span>\n  <span style=\"color: #ff6600;\">mb.addIreg<\/span>(1); \u00a0<span style=\"color: #808080;\">\/\/ Input-Register 1 = 30002 in der SPS<\/span>\n  <span style=\"color: #ff6600;\">mb.addIreg<\/span>(2); \u00a0<span style=\"color: #808080;\">\/\/ Input-Register 2 = 30003 in der SPS<\/span>\n  <span style=\"color: #ff6600;\">mb.addIreg<\/span>(3); \u00a0<span style=\"color: #808080;\">\/\/ Input-Register 3 = 30004 in der SPS<\/span>\n  <span style=\"color: #ff6600;\">mb.addIreg<\/span>(4); \u00a0<span style=\"color: #808080;\">\/\/ Input-Register 4 = 30005 in der SPS<\/span>\n  <span style=\"color: #ff6600;\">mb.addIreg<\/span>(5); \u00a0<span style=\"color: #808080;\">\/\/ Input-Register 5 = 30006 in der SPS<\/span>\n\n  <span style=\"color: #808080;\">\/\/ Holding Register anlegen (SPS -&gt; Server)<\/span>\n  <span style=\"color: #ff6600;\">mb.addHreg<\/span>(0); \u00a0<span style=\"color: #808080;\">\/\/ Holding-Register 0 = 40001 in der SPS<\/span>\n  <span style=\"color: #ff6600;\">mb.addHreg<\/span>(1); \u00a0<span style=\"color: #808080;\">\/\/ Holding-Register 1 = 40002 in der SPS<\/span>\n  <span style=\"color: #ff6600;\">mb.addHreg<\/span>(2);  <span style=\"color: #808080;\">\/\/ Holding-Register 2 = 40003 in der SPS<\/span>\n  <span style=\"color: #ff6600;\">mb.addHreg<\/span>(3); \u00a0<span style=\"color: #808080;\">\/\/ Holding-Register 3 = 40004 in der SPS\n<\/span>  <span style=\"color: #ff6600;\">mb.addHreg<\/span>(4);  <span style=\"color: #808080;\">\/\/ Holding-Register 4 = 40005 in der SPS<\/span><\/pre>\n<\/div>\n<p>Im Loop-Bereich wird als erstes die Eingangskarte \u00fcber den I2C-Bus eingelesen. Die Funktion I2E ist im Arduino-Programm ganz unten im Bereich &#8222;Globale Funktionen&#8220; programmiert. Die Funktion kann f\u00fcr mehrere Karten immer wieder aufgerufen werden.<\/p>\n<p>Der eingelesene Wert wird dann in das Modbus-Register o eingetragen. Der Wert erscheint dann in der SPS im Register 30001<\/p>\n<div>\n<pre><span style=\"color: #808080;\">\u00a0 \/\/ Einlesen der Bits von der I2C-INPUT Karte<\/span>\n<span style=\"color: #808080;\">  \/\/ ------------------------------------------<\/span>\n<span style=\"color: #808080;\">  \/\/ 8-Bit von der Eingangkarte lesen<\/span>\n <span style=\"color: #ff6600;\"> I2E<\/span>(I2E1_ADDR, I2E1_WERT, I2E1_OK); <span style=\"color: #808080;\">\/\/ Ein Byte von der DI-Karte Adr. 112 lesen<\/span>\n  <span style=\"color: #99cc00;\">if<\/span> (I2E1_OK == <span style=\"color: #008080;\">0<\/span>) {\n  \u00a0 <span style=\"color: #ff6600;\">Serial.print<\/span>(<span style=\"color: #008080;\">\"Keine Antwort vom Slave \"<\/span>);\n  \u00a0 <span style=\"color: #ff6600;\">Serial.println<\/span> (I2E1_ADDR);\n  }\n  <span style=\"color: #808080;\">\/\/ Wert zur SPS<\/span>\n  <span style=\"color: #ff6600;\">mb.Ireg<\/span>(0, I2E1_WERT) ; \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 <span style=\"color: #808080;\">\/\/ Input-Register 0 = 30001 in der SPS<\/span><\/pre>\n<div>\u00a0<\/div>\n<\/div>\n<p>Der n\u00e4chste Programm-Block schreibt den Wert aus dem Holding-Register 40001 zur digitalen Ausgangskarte<\/p>\n<div>\n<div>\n<pre><span style=\"color: #808080;\">\u00a0 \/\/ Ausgeben der Bits an die I2C-OUTPUT Karte<\/span>\n<span style=\"color: #808080;\">  \/\/ ------------------------------------------ \u00a0<\/span>\n<span style=\"color: #808080;\">  \/\/ Wert von der SPS umrangieren<\/span>\n  I2A1_WERT = <span style=\"color: #ff6600;\">mb.Hreg<\/span>(0); \u00a0 \u00a0 \u00a0 \u00a0 \u00a0   <span style=\"color: #808080;\">\/\/ Holding-Register 0 = 40001 in der SPS<\/span>\n  <span style=\"color: #808080;\">\/\/ 8-Bit zur Ausgangskarte schicken<\/span>\n  <span style=\"color: #ff6600;\">I2A<\/span>(I2A1_ADDR, I2A1_WERT, I2A1_OK);<\/pre>\n<\/div>\n<\/div>\n<p>Anschlie\u00dfend werden die analogen Eing\u00e4nge mit der Funktion<br \/><span style=\"color: #ff6600;\">I2AE<\/span>(I2AE1_ADDR, I2AE1_WERT, I2AE1_OK);<br \/>eingelesen und in die Input-Register 1-5 einsortiert.<br \/>Die erscheinen dann in der SPS in den Registern 30002 bis 30006)<\/p>\n<div>\n<pre><span style=\"color: #808080;\">\u00a0 \/\/ Analogwerte einlesen und berechnen<\/span>\n<span style=\"color: #808080;\">  \/\/ ----------------------------------<\/span>\n<span style=\"color: #808080;\">  \/\/ Werte von Analogkarte lesen<\/span>\n  <span style=\"color: #ff6600;\">I2AE<\/span>(I2AE1_ADDR, I2AE1_WERT, I2AE1_OK);\n<span style=\"color: #808080;\">  \/\/ Werte zur SPS<\/span>\n  <span style=\"color: #ff6600;\">mb.Ireg<\/span>(1, <span style=\"color: #ff6600;\">I2AE1_WERT<\/span>[0]); \u00a0<span style=\"color: #808080;\">\/\/ Input-Register 1 = 30002 in der SPS<\/span>\n  <span style=\"color: #ff6600;\">mb.Ireg<\/span>(2, <span style=\"color: #ff6600;\">I2AE1_WERT<\/span>[1]); \u00a0<span style=\"color: #808080;\">\/\/ Input-Register 2 = 30003 in der SPS<\/span>\n  <span style=\"color: #ff6600;\">mb.Ireg<\/span>(3, <span style=\"color: #ff6600;\">I2AE1_WERT<\/span>[2]); \u00a0<span style=\"color: #808080;\">\/\/ Input-Register 3 = 30004 in der SPS<\/span>\n  <span style=\"color: #ff6600;\">mb.Ireg<\/span>(4, <span style=\"color: #ff6600;\">I2AE1_WERT<\/span>[3]); \u00a0<span style=\"color: #808080;\">\/\/ Input-Register 3 = 30005 in der SPS<\/span>\n  <span style=\"color: #ff6600;\">mb.Ireg<\/span>(5, <span style=\"color: #ff6600;\">I2AE1_WERT<\/span>[4]); \u00a0<span style=\"color: #808080;\">\/\/ Input-Register 3 = 30006 in der SPS<\/span><\/pre>\n<\/div>\n<p>Die Analogen Ausg\u00e4nge werden mit der Funktion<br \/><span style=\"color: #ff6600;\">I2AA<\/span>(I2AA1_ADDR, I2AA1_WERT, I2AA1_OK);<br \/>zur Analogkarte gesendet. Vorherm\u00fcssen aber die Werte von den Holding-Registern 4002 bis 4005 umrangiert werden<\/p>\n<div>\n<pre><span style=\"color: #808080;\">\u00a0 \/\/ Analogwerte ausgeben<\/span>\n<span style=\"color: #808080;\">  \/\/ --------------------<\/span>\n<span style=\"color: #808080;\">  \/\/ Wert von der SPS<\/span>\n  <span style=\"color: #ff6600;\">I2AA1_WERT<\/span>[0] = <span style=\"color: #ff6600;\">mb.Hreg<\/span>(1); \u00a0<span style=\"color: #808080;\">\/\/ Holding-Register 1 = 40002 in der SPS<\/span>\n  <span style=\"color: #ff6600;\">I2AA1_WERT<\/span>[1] = <span style=\"color: #ff6600;\">mb.Hreg<\/span>(2); \u00a0<span style=\"color: #808080;\">\/\/ Holding-Register 2 = 40003 in der SPS<\/span>\n  <span style=\"color: #ff6600;\">I2AA1_WERT<\/span>[2] = <span style=\"color: #ff6600;\">mb.Hreg<\/span>(3); \u00a0<span style=\"color: #808080;\">\/\/ Holding-Register 3 = 40004 in der SPS<\/span>\n  <span style=\"color: #ff6600;\">I2AA1_WERT<\/span>[3] = <span style=\"color: #ff6600;\">mb.Hreg<\/span>(4); \u00a0<span style=\"color: #808080;\">\/\/ Holding-Register 4 = 40005 in der SPS<\/span>\n<span style=\"color: #808080;\">  \/\/ Werte zur Analogkarte schicken<\/span>\n  <span style=\"color: #ff6600;\">I2AA<\/span>(I2AA1_ADDR, I2AA1_WERT, I2AA1_OK);<\/pre>\n<\/div>\n<h2>Software SIEMENS TIA-Portal<\/h2>\n<p><a href=\"https:\/\/www.horter.de\/blog\/wp-content\/uploads\/2025\/01\/S7-1511.png\"><img loading=\"lazy\" decoding=\"async\" class=\"alignright wp-image-28353\" src=\"https:\/\/www.horter.de\/blog\/wp-content\/uploads\/2025\/01\/S7-1511.png\" alt=\"S7-1511\" width=\"70\" height=\"200\" srcset=\"https:\/\/www.horter.de\/blog\/wp-content\/uploads\/2025\/01\/S7-1511.png 140w, https:\/\/www.horter.de\/blog\/wp-content\/uploads\/2025\/01\/S7-1511-105x300.png 105w, https:\/\/www.horter.de\/blog\/wp-content\/uploads\/2025\/01\/S7-1511-53x150.png 53w\" sizes=\"auto, (max-width: 70px) 100vw, 70px\" \/><\/a>Als SPS habe ich eine SIEMENS SIMATIC S7-1511 CPU auf meinem Teststand.<br \/>Die soll jetzt als Modbus-TCP-Client die Werte vom Server lesen und schreiben.<\/p>\n<p>Eine Ausf\u00fchrliche Beschreibung der Modbus-Kommunikation gibt es als PDF-Dokument auf der SIEMENS Seite\u00a0 support.industry.siemens.com<br \/><a href=\"https:\/\/support.industry.siemens.com\/cs\/attachments\/102020340\/net_modbus_tcp_s7-1500_s7-1200_de.pdf\" target=\"_blank\" rel=\"noopener\">Modbus\/TCP mit den Anweisungen MB_CLIENT und &#8230;<\/a><\/p>\n<p>Im Beispiel verwende ich drei Datenbausteine<\/p>\n<h4>DB3 = DataWrite<\/h4>\n<p>Darin ist ein Array mit 5 WORD Variablen f\u00fcr das Holding-Register[0] .. [4] angelegt.<\/p>\n<p><a href=\"https:\/\/www.horter.de\/blog\/wp-content\/uploads\/2025\/01\/Modbus_TIA_DB3.jpg\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-28368\" src=\"https:\/\/www.horter.de\/blog\/wp-content\/uploads\/2025\/01\/Modbus_TIA_DB3.jpg\" alt=\"\" width=\"1366\" height=\"736\" srcset=\"https:\/\/www.horter.de\/blog\/wp-content\/uploads\/2025\/01\/Modbus_TIA_DB3.jpg 1366w, https:\/\/www.horter.de\/blog\/wp-content\/uploads\/2025\/01\/Modbus_TIA_DB3-300x162.jpg 300w, https:\/\/www.horter.de\/blog\/wp-content\/uploads\/2025\/01\/Modbus_TIA_DB3-1024x552.jpg 1024w, https:\/\/www.horter.de\/blog\/wp-content\/uploads\/2025\/01\/Modbus_TIA_DB3-768x414.jpg 768w, https:\/\/www.horter.de\/blog\/wp-content\/uploads\/2025\/01\/Modbus_TIA_DB3-150x81.jpg 150w\" sizes=\"auto, (max-width: 1366px) 100vw, 1366px\" \/><\/a><\/p>\n<h4>DB3 = DataRead<\/h4>\n<p>Darin ist ein Array mit 6 WORD Variablen f\u00fcr die Reading-Register[0] .. [5] angelegt.<\/p>\n<p><a href=\"https:\/\/www.horter.de\/blog\/wp-content\/uploads\/2025\/01\/Modbus_TIA_DB4.jpg\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-28369\" src=\"https:\/\/www.horter.de\/blog\/wp-content\/uploads\/2025\/01\/Modbus_TIA_DB4.jpg\" alt=\"\" width=\"1366\" height=\"736\" srcset=\"https:\/\/www.horter.de\/blog\/wp-content\/uploads\/2025\/01\/Modbus_TIA_DB4.jpg 1366w, https:\/\/www.horter.de\/blog\/wp-content\/uploads\/2025\/01\/Modbus_TIA_DB4-300x162.jpg 300w, https:\/\/www.horter.de\/blog\/wp-content\/uploads\/2025\/01\/Modbus_TIA_DB4-1024x552.jpg 1024w, https:\/\/www.horter.de\/blog\/wp-content\/uploads\/2025\/01\/Modbus_TIA_DB4-768x414.jpg 768w, https:\/\/www.horter.de\/blog\/wp-content\/uploads\/2025\/01\/Modbus_TIA_DB4-150x81.jpg 150w\" sizes=\"auto, (max-width: 1366px) 100vw, 1366px\" \/><\/a><\/p>\n<h4>DB100 = ModbusData<\/h4>\n<p>Hier sind die Verbindungsdaten und ein paar Variablen f\u00fcr den Status vom Funktionsbaustein MB_CLIENT definiert<\/p>\n<p>es m\u00fcssen zwei Strukturen mit dem UDT TCON_IP_V4 angelegt werden. Eine Struktur zum Lesen, eine Struktur zum Schreiben<\/p>\n<p><strong>InterfaceID<\/strong> ist die Hardware-Kennung der lokalen Schnittstelle.<br \/>Die Hardware-Kennung finden Sie in der Ger\u00e4tekonfiguration der CPU. Markieren Sie die PROFINET-Schnittstelle &#8211; Eigenschaften &#8211;\u00a0 Systemkonstanten &#8222;Local_Profinet-Schnittstelle_1<\/p>\n<p><strong>ID:<\/strong> \u00dcber den Parameter wird eine Verbindung innerhalb der CPU eindeutig identifiziert. Jede einzelne Instanz der Anweisung &#8222;MB_CLIENT&#8220; sowie &#8222;MB_SERVER&#8220; muss eine eindeutige ID verwenden.<\/p>\n<p><strong>ConnectionType<\/strong> Verbindungstyp W\u00e4hlen Sie 11 (dezimal) f\u00fcr TCP. Andere Verbindungstypen sind nicht zul\u00e4ssig.<\/p>\n<p><strong>ActiveEstablished<\/strong> Kennung f\u00fcr die Art des Verbindungsaufbaus. True: aktiver Verbindungsaufbau False: passiver Verbindungsaufbau<\/p>\n<p><strong>RemoteAddress<\/strong> IP-Adresse des entfernten Verbindungspartners<\/p>\n<p><strong>RemotePort<\/strong> Verwenden Sie die IP-Port-Nummer des Servers, zu dem der Client die Verbindung herstellt und \u00fcber das TCP\/IP-Protokoll kommuniziert<\/p>\n<p><strong>LocalPort<\/strong> Port-Nummer des lokalen Verbindungspartners \u00a00= Beliebiger Port<\/p>\n<table style=\"border-collapse: collapse; width: 100%;\">\n<tbody>\n<tr>\n<td style=\"width: 50%;\"><a href=\"https:\/\/www.horter.de\/blog\/wp-content\/uploads\/2025\/01\/Modbus_TIA_DB100_Client_read.jpg\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone wp-image-28358 size-full\" src=\"https:\/\/www.horter.de\/blog\/wp-content\/uploads\/2025\/01\/Modbus_TIA_DB100_Client_read.jpg\" alt=\"TCON_IP_V4 Struktur f\u00fcr MB_CLIENT read\" width=\"459\" height=\"265\" srcset=\"https:\/\/www.horter.de\/blog\/wp-content\/uploads\/2025\/01\/Modbus_TIA_DB100_Client_read.jpg 459w, https:\/\/www.horter.de\/blog\/wp-content\/uploads\/2025\/01\/Modbus_TIA_DB100_Client_read-300x173.jpg 300w, https:\/\/www.horter.de\/blog\/wp-content\/uploads\/2025\/01\/Modbus_TIA_DB100_Client_read-150x87.jpg 150w\" sizes=\"auto, (max-width: 459px) 100vw, 459px\" \/><\/a><\/td>\n<td style=\"width: 50%;\">InterfaceID = 64 (Aus Hardware-Konfig)<br \/>ID = 2<br \/>ConnectionType = 11<br \/>ActiveEstablished = 1 (aktiver Verbindungsaufbau )<br \/>IP-Adresse = 192.168.1.7<br \/>RemotePort = 502<br \/>LocalPort = 0<\/td>\n<\/tr>\n<tr>\n<td style=\"width: 50%;\"><a href=\"https:\/\/www.horter.de\/blog\/wp-content\/uploads\/2025\/01\/Modbus_TIA_DB100_Client_write.jpg\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-28359\" src=\"https:\/\/www.horter.de\/blog\/wp-content\/uploads\/2025\/01\/Modbus_TIA_DB100_Client_write.jpg\" alt=\"TCON_IP_V4 Struktur f\u00fcr MB_CLIENT write\" width=\"459\" height=\"285\" srcset=\"https:\/\/www.horter.de\/blog\/wp-content\/uploads\/2025\/01\/Modbus_TIA_DB100_Client_write.jpg 459w, https:\/\/www.horter.de\/blog\/wp-content\/uploads\/2025\/01\/Modbus_TIA_DB100_Client_write-300x186.jpg 300w, https:\/\/www.horter.de\/blog\/wp-content\/uploads\/2025\/01\/Modbus_TIA_DB100_Client_write-150x93.jpg 150w\" sizes=\"auto, (max-width: 459px) 100vw, 459px\" \/><\/a><\/td>\n<td style=\"width: 50%;\">InterfaceID = 64 (Aus Hardware-Konfig)<br \/>ID = 1<br \/>ConnectionType = 11<br \/>ActiveEstablished = 1 (aktiver Verbindungsaufbau )<br \/>IP-Adresse = 192.168.1.7<br \/>RemotePort = 502<br \/>LocalPort = 0<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<h4>FB1 ModbusTCP<\/h4>\n<p><a href=\"https:\/\/www.horter.de\/blog\/wp-content\/uploads\/2025\/01\/Modbus_TIA_FB1.jpg\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-28367\" src=\"https:\/\/www.horter.de\/blog\/wp-content\/uploads\/2025\/01\/Modbus_TIA_FB1.jpg\" alt=\"\" width=\"1366\" height=\"736\" srcset=\"https:\/\/www.horter.de\/blog\/wp-content\/uploads\/2025\/01\/Modbus_TIA_FB1.jpg 1366w, https:\/\/www.horter.de\/blog\/wp-content\/uploads\/2025\/01\/Modbus_TIA_FB1-300x162.jpg 300w, https:\/\/www.horter.de\/blog\/wp-content\/uploads\/2025\/01\/Modbus_TIA_FB1-1024x552.jpg 1024w, https:\/\/www.horter.de\/blog\/wp-content\/uploads\/2025\/01\/Modbus_TIA_FB1-768x414.jpg 768w, https:\/\/www.horter.de\/blog\/wp-content\/uploads\/2025\/01\/Modbus_TIA_FB1-150x81.jpg 150w\" sizes=\"auto, (max-width: 1366px) 100vw, 1366px\" \/><\/a><\/p>\n<pre><span style=\"color: #008000;\">\/\/ Input-Register vom Server lesen<\/span>\n#MB_READ(REQ := TRUE,\n    DISCONNECT :=<span style=\"color: #3366ff;\">FALSE<\/span>,    <span style=\"color: #008000;\">\/\/ Verbindung halten<\/span>\n    MB_MODE :=0,           <span style=\"color: #008000;\">\/\/ 0=Lesen<\/span>\n    MB_DATA_ADDR := <span style=\"color: #3366ff;\">30001<\/span>, <span style=\"color: #008000;\">\/\/ Start bei Register 30001<\/span>\n    MB_DATA_LEN :=6,       <span style=\"color: #008000;\">\/\/ 6 Register auslesen<\/span>\n    DONE =&gt; <span style=\"color: #3366ff;\">\"ModbusData\".clientData.done_read<\/span>,\n    BUSY =&gt; <span style=\"color: #3366ff;\">\"ModbusData\".clientData.busy_read<\/span>,\n    ERROR =&gt; <span style=\"color: #3366ff;\">\"ModbusData\".clientData.error_read<\/span>,\n    STATUS =&gt; <span style=\"color: #3366ff;\">\"ModbusData\".clientData.status_read<\/span>,\n    MB_DATA_PTR := <span style=\"color: #3366ff;\">\"Date_Read\".InputRegister<\/span>,\n    CONNECT := <span style=\"color: #3366ff;\">\"ModbusData\".connectParamClient_read)<\/span>;\n\n<span style=\"color: #008000;\">\/\/ Holding-Register zum Server schreiben<\/span>\n#MB_WRITE(:= TRUE,\n    DISCONNECT:=FALSE,     <span style=\"color: #008000;\">\/\/ Verbindung halten<\/span>\n    MB_MODE:=1,            <span style=\"color: #008000;\">\/\/ 1=Schreiben<\/span>\n    MB_DATA_ADDR:=40001,   <span style=\"color: #008000;\">\/\/ Start bei Register 40001<\/span>\n    MB_DATA_LEN:=5,        <span style=\"color: #008000;\">\/\/ 5 Register auslesen<\/span>\n    DONE=&gt;<span style=\"color: #3366ff;\">\"ModbusData\".clientData.done_write<\/span>,\n    BUSY=&gt;<span style=\"color: #3366ff;\">\"ModbusData\".clientData.busy_write<\/span>,\n    ERROR=&gt;<span style=\"color: #3366ff;\">\"ModbusData\".clientData.error_write<\/span>,\n    STATUS=&gt;<span style=\"color: #3366ff;\">\"ModbusData\".clientData.status_write<\/span>,\n    MB_DATA_PTR:=<span style=\"color: #3366ff;\">\"Data_Write\".holdingRegister<\/span>,\n    CONNECT:=<span style=\"color: #3366ff;\">\"ModbusData\".connectParamClient_write)<\/span>;\n\n<\/pre>\n<table style=\"border-collapse: collapse; width: 100%;\">\n<tbody>\n<tr>\n<td style=\"width: 11.1221%;\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone wp-image-28376\" src=\"https:\/\/www.horter.de\/blog\/wp-content\/uploads\/2025\/01\/TIA-V17-Icon.jpg\" alt=\"\" width=\"70\" height=\"69\" srcset=\"https:\/\/www.horter.de\/blog\/wp-content\/uploads\/2025\/01\/TIA-V17-Icon.jpg 140w, https:\/\/www.horter.de\/blog\/wp-content\/uploads\/2025\/01\/TIA-V17-Icon-125x125.jpg 125w\" sizes=\"auto, (max-width: 70px) 100vw, 70px\" \/><\/td>\n<td style=\"width: 88.8779%;\">Hier kann eine TIA-V17 Bibliothek mit den Bausteinen aus der obigen Beschreibung heruntergeladen werden<br \/><a  data-e-Disable-Page-Transition=\"true\" class=\"download-link\" title=\"Version lib\" href=\"https:\/\/www.horter.de\/blog\/download\/28371\/?tmstv=1777537224\" rel=\"nofollow\" id=\"download-link-28371\" data-redirect=\"false\" >\n\tModbus-TCP TIA-V17 Library\t(1233 Downloads\t)\n<\/a>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>Und hier das komplette Arduino-Programm<\/p>\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:.75rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#D4D4D4;--cbp-line-number-width:calc(3 * 0.6 * .75rem);line-height:1rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span role=\"button\" tabindex=\"0\" style=\"color:#D4D4D4;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><pre class=\"code-block-pro-copy-button-pre\" aria-hidden=\"true\"><textarea class=\"code-block-pro-copy-button-textarea\" tabindex=\"-1\" aria-hidden=\"true\" readonly>\/* \n==============================================\nTest I2C-Modbus TCP Server\n==============================================\nBoard Arduino UNO\nVersion 1.0\n\nQuelle:\nModbus-Arduino Example (Modbus IP)\nCopyright by Andr\u00e9 Sarmento Barbosa\nhttp:\/\/github.com\/andresarmento\/modbus-arduino\n\n==============================================\n*\/\n\nString Version = \"V1.0\"; \/\/ Version\n\n#include &lt;Wire.h> \/\/ I2C-Lib\n#include &lt;avr\/wdt.h> \/\/ Watchdog \n#include &lt;Modbus.h> \/\/ ArduinoRS485 library\n#include &lt;ModbusIP.h> \/\/ Modbus\n\n\/\/ModbusIP object\nModbusIP mb;\nbyte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED }; \nbyte ip[] = { 192, 168, 1, 7};\n\n\/\/ Pins definieren\nint I2C_SCL = 19; \/\/ PC5 = I2C-Bus SCL \nint I2C_SDA = 18; \/\/ PC4 = I2C-Bus SDA \nint I2C_INT = 17; \/\/ PC3 = I2C-Bus INT \nint LED_BL = 8; \/\/ PB0 = LED Blau\n\n\/\/ I2C-Baugruppen definieren und globale Variablen anlegen\n#define I2E1_ADDR 112 >> 1 \/\/ I2C-Digital INPUT Addresse als 7 Bit\nint I2E1_WERT=0;\nbool I2E1_OK;\n#define I2A1_ADDR 64 >> 1 \/\/ I2C-Digital OUTPUT Addresse als 7 Bit\nint I2A1_WERT=0;\nbool I2A1_OK;\n#define I2AE1_ADDR 16 >> 1 \/\/ I2C-Analog INPUT Addresse als 7 Bit\nint I2AE1_WERT&#091;5&#093;;\nbool I2AE1_OK;\n#define I2AA1_ADDR 176 >> 1 \/\/ I2C-Analog OUTPUT Addresse als 7 Bit\nint I2AA1_WERT&#091;4&#093;;\nbool I2AA1_OK;\n\n\/\/ Variablen deklarieren\nbyte ALTWERT;\nlong ts;\n\nvoid setup() {\n\n\/\/ Pin-Modes einstellen\n\/\/ --------------------\npinMode(I2C_INT, INPUT);\npinMode(LED_BL, OUTPUT);\n\nSerial.begin(9600); \/\/ Serielle Schnittstelle konfigurieren\nWire.begin(); \/\/ I2C-Pins definieren\n\nSerial.println(\"Version \" + Version); \/\/ Version ausgeben\n\n\/\/ setzten aller Bits der Eingabekarte auf 1\n\/\/ -----------------------------------------\nWire.beginTransmission(I2E1_ADDR); \/\/ Start \u00dcbertragung zum PCF8574\nWire.write(0xFF); \/\/ Alle Bits sind Eing\u00e4nge\nWire.endTransmission(); \/\/ Ende\n\n\/\/ Blaue LED abschalten\n\/\/ --------------------\ndigitalWrite(LED_BL, LOW); \/\/ Blaue LED AUS\n\n\/\/ Modbus-TCP Server starten\n\/\/ -------------------------\nSerial.println(\"Modbus TCP Server\");\nmb.config(mac, ip);\n\n\/\/ Input-Register anlegen (Server -> SPS)\nmb.addIreg(0); \/\/ Input-Register 0 = 30001 in der SPS\nmb.addIreg(1); \/\/ Input-Register 1 = 30002 in der SPS\nmb.addIreg(2); \/\/ Input-Register 2 = 30003 in der SPS\nmb.addIreg(3); \/\/ Input-Register 3 = 30004 in der SPS\nmb.addIreg(4); \/\/ Input-Register 4 = 30005 in der SPS\nmb.addIreg(5); \/\/ Input-Register 5 = 30006 in der SPS\n\n\/\/ Holding Register anlegen (SPS -> Server)\nmb.addHreg(0); \/\/ Holding-Register 0 = 40001 in der SPS\nmb.addHreg(1); \/\/ Holding-Register 1 = 40002 in der SPS\nmb.addHreg(2); \/\/ Holding-Register 2 = 40003 in der SPS\nmb.addHreg(3); \/\/ Holding-Register 3 = 40004 in der SPS\nmb.addHreg(4); \/\/ Holding-Register 4 = 40005 in der SPS\n\n}\n\nvoid loop() {\n\n\/\/Call once inside loop() - all magic here\nmb.task(); \/\/ Modbus-Task\n\n\/\/ Einlesen der Bits von der I2C-INPUT Karte\n\/\/ ------------------------------------------\n\/\/ 8-Bit von der Eingangkarte lesen\nI2E(I2E1_ADDR, I2E1_WERT, I2E1_OK); \/\/ Ein Byte von der DI-Karte Adresse 112 lesen\nif (I2E1_OK == 0) {\nSerial.print(\"Keine Antwort vom Slave \");\nSerial.println (I2E1_ADDR);\n}\n\n\/\/ Wert zur SPS\nmb.Ireg(0, I2E1_WERT) ; \/\/ Input-Register 0 = 30001 in der SPS\n\n\n\/\/ Ausgeben der Bits an die I2C-OUTPUT Karte\n\/\/ ------------------------------------------ \n\/\/ Wert von der SPS umrangieren\nI2A1_WERT = mb.Hreg(0); \/\/ Holding-Register 0 = 40001 in der SPS\n\/\/ 8-Bit zur Ausgangskarte schicken\nI2A(I2A1_ADDR, I2A1_WERT, I2A1_OK);\n\n\n\/\/ Analogwerte einlesen und berechnen\n\/\/ ----------------------------------\n\/\/ Werte von Analogkarte lesen\nI2AE(I2AE1_ADDR, I2AE1_WERT, I2AE1_OK);\n\/\/ Werte zur SPS\nmb.Ireg(1, I2AE1_WERT&#091;0&#093;); \/\/ Input-Register 1 = 30002 in der SPS\nmb.Ireg(2, I2AE1_WERT&#091;1&#093;); \/\/ Input-Register 2 = 30003 in der SPS\nmb.Ireg(3, I2AE1_WERT&#091;2&#093;); \/\/ Input-Register 3 = 30004 in der SPS\nmb.Ireg(4, I2AE1_WERT&#091;3&#093;); \/\/ Input-Register 3 = 30005 in der SPS\nmb.Ireg(5, I2AE1_WERT&#091;4&#093;); \/\/ Input-Register 3 = 30006 in der SPS\n\n\n\/\/ Analogwerte ausgeben\n\/\/ --------------------\n\/\/ Wert von der SPS\nI2AA1_WERT&#091;0&#093; = mb.Hreg(1); \/\/ Holding-Register 1 = 40002 in der SPS\nI2AA1_WERT&#091;1&#093; = mb.Hreg(2); \/\/ Holding-Register 2 = 40003 in der SPS\nI2AA1_WERT&#091;2&#093; = mb.Hreg(3); \/\/ Holding-Register 3 = 40004 in der SPS\nI2AA1_WERT&#091;3&#093; = mb.Hreg(4); \/\/ Holding-Register 4 = 40005 in der SPS\n\/\/ Werte zur Analogkarte schicken\nI2AA(I2AA1_ADDR, I2AA1_WERT, I2AA1_OK);\n\n\n\/\/ Link-Status auf blaue LED\n\/\/ -------------------------\nbool takt_1hz = (millis() \/ 500) &amp; 1; \/\/ Blinktakt 1 Hz\nauto link = Ethernet.linkStatus();\nswitch (link) {\ncase Unknown:\ndigitalWrite(LED_BL, takt_1hz); break;\ncase LinkON:\ndigitalWrite(LED_BL, HIGH); break;\ncase LinkOFF:\ndigitalWrite(LED_BL, LOW); break;\n}\n\n\n\n\n\/\/alle 5 Sekunden lesen f\u00fcr Test\nif (millis() > ts + 1000) { \nts = millis();\n\n\/\/ Werte von der SPS\nSerial.print(mb.Hreg(0)); \/\/ Holding-Register 0 = 40001 in der SPS\nSerial.print(\"\\t \");\nSerial.print(mb.Hreg(1)); \/\/ Holding-Register 1 = 40002 in der SPS\nSerial.print(\"\\t \");\nSerial.print(mb.Hreg(2)); \/\/ Holding-Register 2 = 40003 in der SPS\nSerial.print(\"\\t \");\nSerial.print(mb.Hreg(3)); \/\/ Holding-Register 3 = 40004 in der SPS\nSerial.print(\"\\t \");\nSerial.print(mb.Hreg(4)); \/\/ Holding-Register 4 = 40005 in der SPS\nSerial.println ();\n} \n}\n\n\/\/ =============================================================================================================\n\/\/ Globale Funktionen\n\/\/ =============================================================================================================\n\n\/\/ ---------------------------------------\n\/\/ 8-Bit von digitale Eingangskarte lesen\n\/\/ ---------------------------------------\nvoid I2E(int I2C_Adresse, int &amp;Wert, bool &amp;Slave_OK) { \nWire.requestFrom(I2C_Adresse, 1); \/\/ Anfrage an den I2C-Slave\nif (Wire.available()) {\nWert = 255 - Wire.read(); \/\/ Ein Byte vom PCF8574 lesen und in invertierte Eingabe wandlen \nSlave_OK = 1;\n} else {Slave_OK = 0;}\n}\n\n\/\/ ------------------------------------------\n\/\/ 8-Bit zur digitale Ausgangskarte schreiben\n\/\/ ------------------------------------------\nvoid I2A(int I2C_Adresse, int &amp;Wert, bool &amp;Slave_OK) { \nWire.beginTransmission(I2C_Adresse); \/\/ Start \u00dcbertragung zum PCF8574\nWire.write(255 - Wert); \/\/ Wert schreiben\nbyte error = Wire.endTransmission(); \nif (error == 0) { Slave_OK = 1; } else {Slave_OK = 0;} \/\/ Fehlerauswertung\n}\n\n\/\/ ---------------------------------------\n\/\/ 5 Analogwerte von der I2HAE-Karte lesen\n\/\/ ---------------------------------------\nvoid I2AE(int I2C_Adresse, int (&amp;Wert)&#091;5&#093;, bool &amp;Slave_OK) {\nint Array&#091;11&#093;; \/\/ Lokales Array zur Speicherung der gelesenen Daten\nWire.requestFrom(I2C_Adresse, 11); \/\/ Anfrage an den I2C-Slave\nif (Wire.available()) { \/\/ 11 Bytes von Analogkarte lesen und in das array kopieren\nSlave_OK = 1;\nfor(int i=0;i&lt;11;i++){\nint c = Wire.read();\nArray&#091;i&#093;=c;\n} \n\/\/ Werte berechnen. Analogwert = Highbyte * 256 + Lowbyte \nWert&#091;0&#093; = Array&#091; 2&#093; * 256 + Array&#091;1&#093;;\nWert&#091;1&#093; = Array&#091; 4&#093; * 256 + Array&#091;3&#093;;\nWert&#091;2&#093; = Array&#091; 6&#093; * 256 + Array&#091;5&#093;;\nWert&#091;3&#093; = Array&#091; 8&#093; * 256 + Array&#091;7&#093;;\nWert&#091;4&#093; = Array&#091;10&#093; * 256 + Array&#091;9&#093;; \n} else {Slave_OK = 0;}\n}\n\n\/\/ ---------------------------------------\n\/\/ 4 Analogwerte zur I2HAA-Karte schreiben\n\/\/ ---------------------------------------\nvoid I2AA(int I2C_Adresse, int (&amp;Wert)&#091;4&#093;, bool &amp;Slave_OK) {\nWire.beginTransmission(I2C_Adresse); \/\/ Start \u00dcbertragung zur ANALOG-OUT Karte\nWire.write(0); \/\/ Kanal auf 0 setzen\nfor(int i=0;i&lt;4;i++){\nbyte HBy = Wert&#091;i&#093; \/ 256; \/\/ HIGH-Byte berechnen\nWire.write(Wert&#091;i&#093; - HBy * 256); \/\/ LOW-Byte schreiben\nWire.write(HBy); \/\/ HIGH-Byte schreiben\n} \nbyte error = Wire.endTransmission(); \nif (error == 0) { Slave_OK = 1; } else {Slave_OK = 0;} \/\/ Fehlerauswertung\n}<\/textarea><\/pre><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki dark-plus\" style=\"background-color: #1E1E1E\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #6A9955\">\/* <\/span><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\">==============================================<\/span><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\">Test I2C-Modbus TCP Server<\/span><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\">==============================================<\/span><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\">Board Arduino UNO<\/span><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\">Version 1.0<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\">Quelle:<\/span><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\">Modbus-Arduino Example (Modbus IP)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\">Copyright by Andr\u00e9 Sarmento Barbosa<\/span><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\">http:\/\/github.com\/andresarmento\/modbus-arduino<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\">==============================================<\/span><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\">*\/<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">String Version = <\/span><span style=\"color: #CE9178\">&quot;V1.0&quot;<\/span><span style=\"color: #D4D4D4\">;<\/span><span style=\"color: #6A9955\"> \/\/ Version<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #C586C0\">#include<\/span><span style=\"color: #569CD6\"> <\/span><span style=\"color: #CE9178\">&lt;Wire.h&gt;<\/span><span style=\"color: #569CD6\"> <\/span><span style=\"color: #6A9955\">\/\/ I2C-Lib<\/span><\/span>\n<span class=\"line\"><span style=\"color: #C586C0\">#include<\/span><span style=\"color: #569CD6\"> <\/span><span style=\"color: #CE9178\">&lt;avr\/wdt.h&gt;<\/span><span style=\"color: #569CD6\"> <\/span><span style=\"color: #6A9955\">\/\/ Watchdog <\/span><\/span>\n<span class=\"line\"><span style=\"color: #C586C0\">#include<\/span><span style=\"color: #569CD6\"> <\/span><span style=\"color: #CE9178\">&lt;Modbus.h&gt;<\/span><span style=\"color: #569CD6\"> <\/span><span style=\"color: #6A9955\">\/\/ ArduinoRS485 library<\/span><\/span>\n<span class=\"line\"><span style=\"color: #C586C0\">#include<\/span><span style=\"color: #569CD6\"> <\/span><span style=\"color: #CE9178\">&lt;ModbusIP.h&gt;<\/span><span style=\"color: #569CD6\"> <\/span><span style=\"color: #6A9955\">\/\/ Modbus<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\">\/\/ModbusIP object<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">ModbusIP mb;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">byte mac<\/span><span style=\"color: #569CD6\">[]<\/span><span style=\"color: #D4D4D4\"> = { <\/span><span style=\"color: #B5CEA8\">0xDE<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #B5CEA8\">0xAD<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #B5CEA8\">0xBE<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #B5CEA8\">0xEF<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #B5CEA8\">0xFE<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #B5CEA8\">0xED<\/span><span style=\"color: #D4D4D4\"> }; <\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">byte ip<\/span><span style=\"color: #569CD6\">[]<\/span><span style=\"color: #D4D4D4\"> = { <\/span><span style=\"color: #B5CEA8\">192<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #B5CEA8\">168<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #B5CEA8\">1<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #B5CEA8\">7<\/span><span style=\"color: #D4D4D4\">};<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\">\/\/ Pins definieren<\/span><\/span>\n<span class=\"line\"><span style=\"color: #569CD6\">int<\/span><span style=\"color: #D4D4D4\"> I2C_SCL = <\/span><span style=\"color: #B5CEA8\">19<\/span><span style=\"color: #D4D4D4\">;<\/span><span style=\"color: #6A9955\"> \/\/ PC5 = I2C-Bus SCL <\/span><\/span>\n<span class=\"line\"><span style=\"color: #569CD6\">int<\/span><span style=\"color: #D4D4D4\"> I2C_SDA = <\/span><span style=\"color: #B5CEA8\">18<\/span><span style=\"color: #D4D4D4\">;<\/span><span style=\"color: #6A9955\"> \/\/ PC4 = I2C-Bus SDA <\/span><\/span>\n<span class=\"line\"><span style=\"color: #569CD6\">int<\/span><span style=\"color: #D4D4D4\"> I2C_INT = <\/span><span style=\"color: #B5CEA8\">17<\/span><span style=\"color: #D4D4D4\">;<\/span><span style=\"color: #6A9955\"> \/\/ PC3 = I2C-Bus INT <\/span><\/span>\n<span class=\"line\"><span style=\"color: #569CD6\">int<\/span><span style=\"color: #D4D4D4\"> LED_BL = <\/span><span style=\"color: #B5CEA8\">8<\/span><span style=\"color: #D4D4D4\">;<\/span><span style=\"color: #6A9955\"> \/\/ PB0 = LED Blau<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\">\/\/ I2C-Baugruppen definieren und globale Variablen anlegen<\/span><\/span>\n<span class=\"line\"><span style=\"color: #C586C0\">#define<\/span><span style=\"color: #569CD6\"> I2E1_ADDR <\/span><span style=\"color: #B5CEA8\">112<\/span><span style=\"color: #569CD6\"> <\/span><span style=\"color: #D4D4D4\">&gt;&gt;<\/span><span style=\"color: #569CD6\"> <\/span><span style=\"color: #B5CEA8\">1<\/span><span style=\"color: #6A9955\"> \/\/ I2C-Digital INPUT Addresse als 7 Bit<\/span><\/span>\n<span class=\"line\"><span style=\"color: #569CD6\">int I2E1_WERT<\/span><span style=\"color: #D4D4D4\">=<\/span><span style=\"color: #B5CEA8\">0<\/span><span style=\"color: #569CD6\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #569CD6\">bool<\/span><span style=\"color: #D4D4D4\"> I2E1_OK;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #C586C0\">#define<\/span><span style=\"color: #569CD6\"> I2A1_ADDR <\/span><span style=\"color: #B5CEA8\">64<\/span><span style=\"color: #569CD6\"> <\/span><span style=\"color: #D4D4D4\">&gt;&gt;<\/span><span style=\"color: #569CD6\"> <\/span><span style=\"color: #B5CEA8\">1<\/span><span style=\"color: #6A9955\"> \/\/ I2C-Digital OUTPUT Addresse als 7 Bit<\/span><\/span>\n<span class=\"line\"><span style=\"color: #569CD6\">int I2A1_WERT<\/span><span style=\"color: #D4D4D4\">=<\/span><span style=\"color: #B5CEA8\">0<\/span><span style=\"color: #569CD6\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #569CD6\">bool<\/span><span style=\"color: #D4D4D4\"> I2A1_OK;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #C586C0\">#define<\/span><span style=\"color: #569CD6\"> I2AE1_ADDR <\/span><span style=\"color: #B5CEA8\">16<\/span><span style=\"color: #569CD6\"> <\/span><span style=\"color: #D4D4D4\">&gt;&gt;<\/span><span style=\"color: #569CD6\"> <\/span><span style=\"color: #B5CEA8\">1<\/span><span style=\"color: #6A9955\"> \/\/ I2C-Analog INPUT Addresse als 7 Bit<\/span><\/span>\n<span class=\"line\"><span style=\"color: #569CD6\">int <\/span><span style=\"color: #9CDCFE\">I2AE1_WERT<\/span><span style=\"color: #569CD6\">&#091;<\/span><span style=\"color: #B5CEA8\">5<\/span><span style=\"color: #569CD6\">&#093;;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #569CD6\">bool<\/span><span style=\"color: #D4D4D4\"> I2AE1_OK;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #C586C0\">#define<\/span><span style=\"color: #569CD6\"> I2AA1_ADDR <\/span><span style=\"color: #B5CEA8\">176<\/span><span style=\"color: #569CD6\"> <\/span><span style=\"color: #D4D4D4\">&gt;&gt;<\/span><span style=\"color: #569CD6\"> <\/span><span style=\"color: #B5CEA8\">1<\/span><span style=\"color: #6A9955\"> \/\/ I2C-Analog OUTPUT Addresse als 7 Bit<\/span><\/span>\n<span class=\"line\"><span style=\"color: #569CD6\">int <\/span><span style=\"color: #9CDCFE\">I2AA1_WERT<\/span><span style=\"color: #569CD6\">&#091;<\/span><span style=\"color: #B5CEA8\">4<\/span><span style=\"color: #569CD6\">&#093;;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #569CD6\">bool<\/span><span style=\"color: #D4D4D4\"> I2AA1_OK;<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\">\/\/ Variablen deklarieren<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">byte ALTWERT;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #569CD6\">long<\/span><span style=\"color: #D4D4D4\"> ts;<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #569CD6\">void<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #DCDCAA\">setup<\/span><span style=\"color: #D4D4D4\">() {<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\">\/\/ Pin-Modes einstellen<\/span><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\">\/\/ --------------------<\/span><\/span>\n<span class=\"line\"><span style=\"color: #DCDCAA\">pinMode<\/span><span style=\"color: #D4D4D4\">(I2C_INT, INPUT);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #DCDCAA\">pinMode<\/span><span style=\"color: #D4D4D4\">(LED_BL, OUTPUT);<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #9CDCFE\">Serial<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">begin<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #B5CEA8\">9600<\/span><span style=\"color: #D4D4D4\">);<\/span><span style=\"color: #6A9955\"> \/\/ Serielle Schnittstelle konfigurieren<\/span><\/span>\n<span class=\"line\"><span style=\"color: #9CDCFE\">Wire<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">begin<\/span><span style=\"color: #D4D4D4\">();<\/span><span style=\"color: #6A9955\"> \/\/ I2C-Pins definieren<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #9CDCFE\">Serial<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">println<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #CE9178\">&quot;Version &quot;<\/span><span style=\"color: #D4D4D4\"> + Version);<\/span><span style=\"color: #6A9955\"> \/\/ Version ausgeben<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\">\/\/ setzten aller Bits der Eingabekarte auf 1<\/span><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\">\/\/ -----------------------------------------<\/span><\/span>\n<span class=\"line\"><span style=\"color: #9CDCFE\">Wire<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">beginTransmission<\/span><span style=\"color: #D4D4D4\">(I2E1_ADDR);<\/span><span style=\"color: #6A9955\"> \/\/ Start \u00dcbertragung zum PCF8574<\/span><\/span>\n<span class=\"line\"><span style=\"color: #9CDCFE\">Wire<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">write<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #B5CEA8\">0xFF<\/span><span style=\"color: #D4D4D4\">);<\/span><span style=\"color: #6A9955\"> \/\/ Alle Bits sind Eing\u00e4nge<\/span><\/span>\n<span class=\"line\"><span style=\"color: #9CDCFE\">Wire<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">endTransmission<\/span><span style=\"color: #D4D4D4\">();<\/span><span style=\"color: #6A9955\"> \/\/ Ende<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\">\/\/ Blaue LED abschalten<\/span><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\">\/\/ --------------------<\/span><\/span>\n<span class=\"line\"><span style=\"color: #DCDCAA\">digitalWrite<\/span><span style=\"color: #D4D4D4\">(LED_BL, LOW);<\/span><span style=\"color: #6A9955\"> \/\/ Blaue LED AUS<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\">\/\/ Modbus-TCP Server starten<\/span><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\">\/\/ -------------------------<\/span><\/span>\n<span class=\"line\"><span style=\"color: #9CDCFE\">Serial<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">println<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #CE9178\">&quot;Modbus TCP Server&quot;<\/span><span style=\"color: #D4D4D4\">);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #9CDCFE\">mb<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">config<\/span><span style=\"color: #D4D4D4\">(mac, ip);<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\">\/\/ Input-Register anlegen (Server -&gt; SPS)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #9CDCFE\">mb<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">addIreg<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #B5CEA8\">0<\/span><span style=\"color: #D4D4D4\">);<\/span><span style=\"color: #6A9955\"> \/\/ Input-Register 0 = 30001 in der SPS<\/span><\/span>\n<span class=\"line\"><span style=\"color: #9CDCFE\">mb<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">addIreg<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #B5CEA8\">1<\/span><span style=\"color: #D4D4D4\">);<\/span><span style=\"color: #6A9955\"> \/\/ Input-Register 1 = 30002 in der SPS<\/span><\/span>\n<span class=\"line\"><span style=\"color: #9CDCFE\">mb<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">addIreg<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #B5CEA8\">2<\/span><span style=\"color: #D4D4D4\">);<\/span><span style=\"color: #6A9955\"> \/\/ Input-Register 2 = 30003 in der SPS<\/span><\/span>\n<span class=\"line\"><span style=\"color: #9CDCFE\">mb<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">addIreg<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #B5CEA8\">3<\/span><span style=\"color: #D4D4D4\">);<\/span><span style=\"color: #6A9955\"> \/\/ Input-Register 3 = 30004 in der SPS<\/span><\/span>\n<span class=\"line\"><span style=\"color: #9CDCFE\">mb<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">addIreg<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #B5CEA8\">4<\/span><span style=\"color: #D4D4D4\">);<\/span><span style=\"color: #6A9955\"> \/\/ Input-Register 4 = 30005 in der SPS<\/span><\/span>\n<span class=\"line\"><span style=\"color: #9CDCFE\">mb<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">addIreg<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #B5CEA8\">5<\/span><span style=\"color: #D4D4D4\">);<\/span><span style=\"color: #6A9955\"> \/\/ Input-Register 5 = 30006 in der SPS<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\">\/\/ Holding Register anlegen (SPS -&gt; Server)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #9CDCFE\">mb<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">addHreg<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #B5CEA8\">0<\/span><span style=\"color: #D4D4D4\">);<\/span><span style=\"color: #6A9955\"> \/\/ Holding-Register 0 = 40001 in der SPS<\/span><\/span>\n<span class=\"line\"><span style=\"color: #9CDCFE\">mb<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">addHreg<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #B5CEA8\">1<\/span><span style=\"color: #D4D4D4\">);<\/span><span style=\"color: #6A9955\"> \/\/ Holding-Register 1 = 40002 in der SPS<\/span><\/span>\n<span class=\"line\"><span style=\"color: #9CDCFE\">mb<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">addHreg<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #B5CEA8\">2<\/span><span style=\"color: #D4D4D4\">);<\/span><span style=\"color: #6A9955\"> \/\/ Holding-Register 2 = 40003 in der SPS<\/span><\/span>\n<span class=\"line\"><span style=\"color: #9CDCFE\">mb<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">addHreg<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #B5CEA8\">3<\/span><span style=\"color: #D4D4D4\">);<\/span><span style=\"color: #6A9955\"> \/\/ Holding-Register 3 = 40004 in der SPS<\/span><\/span>\n<span class=\"line\"><span style=\"color: #9CDCFE\">mb<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">addHreg<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #B5CEA8\">4<\/span><span style=\"color: #D4D4D4\">);<\/span><span style=\"color: #6A9955\"> \/\/ Holding-Register 4 = 40005 in der SPS<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">}<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #569CD6\">void<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #DCDCAA\">loop<\/span><span style=\"color: #D4D4D4\">() {<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\">\/\/Call once inside loop() - all magic here<\/span><\/span>\n<span class=\"line\"><span style=\"color: #9CDCFE\">mb<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">task<\/span><span style=\"color: #D4D4D4\">();<\/span><span style=\"color: #6A9955\"> \/\/ Modbus-Task<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\">\/\/ Einlesen der Bits von der I2C-INPUT Karte<\/span><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\">\/\/ ------------------------------------------<\/span><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\">\/\/ 8-Bit von der Eingangkarte lesen<\/span><\/span>\n<span class=\"line\"><span style=\"color: #DCDCAA\">I2E<\/span><span style=\"color: #D4D4D4\">(I2E1_ADDR, I2E1_WERT, I2E1_OK);<\/span><span style=\"color: #6A9955\"> \/\/ Ein Byte von der DI-Karte Adresse 112 lesen<\/span><\/span>\n<span class=\"line\"><span style=\"color: #C586C0\">if<\/span><span style=\"color: #D4D4D4\"> (I2E1_OK == <\/span><span style=\"color: #B5CEA8\">0<\/span><span style=\"color: #D4D4D4\">) {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #9CDCFE\">Serial<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">print<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #CE9178\">&quot;Keine Antwort vom Slave &quot;<\/span><span style=\"color: #D4D4D4\">);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #9CDCFE\">Serial<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #9CDCFE\">println<\/span><span style=\"color: #D4D4D4\"> (I2E1_ADDR);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">}<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\">\/\/ Wert zur SPS<\/span><\/span>\n<span class=\"line\"><span style=\"color: #9CDCFE\">mb<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">Ireg<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #B5CEA8\">0<\/span><span style=\"color: #D4D4D4\">, I2E1_WERT) ;<\/span><span style=\"color: #6A9955\"> \/\/ Input-Register 0 = 30001 in der SPS<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\">\/\/ Ausgeben der Bits an die I2C-OUTPUT Karte<\/span><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\">\/\/ ------------------------------------------ <\/span><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\">\/\/ Wert von der SPS umrangieren<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">I2A1_WERT = <\/span><span style=\"color: #9CDCFE\">mb<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">Hreg<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #B5CEA8\">0<\/span><span style=\"color: #D4D4D4\">);<\/span><span style=\"color: #6A9955\"> \/\/ Holding-Register 0 = 40001 in der SPS<\/span><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\">\/\/ 8-Bit zur Ausgangskarte schicken<\/span><\/span>\n<span class=\"line\"><span style=\"color: #DCDCAA\">I2A<\/span><span style=\"color: #D4D4D4\">(I2A1_ADDR, I2A1_WERT, I2A1_OK);<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\">\/\/ Analogwerte einlesen und berechnen<\/span><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\">\/\/ ----------------------------------<\/span><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\">\/\/ Werte von Analogkarte lesen<\/span><\/span>\n<span class=\"line\"><span style=\"color: #DCDCAA\">I2AE<\/span><span style=\"color: #D4D4D4\">(I2AE1_ADDR, I2AE1_WERT, I2AE1_OK);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\">\/\/ Werte zur SPS<\/span><\/span>\n<span class=\"line\"><span style=\"color: #9CDCFE\">mb<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">Ireg<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #B5CEA8\">1<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #9CDCFE\">I2AE1_WERT<\/span><span style=\"color: #D4D4D4\">&#091;<\/span><span style=\"color: #B5CEA8\">0<\/span><span style=\"color: #D4D4D4\">&#093;);<\/span><span style=\"color: #6A9955\"> \/\/ Input-Register 1 = 30002 in der SPS<\/span><\/span>\n<span class=\"line\"><span style=\"color: #9CDCFE\">mb<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">Ireg<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #B5CEA8\">2<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #9CDCFE\">I2AE1_WERT<\/span><span style=\"color: #D4D4D4\">&#091;<\/span><span style=\"color: #B5CEA8\">1<\/span><span style=\"color: #D4D4D4\">&#093;);<\/span><span style=\"color: #6A9955\"> \/\/ Input-Register 2 = 30003 in der SPS<\/span><\/span>\n<span class=\"line\"><span style=\"color: #9CDCFE\">mb<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">Ireg<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #B5CEA8\">3<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #9CDCFE\">I2AE1_WERT<\/span><span style=\"color: #D4D4D4\">&#091;<\/span><span style=\"color: #B5CEA8\">2<\/span><span style=\"color: #D4D4D4\">&#093;);<\/span><span style=\"color: #6A9955\"> \/\/ Input-Register 3 = 30004 in der SPS<\/span><\/span>\n<span class=\"line\"><span style=\"color: #9CDCFE\">mb<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">Ireg<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #B5CEA8\">4<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #9CDCFE\">I2AE1_WERT<\/span><span style=\"color: #D4D4D4\">&#091;<\/span><span style=\"color: #B5CEA8\">3<\/span><span style=\"color: #D4D4D4\">&#093;);<\/span><span style=\"color: #6A9955\"> \/\/ Input-Register 3 = 30005 in der SPS<\/span><\/span>\n<span class=\"line\"><span style=\"color: #9CDCFE\">mb<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">Ireg<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #B5CEA8\">5<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #9CDCFE\">I2AE1_WERT<\/span><span style=\"color: #D4D4D4\">&#091;<\/span><span style=\"color: #B5CEA8\">4<\/span><span style=\"color: #D4D4D4\">&#093;);<\/span><span style=\"color: #6A9955\"> \/\/ Input-Register 3 = 30006 in der SPS<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\">\/\/ Analogwerte ausgeben<\/span><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\">\/\/ --------------------<\/span><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\">\/\/ Wert von der SPS<\/span><\/span>\n<span class=\"line\"><span style=\"color: #9CDCFE\">I2AA1_WERT<\/span><span style=\"color: #D4D4D4\">&#091;<\/span><span style=\"color: #B5CEA8\">0<\/span><span style=\"color: #D4D4D4\">&#093; = <\/span><span style=\"color: #9CDCFE\">mb<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">Hreg<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #B5CEA8\">1<\/span><span style=\"color: #D4D4D4\">);<\/span><span style=\"color: #6A9955\"> \/\/ Holding-Register 1 = 40002 in der SPS<\/span><\/span>\n<span class=\"line\"><span style=\"color: #9CDCFE\">I2AA1_WERT<\/span><span style=\"color: #D4D4D4\">&#091;<\/span><span style=\"color: #B5CEA8\">1<\/span><span style=\"color: #D4D4D4\">&#093; = <\/span><span style=\"color: #9CDCFE\">mb<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">Hreg<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #B5CEA8\">2<\/span><span style=\"color: #D4D4D4\">);<\/span><span style=\"color: #6A9955\"> \/\/ Holding-Register 2 = 40003 in der SPS<\/span><\/span>\n<span class=\"line\"><span style=\"color: #9CDCFE\">I2AA1_WERT<\/span><span style=\"color: #D4D4D4\">&#091;<\/span><span style=\"color: #B5CEA8\">2<\/span><span style=\"color: #D4D4D4\">&#093; = <\/span><span style=\"color: #9CDCFE\">mb<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">Hreg<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #B5CEA8\">3<\/span><span style=\"color: #D4D4D4\">);<\/span><span style=\"color: #6A9955\"> \/\/ Holding-Register 3 = 40004 in der SPS<\/span><\/span>\n<span class=\"line\"><span style=\"color: #9CDCFE\">I2AA1_WERT<\/span><span style=\"color: #D4D4D4\">&#091;<\/span><span style=\"color: #B5CEA8\">3<\/span><span style=\"color: #D4D4D4\">&#093; = <\/span><span style=\"color: #9CDCFE\">mb<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">Hreg<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #B5CEA8\">4<\/span><span style=\"color: #D4D4D4\">);<\/span><span style=\"color: #6A9955\"> \/\/ Holding-Register 4 = 40005 in der SPS<\/span><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\">\/\/ Werte zur Analogkarte schicken<\/span><\/span>\n<span class=\"line\"><span style=\"color: #DCDCAA\">I2AA<\/span><span style=\"color: #D4D4D4\">(I2AA1_ADDR, I2AA1_WERT, I2AA1_OK);<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\">\/\/ Link-Status auf blaue LED<\/span><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\">\/\/ -------------------------<\/span><\/span>\n<span class=\"line\"><span style=\"color: #569CD6\">bool<\/span><span style=\"color: #D4D4D4\"> takt_1hz = (<\/span><span style=\"color: #DCDCAA\">millis<\/span><span style=\"color: #D4D4D4\">() \/ <\/span><span style=\"color: #B5CEA8\">500<\/span><span style=\"color: #D4D4D4\">) &amp; <\/span><span style=\"color: #B5CEA8\">1<\/span><span style=\"color: #D4D4D4\">;<\/span><span style=\"color: #6A9955\"> \/\/ Blinktakt 1 Hz<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">auto link = <\/span><span style=\"color: #9CDCFE\">Ethernet<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">linkStatus<\/span><span style=\"color: #D4D4D4\">();<\/span><\/span>\n<span class=\"line\"><span style=\"color: #C586C0\">switch<\/span><span style=\"color: #D4D4D4\"> (link) {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #C586C0\">case<\/span><span style=\"color: #D4D4D4\"> Unknown:<\/span><\/span>\n<span class=\"line\"><span style=\"color: #DCDCAA\">digitalWrite<\/span><span style=\"color: #D4D4D4\">(LED_BL, takt_1hz); <\/span><span style=\"color: #C586C0\">break<\/span><span style=\"color: #D4D4D4\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #C586C0\">case<\/span><span style=\"color: #D4D4D4\"> LinkON:<\/span><\/span>\n<span class=\"line\"><span style=\"color: #DCDCAA\">digitalWrite<\/span><span style=\"color: #D4D4D4\">(LED_BL, HIGH); <\/span><span style=\"color: #C586C0\">break<\/span><span style=\"color: #D4D4D4\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #C586C0\">case<\/span><span style=\"color: #D4D4D4\"> LinkOFF:<\/span><\/span>\n<span class=\"line\"><span style=\"color: #DCDCAA\">digitalWrite<\/span><span style=\"color: #D4D4D4\">(LED_BL, LOW); <\/span><span style=\"color: #C586C0\">break<\/span><span style=\"color: #D4D4D4\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">}<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\">\/\/alle 5 Sekunden lesen f\u00fcr Test<\/span><\/span>\n<span class=\"line\"><span style=\"color: #C586C0\">if<\/span><span style=\"color: #D4D4D4\"> (<\/span><span style=\"color: #DCDCAA\">millis<\/span><span style=\"color: #D4D4D4\">() &gt; ts + <\/span><span style=\"color: #B5CEA8\">1000<\/span><span style=\"color: #D4D4D4\">) { <\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">ts = <\/span><span style=\"color: #DCDCAA\">millis<\/span><span style=\"color: #D4D4D4\">();<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\">\/\/ Werte von der SPS<\/span><\/span>\n<span class=\"line\"><span style=\"color: #9CDCFE\">Serial<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">print<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #9CDCFE\">mb<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">Hreg<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #B5CEA8\">0<\/span><span style=\"color: #D4D4D4\">));<\/span><span style=\"color: #6A9955\"> \/\/ Holding-Register 0 = 40001 in der SPS<\/span><\/span>\n<span class=\"line\"><span style=\"color: #9CDCFE\">Serial<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">print<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #CE9178\">&quot;<\/span><span style=\"color: #D7BA7D\">\\t<\/span><span style=\"color: #CE9178\"> &quot;<\/span><span style=\"color: #D4D4D4\">);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #9CDCFE\">Serial<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">print<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #9CDCFE\">mb<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">Hreg<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #B5CEA8\">1<\/span><span style=\"color: #D4D4D4\">));<\/span><span style=\"color: #6A9955\"> \/\/ Holding-Register 1 = 40002 in der SPS<\/span><\/span>\n<span class=\"line\"><span style=\"color: #9CDCFE\">Serial<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">print<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #CE9178\">&quot;<\/span><span style=\"color: #D7BA7D\">\\t<\/span><span style=\"color: #CE9178\"> &quot;<\/span><span style=\"color: #D4D4D4\">);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #9CDCFE\">Serial<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">print<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #9CDCFE\">mb<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">Hreg<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #B5CEA8\">2<\/span><span style=\"color: #D4D4D4\">));<\/span><span style=\"color: #6A9955\"> \/\/ Holding-Register 2 = 40003 in der SPS<\/span><\/span>\n<span class=\"line\"><span style=\"color: #9CDCFE\">Serial<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">print<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #CE9178\">&quot;<\/span><span style=\"color: #D7BA7D\">\\t<\/span><span style=\"color: #CE9178\"> &quot;<\/span><span style=\"color: #D4D4D4\">);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #9CDCFE\">Serial<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">print<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #9CDCFE\">mb<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">Hreg<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #B5CEA8\">3<\/span><span style=\"color: #D4D4D4\">));<\/span><span style=\"color: #6A9955\"> \/\/ Holding-Register 3 = 40004 in der SPS<\/span><\/span>\n<span class=\"line\"><span style=\"color: #9CDCFE\">Serial<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">print<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #CE9178\">&quot;<\/span><span style=\"color: #D7BA7D\">\\t<\/span><span style=\"color: #CE9178\"> &quot;<\/span><span style=\"color: #D4D4D4\">);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #9CDCFE\">Serial<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">print<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #9CDCFE\">mb<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">Hreg<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #B5CEA8\">4<\/span><span style=\"color: #D4D4D4\">));<\/span><span style=\"color: #6A9955\"> \/\/ Holding-Register 4 = 40005 in der SPS<\/span><\/span>\n<span class=\"line\"><span style=\"color: #9CDCFE\">Serial<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #9CDCFE\">println<\/span><span style=\"color: #D4D4D4\"> ();<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">} <\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">}<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\">\/\/ =============================================================================================================<\/span><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\">\/\/ Globale Funktionen<\/span><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\">\/\/ =============================================================================================================<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\">\/\/ ---------------------------------------<\/span><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\">\/\/ 8-Bit von digitale Eingangskarte lesen<\/span><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\">\/\/ ---------------------------------------<\/span><\/span>\n<span class=\"line\"><span style=\"color: #569CD6\">void<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #DCDCAA\">I2E<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #569CD6\">int<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #9CDCFE\">I2C_Adresse<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #569CD6\">int<\/span><span style=\"color: #D4D4D4\"> &amp;<\/span><span style=\"color: #9CDCFE\">Wert<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #569CD6\">bool<\/span><span style=\"color: #D4D4D4\"> &amp;<\/span><span style=\"color: #9CDCFE\">Slave_OK<\/span><span style=\"color: #D4D4D4\">) { <\/span><\/span>\n<span class=\"line\"><span style=\"color: #9CDCFE\">Wire<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">requestFrom<\/span><span style=\"color: #D4D4D4\">(I2C_Adresse, <\/span><span style=\"color: #B5CEA8\">1<\/span><span style=\"color: #D4D4D4\">);<\/span><span style=\"color: #6A9955\"> \/\/ Anfrage an den I2C-Slave<\/span><\/span>\n<span class=\"line\"><span style=\"color: #C586C0\">if<\/span><span style=\"color: #D4D4D4\"> (<\/span><span style=\"color: #9CDCFE\">Wire<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">available<\/span><span style=\"color: #D4D4D4\">()) {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">Wert = <\/span><span style=\"color: #B5CEA8\">255<\/span><span style=\"color: #D4D4D4\"> - <\/span><span style=\"color: #9CDCFE\">Wire<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">read<\/span><span style=\"color: #D4D4D4\">();<\/span><span style=\"color: #6A9955\"> \/\/ Ein Byte vom PCF8574 lesen und in invertierte Eingabe wandlen <\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">Slave_OK = <\/span><span style=\"color: #B5CEA8\">1<\/span><span style=\"color: #D4D4D4\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">} <\/span><span style=\"color: #C586C0\">else<\/span><span style=\"color: #D4D4D4\"> {Slave_OK = <\/span><span style=\"color: #B5CEA8\">0<\/span><span style=\"color: #D4D4D4\">;}<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">}<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\">\/\/ ------------------------------------------<\/span><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\">\/\/ 8-Bit zur digitale Ausgangskarte schreiben<\/span><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\">\/\/ ------------------------------------------<\/span><\/span>\n<span class=\"line\"><span style=\"color: #569CD6\">void<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #DCDCAA\">I2A<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #569CD6\">int<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #9CDCFE\">I2C_Adresse<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #569CD6\">int<\/span><span style=\"color: #D4D4D4\"> &amp;<\/span><span style=\"color: #9CDCFE\">Wert<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #569CD6\">bool<\/span><span style=\"color: #D4D4D4\"> &amp;<\/span><span style=\"color: #9CDCFE\">Slave_OK<\/span><span style=\"color: #D4D4D4\">) { <\/span><\/span>\n<span class=\"line\"><span style=\"color: #9CDCFE\">Wire<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">beginTransmission<\/span><span style=\"color: #D4D4D4\">(I2C_Adresse);<\/span><span style=\"color: #6A9955\"> \/\/ Start \u00dcbertragung zum PCF8574<\/span><\/span>\n<span class=\"line\"><span style=\"color: #9CDCFE\">Wire<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">write<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #B5CEA8\">255<\/span><span style=\"color: #D4D4D4\"> - Wert);<\/span><span style=\"color: #6A9955\"> \/\/ Wert schreiben<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">byte error = <\/span><span style=\"color: #9CDCFE\">Wire<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">endTransmission<\/span><span style=\"color: #D4D4D4\">(); <\/span><\/span>\n<span class=\"line\"><span style=\"color: #C586C0\">if<\/span><span style=\"color: #D4D4D4\"> (error == <\/span><span style=\"color: #B5CEA8\">0<\/span><span style=\"color: #D4D4D4\">) { Slave_OK = <\/span><span style=\"color: #B5CEA8\">1<\/span><span style=\"color: #D4D4D4\">; } <\/span><span style=\"color: #C586C0\">else<\/span><span style=\"color: #D4D4D4\"> {Slave_OK = <\/span><span style=\"color: #B5CEA8\">0<\/span><span style=\"color: #D4D4D4\">;}<\/span><span style=\"color: #6A9955\"> \/\/ Fehlerauswertung<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">}<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\">\/\/ ---------------------------------------<\/span><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\">\/\/ 5 Analogwerte von der I2HAE-Karte lesen<\/span><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\">\/\/ ---------------------------------------<\/span><\/span>\n<span class=\"line\"><span style=\"color: #569CD6\">void<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #DCDCAA\">I2AE<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #569CD6\">int<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #9CDCFE\">I2C_Adresse<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #569CD6\">int<\/span><span style=\"color: #D4D4D4\"> (&amp;Wert)&#091;<\/span><span style=\"color: #B5CEA8\">5<\/span><span style=\"color: #D4D4D4\">&#093;, <\/span><span style=\"color: #569CD6\">bool<\/span><span style=\"color: #D4D4D4\"> &amp;<\/span><span style=\"color: #9CDCFE\">Slave_OK<\/span><span style=\"color: #D4D4D4\">) {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #569CD6\">int<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #9CDCFE\">Array<\/span><span style=\"color: #D4D4D4\">&#091;<\/span><span style=\"color: #B5CEA8\">11<\/span><span style=\"color: #D4D4D4\">&#093;;<\/span><span style=\"color: #6A9955\"> \/\/ Lokales Array zur Speicherung der gelesenen Daten<\/span><\/span>\n<span class=\"line\"><span style=\"color: #9CDCFE\">Wire<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">requestFrom<\/span><span style=\"color: #D4D4D4\">(I2C_Adresse, <\/span><span style=\"color: #B5CEA8\">11<\/span><span style=\"color: #D4D4D4\">);<\/span><span style=\"color: #6A9955\"> \/\/ Anfrage an den I2C-Slave<\/span><\/span>\n<span class=\"line\"><span style=\"color: #C586C0\">if<\/span><span style=\"color: #D4D4D4\"> (<\/span><span style=\"color: #9CDCFE\">Wire<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">available<\/span><span style=\"color: #D4D4D4\">()) {<\/span><span style=\"color: #6A9955\"> \/\/ 11 Bytes von Analogkarte lesen und in das array kopieren<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">Slave_OK = <\/span><span style=\"color: #B5CEA8\">1<\/span><span style=\"color: #D4D4D4\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #C586C0\">for<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #569CD6\">int<\/span><span style=\"color: #D4D4D4\"> i=<\/span><span style=\"color: #B5CEA8\">0<\/span><span style=\"color: #D4D4D4\">;i&lt;<\/span><span style=\"color: #B5CEA8\">11<\/span><span style=\"color: #D4D4D4\">;i++){<\/span><\/span>\n<span class=\"line\"><span style=\"color: #569CD6\">int<\/span><span style=\"color: #D4D4D4\"> c = <\/span><span style=\"color: #9CDCFE\">Wire<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">read<\/span><span style=\"color: #D4D4D4\">();<\/span><\/span>\n<span class=\"line\"><span style=\"color: #9CDCFE\">Array<\/span><span style=\"color: #D4D4D4\">&#091;i&#093;=c;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">} <\/span><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\">\/\/ Werte berechnen. Analogwert = Highbyte * 256 + Lowbyte <\/span><\/span>\n<span class=\"line\"><span style=\"color: #9CDCFE\">Wert<\/span><span style=\"color: #D4D4D4\">&#091;<\/span><span style=\"color: #B5CEA8\">0<\/span><span style=\"color: #D4D4D4\">&#093; = <\/span><span style=\"color: #9CDCFE\">Array<\/span><span style=\"color: #D4D4D4\">&#091; <\/span><span style=\"color: #B5CEA8\">2<\/span><span style=\"color: #D4D4D4\">&#093; * <\/span><span style=\"color: #B5CEA8\">256<\/span><span style=\"color: #D4D4D4\"> + <\/span><span style=\"color: #9CDCFE\">Array<\/span><span style=\"color: #D4D4D4\">&#091;<\/span><span style=\"color: #B5CEA8\">1<\/span><span style=\"color: #D4D4D4\">&#093;;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #9CDCFE\">Wert<\/span><span style=\"color: #D4D4D4\">&#091;<\/span><span style=\"color: #B5CEA8\">1<\/span><span style=\"color: #D4D4D4\">&#093; = <\/span><span style=\"color: #9CDCFE\">Array<\/span><span style=\"color: #D4D4D4\">&#091; <\/span><span style=\"color: #B5CEA8\">4<\/span><span style=\"color: #D4D4D4\">&#093; * <\/span><span style=\"color: #B5CEA8\">256<\/span><span style=\"color: #D4D4D4\"> + <\/span><span style=\"color: #9CDCFE\">Array<\/span><span style=\"color: #D4D4D4\">&#091;<\/span><span style=\"color: #B5CEA8\">3<\/span><span style=\"color: #D4D4D4\">&#093;;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #9CDCFE\">Wert<\/span><span style=\"color: #D4D4D4\">&#091;<\/span><span style=\"color: #B5CEA8\">2<\/span><span style=\"color: #D4D4D4\">&#093; = <\/span><span style=\"color: #9CDCFE\">Array<\/span><span style=\"color: #D4D4D4\">&#091; <\/span><span style=\"color: #B5CEA8\">6<\/span><span style=\"color: #D4D4D4\">&#093; * <\/span><span style=\"color: #B5CEA8\">256<\/span><span style=\"color: #D4D4D4\"> + <\/span><span style=\"color: #9CDCFE\">Array<\/span><span style=\"color: #D4D4D4\">&#091;<\/span><span style=\"color: #B5CEA8\">5<\/span><span style=\"color: #D4D4D4\">&#093;;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #9CDCFE\">Wert<\/span><span style=\"color: #D4D4D4\">&#091;<\/span><span style=\"color: #B5CEA8\">3<\/span><span style=\"color: #D4D4D4\">&#093; = <\/span><span style=\"color: #9CDCFE\">Array<\/span><span style=\"color: #D4D4D4\">&#091; <\/span><span style=\"color: #B5CEA8\">8<\/span><span style=\"color: #D4D4D4\">&#093; * <\/span><span style=\"color: #B5CEA8\">256<\/span><span style=\"color: #D4D4D4\"> + <\/span><span style=\"color: #9CDCFE\">Array<\/span><span style=\"color: #D4D4D4\">&#091;<\/span><span style=\"color: #B5CEA8\">7<\/span><span style=\"color: #D4D4D4\">&#093;;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #9CDCFE\">Wert<\/span><span style=\"color: #D4D4D4\">&#091;<\/span><span style=\"color: #B5CEA8\">4<\/span><span style=\"color: #D4D4D4\">&#093; = <\/span><span style=\"color: #9CDCFE\">Array<\/span><span style=\"color: #D4D4D4\">&#091;<\/span><span style=\"color: #B5CEA8\">10<\/span><span style=\"color: #D4D4D4\">&#093; * <\/span><span style=\"color: #B5CEA8\">256<\/span><span style=\"color: #D4D4D4\"> + <\/span><span style=\"color: #9CDCFE\">Array<\/span><span style=\"color: #D4D4D4\">&#091;<\/span><span style=\"color: #B5CEA8\">9<\/span><span style=\"color: #D4D4D4\">&#093;; <\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">} <\/span><span style=\"color: #C586C0\">else<\/span><span style=\"color: #D4D4D4\"> {Slave_OK = <\/span><span style=\"color: #B5CEA8\">0<\/span><span style=\"color: #D4D4D4\">;}<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">}<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\">\/\/ ---------------------------------------<\/span><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\">\/\/ 4 Analogwerte zur I2HAA-Karte schreiben<\/span><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\">\/\/ ---------------------------------------<\/span><\/span>\n<span class=\"line\"><span style=\"color: #569CD6\">void<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #DCDCAA\">I2AA<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #569CD6\">int<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #9CDCFE\">I2C_Adresse<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #569CD6\">int<\/span><span style=\"color: #D4D4D4\"> (&amp;Wert)&#091;<\/span><span style=\"color: #B5CEA8\">4<\/span><span style=\"color: #D4D4D4\">&#093;, <\/span><span style=\"color: #569CD6\">bool<\/span><span style=\"color: #D4D4D4\"> &amp;<\/span><span style=\"color: #9CDCFE\">Slave_OK<\/span><span style=\"color: #D4D4D4\">) {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #9CDCFE\">Wire<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">beginTransmission<\/span><span style=\"color: #D4D4D4\">(I2C_Adresse);<\/span><span style=\"color: #6A9955\"> \/\/ Start \u00dcbertragung zur ANALOG-OUT Karte<\/span><\/span>\n<span class=\"line\"><span style=\"color: #9CDCFE\">Wire<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">write<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #B5CEA8\">0<\/span><span style=\"color: #D4D4D4\">);<\/span><span style=\"color: #6A9955\"> \/\/ Kanal auf 0 setzen<\/span><\/span>\n<span class=\"line\"><span style=\"color: #C586C0\">for<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #569CD6\">int<\/span><span style=\"color: #D4D4D4\"> i=<\/span><span style=\"color: #B5CEA8\">0<\/span><span style=\"color: #D4D4D4\">;i&lt;<\/span><span style=\"color: #B5CEA8\">4<\/span><span style=\"color: #D4D4D4\">;i++){<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">byte HBy = <\/span><span style=\"color: #9CDCFE\">Wert<\/span><span style=\"color: #D4D4D4\">&#091;i&#093; \/ <\/span><span style=\"color: #B5CEA8\">256<\/span><span style=\"color: #D4D4D4\">;<\/span><span style=\"color: #6A9955\"> \/\/ HIGH-Byte berechnen<\/span><\/span>\n<span class=\"line\"><span style=\"color: #9CDCFE\">Wire<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">write<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #9CDCFE\">Wert<\/span><span style=\"color: #D4D4D4\">&#091;i&#093; - HBy * <\/span><span style=\"color: #B5CEA8\">256<\/span><span style=\"color: #D4D4D4\">);<\/span><span style=\"color: #6A9955\"> \/\/ LOW-Byte schreiben<\/span><\/span>\n<span class=\"line\"><span style=\"color: #9CDCFE\">Wire<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">write<\/span><span style=\"color: #D4D4D4\">(HBy);<\/span><span style=\"color: #6A9955\"> \/\/ HIGH-Byte schreiben<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">} <\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">byte error = <\/span><span style=\"color: #9CDCFE\">Wire<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">endTransmission<\/span><span style=\"color: #D4D4D4\">(); <\/span><\/span>\n<span class=\"line\"><span style=\"color: #C586C0\">if<\/span><span style=\"color: #D4D4D4\"> (error == <\/span><span style=\"color: #B5CEA8\">0<\/span><span style=\"color: #D4D4D4\">) { Slave_OK = <\/span><span style=\"color: #B5CEA8\">1<\/span><span style=\"color: #D4D4D4\">; } <\/span><span style=\"color: #C586C0\">else<\/span><span style=\"color: #D4D4D4\"> {Slave_OK = <\/span><span style=\"color: #B5CEA8\">0<\/span><span style=\"color: #D4D4D4\">;}<\/span><span style=\"color: #6A9955\"> \/\/ Fehlerauswertung<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">}<\/span><\/span><\/code><\/pre><\/div>\n","protected":false},"excerpt":{"rendered":"<p>In diesem Beitrag zeige ich, wie ein Arduino als I2C\u2011Master arbeitet und gleichzeitig als Modbus\u2011TCP\u2011Server fungiert. Damit lassen sich Daten von I2C\u2011Modulen einfach auslesen und \u00fcber das Netzwerk an eine SPS oder andere Steuerungen weitergeben. Ein praktisches Beispielprogramm zeigt, wie&#8230; <a class=\"continue-reading-link\" href=\"https:\/\/www.horter.de\/blog\/i2c-modbus-tcp-server\/\">mehr lesen<\/a><\/p>\n","protected":false},"author":3,"featured_media":28331,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[287,280],"tags":[40,7,288,290,289,15,291,6,5],"class_list":["post-28335","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-i2c-master","category-modbus-tcp","tag-arduino","tag-i2c","tag-modbus","tag-modbus-server","tag-modbus-tcp","tag-s7","tag-s7-1500","tag-siemens","tag-sps"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v26.8 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>I2C-Arduino-Master als Modbus TCP-Server - Horter &amp; Kalb Blog<\/title>\n<meta name=\"description\" content=\"Arduino\u2011I2C\u2011Master als Modbus\u2011TCP\u2011Server: I2C\u2011Module auslesen und \u00fcber Modbus\u2011TCP an SPS Steuerungen bereitstellen \u2013 inklusive Beispielcode.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.horter.de\/blog\/i2c-modbus-tcp-server\/\" \/>\n<meta property=\"og:locale\" content=\"de_DE\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"I2C-Arduino-Master als Modbus TCP-Server - Horter &amp; Kalb Blog\" \/>\n<meta property=\"og:description\" content=\"Arduino\u2011I2C\u2011Master als Modbus\u2011TCP\u2011Server: I2C\u2011Module auslesen und \u00fcber Modbus\u2011TCP an SPS Steuerungen bereitstellen \u2013 inklusive Beispielcode.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.horter.de\/blog\/i2c-modbus-tcp-server\/\" \/>\n<meta property=\"og:site_name\" content=\"Horter &amp; Kalb Blog\" \/>\n<meta property=\"article:published_time\" content=\"2025-01-17T12:57:47+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2026-01-08T18:14:32+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.horter.de\/blog\/wp-content\/uploads\/2025\/01\/Modbus-Logo_250.png\" \/>\n\t<meta property=\"og:image:width\" content=\"250\" \/>\n\t<meta property=\"og:image:height\" content=\"250\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/png\" \/>\n<meta name=\"author\" content=\"JH\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Verfasst von\" \/>\n\t<meta name=\"twitter:data1\" content=\"JH\" \/>\n\t<meta name=\"twitter:label2\" content=\"Gesch\u00e4tzte Lesezeit\" \/>\n\t<meta name=\"twitter:data2\" content=\"6\u00a0Minuten\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/www.horter.de\/blog\/i2c-modbus-tcp-server\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/www.horter.de\/blog\/i2c-modbus-tcp-server\/\"},\"author\":{\"name\":\"JH\",\"@id\":\"https:\/\/www.horter.de\/blog\/#\/schema\/person\/a8a4c3c5d3167dce7c7d31df6088b5d2\"},\"headline\":\"I2C-Arduino-Master als Modbus TCP-Server\",\"datePublished\":\"2025-01-17T12:57:47+00:00\",\"dateModified\":\"2026-01-08T18:14:32+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/www.horter.de\/blog\/i2c-modbus-tcp-server\/\"},\"wordCount\":765,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/www.horter.de\/blog\/#organization\"},\"image\":{\"@id\":\"https:\/\/www.horter.de\/blog\/i2c-modbus-tcp-server\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/www.horter.de\/blog\/wp-content\/uploads\/2025\/01\/Modbus-Logo_250.png\",\"keywords\":[\"Arduino\",\"I2C\",\"Modbus\",\"Modbus Server\",\"Modbus-TCP\",\"S7\",\"S7-1500\",\"SIEMENS\",\"SPS\"],\"articleSection\":[\"I2C-Master\",\"Modbus TCP\"],\"inLanguage\":\"de\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/www.horter.de\/blog\/i2c-modbus-tcp-server\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/www.horter.de\/blog\/i2c-modbus-tcp-server\/\",\"url\":\"https:\/\/www.horter.de\/blog\/i2c-modbus-tcp-server\/\",\"name\":\"I2C-Arduino-Master als Modbus TCP-Server - Horter &amp; Kalb Blog\",\"isPartOf\":{\"@id\":\"https:\/\/www.horter.de\/blog\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/www.horter.de\/blog\/i2c-modbus-tcp-server\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/www.horter.de\/blog\/i2c-modbus-tcp-server\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/www.horter.de\/blog\/wp-content\/uploads\/2025\/01\/Modbus-Logo_250.png\",\"datePublished\":\"2025-01-17T12:57:47+00:00\",\"dateModified\":\"2026-01-08T18:14:32+00:00\",\"description\":\"Arduino\u2011I2C\u2011Master als Modbus\u2011TCP\u2011Server: I2C\u2011Module auslesen und \u00fcber Modbus\u2011TCP an SPS Steuerungen bereitstellen \u2013 inklusive Beispielcode.\",\"breadcrumb\":{\"@id\":\"https:\/\/www.horter.de\/blog\/i2c-modbus-tcp-server\/#breadcrumb\"},\"inLanguage\":\"de\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/www.horter.de\/blog\/i2c-modbus-tcp-server\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"de\",\"@id\":\"https:\/\/www.horter.de\/blog\/i2c-modbus-tcp-server\/#primaryimage\",\"url\":\"https:\/\/www.horter.de\/blog\/wp-content\/uploads\/2025\/01\/Modbus-Logo_250.png\",\"contentUrl\":\"https:\/\/www.horter.de\/blog\/wp-content\/uploads\/2025\/01\/Modbus-Logo_250.png\",\"width\":250,\"height\":250,\"caption\":\"Modbus TCP Logo\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/www.horter.de\/blog\/i2c-modbus-tcp-server\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Start\",\"item\":\"https:\/\/www.horter.de\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"I2C-Arduino-Master als Modbus TCP-Server\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/www.horter.de\/blog\/#website\",\"url\":\"https:\/\/www.horter.de\/blog\/\",\"name\":\"Horter & Kalb Blog\",\"description\":\"SPS, I2C und mehr\",\"publisher\":{\"@id\":\"https:\/\/www.horter.de\/blog\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/www.horter.de\/blog\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"de\"},{\"@type\":\"Organization\",\"@id\":\"https:\/\/www.horter.de\/blog\/#organization\",\"name\":\"Horter & Kalb Blog\",\"url\":\"https:\/\/www.horter.de\/blog\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"de\",\"@id\":\"https:\/\/www.horter.de\/blog\/#\/schema\/logo\/image\/\",\"url\":\"https:\/\/www.horter.de\/blog\/wp-content\/uploads\/2026\/01\/hoka_Icon_400x400.png\",\"contentUrl\":\"https:\/\/www.horter.de\/blog\/wp-content\/uploads\/2026\/01\/hoka_Icon_400x400.png\",\"width\":400,\"height\":400,\"caption\":\"Horter & Kalb Blog\"},\"image\":{\"@id\":\"https:\/\/www.horter.de\/blog\/#\/schema\/logo\/image\/\"}},{\"@type\":\"Person\",\"@id\":\"https:\/\/www.horter.de\/blog\/#\/schema\/person\/a8a4c3c5d3167dce7c7d31df6088b5d2\",\"name\":\"JH\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"de\",\"@id\":\"https:\/\/www.horter.de\/blog\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/www.horter.de\/blog\/wp-content\/uploads\/2015\/07\/jhfb.jpg\",\"contentUrl\":\"https:\/\/www.horter.de\/blog\/wp-content\/uploads\/2015\/07\/jhfb.jpg\",\"caption\":\"JH\"},\"url\":\"https:\/\/www.horter.de\/blog\/author\/j-horter\/\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"I2C-Arduino-Master als Modbus TCP-Server - Horter &amp; Kalb Blog","description":"Arduino\u2011I2C\u2011Master als Modbus\u2011TCP\u2011Server: I2C\u2011Module auslesen und \u00fcber Modbus\u2011TCP an SPS Steuerungen bereitstellen \u2013 inklusive Beispielcode.","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.horter.de\/blog\/i2c-modbus-tcp-server\/","og_locale":"de_DE","og_type":"article","og_title":"I2C-Arduino-Master als Modbus TCP-Server - Horter &amp; Kalb Blog","og_description":"Arduino\u2011I2C\u2011Master als Modbus\u2011TCP\u2011Server: I2C\u2011Module auslesen und \u00fcber Modbus\u2011TCP an SPS Steuerungen bereitstellen \u2013 inklusive Beispielcode.","og_url":"https:\/\/www.horter.de\/blog\/i2c-modbus-tcp-server\/","og_site_name":"Horter &amp; Kalb Blog","article_published_time":"2025-01-17T12:57:47+00:00","article_modified_time":"2026-01-08T18:14:32+00:00","og_image":[{"width":250,"height":250,"url":"https:\/\/www.horter.de\/blog\/wp-content\/uploads\/2025\/01\/Modbus-Logo_250.png","type":"image\/png"}],"author":"JH","twitter_card":"summary_large_image","twitter_misc":{"Verfasst von":"JH","Gesch\u00e4tzte Lesezeit":"6\u00a0Minuten"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.horter.de\/blog\/i2c-modbus-tcp-server\/#article","isPartOf":{"@id":"https:\/\/www.horter.de\/blog\/i2c-modbus-tcp-server\/"},"author":{"name":"JH","@id":"https:\/\/www.horter.de\/blog\/#\/schema\/person\/a8a4c3c5d3167dce7c7d31df6088b5d2"},"headline":"I2C-Arduino-Master als Modbus TCP-Server","datePublished":"2025-01-17T12:57:47+00:00","dateModified":"2026-01-08T18:14:32+00:00","mainEntityOfPage":{"@id":"https:\/\/www.horter.de\/blog\/i2c-modbus-tcp-server\/"},"wordCount":765,"commentCount":0,"publisher":{"@id":"https:\/\/www.horter.de\/blog\/#organization"},"image":{"@id":"https:\/\/www.horter.de\/blog\/i2c-modbus-tcp-server\/#primaryimage"},"thumbnailUrl":"https:\/\/www.horter.de\/blog\/wp-content\/uploads\/2025\/01\/Modbus-Logo_250.png","keywords":["Arduino","I2C","Modbus","Modbus Server","Modbus-TCP","S7","S7-1500","SIEMENS","SPS"],"articleSection":["I2C-Master","Modbus TCP"],"inLanguage":"de","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/www.horter.de\/blog\/i2c-modbus-tcp-server\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/www.horter.de\/blog\/i2c-modbus-tcp-server\/","url":"https:\/\/www.horter.de\/blog\/i2c-modbus-tcp-server\/","name":"I2C-Arduino-Master als Modbus TCP-Server - Horter &amp; Kalb Blog","isPartOf":{"@id":"https:\/\/www.horter.de\/blog\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.horter.de\/blog\/i2c-modbus-tcp-server\/#primaryimage"},"image":{"@id":"https:\/\/www.horter.de\/blog\/i2c-modbus-tcp-server\/#primaryimage"},"thumbnailUrl":"https:\/\/www.horter.de\/blog\/wp-content\/uploads\/2025\/01\/Modbus-Logo_250.png","datePublished":"2025-01-17T12:57:47+00:00","dateModified":"2026-01-08T18:14:32+00:00","description":"Arduino\u2011I2C\u2011Master als Modbus\u2011TCP\u2011Server: I2C\u2011Module auslesen und \u00fcber Modbus\u2011TCP an SPS Steuerungen bereitstellen \u2013 inklusive Beispielcode.","breadcrumb":{"@id":"https:\/\/www.horter.de\/blog\/i2c-modbus-tcp-server\/#breadcrumb"},"inLanguage":"de","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.horter.de\/blog\/i2c-modbus-tcp-server\/"]}]},{"@type":"ImageObject","inLanguage":"de","@id":"https:\/\/www.horter.de\/blog\/i2c-modbus-tcp-server\/#primaryimage","url":"https:\/\/www.horter.de\/blog\/wp-content\/uploads\/2025\/01\/Modbus-Logo_250.png","contentUrl":"https:\/\/www.horter.de\/blog\/wp-content\/uploads\/2025\/01\/Modbus-Logo_250.png","width":250,"height":250,"caption":"Modbus TCP Logo"},{"@type":"BreadcrumbList","@id":"https:\/\/www.horter.de\/blog\/i2c-modbus-tcp-server\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Start","item":"https:\/\/www.horter.de\/blog\/"},{"@type":"ListItem","position":2,"name":"I2C-Arduino-Master als Modbus TCP-Server"}]},{"@type":"WebSite","@id":"https:\/\/www.horter.de\/blog\/#website","url":"https:\/\/www.horter.de\/blog\/","name":"Horter & Kalb Blog","description":"SPS, I2C und mehr","publisher":{"@id":"https:\/\/www.horter.de\/blog\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.horter.de\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"de"},{"@type":"Organization","@id":"https:\/\/www.horter.de\/blog\/#organization","name":"Horter & Kalb Blog","url":"https:\/\/www.horter.de\/blog\/","logo":{"@type":"ImageObject","inLanguage":"de","@id":"https:\/\/www.horter.de\/blog\/#\/schema\/logo\/image\/","url":"https:\/\/www.horter.de\/blog\/wp-content\/uploads\/2026\/01\/hoka_Icon_400x400.png","contentUrl":"https:\/\/www.horter.de\/blog\/wp-content\/uploads\/2026\/01\/hoka_Icon_400x400.png","width":400,"height":400,"caption":"Horter & Kalb Blog"},"image":{"@id":"https:\/\/www.horter.de\/blog\/#\/schema\/logo\/image\/"}},{"@type":"Person","@id":"https:\/\/www.horter.de\/blog\/#\/schema\/person\/a8a4c3c5d3167dce7c7d31df6088b5d2","name":"JH","image":{"@type":"ImageObject","inLanguage":"de","@id":"https:\/\/www.horter.de\/blog\/#\/schema\/person\/image\/","url":"https:\/\/www.horter.de\/blog\/wp-content\/uploads\/2015\/07\/jhfb.jpg","contentUrl":"https:\/\/www.horter.de\/blog\/wp-content\/uploads\/2015\/07\/jhfb.jpg","caption":"JH"},"url":"https:\/\/www.horter.de\/blog\/author\/j-horter\/"}]}},"_links":{"self":[{"href":"https:\/\/www.horter.de\/blog\/wp-json\/wp\/v2\/posts\/28335","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.horter.de\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.horter.de\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.horter.de\/blog\/wp-json\/wp\/v2\/users\/3"}],"replies":[{"embeddable":true,"href":"https:\/\/www.horter.de\/blog\/wp-json\/wp\/v2\/comments?post=28335"}],"version-history":[{"count":27,"href":"https:\/\/www.horter.de\/blog\/wp-json\/wp\/v2\/posts\/28335\/revisions"}],"predecessor-version":[{"id":28592,"href":"https:\/\/www.horter.de\/blog\/wp-json\/wp\/v2\/posts\/28335\/revisions\/28592"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.horter.de\/blog\/wp-json\/wp\/v2\/media\/28331"}],"wp:attachment":[{"href":"https:\/\/www.horter.de\/blog\/wp-json\/wp\/v2\/media?parent=28335"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.horter.de\/blog\/wp-json\/wp\/v2\/categories?post=28335"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.horter.de\/blog\/wp-json\/wp\/v2\/tags?post=28335"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}