TIA ET200SP als Modbus RTU Master mit CM PtP Kommunikationsmodul

ModbusDani1995

Level-2
Beiträge
73
Reaktionspunkte
3
Zuviel Werbung?
-> Hier kostenlos registrieren
Ich hab ein Problem mit einer ET200SP und einem CM PTP die über Modbus RTU mit einem Messgerät (UPM209 von Algodue) kommunizieren sollen.

Auf dem Algodue UPM 209 ist eingestellt:
Modbus Adresse 15
8 Datenbit
1 Stoppbit
19200 Baudrate

Programmiert wird mit TIA Portal 15.1

Ich will die 5 Werte Phase1 Current bis System Current auslesen. Bild 1111.jpg

Passt die Beschaltung vom FB640 Modbus_Comm_Load und vom FB641 Modbus_Master?3.jpg4.jpg7.jpg2.jpg
Mode und den Anfangswert für DATA_ADDR hab ich aus der Hilfe vom Modbus Master Baustein.
Für Mode verwende ich 0 weil ich lesen will.
Für DATA_ADDR verwende ich 40000+14 weil ich erst ab 0E Phase 1 Current lesen will.
Data_Len hab ich mit 10 beschalten weil ich eben die 5*2 Wörter am Bild 11 lesen will.

Vom Modbus_Comm_Load bekomm ich beim Starten der CPU ein Done wenn ich dann den Request beim Modbus_Master auf 1 setz geht er auf Busy und der Status gibt 80C8 aus was heißt Baudrate Parität oder Verkabelung falsch. Die drei Sachen passen aber.

Deswegen meine Frage wo der Fehler im Programm sein kann? Tx blink am Kommunikationsmodul wenn ich den Request auf 1 setze.

Danke schon einmal für eure Hilfe.
 
Hast Du schon mal testweise die beiden RS485-Drähte A und B vertauscht? Das ist ein häufiger Fehler, und bei dem vertauschen geht nichts kaputt.
Du könntest auch mal den Datenverkehr mitsniffern, z.B. mit HTerm oder ein anderes Terminalprogramm.

Harald
 
Code:
16#80C8
 The slave does not respond within the set time
 Check the data transmission rate, parity and wiring of the slave.


Veruche doch mal ab 40001 + 14 zu lesen - ich kann mich erinner das es da eine Verschiebung gibt in der Adressierung bei MB RTU
 
Habe ich auch schon versucht.
Was sagst du zu der Verkabelung?

Kommunikationsmodul.PNGUPM209.jpg

+ vom Gerät auf - vom Kommunikationsmodul

- vom Gerät auf + vom Kommunikationsmodul

also 2 vom Algodue auf 14 am Modul und 3 vom Algodue auf 12 vom Modul.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo,
ich hoffe meine Anmerkung ist jetzt nicht zu frech..

Aus dem Zähler liest du via Modbus 0A.
Am Zähler ist weder Strom noch Spannung angeschlossen.

hm...

Ich würde sagen Problem gelöst...
 
Bei RS485 verbindet man normalerweise die gleichnamigen Anschlüsse miteinander, also + mit + und - mit - , oder Tx/Rx+ mit Tx/Rx+ und Tx/Rx- mit Tx/Rx-, oder P mit P und N mit N, oder mit B mit B und A mit A. Allerdings: Verschiedene Hersteller verwenden verschiedene Bezeichnungen. Speziell bei A und B ist es oft unterschiedlich wie die Hersteller das bezeichnen. Bei Deinem Algodue Handbuch wird beispielhaft A mit + verbunden, beim CM PtB bedeutet B = + ... Deshalb bei Problemen immer mal testweise A und B vertauschen.

Entferne mal testweise den Draht zwischen GND und COM - der ist bei RS485 unnötig, und stört vielleicht.
Klemme mal mindestens einen RS485-Abschlußwiderstand 120 Ohm zwischen RS485 + und -, z.B. am Zähler. (Beim Siemens CM PtP ist das leider nur schwer möglich.)
Hast Du von dem Algodue UPM 209 einen Download-Link vom Handbuch?

Flackern die TX- und RX-LEDs, wenn Du am FB Modbus_Master den REQ zyklisch aktivierst (z.B. alle 2s)?

Versuche mal testweise nur 1 Register zu lesen, und erst wenn das grundsätzlich funktioniert, dann versuche mehrere aufeinanderfolgende Register lesen und interpretieren.

Ist Modbus_Comm_Load_DB.MODE := 4 (Halbduplex (RS485) Zweidraht-Betrieb)?
probiere mal LINE_PRE := 0, 1, 2 durch

