MDX61B0005-5A3 mit DFP21B Byteverdr. Big_Endian zu Little_Endian ändern, möglich?

Andrax

Level-1
Beiträge
84
Reaktionspunkte
3
Zuviel Werbung?
-> Hier kostenlos registrieren
Guten Morgen,

ich betreibe den Umrichter MDX61B0005-5A3 mit DFP21B außerhalb der Siemenswelt.
Standardmäßig kommt das Profibus-telegramm vom DFP21B im Big_Endian Format.
Ich benötige es aber im Little_Endian Format.
Ich habe mir jetzt zwar eine entsprechende Funktion geschrieben, welche die Bytes in die richtige Reihenfolge schiebt, aber schöner wärs natürlich wenn ich die Daten gleich in
der richtigen Reihenfolge bekommen würde und ich auf die Funktion verzichten könnte.

Ist das möglich?

Besten Gruß

Andre
 
Schade, dafür gibt es scheinbar keine Lösung.Also bleibt es beim Umsetzer, der mit die Bytes in die richtige Reihenfolge schiebt.Grußandre
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Die "richtige" Reihenfolge ist die, die im Profibus-Standard festgeschrieben ist. Wenn Dein Telegramm-Empfänger die Rohdaten nicht interpretieren kann und deshalb nicht umdreht, Dein Prozessor die einzelnen Datenpunkte aber andersrum braucht, dann mußt Du die halt in Deinem Anwenderprogramm umdrehen.

Harald
 
Hatte bei anderen Herstellern gesehen, das dies geht. Daher meine Frage.Es funktioniert auch so, hab mir eine entsprechende Funktion geschrieben.GrußAndre
 
Hallo,

vielleicht könnte das hier die Lösung sein:

Code:
FUNCTION_BLOCK FB_SEW
VAR_INPUT
 IO_ADDRESS:DWORD;   
 ENABLE_RAPID_STOP:BOOL;   
 RESET:BOOL;  
 JOG_PLUS_MODE:BOOL;   
 JOG_MINUS_MODE:BOOL;  
 REF_TRAVEL_MODE:BOOL;   
 POSITIONING_MODE:BOOL;   
 SETPOINT_POS:DINT;   
 SETPOINT_SPEED:INT;   
 START_RAMP:INT;   
 STOP_RAMP:INT;   
END_VAR
VAR_OUTPUT
 COMMUNICATION_OK:BOOL;   
 FAULT_OF_AXIS:BOOL;   
 WARNING_OF_AXIS:BOOL;   
 INVERTER_READY:BOOL;   
 REFERENCED:BOOL;   
 TARGET_POS_REACHED:BOOL;   
 AXIS_INTERLOCKED:BOOL;   
 FAULT_NO:INT;   
 ACTUAL_POSITION:DINT;   
 ACTUAL_SPEED:INT;   
 ACTUAL_CURRENT:INT;   
END_VAR
VAR
 PI: ARRAY[1..6] OF WORD;   
 PO: ARRAY[1..6] OF WORD;   
 DPRD_RET_VAL:DWORD;   
 DPWR_RET_VAL:DWORD;   
 tempRef:BOOL;   
 tempPos:BOOL;   
 DPRD_DAT: CommFB.RDREC; 
 DPWR_DAT: CommFB.WRREC;
END_VAR


//BEGIN


//DPRD_DAT: Konsistente Daten eines DP-Normslaves lesen
DPRD_DAT(REQ:=TRUE , 
      ID:=IO_ADDRESS , 
         MLEN := TO_INT(SIZEOF(PI)), 
      RECORD:= ADR(PI),  
      STATUS=>DPRD_RET_VAL );
IF DPRD_RET_VAL = 0 THEN COMMUNICATION_OK:=TRUE;
//bei fehlerfreiem Lesen werden die Prozesseingangsdaten verarbeitet:
ACTUAL_POSITION:=SHL(WORD_TO_DINT(PI[2]),16)+ WORD_TO_DINT(PI[3]); //Istposition aus High- + Low-Word zusammensetzen 
ACTUAL_SPEED:=WORD_TO_INT(PI[4]);
ACTUAL_CURRENT:=(WORD_TO_INT(PI[5]))/10;
  
INVERTER_READY:=PI[1].1;// Bit 1: Umrichter betriebsbereit
WARNING_OF_AXIS:=PI[1].1 AND PI[1].5;// bereit und Fehler => Warnung
FAULT_OF_AXIS:=NOT PI[1].1 AND PI[1].5;// nicht bereit und Fehler => Störung;
REFERENCED:=PI[1].2;//Achse referenziert;
TARGET_POS_REACHED:=PI[1].3; //Zielposition erreicht;
  
