TIA Modbus RTU

nik2099

Level-1
Beiträge
9
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Moin Freunde,

ich probiere grade meine Lüftungsanlage (Wolf CWL Exccellent 400) via Modbus an meine S7-1500 zu bekommen.

Ausgangssituatuion: CWL Modul siehe Anhang

Ich hab folgendes in SCL Programmiert:

REGION Modbus Schnittstelle einrichten
IF #Modbus_Master_Instance.MB_DB.S_PORT = 16#FFFF THEN
//#Modbus.Req := TRUE;
#Modbus_Comm_Load_Instance(REQ := #Modbus.Req,
"PORT" :="Local~CM_PtP_1",
BAUD := 9600,
PARITY := 2,
FLOW_CTRL := 0,
RTS_ON_DLY := 250,
RTS_OFF_DLY := 250,
RESP_TO := 1000,
DONE => #Modbus.Done,
ERROR => #Modbus.Error,
STATUS => #Modbus.Status,
MB_DB := #Modbus_Master_Instance.MB_DB);
#ModbusMaster.MB_Addr := 11;
END_IF;
END_REGION ;

REGION ModbusKommunikation
#Modbus_Master_Instance(REQ := #ModbusMaster.Req,
MB_ADDR := #ModbusMaster.MB_Addr,
MODE := #ModbusMaster.Mode,
DATA_ADDR := #ModbusMaster.DataAddr,
DATA_LEN := #ModbusMaster.DataLen,
DONE => #ModbusMaster.Done,
BUSY => #ModbusMaster.Busy,
ERROR => #ModbusMaster.Error,
STATUS => #ModbusMaster.Status,
DATA_PTR := #ModbusMaster.InOutData);
END_REGION ;


REGION Auswertung Modbus Master Baustein
IF #ModbusMaster.Done OR #ModbusMaster.Error THEN
#ModbusMaster.Req := FALSE;
IF #ModbusMaster.Error THEN
#Count := #Count + 1;
END_IF;
END_IF;

IF #ModbusMaster.Error THEN
#ModbusMaster.StatusSave := #ModbusMaster.Status;
END_IF;

IF #ModbusMaster.Done THEN
//#ModbusMaster.StatusSave := 0;
#ModbusMaster.StatusSave := #ModbusMaster.Status;
END_IF;
END_REGION ;



Zu beginn wird durch Einmaligen Durchlauf von dem Modbus_Comm_Load_Instance die Schnittstelle Definiert

Anschließend durchläuft der Modbus_Master_Instance Zyklisch
#ModbusMaster.MB_Addr = 11
#ModbusMaster.Mode = 3
#ModbusMaster.DataAddr = 4009
#ModbusMaster.DataLen = 4

Ich bekomme keine Verbindung. Jemand n Tipp?
 

Anhänge

Wie kommst du denn auf Mode=3? Und wieso schreibst du oben Länge=4 im Screenshot sieht man aber 100?

Ich würde für Funktionscode 0x03 MODE 0 verwenden, dann muss man aber soweit ich weiß 40000 auf die Adresse aufaddieren.

Beim Modbus_Comm_Load existiert auch noch ein Parameter der nicht über die Bausteinschnittsteller erreichbar ist, sondern direkt in die Instanz geschrieben werden muss. Und zwar die Variable MODE die zumindest mal Default auf 0 stand, und für RS485 Zweidrahtbetrieb auf 4 gesetzt werden muss. Aber schau dazu bitte nochmal in der Hilfe zu deiner konkreten Bausteinversion nach, ich meine da hat sich auch mal etwas geändert.
 
Sorry, die Länge ist aus versuchen schon anders gewesen. :D

oke gut. Das in der Modbus_Comm_Load hab ich gesehen mit dem Mode auf 4.

jetzt muss du mir nochmal helfen... Der Funktionscode. Wo muss der drin stehen?


#Modbus_Master_Instance(REQ := #ModbusMaster.Req,
MB_ADDR := 11 also Dezimal
MODE := Muss hier jetzt einfach eine 0 rein?
DATA_ADDR :=4009 (Aus dem CWL Modbus Dokument)
DATA_LEN :=4 Wenn ich die Länge nicht genau kenne würd ich erstmal eine 4 nehmen. Wenn der Platz nicht reicht, bekomm ich nur zu wenig daten
DONE => #ModbusMaster.Done,
BUSY => #ModbusMaster.Busy,
ERROR => #ModbusMaster.Error,
STATUS => #ModbusMaster.Status,
DATA_PTR := Hier wird der Gelesene Rückgabewert eingetragen oder?);


Sorry ich Startet grade erst mit dem Thema, darum einige vielleicht Anfänger fragen...
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Siemens hat sich überlegt, dass die Parametrierung nichts mit dem Modbus Protokoll an sich zu tun hat. Warum auch immer das so kryptisch gestaltet wurde, und dass man in den Instanzen rumschmieren muss. Das Modbus Protokoll ist absolut simpel, frag mich nicht warum Siemens das so verkompliziert hat.

Mit MODE = 0 müsstest du imho um 4009 zu lesen als DATA_ADDR 44009 angeben. Wenn das funktioniert und du unplausible Werte erhältst, würde ich mal 44008 oder 44010 versuchen, denn einige Hersteller beginnen mit Adresse 0 und andere mit 1.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Ist aktiv,
ja hab ich . keine Lösung..



also bin jetzt beim Stand dass wieder die Fehler 81E2 und 81E7 sich abwehseln.

Ich werde heut erstmal Abbrechen. Erstaml schonmal danke für die Hilfe
 
Ich lese aktuell nur 4 aus....

Aktuell hab ich wieder die Meldung
16#80C8

ich versteh aktuell nicht, was ich noch machen kann....

aber heut erstmal feierabend
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Ich hab mit diese Einstellungen als Modbus Slave Verbindung bekommen.

Mach mal screenshots von deiner Hardwareeinsteuungen am PTP Karte.
Ich hatte schon mal das ich zum Teufel keine Verbindung bekommen hab. trotz 1000 mal Eistellungen kontrollieren.
Dann hab ich die PTP Karte gelöscht, cpu geladen, Karte wieder neu eingefügt und eingestellt, und dann auf 1 mal Verbindung..
Mann brauch manchmal durchhaltevermögen bei Modbus.

Code:
REGION Initialisieren Modbus Anbindung mit Modbus Comm LOAD
    
    #Modbus_Comm_Load_Instance.MODE := 4;
    #"Initialisieren Modbus Load"(IN:="FirstScan",
                                         PT:=t#5s);
          
           IF #"Initialisieren Modbus Load".Q THEN
               #Modbus_Comm_Load_Instance(REQ := true,
                                          "PORT" := "Local~Modbus_RTU_Slave",
                                          BAUD := 9600,
                                          PARITY := 0,
                                          RESP_TO := 2000,
                                          STATUS => #Status_Com_Load,
                                          MB_DB := #Modbus_Slave_Instance.MB_DB);
           END_IF;
END_REGION


REGION Kommunizieren mit Modbus Slave
 
     #Modbus_Slave_Instance.HR_Start_Offset := 16#12C;    // Startoffset Modbusregister auf Register 40300 (HEX vorgabe)
  
     #Modbus_Slave_Instance(MB_ADDR := 49,
                            STATUS => #Status_Slave,
                            MB_HOLD_REG := "Modbus_ABB_Symphony");
 END_REGION
 
Zurück
Oben