# WAGO 750-8204 PFC200  CAN Codesys



## sadik (3 Dezember 2015)

Hallo,

Ich habe eine Wago 750-8204 zwischen zwei Geräten geschaltet die über CAN kommunizierten. 
Jetzt will ich die CAN Kommunikation in Codesys 2.3 abhören aber leider habe keine Code Beispiele dazu gefunden.
Ich habe es mit WagoCanLayer2_02.lib ausprobiert aber leider erhalte ist mein date Array immer leer.

open(BAUDRATE := 500000 ,ENABLE := TRUE );
can11BitFrame(
    CAN_ID:= 16#380,
    CAN_BUFFER:= FALSE,
    ENABLE:= TRUE,
    READ_FRAME:= frame,
    DATA=> data
);

Gibt es Beispielcode für WagoCanLayer2_02.lib und WagoCanOpen?

Gruß


----------



## .:WAGO::016346:. (4 Dezember 2015)

Hallo Sadik,

wenn der PFC200 nur lauschen soll, kannst Du in der Steuerungskonfiguration das Element "CAN Layer2 Device" einfügen.
Dieser Code öffnet die CAN Schnittstelle und kopiert die empfangen Daten in ein lokales Array.


```
VAR
fbOpenPort : CAN_OPEN;
xOpenPort : BOOL := TRUE;
xPortIsOpen : BOOL;
fbCanRecv : CAN_RX_11BIT_FRAME :=(
 CAN_ID := 16#380,
 CAN_BUFFER := FALSE );
xRead : BOOL;
aRecvData : ARRAY [1..8] OF BYTE;
bRecvLen : BYTE;
END_VAR
---------------------------------------------------------------------------------------------
fbOpenPort(BAUDRATE:= 500000, ENABLE:= xOpenPort);
fbCanRecv(
 ENABLE := xPortIsOpen,
 READ_FRAME := xRead );
IF fbOpenPort.CONFIRM AND fbOpenPort.ERROR = CAN_PORT_OK THEN
  xOpenPort := FALSE;
  xPortIsOpen := TRUE;
END_IF
IF xPortIsopen AND NOT xRead THEN
 IF fbCanRecv.ERROR = CAN_RECEIVE_OK THEN
  aRecvData := fbCanRecv.DATA;
  bRecvLen := fbCanRecv.DATALENGTH;
  xRead := TRUE;
 ELSE
  xRead := TRUE;
 END_IF
END_IF
```

Wenn der PFC200 als CANopen Master oder Slave genutzt werden soll, muss der Port nicht vom Anwenderprogramm geöffnet werden.
Die Rx und Tx Bausteine sollten dann jedoch erst freigeschaltet werden, wenn sich der PFC200 im operational state befindet.

Grüße


----------



## sadik (4 Dezember 2015)

Ich habe den POE debuggt und in der ersten iteration nach dem öffnen des CANBUSES ist der FB fbCanRecv Error Feld auf = POU_NOT_FOUND da ENABLE auf xPortIsOpen gesetzt ist und die daten werden auch nicht in
der ersten iteration ausgelesen (IF fbCanRecv.ERROR = CAN_RECEIVE_OK THEN....) ist falsch und xReady wird auf TRUE gesetzt. 

In der zweiten Iteration ist fbCanRecv aktiviert aber das Error Feld ist auf CAN_BUS_IDLE gestellt, da xReady auf TRUE ist wird die äußere if-Bedingung immer unwahr und die Anweisung tritt nie in die Datenauswertung (innere if-Bedingung) ein.

Gruß


----------



## sadik (11 Dezember 2015)

Wir würde das Schreiben und Auslesen mit CanOpen funktionieren ?


----------



## .:WAGO::016346:. (14 Dezember 2015)

Hallo Sadik,

nach dem Öffnen der CAN Schnittstelle wird das Bit xRead auf TRUE gesetzt.
Wenn nun ein Telegramm mit der eingestellten CAN ID (hier 16#380) empfangen wird, setzt der Baustein das Bit xRead auf FALSE.
Nach dem Auswerten des Fehlers werden die empfangen Daten in ein lokales Array übernommen und xRead wird wieder gesetzt um das nächste Telegramm zu empfangen.

Das Schreiben funktioniert analog zum Empfangen. Nachdem die Schnittstelle geöffnet wurde, kann der Enable Eingang auf TRUE gesetzt werden.
Das Telegramm wird versendet sobald das Bit WRITE_FRAME auf TRUE gesetzt wird, danach wird es vom Baustein auf FALSE zurückgesetzt.

Ist sichergestellt dass ein Telegramm mit der ID 16#380 auf dem CAN Bus gesendet wird?


Grüße


----------

