TIA S7-1510 CM Ptp => Modbus Kommunikation

Sickone4

Level-2
Beiträge
78
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo,
ich möchte mit meiner ET200SP mit dem Kommunikationsmodul CM Ptp via Modbus mit einem Vestamatic SMI Interface kommunizieren.
Leider bekomme ich das nicht mal im Ansatz hin. Es liegt wohl eher nicht an der Programmierung der Befehle, sondern daran zu verstehen
was RS485 hier bedeutet und wie man das anspricht.

Kennen tue ich Modbus und ich habe bereits via TCP beispielsweise mit HoldingRegister zutun gehabt.
Hier ist es ein zwei Draht Anschluss am CM.

Also ModBus TCP scheidet aus.

Angaben des Herstellers:
4.1.2
RS-485 BUS RS-485 ist der Kommunikationsbus zwischen dem Host Controller und dem IF SMI RS-485 Modul. Nachstehende Konfiguration wird verwendet:
Baud-Rate: 19200
Datenbits: 8
Stoppbits: 1
Parität: keine
Signal: -7V bis +10V Gleichtakt-Eingangsspannungsbereich
Maximal zulässiger Abstand Byte-to-Byte: 5 Millisekunden

6.1 Message-Struktur

[SID] [LEN] [CMD] [DATA] [CRC16]
SID Slave ID
LEN Message-Länge (ohne CRC)
CMD Steuerbyte
DATA Optionale Datenbits
CRC16 16-Bit-Prüfsumme (zuerst LSB)

6.3 Steuerbefehle
#define MSG_UP 0x10
#define MSG_DOWN 0x11
#define MSG_STOP 0x12
#define MSG_STEP_UP 0x13
.
.
.

Leider weiß ich nicht, mit welchem Baustein ich z.B. folgende Message absetzen muss, damit das beim Interface ankommt:
Den Prüfcode habe ich berechnet mit einem Baustein der LGF Bibliothek.

6.3.1 MSG_UP
Message: [SID] / [LEN] / [CMND] / [MSK0] / [MSK1] / [CRC16]

[MSK0]: LSB der 16-Bitgruppe für die Wahl der Motoradresse 0..7.
[MSK1]: MSB der 16-Bitgruppe für die Wahl der Motoradresse 8..16.



Ich denke, dass ich den Aufbau der Bytes schon hinbekomme. Aber mit welchem Baustein sendet man sowas?
Ich spreche keine Register an...
Ich stehe da irgendwie auf dem Schlauch. Vll kann mir da jemand einen Tip geben.

Danke
MfG
S.
 
Du musst Dich mit den beiden Bausteinen Modbus_Comm_Load und Modbus Master auseinandersetzen. Näheres in der TIA-Hilfe. Beachte, dass hier teilweise die DBs dieser Siemens-Bausteine manuell konfiguriert werden müssen.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hi Ludewig,
danke schonmal vorab für deinen Tip. In den Tia Bausteinen habe ich schon rumprobiert und bin dort nicht zu einem Ergebnis gekommen.
Allerdings habe ich mich gestern noch einmal mit dem Modbus_Comm_Load und dem Modbus_Master beschäftigt.

Der Load gibt mir ein Done aus und Status 7000. Ich gehe davon aus, dass das richtig ist.
Also habe ich am Master das Req gesetzt mit den Parametern
MB_Addr = 1
Mode = 104
Data_Addr = 1
Data_Len = 7

am Data_PTR habe ich ein Array mit 20 bytes angeschlossen, ich habe aber einfach mal 7 bytes (MSG aufbau) belegt

der Status wechselt dann auf 7002 und busy.
passieren tut nun aber nichts mehr. im DB stehen meine werte, aber keine antwort.
was mir hier auch nicht aufgeht ist, dass der MB master nur einen data_ptr hat aber gleichzeitig sendet und empfängt. wo schreibe ich meine sendeseite hin und wo er seinen rcv?
 
So.
Ich bin einen Schritt weiter. Ich habe vom hersteller ein RS485 Test Tool bekommen und habe an meinem PC via USB RS485 einen der angeschlossenen Rollladen bewegt.

Dabei wird die Ausgabezeile angezeigt:

Code:
$C1        SlaveID

$05        LENGTH ohne CRC

$11        MSG_DOWN

$40        MSK0 LSB 0...7  der 16-Bitgruppe // Rolladen 6 => 0100 0000 Bit Nr 6 im LSB