IF PI[1].5=TRUE THEN 
FAULT_NO:= WORD_TO_INT (SHR ( PI[1] , 8) );(*extrahieren des Statusbyte1 aus Statuswort1 und FU Fehlercode ausgeben*)
ELSE 
FAULT_NO:=0; 
END_IF; //Im Fehlerfall den Fehlercode ausgeben; andernfalls 0 ausgeben.
//Steuerbefehle:
PO[1].1:=ENABLE_RAPID_STOP; //Steuerwort, Bit 1: Freigabe/Schnellstopp;
PO[1].6:=RESET; //Fehler quittieren;
//Definition der Modi: 
//exklusiv Jog+ angewählt:
PO[1].9:=(JOG_PLUS_MODE AND NOT JOG_MINUS_MODE AND NOT REF_TRAVEL_MODE AND NOT POSITIONING_MODE);
//exklusiv Jog- angewählt:
PO[1].10:=(NOT JOG_PLUS_MODE AND JOG_MINUS_MODE AND NOT REF_TRAVEL_MODE AND NOT POSITIONING_MODE);
//exklusiv Referenzieren angewählt:
tempRef:=(NOT JOG_PLUS_MODE AND NOT JOG_MINUS_MODE AND REF_TRAVEL_MODE AND NOT POSITIONING_MODE);
//exklusiv Positionieren angewählt:
tempPos:=(NOT JOG_PLUS_MODE AND NOT JOG_MINUS_MODE AND NOT REF_TRAVEL_MODE AND POSITIONING_MODE);                                                                                                          //  
//Def. Mode_low;
PO[1].11:=PO[1].9 OR PO[1].10 OR tempPos; 
//Def. Mode_high;
PO[1].12:=tempRef OR tempPos; //Def. Mode_high;
//Wenn ein Modus angewählt ist, wird automatisch die Freigabe [X2] gesetzt:
PO[1].2:=PO[1].11 OR PO[1].12;
//Wenn keine Freigabe gesetzt ist, wurde kein oder mehrere Modi angewählt:
AXIS_INTERLOCKED:=NOT PO[1].2;
//Das Startsignal wird (zeitverzögert) gesetzt, wenn die Bremse gelüftet ist; erforderliche Zeitverzögerung für MDX-A 
PO[1].8:=PI[1].4; 
  
  //ungenutzte Steuerwortbits ablöschen:
PO[1].0:=FALSE;  //Bit 0: Reglersperre,..,..
PO[1].3:=FALSE;
PO[1].4:=FALSE;
PO[1].5:=FALSE;
PO[1].7:=FALSE;
PO[1].13:=FALSE;
PO[1].14:=FALSE;
PO[1].15:=FALSE;
//"Analog"-Werte wandeln & zuweisen:  
PO[2]:=DINT_TO_WORD(SHR(SETPOINT_POS,16)); //High Word der Zielposition wandeln/rangieren
PO[3]:=DINT_TO_WORD(SETPOINT_POS);//Low-Word der Zielposition wandeln/rangieren
PO[4]:=INT_TO_WORD(SETPOINT_SPEED);
PO[5]:=INT_TO_WORD(START_RAMP);
PO[6]:=INT_TO_WORD(STOP_RAMP);
  ELSE 
JMP END; //wenn das Lesen der Prozesseingsgsdaten (DPRD_DAT) mit Fehler beendet wurde, wird das Schreiben übersprungen (DPWR_DAT)... 
 
End_If;
//DPWR_DAT: Konsistente Daten eines DP-Normslaves schreiben 
DPWR_DAT(
 REQ:=TRUE , 
 ID:=IO_ADDRESS ,  
 LEN:=TO_INT(SIZEOF(PO)) , 
 RECORD:=ADR(PO) ,  
 STATUS=>DPWR_RET_VAL );
END:IF  DPRD_RET_VAL <> 0 OR DPWR_RET_VAL <> 0 THEN
COMMUNICATION_OK:=FALSE; //Ausgänge ablöschen, wenn ein Lese/Schreibfehler aufgetreten ist:
FAULT_OF_AXIS:=FALSE; 
WARNING_OF_AXIS:=FALSE;
INVERTER_READY:=FALSE;
REFERENCED:=FALSE; 
TARGET_POS_REACHED:=FALSE; 
AXIS_INTERLOCKED:=FALSE; 
FAULT_NO:=0;
ACTUAL_POSITION:=0;
ACTUAL_SPEED:=0;
ACTUAL_CURRENT:=0;
End_If;

//END FUNCTION BLOCK

Dieser FB ist in CoDeSys 3 angepasst für MDX61 SEW Antriebe mit Profinet oder Profibus kom.

Schöne Grüße
 
Zurück
Oben