Harald
 
Hallo,

ich hänge mich mal hier dran.
Eigentlich habe ich genau das selbe verhalten wie oben beschrieben, ich weiß allerdings nicht ob ich alles korrekt eingestellt habe.
Ich möchte die Daten mehrerer PAC2220 auslesen. Dafür habe ich mir einen Baustein für die S7-1200 geschrieben - der Funktioniert super.

Jetzt das selbe Spiel mit der SP und ich verzweifle. IM 1200er Baustein wurden die Bausteine MB_Comm_Load und MB_Master verwendet.
Die gibt es in der 1500 nicht, daher habe ich die durch Modbus_Comm_Load und Modbus_Master ersetzt.

Leider bekomme ich keine funktionierende Übertragung.
Einstellung sind folgendermaßen:
Modbus_Comm_Load_DB.MODE := 4
Modbus_Comm_Load_DB.LINE_PRE := 2
Baudrate: 19200
Parity: 0
Flow_ctrl: 0
RTS on dlly: 0
RTS off dlly: 0
resp_to: 1000


Als Fehler Code bekomme ich die 80C8 (Modbus_Comm_Load_DB).
Die TX LED blinkt ab und zu auf RX kommt allerdings nicht zurück.
Verdrahtet habe ich die SP klemme 12 --> PAC klemme A, SP klemme 14 --> PAC klemme B.
Gedreht habe ich das auch schon.

Was mich stutzig macht ist der Baustein Comm_Load. Da bekomme ich kein Done heraus. Das war in der 1200 immer der Fall, hier ist er möglicherweiße nur für einen züglich true?
Der Status steht hier auch immer auf 7000.


Ehrlich gesagt bin ich mit meinem Wissen am Ende oder stehe auf dem Schlauch :D
Vielleicht kann ja jemand helfen.


Vielen Dank.
 
Niemand eine Idee hierzu? Vielleicht würde mir auch eine Vorlage einer funktionierenden Verbindung helfen.
Habe so ziemlich alles durch probiert. Nichts Funktioniert.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Was mich stutzig macht ist der Baustein Comm_Load. Da bekomme ich kein Done heraus. Das war in der 1200 immer der Fall, hier ist er möglicherweiße nur für einen züglich true?
Der Status steht hier auch immer auf 7000.
Konsultieren wir doch mal die Hilfe. Was steht da bei done, error und status?
1738655579685.png
jetzt muss man nur noch herausfinden warum der PAC nicht antwortet, Verdrahtungsfehler? Abschlusswiederstände? richtige Teilnehmeradresse? richtiges Register? mal mit Putty oder sowas mitgehört?
 
Konsultieren wir doch mal die Hilfe. Was steht da bei done, error und status?
Anhang anzeigen 85090
jetzt muss man nur noch herausfinden warum der PAC nicht antwortet, Verdrahtungsfehler? Abschlusswiederstände? richtige Teilnehmeradresse? richtiges Register? mal mit Putty oder sowas mitgehört?


Mittlerweile bin ich soweit, das ich generell den Fehler 80C8 habe. Das bedeutet das keine Antwort kommt - kann aber so ziemlich allem liegen.
Ich habe das selbe PAC mit einer 1200er getestet, daran liegt es nicht.
Deshalb schließe ich die Verdrahtung und die Widerstände aus.
Ebenso die Adresse und die Register.
Ich habe meinen fertigen Baustein für die 1200 genommen in dem die Bausteine MB_Comm_Load und MB_Master verwendet sind genommen und diesen auf Modbus_Comm_Load und Modbus_Master umgeschrieben. Adressen und Register sind gleich geblieben.

Meiner Meinung nach unterscheiden sich die Bausteine in Ihrem inneren, vor allem durch die Startwerte. Ich vermute, dass die Werte in den MB_ Bausteinen schon passend waren, in den Modbus_ Bausteinen steht so ziemlich alles auf 0.

Einige Werte habe ich nach bestem Wissen angepasst, so wie ich es aus dem Netz und meiner Vorlage rauslesen konnte.
Da es sich aber rein garnichts am Status ändert, weiß ich natürlich nicht, ob mir noch Parameter fehlen oder die vorhanden falsch sind.
Über die Hilfe werde ich halt wirklich nicht mehr schlauer.

Deshalb wäre vielleicht ein Beispiel Projekt mit funktionierenden Parameter nicht verkehrt.


Mitgehört habe ich noch nicht, dass könnte ich mal testen. Muss ich mich erstmal schlau machen, wie das funktioniert :D
 
