Dint aufteilen

Wenn es vier Byte sein sollen dann am Besten mit einem Union. Du schreibst in das DINT den 32Bit Wert rein und liest ihn mit den 4 einzelnen Byte aus. Die vier einzelnen musst du halt in eine Struktur packen und neben das DINT legen.

Btw. ein wenig mehr info wäre schon toll...

Code:
TYPE myUnion :
UNION
  diagCode : DINT;
  diagStruct : MyDiagStruct;
END_UNION
END_TYPE

Code:
TYPE MyDiagStruct :
STRUCT
  diagByte1 : BYTE;
  diagByte2 : BYTE;
  diagByte3 : BYTE;
  diagByte4 : BYTE;
END_STRUCT
END_TYPE

Code:
myUnionVar : myUnion;
dummyByte : BYTE;

myUnionVar.diagCode := 156;

dummyByte := myUnionVar.diagByte1;
 
jupp, wie gesagt mit einem Union kannst du die 4 Byte DINT Wert schön in 4 einzelne Bytes aufteilen und getrennt versenden.
 
Wie Du ich Dir hier schon schrieb, musst Du die Byte-Reihenfolge tauschen (Codesys verwendet Little-Endian, doch Dein Motorkontroller will die Werte als Big-Endian) - das ist über so eine Union sehr einfach machbar:
Code:
myUnionVar.DintVar := 150;

myMotorCmd.Byte4 := myUnionVar.Byte4;
myMotorCmd.Byte5 := myUnionVar.Byte3;
myMotorCmd.Byte6 := myUnionVar.Byte2;
myMotorCmd.Byte7 := myUnionVar.Byte1;

Harald
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Erstmal danke für die Info's. Aber so wirklich komme ich nicht weiter. Den letzten Abschnitt mit Little Endian und Big Endian versteh ich. Aber wie ich die einzelnen Bytes aus dem DINT bekommen nicht.

LG
 
Union = mehrere Variablen auf die selbe Speicheradresse legen
- ein DINT = 32 Bit besteht aus 4 Bytes
- Du deklarierst in der Union einen DINT, der kommt in die 4 aufeinanderfolgende Bytes an Adresse x
- Du deklarierst in der Union ein Struct von 4 Bytes, der kommt in 4 aufeinanderfolgende Bytes an der selben Adresse x
- Du speicherst einen DINT in die DINT-Variable an der Adresse x
- Du holst nacheinander die Bytes von der Adresse x, x+1, x+2 und x+3

Harald
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo,

ich habe es nun mit dieser Variante gelöst:
VAR
value : DINT;
valueDataPtr : POINTER TO DINT;
arrayValue : ARRAY[0..3] OF BYTE;
Data : ARRAY[0..8]OF BYTE;
END_VAR
....
valueDataPtr := ADR (arrayValue[0]);
valueDataPtr^:= value;
Data[4] := arrayValue[3];
Data[5] := arrayValue[2];
Data[6] := arrayValue[1];
Data[7] := arrayValue[0];
.....

Nun weiß ich aber nicht wie ich den Wert in ASCII umwandle. Oder muss ich diesen gar nicht umwandeln. Steh leider dabei etwas auf der Leitung.

LG
 
Warum in ASCII umwandeln? Dein Bild zeigt, daß der Motorkontroller die Datenbytes rein binär braucht. In Deinem anderen Thread haben wir Dir mehrmals geschrieben daß Du nichts umwandeln brauchst (außer die Byte-Reihenfolge tauschen).

PS:
"POINTER" klingt wohl "professioneller" als "UNION"? ;) Oder kann Deine Sabo keine UNIONs? Ich finde die UNION-Formulierung besser verständlich:
Code:
VAR
  value : DINT;
  U : UNION
    dintValue : DINT;
    arrayValue : ARRAY[0..3] OF BYTE;
  END_UNION;
  Data : ARRAY[0..8] OF BYTE;
END_VAR

U.dintValue := value;

Data[4] := U.arrayValue[3];
Data[5] := U.arrayValue[2];
Data[6] := U.arrayValue[1];
Data[7] := U.arrayValue[0];

Harald
 
Ich war im falschen Forum, dachte dass es das Simatic-Forum ist.

Grüße
INERAX
 
Zuletzt bearbeitet:
Vielleicht denken wir ja alle schon viel zu kompliziert.
Aber Beispiel:
MD32 besteht aus:
- MB32
- MB33
- MB34
- MB35
Vielleicht denken manche viel zu befangen? ;)
Hier geht es um eine SPS die mit Codesys programmiert wird, da besteht das MD32 aus MB128, MB129, MB130, MB131. Und höchstwahrscheinlich wird der Fragesteller nicht absolut adressieren sondern symbolisch programmieren wollen. Und allerhöchstwahrscheinlich wird er seine Variablen nicht in den Speicherbereich der Merker legen. :cool:

Harald
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Anhang anzeigen 39522

Das ist nun der Wert der gesendet werden soll damit der Motor stoppt.
Leider tut er das nicht.:icon_frown::icon_frown::icon_frown:
Deine Command-Message Data[0]..Data[8] enthält keine Command-Nummer und die Checksum ist falsch.
Irgendwie hast Du die Message verkehrt herum zusammengebastelt?

Im Handbuch Kapitel 3.3 sieht das Motor-Stop-Command Beispiel so aus:
DATA[0] = 1 //Motor-Nummer
DATA[1] = 3 //Command Nummer MST
DATA[2] = 0 //Type
DATA[3] = 1 //Motor
DATA[4] = 0 //Operand
DATA[5] = 0 //Operand
DATA[6] = 0 //Operand
DATA[7] = 0 //Operand
DATA[8] = 5 //Checksum


Harald
 
Unbenannt.jpg
Hab ich auf diese Art auch schon versucht. Wenn ich mich mittels serielle Schnittstelle auf den Motorcontroller hänge sehe ich das bei Data[0] eine 6 reingehört. Über USB wird eine 1 angezeigt.
 

Anhänge

  • Unbenannt.jpg
    Unbenannt.jpg
    46,9 KB · Aufrufe: 7
... serielle Schnittstelle ... sehe ich das bei Data[0] eine 6 reingehört.
Über USB wird eine 1 angezeigt.
... und ich sehe in Deinem Bildchen, dass Du Data[0] mit 9 vorbesetzt.
Die serielle Schnittstelle zeigt Dir, was reingehört,
der universelle serielle Bus zeigt Dir, was drin steht und
Dein ScreenShot zeigt mir, wie Du es gerne haben möchtest?
Wie kriegen wir das denn alles unter einen Hut?
Ist den Deine maximal zulässige MotorNr die 7?
Greift da irgend eine mitdenkende Instanz ein und kappt deshalb das Bit 3 der Nr 9, so dass Nr 1 übrigbleibt?
Gruss, Heinileini
 
Zurück
Oben