TC3 - CX5130 Com Port - SerialLineControl

blubbi

Level-2
Beiträge
39
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo,

ich hab eine RFID Lesegeräte am Comport meiner CX5130 angeschlossen. Der Betrieb mit dem virtuellen Comport über USB und ADS funktioniert einwandfrei. Stecke ich nun das Lesegerät auf den comport, bekomm ich auch im Windows (BIOS geändert auf Windows Betrieb) die nötigen Daten. Also der Com Stecker funktioniert. Will ich das nun über die PLC betreiben, kommt im RXBuffer nichts an.

Konfiguration COM Schnittstelle: (wurde so mit Scannen gefunden)
1633090077766.png
Kommunikationseinstellungen: Parität, Stoppbits, Datenbits und Baudrate entsprechen der Konfig des Lesegeräts:
1633090178914.png

Die In und Out sind verknüpft mit:
Code:
VAR_GLOBAL
    stIn_PcCom AT %I* : PcComInData;
    stOut_PcCom AT %Q* : PcComOutData;
END_VAR

Im Main Programm habe ich folgende Variablen deklariert:
Code:
PROGRAM MAIN
VAR
(* communication buffer between application and SerialLineControl *)
    RxBuffer        : ComBuffer;
    TxBuffer        : ComBuffer;
(* serial line control *)
    fbLineCtrl        : SerialLineControl;
