26 Bit vorzeichenrichtig auf DINT

sps_horst

Level-1
Beiträge
13
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo Kollegen,

ich habe ein kleines Problem mit einem Stegmann-Sick geber ATM60.

Ich bekomme vom Geber einen 26 bit Vorzeichen behaften Wert. Nun habe ich gewisse Probleme den Wert auf einen 32 Bit DINT mit richtigem Vorzeichen zu bringen.:confused:

Selbstverständlich kann dass das DTR nicht.:(

Danke im Voraus für die Hilfe.:D

mfg

horst
 
Hallo Horst,
ich würde mir das 26 Bit aus dem DINT ausmaskieren. Nun kannst du den DINT in REAL wandeln und anschließend, wenn das Bit gesetzt sein sollte das Ganze mit -1 multiplizieren. Das geht natürlichlich auch ohne die DTR-Wandlung ...

Gruß
LL
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Selbst auf die Gefahr hin, aber bist du sicher das in den 26Bit wirklich ein Vorzeichen ist?

Laut Doku ATM60:
PMR = 8192 x 8192 = 67108864 (Rotativ)
PMaxVal = 67108864 - 1 = 67108863
PMinVal = 0

Mfg
Manuel
 
ich mache das persönlich mit dem SLD-Befehl (wenn es S7 ist). Egal was kommt, ob 10bit, 12bit, 24bit, ich schieb das alles linksbündig, dann hab ich im program scheinbar einen 32-bit-Geber, der halt einfach nur grobkörniger ist. Wenn dich die körnigkeit stört, mit SSD einfach vorzeichenrichtig das Bitmuster in die Ausgangsposition zurückschieben ...
 
Hallo Perfektionist,

Danke für den Tipp, habe schon länger drüber nachgedacht wie ich das 2'er Kompliment ergänzen kann oder dgl. aber

SLD
SSD

ist eine eine schnelle und sehr saubere Lösung.
Ich hab's wie folgt gelöst (AWL Quelle), falls jemand den Code brauchen kann.

mfg

SPS_Horst


FUNCTION_BLOCK "Encoder ATM60"
TITLE =
VERSION : 0.1

VAR_INPUT
Preset : BOOL ;
PresetValue : REAL ;
RollDiameter : REAL ;
CPR : INT ;
ADDR_RD : WORD ;
ADDR_WR : WORD ;
END_VAR
VAR_OUTPUT
Position : REAL ;
END_VAR
VAR
EFPreset : BOOL ;
Rec : STRUCT
Position : DWORD ;
END_STRUCT ;
Snd : STRUCT
Preset : DWORD ;
END_STRUCT ;
END_VAR
VAR_TEMP
Value : DWORD ;
RetVals : STRUCT
DPRD : INT ;
DPWR : INT ;
END_STRUCT ;
Factor : REAL ;
Sign : BOOL ;
END_VAR
BEGIN
NETWORK
TITLE =reading in of PZD (Process data)
CALL "DPRD_DAT" (
LADDR := #ADDR_RD,
RET_VAL := #RetVals.DPRD,
RECORD := #Rec);
NOP 0;
NETWORK
TITLE =Calculate count disdance for count per rotation
L #RollDiameter;
L 3.141593e+000;
*R ;
L #CPR;
DTR ;
/R ;
T #Factor; // disdance for 1 count
L #Rec.Position;
SLD 6;
SSD 6;
DTR ;
L #Factor;
*R ;
T #Position;
NOP 0;
NETWORK
TITLE =Set to 0
//#Rec.Position
U #Preset;
FP #EFPreset;
SPBNB XXXX;
L #PresetValue;
L #Factor;
/R ;
RND ;
SLD 6; // remove most significant 6 Bit
SRD 6;
L DW#16#80000000; // set msb for activating Preset
OD ;
T #Snd.Preset;
SPA END2;
XXXX: NOP 0;
L DW#16#0;
T #Snd.Preset;
END2: NOP 0;
NETWORK
TITLE =
CALL "DPWR_DAT" (
LADDR := #ADDR_WR,
RECORD := #Snd,
RET_VAL := #RetVals.DPWR);
NOP 0;
END_FUNCTION_BLOCK
 
Zurück
Oben