CODESYS - das IEC 61131-3 Programmiersystem

Willkommen im offiziellen CODESYS - Forum von 3S-Smart Software Solutions | A member of the CODESYS Group
Deutsche Version English version russian version 
Aktuelle Zeit: Fr Mär 22, 2019 8:43 pm

Alle Zeiten sind UTC




Ein neues Thema erstellen  Auf das Thema antworten  [ 3 Beiträge ] 
Autor Nachricht
 Betreff des Beitrags: Konvertierung Gray Code in Dual Code
BeitragVerfasst: Mi Nov 04, 2009 11:22 am 
Offline

Registriert: Di Sep 22, 2009 7:16 am
Beiträge: 0
Hallo,

weiß jemand eine Funktion die mir eine Variable mit Gray-Code codierten Inhalt in einen Dual codierten Inhalt umwandelt?

Dual-Code in Gray-Code hab ich schon (in C/C++).

Code:
UINT8 APP_Binary2Gray(UINT8 b)
{
  return b ^ (b >> 1);
}


mfG.
fujitaufan


Nach oben
   
 Betreff des Beitrags:
BeitragVerfasst: Mi Nov 04, 2009 5:44 pm 
Offline

Registriert: Mo Apr 03, 2006 7:43 am
Beiträge: 71
Hallo,
für die Konvertierung von gray-codierten Encoderpositionen (24 Bit) nehme ich folgenden Code:
Code:
FUNCTION GRAY_TO_BIN : DWORD
VAR_INPUT
  Signal : DWORD;  (* encoder signal *)
END_VAR
VAR
  local  : DWORD;
  ix     : INT;
  Mask   : DWORD;
END_VAR

(* Bit 23 *)
Mask := SHR (Mask, 1);  (* adopt bit mask *)
IF ((local AND Mask) <> DWORD#16#00000000)
THEN IF ((local AND (SHR (Mask, 1))) = DWORD#16#00000000)
     THEN local := local OR (SHR (Mask, 1));
     ELSE local := local AND NOT (SHR (Mask, 1));
     END_IF;
END_IF;

(* Bit 22 *)
Mask := SHR (Mask, 1);  (* adopt bit mask *)
IF ((local AND Mask) <> DWORD#16#00000000)
THEN IF ((local AND (SHR (Mask, 1))) = DWORD#16#00000000)
     THEN local := local OR (SHR (Mask, 1));
     ELSE local := local AND NOT (SHR (Mask, 1));
     END_IF;
END_IF;

(* und so weiter bis Bit 0 *)
(* Bit 0 *)
Mask := SHR (Mask, 1);  (* adopt bit mask *)
IF ((local AND Mask) <> DWORD#16#00000000)
THEN IF ((local AND (SHR (Mask, 1))) = DWORD#16#00000000)
     THEN local := local OR (SHR (Mask, 1));
     ELSE local := local AND NOT (SHR (Mask, 1));
     END_IF;
END_IF;

Gray_to_Bin := local;
END_FOR;


Gebe zu, sieht fürchterlich aus, viel redundanter Code. Habe aber auf die Schnelle keine Möglichkeit gefunden, eine Schleife mit aufsteigender Kontrollvariablen und daraus abgeleitetem absteigenden Bit-Index zu bauen. Die Bit-Abfrage geht leider nur von oben nach unten.

Gruss Rolf


Nach oben
   
BeitragVerfasst: Mi Mär 23, 2016 5:21 pm 
Offline

Registriert: Di Mär 22, 2016 9:09 am
Beiträge: 1
Hallo User,
es geht tatsächlich einfacher. Folgendes Beispiel rechnet ein Byte Gray-Code in Binärcode um:

Code:
bBinCode := bGrayCode AND 128; (* Bitmaskierung höchstes Bit, 2^n, hier n=8, 2^8=128 *)
FOR n := 1 TO 7 DO      (* n-1 = 7 Durchläufe für die restlichen Bits *)
   bBinCode := SHR(bBinCode,1) XOR bGrayCode;
END_FOR


Warum und wie diese Verfahren funktioniert ist auf mehreren Seiten im Internet zum Teil sehr anschaulich beschrieben.
Für andere Variablen-Größen muss nur der Variablen-Typ und 'n' angepasst werden, es bleibt bei vier Programmzeilen.

Gruß, Jan


Nach oben
   
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen  Auf das Thema antworten  [ 3 Beiträge ] 

Alle Zeiten sind UTC


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 4 Gäste


Sie dürfen keine neuen Themen in diesem Forum erstellen.
Sie dürfen keine Antworten zu Themen in diesem Forum erstellen.
Sie dürfen Ihre Beiträge in diesem Forum nicht ändern.
Sie dürfen Ihre Beiträge in diesem Forum nicht löschen.
Sie dürfen keine Dateianhänge in diesem Forum erstellen.

Suche nach:
Gehe zu:  
Powered by phpBB® Forum Software © phpBB Limited
Deutsche Übersetzung durch phpBB.de