# Dem Alphabet, Nummern zuordnen



## Gizzl0r (7 Februar 2019)

Guten Tag,
ich will in mein Twincat 3 Programm ein Datum in Buchstabenform eingeben, welches damit codiert sein soll.
Als Beispiel das Jahr 19.

1 = A
9 = T -----> (9+1)*2 = 20 ----> ergibt nummerisch, den Buchstaben T im Alphabet

Jetzt will ich jedoch, für die Archivierung des Messprotokolles, diese Codierung wieder auslösen. 

Also:
A = 1
T = (20/2)-1 = 9

Gibt es da von Twincat eine Funktion um das Alphabet nummerisch darzustellen?

Gruß
Daniel


----------



## PN/DP (7 Februar 2019)

Warum willst oder sollst Du das Datum in Buchstaben codieren? Kannst Du nicht die Ziffern als Zeichen verwenden?
Warum ist die Codierung nicht eindeutig? (19, 28, 37, ... 91 würden den selben Codebuchstaben ergeben, was das Decodieren eigentlich unmöglich macht)
Hast Du Dir die Codierung ausgedacht oder gibt es eine Codiervorschrift bzw. -Tabelle? Wie sieht die Vorschrift bzw. Tabelle aus?

Wenn Deine Buchstaben Zeichen (CHAR) in einem STRING sind, dann dürften/sollten sie nach ASCII- oder ANSI-Standard codiert sein:
'A' = 65 = 16#41 ... 'Z' = 90 = 16#5A (Großbuchstaben)
'0' = 48 = 16#30 ... '9' = 57 = 16#39 (Ziffern)

PS: Twincat kenne ich nicht, ich weiß nicht ob es da für Dich brauchbare fertige Funktionen gibt. Üblicherweise braucht man die nicht, weil man den Zahlenwert der Buchstaben und Ziffern einfach ausrechnen kann, z.B. 'A' hat den Wert 65; 'A' + 3 ---> 68 = 'D'

Harald


----------



## Gizzl0r (7 Februar 2019)

28 wäre in diesem Fall ja der Code BR und nicht AT

Textfeld (Jahr AT) hier wird uns die Jahreszahl verschlüsselt z.B.        Jahr = 19 ist gleich AT
die erste Zahl 1 wird mit dem Alphabet abgeglichen also „A“ sie zweite Zahl 9 wird mit 1 addiert und mit zwei multipliziert und dann mit dem Alphabet verglichen also T

Muss mir mal Gedanken machen, wie ich die Buchstaben dann auflöse und zurück wandele


----------



## Larry Laffer (7 Februar 2019)

Vielleicht wäre es Idee, uns zu schildern was du genau damit bezweckst.
Intuitiv hätte ich dir das gleiche wie Harald hingeschrieben - aber das scheint ja für dich gar nicht zu passen ...

Gruß
Larry


----------



## Gizzl0r (7 Februar 2019)

Ich habe ein Produkt wo eine Seriennummer drauf kommt. Diese Seriennummer ist wie folgt aufgebaut DATUM(sekunden,minuten,stunde,tag,monat,jahr). 
Damit es für den Kunden nicht direkt ersichtlich ist, wird diese Seriennummer codiert in der vorhin beschriebenen Art. Jedoch würde ich für die Archivierung von den Messdaten (Das Produkt wird erst einige Tage bzw. Wochen später geprüft) diese Daten wieder Decodieren, damit für den Mitarbeiter, das rumrechnen weg fällt.


----------



## PN/DP (7 Februar 2019)

Gizzl0r schrieb:


> die erste Zahl 1 wird mit dem Alphabet abgeglichen also „A“ sie zweite Zahl 9 wird mit 1 addiert und mit zwei multipliziert und dann mit dem Alphabet verglichen also T


Vielleicht so etwa?

```
code : ARRAY [1..2] OF CHAR;
END_VAR

[COLOR="#008000"]//Jahr 10..99 in 2 Buchstaben-Zeichen wandeln:[/COLOR]
Jahr_z := Jahr / 10;               [COLOR="#008000"]//Jahr Zehner[/COLOR]
Jahr_e := Jahr MOD 10;             [COLOR="#008000"]//Jahr Einer[/COLOR]

code[1] := Jahr_z + 65;            [COLOR="#008000"]//Zehner 1 .. 9 --> 'A' .. 'I'[/COLOR]
code[2] := (Jahr_e + 1) * 2 + 65;  [COLOR="#008000"]//Einer  0 .. 9 --> 'B' .. 'T'[/COLOR]

[COLOR="#008000"]//zurück:[/COLOR]
Jahr_z := code[1] - 65;            [COLOR="#008000"]//'A' .. 'I' --> 1 .. 9[/COLOR]
Jahr_e := (code[2] - 65) / 2 - 1;  [COLOR="#008000"]//'B' .. 'T' --> 0 .. 9[/COLOR]

Jahr := Jahr_z * 10 + Jahr_e;

[COLOR="#008000"]//besser: die 65 als 'A' schreiben? oder ggf. als "sprechende" Konstante (ASC_A := 65)[/COLOR]
```

