# Modbus TCP / IP zu CP1243 über 1200 SPS und PN mit dem BACnet LINK



## mista (26 Januar 2022)

Hallo ich habe folgende Herausforderung von der IT beim Kunden:

Wir haben ein Gerät, welches nicht ins interne Netz darf. Also wollten wir diese Gerät mit Modbus TCP /IP über einen CP1243 vom Netz Abtrennen über eine 1200er Steuerung welche im Firmennetz ist. Soweit so gut, die Herausforderung ist jetzt, dass die Gebäudetechnik über BACnet das Gerät auslesen bzw. Steuern möchte.

Dafür habe ich den  PN/BACnet LINK zur Verfügung bekommen.

Durch den CP ist dann gewährleistet, dass das Endgerät an einem anderen Subnetz hängt.

Endgerät:
172.16.0.120
255.255.255.0

CP1243:
172.16.0.241
255.255.255.0
----------------------------
SPS im Firmennetz:
10.40.59.14
255.255.248.0
10.40.56.1

PN/BACnet LINK
10.40.59.12
255.255.248.0
10.40.56.1

GLT:
10.40.59.13
255.255.248.0
10.40.56.1

Da ich kein Plan von BACnet habe weiß ich nicht wo ich Anfangen soll.

Ich wäre so vorgegangen:

Eine Modbus TCP Kopplung mit dem Endgerät über die SPS aufbauen, dann diese Daten ins BACnet Format bringen /rangieren und zur Verfügung (in einem DB???) stellen. Die Steuerung über Modbus wurde im vor ein mit dem Programm Modbus Poll erfolgreich getestet.

Der PN/BACnet LINK kommt ein Patchkabel von der SPS rein und eins raus Richtung Switch (Damit Kommunitziert die SPS per Profinet PUT/GET mit einer anderen SPS das soll unberührt bleiben.). Und noch eins zum Switch für BACnet Kommunikation (auch über PUT/GET).

EDIT: ich habe noch EDE Files zur Verfügung gestellt bekommen. Doch was ich damit mache (außer Sie in der Konfiguration vom PN/BACnet LINK zu importieren) weiß ich leider auch nicht.

Aber wie man die Daten von Modbus in BACnet Objekte umwandelt, da bin ich im Moment ratlos und suche hier Eure Hilfe.

Vielen DANK

PS ein Modbus TCP/BACnet Converter von Wachendorff soll explizit nicht angewendet werden.


----------



## SPS-Bitschubser (26 Januar 2022)

Also im Prinzip gibt es das Bac-Net als CP und als lösung von MBS etc. 
Solange nicht native Bacnet Funktionen verlangt wird. Kannst du über BAC net kommunizieren. Im bacnet sind verschiedene Leistungen von Steuerungen beschrieben.
EdE File ist die configdatei mit Namen, ID, Einheit melde Kategorie für stormeldungen, Aktualisierierungsinterval. 
Den Umweg über Modbus muss man nicht machen. Es kann dierekt Projektiert werden als profinet device. Vorsicht bei den EDE-File das kann die überlagete GLT bei falschen Einträgen bis zum Ausfall bringen. 
Meistens bekommt man die ede file als Vorlage wegen den Schlüssel Namen cov halbwegs richtig einzutragen. Im Handbuch des CP stehen Beispiele drin.
Edit. 
Daten in von modbus in die 1200 lesen und schreiben und diese dann über i-device zum gateway bacnet senden und empfangen. 
Das ist auf jeden Fall komplizierter als es klingt.


----------



## mista (26 Januar 2022)

Oh mein Gott. Ich verstehe nur Bahnhof. Also Das Endgerät ist ein BHKW welches über ein Fernwartungsmodem verfügt, und dies darf unter keinem Umständen ins lokale Netz. Deshalb muss Modbus dazwischen. Was ich nicht verstanden habe ist, kann ich einfach ein DB den BACnet übergeben per PUT/GET über die PN Schnittstelle vom PN/BACnet LINK? 

Ich habe mal in die CSV Dateien rein geschaut, ich glaube die sind nur als Beispiel weil aus einem anderen Projekt. 
Das ist jetzt echt eine Herausforderung und nächste Woche soll das laufen..

Es sind zwar nicht so viele Datenpunkte, aber wenn man nicht weiß wie man anfangen soll tickt die Zeit schneller...


----------



## SPS-Bitschubser (26 Januar 2022)

Am besten erst mal den modbus zum laufen zu bringen.
Danach alle Datenpunkte zusammen schreiben ins EDE-File 
Kleines Beispiel zur Zuordnung der Bacnet Datentypen 
Binary Input z.B. Meldung vom BHKW
Binary Output z.B. Freigabe BHKW
AnalogInput z.B. aktuelle Leistung
AnalogOutput z.B. Sollleistung BHKW 

Put get brauchst du noch da du die Daten direkt über Idevice konfiguriert.  Du musst in deiner sps die Daten von modbus zum idevice kopieren und zurückschreiben. und im pn/bacnet gateway werden die Daten über idevice für das bacnet Protokoll aufbereitet. 

Zum Testen für das bacnet wäre es gut wenn der Kunde dir ein Testsystem zur Verfügung stellt könnte. Dann kannst mal ein paar Werte von der sps zum bacnet senden und lesen.kurz und knapp 1 modbus Inbetriebnahme 2. Bacnet Inbetriebnahme gateway 3. Datenhandling zwischen modbus und idevice 4. Bacnet zum BHKW komplett durchtesten
Hier mal ein wenig lesestoff:





						SIOS
					






					support.industry.siemens.com


----------



## mista (26 Januar 2022)

OK, Also muss ich erstmal die BACnet Objekte vom BHKW erstellen, aus der Liste vom Modbus. Da es Modbus ist kann es ja nur Ganzzahlen verwenden, sollte ich das für die Analogwerte so bei belassen? Bzw. kann ich das so bei belassen?

Ist es Möglich dass eine CPU mit iDevice eine PUT/GET Verbindung aufbaut und zusätzlich mit einer anderen SPS (welche aktuell verbunden ist).

Das mit dem iDevice habe ich für eine andere Kopplung schon gemacht, für ein WAGO Umsetzer, also ist das nichts neues für mich. 

Ich habe insgesamt 4 CSV aus einem Anderen Projekt.
1:

#Encoding of BACnet Engineering Units#CodeUnit Text

2:

# Proposal_Engineering-Data-Exchange - B.I.G.-EU

VERSION_OF_LAYOUTV2.2#mandatorymandatorymandatorymandatorymandatoryoptionaloptionaloptionaloptionaloptionaloptionaloptionaloptionaloptionaloptionaloptionaloptionaloptional

3:

#Encoding of BACnet Object Types#CodeObject Type

4:

#State Text Reference#Reference NumberText 1 or Inactive-TextText 2 or Active-TextText 3Text 4Text 5...Text n


----------



## SPS-Bitschubser (27 Januar 2022)

Put/Get ist nicht i-device deine andere s7 Verbindung macht keinen Unterschied. 
Für analoge musst du den datentyp real nehmen. Siehe Beschreibung. Außerdem gibt es pro analogwert noch zusätzlichliche Status welche man benutzen könnte. Z.B. Alarmmeldung beim analoginput wenn das außerhalb des erlaubten Bereich ist setzt ein bit und verlinkt dieses auf das Objekt.
Erste csv ist die umschlüsselung Nr zu Einheit.  
3 == Bar, 4 mbar, 5 psi etc.
Vierte csv ist für Meldungen und Steuerung binär bzw. Binary multistate 
5 Auf/zu, 6 ein/aus,7 ok/Störung 
Zweite csv Datei müsste das allgemeine ede file sein.
Dritte csv Datei weiß  ich aktuell  nicht für was das da ist.


----------



## mista (27 Januar 2022)

Ok, also die CSV Dateien die ich bekommen habe sind fertig für ein Beispiel, das für ein PX Controller gelten soll.
Da müsste ich für das Beispiel den PN/BACnet LINK als Client einstellen richtig?

Für Mein Vorhaben muss es aber Server sein.

Kommen wir zum Modbus, da gibt es ja für die 12er Steuerung MB_CLIENT v5.2 und MB_MASTER v2.2. Welchen würdet ihr verwenden?

Und wie würdet ihr den Datenbaustein aufbauen? es gibt ja auch das Problem 0 basiert, 1 basiert, 4000,40000,400000 bei den MB_ADDR.

Die Register vom BHKW sind folgende:

Eingangsregister FC 0x04 (nur lesen)
beginnend mit Adresse 0
habe mode 104 verwendet

Halteregister FC 0x03 / FC 0x06 / FC 0x10 lesen/schreiben
beginnend mit Adresse 0
habe mode 103 zum lesen und 106 zum schreiben verwendet

Habe die eine CSV probehalber importiert und verstehe nicht, woher aus der CSV Tia weiß, dass es input binary sein soll:


#mandatorymandatorymandatorymandatorymandatoryoptionaloptionaloptionaloptionaloptionaloptionaloptionaloptionaloptionaloptionaloptionaloptionaloptional# keynamedevice obj.-instanceobject-nameobject-typeobject-instancedescriptionpresent-value-defaultmin-present-valuemax-present-valuesettablesupports COVhi-limitlow-limitstate-text-referenceunit-codevendor-specific-addressobject-tagobject-tag-textB'Sporthall'H'E'RstAlmBtn2099201​B'Sporthall'H'E'RstAlmBtn3​1​Alarm-RücksetztasteN20992014​6​

ich würde gerne eine EDE mit den Datenpunkten des BHKW erstellen wie ich sie vom Modbus bekomme:

Adresse = wahrscheinlich unnötigTyp = uint16Wertebereich= ?KommentarKommentar


----------



## SPS-Bitschubser (27 Januar 2022)

Also das ede file ist wichtig für server und client wichtig. 
Client funktion wirst du bei deinem Projekt nicht brauchen. Diese wäre notwendig um z. B. die Außentemperatur von einem anderen BAC-Net device zu erhalten.

Ich würde  2 DB mindestens machen einen für BAC net und einen für Modbus. Und diese umkopieren. Die modbus Daten musst du auf real umwandeln

Die csv Datei wird im Bacnet PN Link gemacht. Anscheinend werden laut dem Handbuch die ea Symbole selbst erstellt.
Dann musst du nur die E/A vom idevice verknüpfen. 

Das ede file hat nix mit modbus zu tun.
EDE File ist das A und O bei BacNet.
Kann morgen mal ein ede file mit ein paar Beispielen als Vorlage hier hochladen.

Allgemeine Daten zu Bac-Net 
Theoretisch könnte man in Bacnet bei gleichen EDE file Einstellungen. Alle Bacnet konform Geräte ausprobieren und die GLT würde immer die richtigen Daten bekommen. Egal welcher Hersteller als Bacnet device verwendet wird.
Praktisch gibt es auch Unterschiede zwischen den Herstellern. Aber Bac-Net ist als das Standard Protokoll mittlerweile in der Gebäude automation. Ähnlich Profibus / Profinet / Ethercat.
Vergiss Adressen datentyp real etc. Bei bacnet ist nur das ede file wichtig.


----------



## mista (27 Januar 2022)

ja wegen dem modbus  wollte fragen ob das mit den Modes 104 für inputregister und 103 bzw. 106 richtig ist.

Ja das wäre sehr nice, wenn du mal ein Beispiel reinsetzt. Ich werde morgen Früh auch mal ein paar Bilder der aktuellen Modbus des und Bausteine hier posten.

Hoffe du meinst mit dem idevice nicht noch ein weiteres Gerät sondern das PN/BACnet LINK welches ich eingebunden habe.

Die dritte csv Datei konnte Tia nicht importieren weil es 5 statt 3 Werte erwartet hat.

Vielen Dank!

Ich habe jetzt diesen Guide gefunden, allerdings ist da kein Beispiel von dem bacnet read bzw. Write db. 



			https://support.industry.siemens.com/cs/attachments/109757273/109757273_network_transitions_pnbacnet_link_de.pdf
		


Leider weis ich nicht wie so ein Baustein aufgebaut werden muss. Für die EA Objekte würde ich ein 4 Objekte händisch hinzufügen, also bi, Bo, ai und ao und diese dann exportieren um in excel bequem alle Objekte zu erstellen. Frage, muss ich ein analog oder binary Input auch als output definieren, damit es auch gelesen werden kann, oder reicht es einmal weil inputs read/write sind?


----------



## mista (1 Februar 2022)

Ich habe jetzt folgendes gemacht. Habe die Objekte BI, BO, AI und AO selber erstellet und der GLT Seite die exportierte Edge Datei zur Verfügung gestellt. 

Dann habe ich das PN/BACnet LINK und eine andere Steuerung konfiguriert. In der Main OB steht nichts weiter. 
Habe dann den YetAnotherBacnetExplorer runter geladen und den PC im gleichen subnetz nach BACnet Objekte zu suchen und siehe da, er findet Schonmal. 

Was ich nicht verstehe ist, warum man azyklisch oder zyklisch beschreiben muss. Finde in dem oben erwähnten Beispiel, dass man den out of service nicht gesetzt wird . Ich möchte ja mit dem PN/BACnet LINK das BHKW als BACnet Objekt simulieren.

Und weis nicht wie ich sicherstellen kann dass es richtig ist? Gibt es ein modbus simulator Freeware? So dass ich die modbus Register zu den BACnet Objekte rangieren und testen kann.


----------



## SPS-Bitschubser (1 Februar 2022)

