-> Hier kostenlos registrieren
Hallo zusammen,
ich habe aktuell ein Projekt, bei dem ich ein Slave-Gerät der DF-C 61XXX-Serie über Modbus RTU mit TwinCAT 3 steuern möchte. Dabei benutze ich eine Beckhoff EL6002 (RS232-Klemme). Mein Ziel ist es, die Frequenz auf das Slave-Gerät zu schreiben und andere Werte wie Spannung oder Strom auszulesen.
Projektbeschreibung:
• Hardware:
• Beckhoff CX5020 mit EL6002-Klemme (RS232)
• Modbus-RTU-fähiges Slave-Gerät: DF-C 61XXX-Serie
• Kommunikation:
• Modbus RTU
• Baudrate: 9600
• Datenbits: 8
• Stopbits: 2
• Parität: N
• Slave-Adresse: 100
• Register:
• Frequenz schreiben: 0x0007 (Frequency Setting, R/W, Einheit: 0.1 Hz)
• Output Start/Stop: 0x0009 (Control Command, W, Werte: 0x0000 für Stop, 0x0001 für Start)
Was funktioniert bereits:
1. Output Start/Stop:
• Schreiben von 0x0000 (Stop) und 0x0001 (Start) in das Register 0x0009 funktioniert einwandfrei. Das Slave-Gerät reagiert korrekt.
2. Kommunikation:
• Es treten keine Fehler während der Kommunikation auf. Das Slave-Gerät bestätigt die Befehle mit korrekten Antworten.
Problem:
• Beim Schreiben eines Frequenzwerts (z. B. 62.0 Hz → 620 in 0.1 Hz) in das Register 0x0007 gibt es keine sichtbare Reaktion am Slave-Gerät.
• Der Schreibvorgang wird als erfolgreich gemeldet (kein Fehlercode), aber der Wert wird nicht angezeigt oder übernommen.
Verwendeter Code:
FUNCTION_BLOCK Modbus_rtu
VAR_ INPUT
newVarInput: UINT;
freqValue : UINT;// Frequency value (e.g., 62.0 Hz -> 620 in 0.1Hz resolution)
voltValue : UINT;// Voltage value (e.g., 120.0V -> 1200 in 0.1V resolution)
outputCommand: UINT: // Command to control output (e.g., 1 for start output)
enable: BOOL;
END_VAR
VAR OUTPUT
bSuccess : BOOL; // Indicates if the operation was successful
bBusy: BOOL; // Indicates if the operation is in progress
bError : BOOL; // Indicates if an error occurred uiErrorID: UINT; // Error ID in case of failure
END VAR
VAR
fregRegisterAddress : UINT :=7; // Register address for frequency
voltRegisterAddress : UINT := 8; // Register address for voltage
outputRegisterAddress : WORD:= 9; // Register address for output control
wqauntity: WORD:=1;
uid: BYTE:=100;
data _write: WORD:=16#0001;// Outputstart
data_writefreq: WORD:=16#0258 // Example: Data returned as 0x0258 HEX 0x0258 = Value 600, the output frequency of device is 60.0Hz
ModbusRtu: ModbusRtuMasterV2_RL6x22B;
Execute: BOOL;
END VAR
ModbusRtu.WriteSingleRegister
(UnitID:-uid,
Quantity:=wqauntity,
MBAddr: =outputRegisterAddress,
cbLength:=SIZEOF (data_write) .
pMemoryAddr:=ADR(data_write) ,
Execute:-enable,
);
ModbusRtu.WriteSingleRegister
(UnitID:-uid,
Quantity:=wqauntity,
MBAddr: = fregRegisterAddress,
cbLength:=SIZEOF (data_writefreq) .
pMemoryAddr:=ADR(data_writefreq) ,
Execute:-enable,
);
Analyse bisher:
1. Register-Adresse: Die Adresse 0x0007 für Frequency Setting ist laut Dokumentation korrekt.
2. Skalierung: Der Frequenzwert wird in 0.1 Hz gesendet (z. B. 62.0 Hz → 620).
3. Datenformat: Es wird ein UINT-Wert im Big-Endian-Format gesendet (High Byte zuerst).
4. Slave reagiert nicht: Obwohl der Schreibvorgang erfolgreich ist, zeigt das Slave-Gerät den Wert nicht an.
Fragen:
1. Was könnte die Ursache dafür sein, dass das Slave-Gerät den Frequenzwert nicht anzeigt, obwohl die Kommunikation erfolgreich ist?
2. Gibt es spezielle Anforderungen beim Schreiben in Register, die sowohl Lesen als auch Schreiben (R/W) erlauben?
3. Muss ich den Wert über ein weiteres Command bestätigen?
4. Hat jemand Erfahrung mit der DF-C 61XXX-Serie oder ähnlichen Geräten?
Ich freue mich über eure Tipps und Rückmeldungen! Vielen Dank vorab.
Beste Grüße,
ich habe aktuell ein Projekt, bei dem ich ein Slave-Gerät der DF-C 61XXX-Serie über Modbus RTU mit TwinCAT 3 steuern möchte. Dabei benutze ich eine Beckhoff EL6002 (RS232-Klemme). Mein Ziel ist es, die Frequenz auf das Slave-Gerät zu schreiben und andere Werte wie Spannung oder Strom auszulesen.
Projektbeschreibung:
• Hardware:
• Beckhoff CX5020 mit EL6002-Klemme (RS232)
• Modbus-RTU-fähiges Slave-Gerät: DF-C 61XXX-Serie
• Kommunikation:
• Modbus RTU
• Baudrate: 9600
• Datenbits: 8
• Stopbits: 2
• Parität: N
• Slave-Adresse: 100
• Register:
• Frequenz schreiben: 0x0007 (Frequency Setting, R/W, Einheit: 0.1 Hz)
• Output Start/Stop: 0x0009 (Control Command, W, Werte: 0x0000 für Stop, 0x0001 für Start)
Was funktioniert bereits:
1. Output Start/Stop:
• Schreiben von 0x0000 (Stop) und 0x0001 (Start) in das Register 0x0009 funktioniert einwandfrei. Das Slave-Gerät reagiert korrekt.
2. Kommunikation:
• Es treten keine Fehler während der Kommunikation auf. Das Slave-Gerät bestätigt die Befehle mit korrekten Antworten.
Problem:
• Beim Schreiben eines Frequenzwerts (z. B. 62.0 Hz → 620 in 0.1 Hz) in das Register 0x0007 gibt es keine sichtbare Reaktion am Slave-Gerät.
• Der Schreibvorgang wird als erfolgreich gemeldet (kein Fehlercode), aber der Wert wird nicht angezeigt oder übernommen.
Verwendeter Code:
FUNCTION_BLOCK Modbus_rtu
VAR_ INPUT
newVarInput: UINT;
freqValue : UINT;// Frequency value (e.g., 62.0 Hz -> 620 in 0.1Hz resolution)
voltValue : UINT;// Voltage value (e.g., 120.0V -> 1200 in 0.1V resolution)
outputCommand: UINT: // Command to control output (e.g., 1 for start output)
enable: BOOL;
END_VAR
VAR OUTPUT
bSuccess : BOOL; // Indicates if the operation was successful
bBusy: BOOL; // Indicates if the operation is in progress
bError : BOOL; // Indicates if an error occurred uiErrorID: UINT; // Error ID in case of failure
END VAR
VAR
fregRegisterAddress : UINT :=7; // Register address for frequency
voltRegisterAddress : UINT := 8; // Register address for voltage
outputRegisterAddress : WORD:= 9; // Register address for output control
wqauntity: WORD:=1;
uid: BYTE:=100;
data _write: WORD:=16#0001;// Outputstart
data_writefreq: WORD:=16#0258 // Example: Data returned as 0x0258 HEX 0x0258 = Value 600, the output frequency of device is 60.0Hz
ModbusRtu: ModbusRtuMasterV2_RL6x22B;
Execute: BOOL;
END VAR
ModbusRtu.WriteSingleRegister
(UnitID:-uid,
Quantity:=wqauntity,
MBAddr: =outputRegisterAddress,
cbLength:=SIZEOF (data_write) .
pMemoryAddr:=ADR(data_write) ,
Execute:-enable,
);
ModbusRtu.WriteSingleRegister
(UnitID:-uid,
Quantity:=wqauntity,
MBAddr: = fregRegisterAddress,
cbLength:=SIZEOF (data_writefreq) .
pMemoryAddr:=ADR(data_writefreq) ,
Execute:-enable,
);
Analyse bisher:
1. Register-Adresse: Die Adresse 0x0007 für Frequency Setting ist laut Dokumentation korrekt.
2. Skalierung: Der Frequenzwert wird in 0.1 Hz gesendet (z. B. 62.0 Hz → 620).
3. Datenformat: Es wird ein UINT-Wert im Big-Endian-Format gesendet (High Byte zuerst).
4. Slave reagiert nicht: Obwohl der Schreibvorgang erfolgreich ist, zeigt das Slave-Gerät den Wert nicht an.
Fragen:
1. Was könnte die Ursache dafür sein, dass das Slave-Gerät den Frequenzwert nicht anzeigt, obwohl die Kommunikation erfolgreich ist?
2. Gibt es spezielle Anforderungen beim Schreiben in Register, die sowohl Lesen als auch Schreiben (R/W) erlauben?
3. Muss ich den Wert über ein weiteres Command bestätigen?
4. Hat jemand Erfahrung mit der DF-C 61XXX-Serie oder ähnlichen Geräten?
Ich freue mich über eure Tipps und Rückmeldungen! Vielen Dank vorab.
Beste Grüße,