-> Hier kostenlos registrieren
Guten Morgen,
folgende Situation: Eine Kamera liest einen DMC Code von einem Aufkleber ein, wertet diesen aus und schickt ein Telegramm an die SPS.
Der FB empfängt die Daten und gibt einen Wert "Empfangslänge" aus. Dieser sollte wenn alles mit dem DMC Code i.O. ist 47 BYTE betragen.
Im Fehlerfall könnte der DMC Code kürzer bzw länger sein. Die Qualitätsauswertung bleibt unberührt.
Nun frage ich mich, wo im FB die Abfrage der "Endekennung CR" vom Telegramm statt finden müsste, damit der korrekte Wert "47" und nicht wie aktuell "239" ausgegeben wird...
FB161:
folgende Situation: Eine Kamera liest einen DMC Code von einem Aufkleber ein, wertet diesen aus und schickt ein Telegramm an die SPS.
Der FB empfängt die Daten und gibt einen Wert "Empfangslänge" aus. Dieser sollte wenn alles mit dem DMC Code i.O. ist 47 BYTE betragen.
Im Fehlerfall könnte der DMC Code kürzer bzw länger sein. Die Qualitätsauswertung bleibt unberührt.
Nun frage ich mich, wo im FB die Abfrage der "Endekennung CR" vom Telegramm statt finden müsste, damit der korrekte Wert "47" und nicht wie aktuell "239" ausgegeben wird...
FB161:
Code:
FUNCTION_BLOCK "FB161 VS TRIGGER DATA"
//AUTHOR : DV
//FAMILY : BAUMER
//VERSION : 1.0
VAR_INPUT
START : Bool;
END_VAR
VAR_OUTPUT
FINISHED : Bool;
EMPFANGSLAENGE : Int;
DATEN : ARRAY[1..254] OF Char;
END_VAR
VAR_IN_OUT
SendReceiveTelegramm : "udtSendReceiveTelegramm";
END_VAR
VAR
FHM_Flanke : Bool;
END_VAR
VAR_TEMP
tmp_Laenge_Endezeichen : Int;
RET_VAL_WORD : Word;
tmp_WORD : Word;
tmp_Zaehler : Int;
tmp_DATEN : BYTE;
END_VAR
BEGIN
//----------------------------------------------------
// PROTOKOLL Versionen
//
// | PROTOKOLL | VERSION |
// |-----------|-------------------------------------|
// | 10 | ETHERNET: Without end identifier |
// | 11 | ETHERNET: End identifier <CR> |
// | 12 | ETHERNET: End identifier <LF> |
// | 13 | ETHERNET: End identifier <CR><LF> |
// | | |
//
//----------------------------------------------------
IF NOT START THEN
FINISHED := FALSE;
FHM_Flanke := FALSE;
END_IF;
// ***************************************************
// ***** Telegramm zusammenbauen *****
// ***************************************************
// Befehl TR für Trigger setzen
SendReceiveTelegramm.SEND.Zeichen[1] := 'T';
SendReceiveTelegramm.SEND.Zeichen[2] := 'R';
// Protokoll / Endezeichen
IF SendReceiveTelegramm.PROTOKOLL = 11 THEN
SendReceiveTelegramm.SEND.Zeichen[3] := BYTE_TO_CHAR(b#16#D);
SendReceiveTelegramm.SEND.Zeichen[4] := BYTE_TO_CHAR(b#16#0);
SendReceiveTelegramm.SEND.Laenge := 3;
tmp_Laenge_Endezeichen := 1;
ELSIF SendReceiveTelegramm.PROTOKOLL = 12 THEN
SendReceiveTelegramm.SEND.Zeichen[3] := BYTE_TO_CHAR(b#16#A);
SendReceiveTelegramm.SEND.Zeichen[4] := BYTE_TO_CHAR(b#16#0);
SendReceiveTelegramm.SEND.Laenge := 3;
tmp_Laenge_Endezeichen := 1;
ELSIF SendReceiveTelegramm.PROTOKOLL = 13 THEN
SendReceiveTelegramm.SEND.Zeichen[3] := BYTE_TO_CHAR(b#16#D);
SendReceiveTelegramm.SEND.Zeichen[4] := BYTE_TO_CHAR(b#16#A);
SendReceiveTelegramm.SEND.Laenge := 4;
tmp_Laenge_Endezeichen := 2;
ELSE
SendReceiveTelegramm.SEND.Zeichen[3] := BYTE_TO_CHAR(b#16#0);
SendReceiveTelegramm.SEND.Zeichen[4] := BYTE_TO_CHAR(b#16#0);
SendReceiveTelegramm.SEND.Laenge := 2;
tmp_Laenge_Endezeichen := 0;
END_IF;
// ***************************************************
// ***** Telegramm senden *****
// ***************************************************
SendReceiveTelegramm.SEND.Start := START;
IF START AND NOT FHM_Flanke THEN
FOR tmp_Zaehler := 1 TO 254 DO
// Daten ablöschen
EMPFANGSLAENGE := 0;
DATEN[tmp_Zaehler] := ' ';
FHM_Flanke := TRUE;
END_FOR;
END_IF;
// ***************************************************
// ***** Telegramm empfangen *****
// ***************************************************
IF (SendReceiveTelegramm.SEND.Start AND
SendReceiveTelegramm.SEND.Gesendet AND
SendReceiveTelegramm.RECEIVE.NDR AND
SendReceiveTelegramm.RECEIVE.Zeichen[1] = 'R' AND
SendReceiveTelegramm.RECEIVE.Zeichen[2] = 'D') THEN
FOR tmp_Zaehler := 1 TO 4 DO
// Daten von ASCII Zeichen in Hexadezimal umwandeln und kopieren
tmp_WORD := SHL(IN:= tmp_WORD, N := 4);
tmp_DATEN := CHAR_TO_BYTE(SendReceiveTelegramm.RECEIVE.Zeichen[tmp_Zaehler + 2]);
tmp_DATEN := INT_TO_BYTE(BYTE_TO_INT(tmp_DATEN) - 48);
IF BYTE_TO_INT(tmp_DATEN) >= 10 THEN
tmp_DATEN := INT_TO_BYTE(BYTE_TO_INT(tmp_DATEN) - 7);
IF BYTE_TO_INT(tmp_DATEN) >= 6 THEN
tmp_DATEN := INT_TO_BYTE(BYTE_TO_INT(tmp_DATEN) - 32);
END_IF;
END_IF;
tmp_WORD := tmp_WORD OR BYTE_TO_WORD(tmp_DATEN);
END_FOR;
EMPFANGSLAENGE := WORD_TO_INT(tmp_WORD);
FOR tmp_Zaehler := 1 TO EMPFANGSLAENGE DO
// Daten kopieren
DATEN[tmp_Zaehler] := SendReceiveTelegramm.RECEIVE.Zeichen[6 + tmp_Zaehler];
END_FOR;
FINISHED := TRUE;
END_IF;
SendReceiveTelegramm.RECEIVE.NDR := FALSE;
END_FUNCTION_BLOCK
Anhänge
Zuletzt bearbeitet: