CANopen - mehr als 4 Byte aus dem Objektverzeichnis lesen

aho
2007-06-14
2007-06-15
  • aho - 2007-06-14

    Hallo zusammen,

    ich möchte einen String aus dem Objektverzeichnis lesen der 20 Byte lang ist.

    Ich schicke die eine SDO-Nachricht mit dem passenden Index und SubIndex und als Modus 16#40. Die Antwort kommt auch mit dem Modus 16#41 und im Datenbyte0 steht die Stringröße 16#14. Wenn ich jetzt die Request-Nachricht mit dem Modus 16#60 schicken möchte, geht diese nicht raus, scheint so, als ob der Baustein CanOpenSendSDO den Modus 16#60 nicht akzeptiert. Bspl. siehe unten.

    Hat jemand schonmal vor einer solchen Problematik gestanden?

    Wie kann ich sonst mehr als 4 Byte aus dem Objektverzeichnis lesen?

    Schonmal danke für eure Antworten

    Gruß

    Andreas

    CanOpenSendSDO(

    Enable:= 1,
    
    wDrvNr:= 0,
    
    ucNodeId:= 32,
    
    wIndex:= 16#3400,
    
    bySubIndex:= 5,
    
    ucModus:= 16#40,
    
    ucByte0:= ,
    
    ucByte1:= ,
    
    ucByte2:= ,
    
    ucByte3:= ,
    
    aAbortCode:= aAbort,
    
    dwDataBufferLength:= SIZEOF(sInfo2),
    
    pDataBuffer:= ADR(sInfo2),
    
    bWaitForAnswer=> ,
    
    bAnswerRec=> ,
    
    ucAnswerBytes=> ,
    
    iAnswerLength=> ,
    
    bToggleUnequal=> ,
    
    bAbortRec=> ,
    
    aAbortRec=> );
    

    CanOpenSendSDO1(

    Enable:= 1,
    
    wDrvNr:= 0,
    
    ucNodeId:= 32,
    
    wIndex:= 16#0000,
    
    bySubIndex:= 0,
    
    ucModus:= 16#60,
    
    ucByte0:= 0,
    
    ucByte1:= 0,
    
    ucByte2:= 0,
    
    ucByte3:= 0,
    
    aAbortCode:= aAbort,
    
    dwDataBufferLength:= SIZEOF(sInfo2),
    
    pDataBuffer:= ADR(sInfo2),
    
    bWaitForAnswer=> ,
    
    bAnswerRec=> ,
    
    ucAnswerBytes=> ,
    
    iAnswerLength=> ,
    
    bToggleUnequal=> ,
    
    bAbortRec=> ,
    
    aAbortRec=> );
    
     
  • aho - 2007-06-15

    nochmal etwas genauer erklärt...

    Ich möchte auf einen Objektverzeichnis-eintrag zugreifen, der 20 Byte groß ist. Das mache ich, in dem ich die Funktion CanOpenSendSDO mit folgenden Parametern aufrufe:

    CanOpenSendSDO(

            Enable:= 1,
    
    
    
            wDrvNr:= 0,
    
    
    
            ucNodeId:= 32,
    
    
    
            wIndex:= 16#3400,
    
    
    
            bySubIndex:= 5,
    
    
    
            ucModus:= 16#40,
    
    
    
            ucByte0:= ,
    
    
    
            ucByte1:= ,
    
    
    
            ucByte2:= ,
    
    
    
            ucByte3:= ,
    
    
    
            aAbortCode:= ,
    
    
    
            dwDataBufferLength:= SIZEOF(sInfo2),
    
    
    
            pDataBuffer:= ADR(sInfo2),
    
    
    
            bWaitForAnswer=> ,
    
    
    
            bAnswerRec=> ,
    
    
    
            ucAnswerBytes=> ,
    
    
    
            iAnswerLength=> ,
    
    
    
            bToggleUnequal=> ,
    
    
    
            bAbortRec=> ,
    
    
    
            aAbortRec=> );
    

    In der Antwortnachricht vom Slave steht im ersten Datenbyte auch die 14h für 20 Byte.

    841) 46738.8 Rx 0620 8 40 00 34 05 00 00 00 00

    842) 46740.0 Rx 05A0 8 41 00 34 05 14 00 00 00

    Wenn ich jetzt die nächste request-Nachricht mit ucModus 60h schicken möchte, wird diese Nachricht nicht auf den Bus gelegt.

    CanOpenSendSDO1(

            Enable:= 1,
    
    
    
            wDrvNr:= 0,
    
    
    
            ucNodeId:= 32,
    
    
    
            wIndex:= 16#0000,
    
    
    
            bySubIndex:= 0,
    
    
    
            ucModus:= 16#60,
    
    
    
            ucByte0:= 0,
    
    
    
            ucByte1:= 0,
    
    
    
            ucByte2:= 0,
    
    
    
            ucByte3:= 0,
    
    
    
            aAbortCode:= ,
    
    
    
            dwDataBufferLength:= ,
    
    
    
            pDataBuffer:= ,
    
    
    
            bWaitForAnswer=> ,
    
    
    
            bAnswerRec=> ,
    
    
    
            ucAnswerBytes=> ,
    
    
    
            iAnswerLength=> ,
    
    
    
            bToggleUnequal=> ,
    
    
    
            bAbortRec=> ,
    
    
    
            aAbortRec=> );*)
    

    Es scheint so, als akzeptiert der FB CanOpenSendSDO den ucModus := 16#60 nicht. Oder übernimmt die Library die weitere Kommunikation mit dem Slave selbstständig, bis alle Datenbytes geladen sind, und wenn ja, wo finde ich diese dann? In der Doku Version 1.1 ist leider nichts darüber zu finden.

    Gibt es schon eine neuere Doku zu der CANopen-Lib als V1.1?

     
  • aho - 2007-06-15

    ok, dann geb ich hier mal die Antwort, so gehts:

    WHILE CanOpenSendSDO.bAnswerRec <> TRUE DO

    CanOpenSendSDO(

    Enable:= 1,
    
    wDrvNr:= 0,
    
    ucNodeId:= 32,
    
    wIndex:= 16#3400,
    
    bySubIndex:= 5,
    
    ucModus:= 16#40,
    
    ucByte0:= ,
    
    ucByte1:= ,
    
    ucByte2:= ,
    
    ucByte3:= ,
    
    aAbortCode:= ,
    
    dwDataBufferLength:= SIZEOF(sInfo3),
    
    pDataBuffer:= ADR(sInfo3),
    
    bWaitForAnswer=> ,
    
    bAnswerRec=> ,
    
    ucAnswerBytes=> ,
    
    iAnswerLength=> ,
    
    bToggleUnequal=> ,
    
    bAbortRec=> ,
    
    aAbortRec=> );
    

    END_WHILE

    und auf Bus siehts dann so aus:

    ; Columns description:

    ; ~~~~~~~~~~~~~~~~~~~~~

    ; +-Message Number

    ; | +Time Offset (ms)

    ; | | +Type

    ; | | | +ID (hex)

    ; | | | | +Data Length Code

    ; | | | | | +Data Bytes (hex) ...

    ; | | | | | |

    ;---+-- ----+---- --+-- ---- +--- + -+ -- -- -- -- -- -- --

    537) 10519.8 Rx 0620 8 40 00 34 05 00 00 00 00

    538) 10521.1 Rx 05A0 8 41 00 34 05 14 00 00 00

    539) 10521.9 Rx 0620 8 60 00 00 00 00 00 00 00

    540) 10522.9 Rx 05A0 8 00 31 37 2E 30 34 2E 32

    541) 10523.9 Rx 0620 8 70 00 00 00 00 00 00 00

    542) 10524.8 Rx 05A0 8 10 30 30 37 00 00 00 00

    543) 10525.9 Rx 0620 8 60 00 00 00 00 00 00 00

    544) 10528.0 Rx 05A0 8 03 00 00 00 00 00 00 00

     

Log in to post a comment.