Mega Problem bei meinem Programm

COOLT

Level-1
Beiträge
98
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Hey Leute ich weis zwar nich ob ich das darf aber ich Poste euch mal den FB wie ich ihn bisher jetz soweit geschrieben habe.
Code:
CASE SchrittNr OF
0:    i:=0;
    FOR i:=0 TO 4 BY 1 DO
        LastReceivedByte[i]:=0;
    END_FOR;
    i:=0;
    ReceivedByte:=0;
    ReceiveCounter:=0;
    SchrittNr:=1;
    READDone:=FALSE;

1:    Receive(
        RXbuffer:= RxBuffer2,
        Error=> ReceiveErrorID, );
    IF Receive.ByteReceived (*Byte Received*)THEN
        ReceivedByte:=Receive.ReceivedByte;
    END_IF;
    IF ReceivedByte=2 THEN
        SchrittNr:=5;
    END_IF;

5:    FOR i:=0 TO 4 BY 1 DO
        Receive(
            RXbuffer:= RxBuffer2,
            Error=> ReceiveErrorID, );
        IF Receive.ByteReceived (*Byte Received*) AND LastReceivedByte[ReceiveCounter] = 0 THEN
            ReceivedByte:=Receive.ReceivedByte;
            IF ReceivedByte>127 THEN
                ReceivedByte:=ReceivedByte-128;
            END_IF;
            LastReceivedByte[ReceiveCounter] := ReceivedByte;
            ReceiveCounter := ReceiveCounter + 1;
        END_IF
    END_FOR;
    SchrittNr:=10;

10:    Receive(
            RXbuffer:= RxBuffer2,
            Error=> ReceiveErrorID, );
        IF Receive.ByteReceived(*Byte Received*)THEN
            ReceivedByte:=Receive.ReceivedByte;
        END_IF;
        IF ReceivedByte = 3 THEN
            SchrittNr:=15;
        END_IF;

15:    Receive(
            RXbuffer:= RxBuffer2,
            Error=> ReceiveErrorID, );
        IF Receive.ByteReceived(*Byte Received*)THEN
            ReceivedByte:=Receive.ReceivedByte;
        END_IF;
        IF ReceivedByte = 24 THEN
            ReadDone:=TRUE;
        END_IF;
END_CASE;
    IF ReceiveCounter>=4 THEN
        ReceiveCounter:=0;
    END_IF;
So mein Problem is das er in der For Schleife nich auf die Bytes wartet sondern das ganze einfach überspringt. und ins LastReceiveByte Array nix reinschreibt. Kann mir da wer helfen?
Mfg
COOLT
 
Ja, wie soll er denn warten?
Wo genau in der For-Schleife sollte er anhalten und auf die Bytes warten?
Das (warten) geht mit einer SPS normalerweise gar nicht, die Zykluszeitüberwachung würde dann anschlagen.

Ich denke mal

Code:
Receive(
            RXbuffer:= RxBuffer2,
            Error=> ReceiveErrorID, );

ist eine Funktion.
Die führt er aus, danach rödelt das Programm 5 Mal durch die For-Schleife.
Ist die erste IF-Bedingung nicht erfüllt, wird auch

Code:
LastReceivedByte[ReceiveCounter] := ReceivedByte;

nicht abgearbeitet. Die For-Schleife endet, ohne daß etwas geschrieben wurde.
Nach der For-schleife wird auf jeden Fall in Schritt 10 gesprungen.
 
Naja ich hätte gerne, dass das Programm in der For Schleife darauf wartet das die Karte über den Kartenleser gezogen wird. Welcher das RXBuffer schickt. Ich brauch halt das er in der For schleife wartet bis der Kartenleser etwas schickt.
 
Naja ich hätte gerne, dass das Programm in der For Schleife darauf wartet das die Karte über den Kartenleser gezogen wird. Welcher das RXBuffer schickt. Ich brauch halt das er in der For schleife wartet bis der Kartenleser etwas schickt.

Das kannst du bei einer SPS so nicht machen, da geht die in STOP, weil ja in der Zeit nichts anderes mehr läuft. Du mußt vor der For-Schleife abfragen, ob der Leser Daten gebracht hat. so lange springt ja das Programm zyklisch immer wieder in den Schritt 5. Erst wenn der Datenempfang klar ist, gehst du durch die For-Schleife. Die 10 für Schritt 10 lädst du erst, wenn alle Daten fertig empfangen sind, also im letzten For-Schleifen-Durchlauf!
 
Zuviel Werbung?
-> Hier kostenlos registrieren
also z.B. so :
Code:
0 :
Empfangspointer := 0 ;
Schritt_Nr := 1 ;
 
1 :
EmpfangeZeichen ;
if Zeichen_empfangen then 
   Empfangspointer := Empfangspointer + 1 ;
   Puffer[Empfangspointer] := Zeichen ;
end_if ;
if Empfangspointer = max_Zeichen then 
   Schritt_Nr := 5 ;
end_if ;
 
usw.
den Code bitte als Vorschlag und nicht als Lösung verstehen ...

Gruß
LL
 
Also ich hab das vorhin auf der Arbeit nochmal umgeschrieben werde am Montag dann mal das ergebnis nochmal posten.
Danke euch nochmal
Gute Nacht
Mfg
COOLT
 
Also das Einlesen hab ich jetzt soweit in den Griff bekommen. Jetzt hab ich wieder ein neues Problem. Und zwar die Auswertung. Bei der Auswertung brauche ich von den Byte typen (die Zahlen die ich eingelesen habe) die 2. stelle der Hex werte. Mit der Funktion Byte_TO_INT bekomm ich das ganze schonmal in Int werte. Aber wie bekomm ich die int werte nun auf ihre Hexwerte und davon dann nur die zweite stelle?
Code:
var:
aData:Array[0..4] of byte;
End_var
aData[i]:=Byte_TO_INT(aData[i]);
aData[i]:=Int_TO_Hex(aData[i]);//funktioniert nicht.
Hättet ihr da nützliche vorschläge?
Mfg
COOLT
 
... soll heißen :
die Zahl 17 dezimal entspräche 11 hex und 10001 binär - es ist aber immer noch der gleiche Zahlenwert.

Gruß
LL
 
Jo gut danke leute das Problem haben wir jetz aus der welt geschafft und alles funktioniert soweit.
Ich danke euch vielmals
Melde mich bei weiteren Problemen.
Mfg
COOLT
 
Zurück
Oben