Habe ich mehrfach ausprobiert.
Eigentlich sollte doch A auf A und B auf B korrekt sein, oder nicht?
Sollte, ist es aber nicht immer.
Beachte das der Modbus_comm_load diverse Parameter im Stat bereich der Schnittstelle hat.
Die müssen entsrpechend deiner Teilnehmer gefüttert werden.
Code:
    REGION Call CommLoad
        #instCommLoadMaster.LINE_PRE := #RTUParameter.linePreset;
        #instCommLoadMaster.ICHAR_GAP := #RTUParameter.InterCharGap;
        #instCommLoadMaster.RETRIES := #RTUParameter.retries;
        #instCommLoadMaster.MODE := #RTUParameter.mode;
        #instCommLoadMaster.BRK_DET := #RTUParameter.brakeDetection;
        #instCommLoadMaster.EN_DIAG_ALARM := #RTUParameter.enableDiagAlarm;
        #instCommLoadMaster.STOP_BITS := #RTUParameter.stopBits;
        #instCommLoadMaster.EN_SUPPLY_VOLT := #RTUParameter.enableSupplyVoltage;
        #instCommLoadMaster("PORT" := #PtP_Port,
                            BAUD := #RTUParameter.baud,
                            PARITY := #RTUParameter.parity,
                            FLOW_CTRL := #RTUParameter.flowControl,
                            RTS_ON_DLY := #RTUParameter.rtsOnDelay,
                            RTS_OFF_DLY := #RTUParameter.rtsOffDelay,
                            RESP_TO := #RTUParameter.respondsTime,
                            MB_DB := #Modbus_Master_Instance.MB_DB);
    END_REGION
Das ist ja das schöne an den Siemens Bausteinen. Sie halten sich so schön NICHT an den Siemens Programmier Styleguide ;-)
 
Sollte, ist es aber nicht immer.
Beachte das der Modbus_comm_load diverse Parameter im Stat bereich der Schnittstelle hat.
Die müssen entsrpechend deiner Teilnehmer gefüttert werden.
Code:
    REGION Call CommLoad
        #instCommLoadMaster.LINE_PRE := #RTUParameter.linePreset;
        #instCommLoadMaster.ICHAR_GAP := #RTUParameter.InterCharGap;
        #instCommLoadMaster.RETRIES := #RTUParameter.retries;
        #instCommLoadMaster.MODE := #RTUParameter.mode;
        #instCommLoadMaster.BRK_DET := #RTUParameter.brakeDetection;
        #instCommLoadMaster.EN_DIAG_ALARM := #RTUParameter.enableDiagAlarm;
        #instCommLoadMaster.STOP_BITS := #RTUParameter.stopBits;
        #instCommLoadMaster.EN_SUPPLY_VOLT := #RTUParameter.enableSupplyVoltage;
        #instCommLoadMaster("PORT" := #PtP_Port,
                            BAUD := #RTUParameter.baud,
                            PARITY := #RTUParameter.parity,
                            FLOW_CTRL := #RTUParameter.flowControl,
                            RTS_ON_DLY := #RTUParameter.rtsOnDelay,
                            RTS_OFF_DLY := #RTUParameter.rtsOffDelay,
                            RESP_TO := #RTUParameter.respondsTime,
                            MB_DB := #Modbus_Master_Instance.MB_DB);
    END_REGION
Das ist ja das schöne an den Siemens Bausteinen. Sie halten sich so schön NICHT an den Siemens Programmier Styleguide ;-)
Denke hier liegt auch das Problem. Ich habe die Parameter soweit beschrieben.
Ein paar kann man aus der Doku heraus lesen, bei anderen hilft nur raten.
Deshalb denke ich, grundsätzlich funktionierende Parameter wären hilfreich - einfach um Fehler ausschließen zu können. So ist es aktuell nur blindflug.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Es gibt keine Grundsätzlich funktionierende Parameter in einer seriellen Buskommunikation. Die sind abhängig von deiner Buskonfiguration. Aber wenns doch bei der 1200er gelaufen ist, schreib deren parameter nieder und übertrage sie in die 1500er. Req des commload nicht vergessen. Und schau mal ob du mit einem terminalprogramm ob dieselben telegramme bei der 150.er rauskommen wie sie es bei der 1200 tun.
 
Heyho, ich hatte heute zufällig ein ähnliches Problem und habe es gelöst. Ich hatte im Comm_load instanz-DB vergessen den Mode auf 4 (Halbduplex RS485) zu stellen. Danach hatte ich auch eine Rückmeldung über die Rx Leitung.

Jetzt weiß ich nur noch nicht, wie ich verschiedene Register nacheinander ansprechen kann.

Grüße
 
Zurück
Oben