$00        MSK1 MSB 8..16

$D8        Vermutlich CRC16_Modbus

$78        Vermutlich CRC16_Modbus

Wenn ich das nun via SPS versuche zu senden geht es nicht. Auf dem Interface steht dann E1 => RS485 Framing Error

Demnach gehe ich davon aus, dass es immernoch an der Konfiguration liegt. Da stehe ich auf dem Schlauch.
Wie gesagt die Befehle stehen alle in der Doku, die werde ich entsprechend aufbauen und kann sie auch mit dem USB Tool verifizieren.
 
Ich habe jetzt die Funktion des Modbus_Master nicht im Kopf, doch ich weiß, dass du nicht die Modbus-Telegramme inkl. CRC zusammenbasteln musst und auch nicht die Roh-Antworten bekommst, sondern lediglich die Inhalte der Modbus-Register.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Bitte prüfe, ob Du den Status von MB Comm Load wie in diesem Faden beschrieben auswertest:

Der Status muss 0 sein. Die 7000 sieht man zwar am Bausteinausgang regelmäßig. Relevant ist aber nur der Status in dem Moment, wenn Done = true ist.

Erst wenn das bei Dir der Fall ist, hat es Sinn, sich mit dem Master zu beschäftigen.
 
Hallo Leute,

das hat mit Modbus nichts zu tun. Die einzige Gemeinsamkeit mit Modbus (RTU) ist die Verwendung von RS-485. Da könnte man auch sagen das ist Profibus!

Das ist freie Kommunikation, da wirst Du Dir die Bausteine selbst schreiben müssen. Weiß gerade nicht welche Bausteine Du da benötigst, um direkt über die serielle Schnittstelle kommunizieren zu können.

Info zum Telegrammaufbau findet ihr hier: https://www.vestamatic.com/wp-content/uploads/2018/09/01092714_00.pdf

Gruß
 
Hi Thruser,
das Thema ob Modbus oder nciht ist mir auch durch den Kopf gegangen, da ich keine HoldingRegister habe.
Ich habe das ganze nun einmal auf Freeport umgebaut und habe den Baustein Port_Config auch mit den internen Stati fehlerfrei bekommen.

nun sende ich testweise alle 4s und die Tx LED blinkt dann kurz auf. Leider ändert sich der status am send baustein nicht. der bleibt einfach auf 7000.
ich kann aber nur den Port, also meine hw adresse, den puffer und die länge angeben. ich suche nach fehlern
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hi,

kenn mich damit nicht so aus, aber nach der Hilfe benötigst Du mind. die beiden Bausteine Send_PtP und Receive_PtP. Ersteren zum Senden der Daten und letzteren zum Empfangen der Antwort.

Wie beobachtest Du den Status? Hänge am besten mal einen Zähler an den DONE Ausgang des Send_PtP Bausteins, dann siesht Du, ob er korrekt ausgeführt wird. Einen zweiten kannst Du an den Error Ausgang setzen.

Sonst Such auch mal hier im Forum nach Send_PtP, da findest Du findest einige Beiträge.

Gruß
 
ich hab beide bausteine im einsatz und auch beide ausgänge wie du es angesprochen hast incrementiert. bei einm puls von 0.5Hz wird jedes mal mit dem done der zähler eins hochgezählt.
also macht er das. error bleibt 0!

aber wenn ich den idb aufklappe und schaue was im sendbuffer steht, dann frage ich mich die das funktioniert. dort stehen meine sendedaten an pos 2 aufwärts. pos0 in dem array ist der zähler und pos 1 weiß ich nicht. das steht auf 1.

an meinem rs485 empfänger steht nun auch kein fehler mehr. ich denke das liegt daran, dass der gar nicht angesprochen wird. seine adresse kommt schließlich erst an pos2. aber warum stehen die beiden werde da drin. das macht doch keinen sinn.

1743944688141.png

1743944710010.png

ich hab mal einen trace auf REQ, Status und done gelegt und es verhält sich exakt wie in der doku angegeben:

1743945677983.png
 
Zuletzt bearbeitet:
Hi,

die zusätzlichen Daten benötigt eventuell der Baustein selbst oder der CM.

Welche Einstellungen hast Du denn sonst für die Konfiguration? Hast Du das mit den beiden Konfigurationsbausteinen oder über die Konfiguration des Moduls gemacht?