Modbus Simulation hier mal ein Beitrag.
www.sps-forum.de/threads/modbus-ger%C3%A4t-simulieren.106756/
Modbus ist nicht gerade meine Stärke... da gibt's bessere Personen.
Out of Service bzw. Bringt dir ja nix da du kein nativ bacnet verwendest. Dies könnte man verwenden wenn der Außentemperaturfühler defekt ist. Dann stellt man ihn auf out of Service schreibt dan eine halbwegs aktuelle Temperatur rein und die Heizung würde im Winter  weiterlaufen.
Ich vermute das alle relativ schnellen Daten als zyklisch erwartet werden. Und alles was nicht echtzeitfähig sein muss is azyklisch. 
Also laut deiner Beschreibung der Anwendung und deiner Hardware pn/bacnet link ist es eher ein Gateway zum daten kopieren.


----------



## mista (1 Februar 2022)

Ich habe den YetAnotherBACnetExplorer installiert und die EDE Datei die ich erstellt habe aufs PN/BACnet LINK importiert und aufgespielt. 
Siehe da, der YABE findet  das BACnet.

Ich kann sogar die über YABE die outputs schreiben.

Ich mache das zyklisch in einer FC:



Spoiler: Code:



// Wert über zwei Register... 
#temp_DWord.%W1 := "ModbusExchange_DB".READ_3[335];
#temp_DWord.%W0 := "ModbusExchange_DB".READ_3[336];
"Link_1.Server.Gascount" := DWORD_TO_REAL(#temp_DWord);

//oder
//"Link_1.Server.Gascount" := DWORD_TO_REAL(SHL(IN := WORD_TO_DWORD("ModbusExchange_DB".READ_3[335]), N := 16) OR "ModbusExchange_DB".READ_3[336]);

//oder
//"Link_1.Server.Gascount" := DWORD_TO_REAL(DINT_TO_DWORD("ModbusExchange_DB".READ_3[335] * 65536 + "ModbusExchange_DB".READ_3[336]));

"Link_1.Server.StundenBisWartung" := UINT_TO_REAL(WORD_TO_UINT("ModbusExchange_DB".READ_3[340]));
"Link_1.Server.VentileLastChecked" := UINT_TO_REAL(WORD_TO_UINT("ModbusExchange_DB".READ_3[348]));
"Link_1.Server.AirfilterLastChecked" := UINT_TO_REAL(WORD_TO_UINT("ModbusExchange_DB".READ_3[349]));
"Link_1.Server.OilExchangedAt" := UINT_TO_REAL(WORD_TO_UINT("ModbusExchange_DB".READ_3[350]));
"Link_1.Server.GasfilterExchangeAt" := UINT_TO_REAL(WORD_TO_UINT("ModbusExchange_DB".READ_3[351]));
"Link_1.Server.IgnitionTorchesCheckedAt" := UINT_TO_REAL(WORD_TO_UINT("ModbusExchange_DB".READ_3[352]));
"Link_1.Server.OilLevelCheckedAt" := UINT_TO_REAL(WORD_TO_UINT("ModbusExchange_DB".READ_3[353]));

// Holdingregister schreiben
"ModbusExchange_DB".WRITE_HOLDING[1] := UINT_TO_WORD(REAL_TO_UINT("Link_1.Server.SollLeistung"));
"ModbusExchange_DB".WRITE_HOLDING[23] := UINT_TO_WORD(REAL_TO_UINT("Link_1.Server.SetEngineMode"));
"ModbusExchange_DB".WRITE_HOLDING[24] := UINT_TO_WORD(REAL_TO_UINT("Link_1.Server.SetEngineState"));



Also sehe ich das richtig, dass das so funktionieren würde? Gerade bei den Wert über zwei Register bin ich mir nicht sicher...

Bzgl. Modbus habe ich es mit der Testversion von "Modbus Slave" getestet, allerdings kann man beim Holdingregister nur die Funktion 0x03 wählen und nur lesen statt schreiben (0x06).

.


----------



## SPS-Bitschubser (2 Februar 2022)

Schaut recht gut aus. Bei den Werten über 2 Register sind das real Zahlen oder dint Zahlen? 

Das mit den set Mode und sate state das sind keine analog Typen  sondern Binary value. Kann sein das du das steuerwors in verschiedene Binary Output aufteilen musst.
Aber das musst du nut aufpassen das bei 2 Register immer beide gelesen und aktuell sind sonst hat man ab und zu falsche Werte drin stehen.
Ansonsten glaub ich wenn du den modbus auf der Baustelle hinbekommst. Sind es nur noch Kleinigkeiten. 
Das mit den zyklischen Daten reicht für das bhkw vollkommen. Wann fängt die Inbetriebnahme an?


----------

