Autor Thema: Funktionsbaustein MD5  (Gelesen 9102 mal)

0 Mitglieder und 1 Gast betrachten dieses Thema.

Offline vmolchanov

  • Newbie
  • *
  • Beiträge: 5
    • Profil anzeigen
Funktionsbaustein MD5
« am: 02. September 2015, 11:45:31 »
Der letzte Satz in der Beschreibung vom Funktionsbaustein "MD5_STR" in oscat_netlib121_de.pdf lautet:
Zitat
Danach steht am Parameter HASH der aktuell berechnete HASH-Wert zur Verfügung. (Siehe Baustein MD5-STREAM).
  • Es  gibt keinen Parameter "HASH". Wahrscheinlich ist der Parameter "MD5" gemeint.
  • "Baustein MD5-STREAM" muss "Baustein MD5_STREAM" geschrieben werden.
Dasselbe gilt für die englische Version oscat_netlib121_en.pdf. Außerdem wird der Parameter "MD5" in oscat_netlib121_en.pdf als Output-Parameter bezeichnet, was falsch ist (deutsche Version des Manuals ist in Ordnung).



Ich bitte Sie, mir mit der Anwendung des Bausteins "MD5_STR" zu helfen. Mein Code ist:

PROGRAM TEST
VAR
   bPerform : BOOL := FALSE;
   bDone : BOOL := FALSE;
   sInputString    : STRING(STRING_LENGTH) := 'some string';
   fbMD5_STR     : MD5_STR;
   abMD5Hash    : ARRAY [0..15] OF BYTE;
   sMD5Hash      : STRING(STRING_LENGTH) := '';
END_VAR

(*MD5 testing*)
IF (bPerform) THEN
   bDone := FALSE;
   fbMD5_STR(RUN := TRUE, STR := sInputString, MD5 := abMD5Hash, DONE => bDone);
   bPerform := FALSE;
END_IF
IF (bDone) THEN
   sMD5Hash := MD5_TO_STRH(abMD5Hash);
   bDone := FALSE;
END_IF

Meine Fragen:
- warum sind "STR" und "MD5" als "VAR_IN_OUT" deklariert? Logisch wäre für mich "STR" als Input und "MD5" als Output zu haben.
- wie soll der Parameter "MD5" initialisiert werden (denn er gilt als Input-Variable)?
- der oben angegebene Code liefert gleiche Verschlusselung unabhängig vom Wert der STR-Variable. Woran kann es liegen?

Mit freundlichen Grüßen
« Letzte Änderung: 02. September 2015, 12:07:24 von vmolchanov »

Offline peewit

  • Moderator
  • *****
  • Beiträge: 2 378
    • Profil anzeigen
Re: Funktionsbaustein MD5
« Antwort #1 am: 04. September 2015, 00:19:13 »
öffne die network lib als projekt und schau in den ordner "demo"
dort findest du viele verschiedene beispiele, wie auch das programm "SHA1_MD5_DEMO"

Offline vmolchanov

  • Newbie
  • *
  • Beiträge: 5
    • Profil anzeigen
Re: Funktionsbaustein MD5
« Antwort #2 am: 04. September 2015, 14:17:02 »
Danke für die Antwort. Die Demos helfen mir leider nicht weiter. Alle 4 Variablen im MD5_STR-Baustein sind bei mir gleich deklariert und initialisiert. Ich sehe keine logische Unterschiede.

Der folgende Code bleibt mit iStep=20 und bDone=FALSE hängen, d.h. MD5_STR-Ausführung endet nicht. Können Sie mir bitte mit diesem Problem helfen? Es geht bloß um den Aufruf des einzigen Funktionsblockes! Irgendwo habe ich einen Denkfehler.

Danke im Voraus.

PROGRAM P_TEST
VAR
bPerform : BOOL := FALSE;
bDone : BOOL := FALSE;
sInputString : STRING(250) := 'OSCAT';
fbMD5_STR : MD5_STR;
abMD5Hash  : ARRAY [0..15] OF BYTE;
sMD5Hash : STRING(32) := '';
iStep : INT := 0;
END_VAR

(*MD5 testing*)
IF (bPerform) THEN
CASE iStep OF
0:
fbMD5_STR.RUN  := FALSE;
bDone := FALSE;
sMD5Hash := '';
iStep := iStep + 10;
10:
fbMD5_STR(RUN := bPerform,
STR := sInputString,
MD5 := abMD5Hash,
DONE => bDone);
iStep := iStep + 10;
20:
IF (bDone) THEN                (*hier steckt es und geht nicht weiter*)
iStep := iStep + 10;
END_IF
30:
sMD5Hash := MD5_TO_STRH(abMD5Hash);
iStep := iStep + 10;
40:
bPerform := FALSE;
iStep := 0;
END_CASE
END_IF

[gelöscht durch Administrator]

Offline peewit

  • Moderator
  • *****
  • Beiträge: 2 378
    • Profil anzeigen
Re: Funktionsbaustein MD5
« Antwort #3 am: 04. September 2015, 20:26:40 »
du siehst keine logischen unterschiede, aber die unterschiede sind eklatant !!

im schritt 10 ruftst du genau für einen zyklus den md5 baustein auf und dann nicht mehr und wartest auf done obwohl der baustein gar nicht durchlaufen wird.

der baustein ist nicht in einen zyklus fertig !!!


der md5 baustein selber darf nicht in der schrittkette hängen sonder muss zumindest solange zyklisch aufgerufen werden bis du ein done hast
« Letzte Änderung: 04. September 2015, 20:28:11 von peewit »

Offline vmolchanov

  • Newbie
  • *
  • Beiträge: 5
    • Profil anzeigen
Re: Funktionsbaustein MD5
« Antwort #4 am: 07. September 2015, 06:23:03 »
Danke sehr!
Diese Erkenntnis wird mich sicher vor weiteren Fehlern schützen.
Danke noch mal!

Das funktioniert:
IF (bPerform) THEN
CASE iStep OF
0:
bDone := FALSE;
fbMD5_STR(RUN := FALSE,
STR := sInputString,
MD5 := abMD5Hash,
DONE => bDone);
sMD5Hash := '';
IF (bDone) THEN
bDone := FALSE;
iStep := iStep + 10;
END_IF
10:
fbMD5_STR(RUN := TRUE,
STR := sInputString,
MD5 := abMD5Hash,
DONE => bDone);
IF (bDone) THEN
iStep := iStep + 10;
END_IF
20:
sMD5Hash := MD5_TO_STRH(abMD5Hash);
iStep := iStep + 10;
30:
bPerform := FALSE;
iStep := 0;
END_CASE
END_IF

Noch weitere Erkenntnis ist, dass MD5_STR erst mit RUN:=FALSE aufgerufen werden soll. Sonst wird der gleiche Hash-Code für alle Eingaben zurückgeliefert.
« Letzte Änderung: 07. September 2015, 07:53:50 von vmolchanov »

Offline peewit

  • Moderator
  • *****
  • Beiträge: 2 378
    • Profil anzeigen
Re: Funktionsbaustein MD5
« Antwort #5 am: 07. September 2015, 18:28:43 »
so könnte man es auch machen ( nach jeden auf true setzen von bPerform wird es ausgeführt)

CASE iStep OF
0: IF (bPerform) THEN
iStep := 10;
END_IF
10: IF (bDone) THEN
sMD5Hash := MD5_TO_STRH(abMD5Hash);
bPerform := false;
iStep := 0;
END_IF
END_CASE

fbMD5_STR(RUN := bPerform,
STR := sInputString,
MD5 := abMD5Hash,
DONE => bDone);