Da Du einen USB RS485 Adapter hast, kannst Du den ja mal parallel dranhängen und dann mit Realterm oder Hercules mitschneiden was so auf den Bus gesendet wird. Dazu mußt Du dann jeweils die Hex Darstellung wählen.

Gruß
 
Zuviel Werbung?
-> Hier kostenlos registrieren
witzig :)

das habe ich gerade mit hterm gemacht.

ich habe allerdings das ziel abgeklemmt und mal geschaut.

was ich wirklich verwunderlich finde ist, dass ich die hex nachrichten mal so garnicht verstehe. das ist was völlig anderes als das was ich sende

Code:
SEND                         RS485 (HTERM)
16#1C                        16#5C
16#05                        16#DF
16#10                        16#F7
16#40                        16#FD
16#00                        16#CF
16#18                        16#AD
16#29                        16#00
 
Hi,

tausch mal die beiden Adern. Manchmal werden trotzdem Zeichen empfangen.

Ansonsten weiß ich im Augenblick auch nicht weiter.

Wenn ich es richtig verstanden haben verwendet man entweder die Hardwareeinstellungen, die Du gepostet hast, oder Port_Config, aber nicht beides. Das gleiche gilt für die Sende- und Empfangseinstellungen.

Gruß
 
Zuviel Werbung?
-> Hier kostenlos registrieren
ja was soll ich sagen. so gehts. vorher haben zwar die anzahl der bytes gestimmt, aber jetzt stimmen auch die inhalte. und nun fahren mein rolladen. ab jetzt kann ich dann einen baustein schreiben der das ganze kapselt ;)

CRC16 muss ich mit schicken.

Prinzipiell würde ich hier einen CRC16 baustein nutzen, in der LGF Bibliothek von siemens ist einer drin, allerdings habe ich die richtigenw erte nicht raus bekommen, die ich z.b. in der rs485 software angezeigt bekomme. und um ehrlich zu sein mache ich mir lieber die mühe und prüfe das mit allen adressen durch mit allen befehlen die mir wichtig sind und dann generiere ich die nicht, sondern sende sie fest. anders wär irgendwie cooler. schon allein deshalb, weil ein baustein für einen rolladen so nicht wirklich multiinstanzfähig wird. da muss ich bissi überlegen. aber danke schonmal für die hilfe!
 
CRC Berechnung ist doch im oben verlinkten PDF beschrieben:

C++:
#define CRC_CONSTANT 0xA001
word Crc16 (byte* pb, byte len)
{
byte i;
word crc;
for (crc=0xffff; len--; pb++)
{
crc ^= (byte)*pb;
for (i=8; i--; )
if (crc & 0x01)
{
crc >>= 1;
crc ^= CRC_CONSTANT;
}
else
crc >>= 1;
}
// return crc result
return crc;
}

Ins Auge fällt die CRC_CONSTANT mit 16#A001
Der Siemens Baustein sollte gefüttert mit diesem Wert die richtige CRC rausbringen
 
Ins Auge fällt die CRC_CONSTANT mit 16#A001
Der Siemens Baustein sollte gefüttert mit diesem Wert die richtige CRC rausbringen
Wohl nicht ganz, die LGF scheint SHL zu verwenden, hier wird aber SHR benötigt.

Siehe hier, da ist auch die notwendige Anpassung im letzten Post. LGF ist glaube ich offen, dann kann man sich eine Kopie erstellen und anpassen.

Gruß
 
Hallo Zusammen,

In der OSCAT Bibliothek gibt es auch eine Baustein der CRC Berechnungen kann.
Dieser muss aber von Classic SCL übersetzt werden. Was aber kein Problem ist.
Gruß TIA
 
ich möchte ja keine mimose sein :D aber ich habe nun aus zig libs und den hilfen von euch CRC16 veruscht zu erzeugen.
das ergebnis was ich gerne hätte ist 18 29.

aber weder LGF, noch der genannte forenbeitrag bringen irgendeine lösung.

anbei mal meine auswertung.

1744124994653.png

1744125021109.png

1744125040375.png

1744125053864.png

kurze erklärung:
laut der in der hilfe angegebenen webseite für CRC16 gibt es reverse ausgaben und die 8005 ist wohl das reverse von A001, dem was ich wohl brauche.

der baustein CRC16 ist mit folgendem quellcode erstellt, was dem forenbeitrag entspricht.

1744125137028.png
 
Zurück
Oben