(* receive data *)
    fbReceiveByte    : ReceiveByte;
    aPrefix            : ARRAY[0..1] OF BYTE := [16#10, 16#02];
    aSuffix            : ARRAY[0..1] OF BYTE := [16#10, 16#03];
(* data buffer *)
    aRxData            : ARRAY[0..999] OF BYTE;
END_VAR

Der Aufruf sieht so aus:
Code:
(*~~~~~~~~~~~~~~~~ cyclic call of serial background comm. ~~~~~~~~~~~~~~~~~*)
fbLineCtrl(
    Mode := SERIALLINEMODE_PC_COM_PORT,
    pComIn := ADR(GV.stIn_PcCom),
    pComOut := ADR(GV.stOut_PcCom),
    SizeComIn := SIZEOF(GV.stIn_PcCom),
    TxBuffer := TxBuffer,
    RxBuffer := RxBuffer
);

IF fbLineCtrl.Error THEN
    //error handling
END_IF

fbReceiveData(
    pPrefix:= ADR(aPrefix),
    LenPrefix:= 2,
    pSuffix:= ADR(aSuffix),
    LenSuffix:=2,
    pReceiveData := ADR(aRxData),
    SizeReceiveData := SIZEOF(aRxData),
    Timeout:= T#700MS,
    RXbuffer := RxBuffer
);

Ich bekomme aber keinen Fehler im SerialLineControl und der RxBuffer bzw. der TxBuffer ändert sich auch nicht.

Task Config: (von 4ms schon auf 2ms herunter gedreht - ändert auch nichts.
1633090657526.png

Bitte um Tipps was falsch sein könnte.

danke!
 
Ändern sich die Werte im Status/Ctrl- Wort des Com Ports (und gegegebenenfalls in den DatenBytes) wenn du was sendest/empfangen solltest?
Das sollten sie. Ein "Klassiker" wäre das man beim Verlinken zwischen EA und HW einen Fehler gemacht hat.
Ansonsten: Force mal auf dem Ctrl den Wert 0x4. Im Status muss dann auch das entsprechende Bit zu sehen sein. Die Bit-Codierung des Status/Ctrl kannst du aus der EL6001 entnehmen.

Guga
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Ändern sich die Werte im Status/Ctrl- Wort des Com Ports (und gegegebenenfalls in den DatenBytes) wenn du was sendest/empfangen solltest?
Das sollten sie. Ein "Klassiker" wäre das man beim Verlinken zwischen EA und HW einen Fehler gemacht hat.
Ansonsten: Force mal auf dem Ctrl den Wert 0x4. Im Status muss dann auch das entsprechende Bit zu sehen sein. Die Bit-Codierung des Status/Ctrl kannst du aus der EL6001 entnehmen.

Guga
DANKE! Der Hinweis mit dem Status / Ctrl-Wort war der richtige Tipp. Ich hab in meiner stIn_PcCom bzw. stOut_PcCom nur das data array verlinkt aber nicht die dazugehörigen Status und Ctrl Variablen. Jetzt funktioniert es bestens.

den Mode musste ich aber auf SERIALLINEMODE_DEFAULT stellen, mit SERIALLINEMODE_PC_COM_PORT hat es leider nicht geklappt.

Ein Problem habe ich aber noch: Ich möchte an meinen RFID Leser einen Bytestream schicken, so dass ein Signal am Lesegerät ertönt.

Variablendeklaration:
Code:
sRedHupe: STRING := '10 02 31 55 60 05 00 20 05 00 20 00 00 40 02 00 10 03';
aTxData                : ARRAY[0..999] OF BYTE;
TxBuffer        : ComBuffer;

Mit folgendem Befehl schicke ich die Daten:
Code:
IF bSend THEN
    HEXSTR_TO_DATA(sHex:= sRedHupe, pData:=ADR(aTxData), cbData:=SIZEOF(aTxData));
  
    (* Write Data from aTxBuffer(user code) in ComBuffer *)
    fbSend(
        pSendData    := ADR(aTxData),
        Length        := 18,
        TXbuffer    := TxBuffer,
    );

    bSend := FALSE;
END_IF

Ich sehe den Stream auch in den Output Variablen, aber am Lesegerät tut sich nichts:
1633201502976.png

Ich habe versucht mittels dem Status und Ctrl Words herauszufinden, was er mir sagen will, bin aber gescheitert.

https://infosys.beckhoff.com/index....el602x/1719177227.html&id=6719347617576344865


Hast du noch einen Tipp für mich?

Danke schön!
 
Der Mode definiert so viel ich glaube nur die max Datenbytes des EA-Gerätes. 64Byte und Comport muss aber funktionieren.
Wobei du nicht gesagt hast wie du festgestellt hast das der default-mode funktioniert. Wobei ich auch nicht weiss was Default tatsächlich bedeutet.

Was ich ebenfalls nicht direkt weiss ist wie der Com-Port sich bezüglich des Prozessabbildes verhält. Mit 64 Byte Daten ist es ein großes Abbild und die Info wie viele Bytes verschickt werden sollen. So oder so, im Control-Wort müsste das Bit0 mind 1x umgeschlagen sein. Ist es das?

Du könntest das Senden der Daten auch über das Forcen des ControlWorts (Bit0) erzwingen. Die Datenlänge muss halt auch stimmen :)
Und dann im StatusWort im Bit0 schauen ob hier das Bit auch seinen Wert geändert hat (bedeutet: Wurde abgeschickt).

Im Moment kann ich nur sagen: Alles trübe und neblig.

Guga
 
Hallo Guga

Der Mode definiert so viel ich glaube nur die max Datenbytes des EA-Gerätes. 64Byte und Comport muss aber funktionieren.
Wobei du nicht gesagt hast wie du festgestellt hast das der default-mode funktioniert. Wobei ich auch nicht weiss was Default tatsächlich bedeutet.

Durch ausprobieren, wobei eh beide Modi funktioniert. Das Problem war wohl wirklich "nur" die fehlende Verknüpfung der Status und Ctrl Variable.

Du könntest das Senden der Daten auch über das Forcen des ControlWorts (Bit0) erzwingen. Die Datenlänge muss halt auch stimmen :)
Und dann im StatusWort im Bit0 schauen ob hier das Bit auch seinen Wert geändert hat (bedeutet: Wurde abgeschickt).

Im Moment kann ich nur sagen: Alles trübe und neblig.

Guga

Bei mir auch noch alles trübe und neblig.

So sieht die Ausgangsbelegung nach dem Senden aus. Dann sollte eigentlich gleich direkt am Lesegerät ein LED erscheinen.
1633435109176.png

Muss ich dann das Ctrl Wort toggeln? also die 299 zu 298 werden lassen? oder wenn die zweite stelle togglet dann 297? Das versteh ich noch nicht ganz. Am Eingang tut sich gar nichts. Da bleiben nur die alten Daten vom letzten Ausweis lesen stehen.

Wenn ich 8 Datenbits eingestellt hab, kann ich dann immer nur 8 Stellen schicken oder gehen mehr auch, und der SendData Baustein übernimmt den Rest?

Muss / Soll ich den TxBuffer vor jedem neuen Senden leeren? Da sonst bei kürzerer KOmmandosequenz ja noch alte Daten drinnen stehen.

Für mich ist serielle Kommunikation leider Neuland. Normalerweise bin ich 10 Ebenen höher unterwegs.

Danke für deine Geduld.

--
Blubbi
 
Zuviel Werbung?
-> Hier kostenlos registrieren
zum Verständnis für Dich.
Die SPS-Bausteine befüllen die EA-Schnittstelle. Das ist der Puffer zur Klemme die dann das senden/empfangen autonom durchführt.
Das Ctrl + Status ist der Handshake zur Klemme.
Wenn du also in die Send-Daten werte einstellst dann sagst du über das Ctrl das die Klemme diese übernehmen soll. Über den Status sagt die Klemme dann das sie sie übernommen hat.
Gleiches passiert natürlich auch für das Daten Empfangen.
Ctrl + Status sind vom Aufbau identisch aufgebaut (bitposition). Damit du jeden Zyklus "Aktion" haben kannst ist sowohl sind die Send/Receive Informationen als Änderung (Toggle) codiert. Neben dem "Machen" Bits im Ctrl/Status gibt es dann noch die Länge die definiert wieviele Bytes relevant sind.

Nach besten Wissen und Gewissen sollte im PC-Com-Interface die relevanten Bits wie folgt maskiert sein.

ReceiveHandshakeBit := 2#00000000_00000010;
TransmitHandshakeBit := 2#00000000_00000001;
DataLength := 2#11111111_00000000;

Für mich sieht es jetzt also so aus als hättest du in der SPS als Definition nicht das PCCom-Interface genommen mit der Konsequenz das die Bytelänge nicht an der richtigen Stelle im Ctrl - Wort steht.

Ansonsten: https://download.beckhoff.com/download/document/ipc/embedded-pc/embedded-pc-cx/cx7080_de.pdf
Auf Seite 67 ist das in meinen Augen ziemlich gut beschrieben.

Guga
 
Zurück
Oben