Harald


----------



## Heinileini (7 Februar 2019)

Gizzl0r schrieb:


> Als Beispiel das Jahr 19.
> 1 = A
> 9 = T -----> (9+1)*2 = 20 ----> ergibt nummerisch, den Buchstaben T im Alphabet


Beschreib doch Deine Kodierung so, dass man weiss, welche Ziffer wann wie kodiert werden soll.
Ich verstehe Dich bisher so, dass . . .
- die erste Ziffer sagt, der wievielte Buchstabe im Alphabet genommen werden soll,
- die zweite Ziffer nach Deiner Formel (9+1)*2 umgesetzt wird.
Was ist mit der 3. Ziffer, der 4. u.s.w.?
Gibt es immer nur ZweierGruppen von Ziffern, die gemeinsam umkodiert werden?
Gilt Dein Beispiel für 2. Ziffer = 9 auch für die Ziffern 0 . . . 8?
Wie soll die 0 als erste Ziffer kodiert werden? '@'?


----------



## Larry Laffer (7 Februar 2019)

Mach doch Folgendes :
Nimm den Date-Wert des jeweiligen Datums - für den 07.02.19 wäre das z.B. 43503
Dann nimm den Sekunden-Wert der Uhrzeit- für z.B. 13:44:26 wäre das dann 49466 (Stunden*3600 + Minuten*60 + Sekunden)
Beide Werte wndelst du in Hex-Strings um. Dann wird aus der Uhzeit C13A und aus dem Datum A9EF.
Das gibt dann einen hübschen String mit dem niemand so ohne weiteres etwas anfangen kannst - den DU aber jederzeit wieder decodiert bekommst ...

Gruß
Larry


----------



## Gizzl0r (7 Februar 2019)

Es sind nur 2 Ziffern für das Jahr. Die Null kommt als erste Ziffer ja nicht vor weil wir da ja bereits raus sind. Es geht mir hierbei nur um die letzten 2 Ziffern des Jahres xx19. 
Danke schon mal an alle, werde eure Vorschläge durchtesten und bescheid geben.


----------



## Heinileini (7 Februar 2019)

Gizzl0r schrieb:


> Die Null kommt als erste Ziffer ja nicht vor weil wir da ja bereits raus sind.


Nach dem Y2kProblem steht uns jetzt also das Y2k1Problem ins Haus!
Ich weiss nicht, wie jung Du bist und wie sich das RentenEintrittsAlter weiterentwickeln wird . . . 

PS:
Andererseits wird Dein Code bis dahin längst geknackt sein. Ist also kein Thema.


----------



## PN/DP (7 Februar 2019)

Wenn Du nicht so viel rechnen willst oder ganz "unberechenbar" vergebene Code-Buchstaben verwenden willst, dann könntest Du die zum Codieren und Decodieren in indizierten Tabellen hinterlegen:

```
code : ARRAY [1..2] OF CHAR;
  JahrCode1 : ARRAY[0..9] OF CHAR := 'J','A','B','C','D','E','F','G','H','I'; [COLOR="#008000"]//Jahr Zehner Ziffer --> Buchstabe[/COLOR]
  JahrCode2 : ARRAY[0..9] OF CHAR := 'B','D','F','H','J','L','N','P','R','T'; [COLOR="#008000"]//Jahr Einer Ziffer --> Buchstabe[/COLOR]

  CodeJahr1 : ARRAY[0..25] OF INT := 1,2,3,4,5,6,7,8,9,17(-1);                [COLOR="#008000"]//'A'..'Z' --> Zehner Ziffer[/COLOR]
  CodeJahr2 : ARRAY[0..25] OF INT := -1,0,-1,1,-1,2,-1,3,-1, ... ,9,6(-1);    [COLOR="#008000"]//'A'..'Z' --> Einer Ziffer[/COLOR]
END_VAR

[COLOR="#008000"]//Jahresziffer zu Zeichen/Buchstabe aus Tabelle[/COLOR]
code[1] := JahrCode1[Jahr_z];      [COLOR="#008000"]//Zehner 1 .. 9 --> 'A' .. 'I'[/COLOR]
code[2] := JahrCode2[Jahr_e];      [COLOR="#008000"]//Einer  0 .. 9 --> 'B' .. 'T'[/COLOR]

[COLOR="#008000"]//zurück Buchstabe zu Jahresziffer, wenn Ergebnis -1 dann war undefinierter Buchstabe[/COLOR]
Jahr_z := CodeJahr1[code[1] - 26]; [COLOR="#008000"]//'A' .. 'I' --> 1 .. 9[/COLOR]
Jahr_e := CodeJahr2[code[2] - 26]; [COLOR="#008000"]//'B' .. 'T' --> 0 .. 9[/COLOR]
```

Harald


----------

