Timeout bei Bacnetclientreadproperty [gelöst]

dirkf
2019-09-04
2019-09-11
  • dirkf - 2019-09-04

    Hallo zusammen,

    ich arbeite mich grad in Bacnet ein und laufe auch direkt in eine Herausforderung.

    Ein im Codesys angelegter BACnet-Server mit einem analogen input läuft ohne Probleme und ich kann den hinterlegten Wert über das Beispiel auslesen. was für mich erstmal bedeutet der Code ist ok.

    Versuche ich jedoch einen Bacnet-Controller im lokalen Netz auszulesen bekomme ich laut eStatus im BACnetClientReadProperty einen timeout.
    Das Anheben der Zeit bis zum timeout hatte auch keinen Erfolg.
    Ein mitlaufender Wireshark zeigt sowohl den Request als auch die Rückmeldung des Controllers mit dem entsprechenden Wert an.
    Nun stellt sich mir die Frage wo ich den Denkfehler begangan habe.

    Folgenden Code wird verwendet, vom Beispiel habe ich nur DeviceID und die ObjektID geändert.

    PROGRAM PLC_PRG
    VAR
        initDone : BOOL := FALSE;
        readProp : BACnet.BACnetClientReadProperty;
        readPropCnt : INT := 0;
        readPropErrorCnt : INT := 0;
        readPropCancelCnt : INT := 0;
        readPropVal : REAL;
    END_VAR
    IF NOT initDone THEN
                    readProp.RegisterToServer(BACnet_Server);
                    readProp(
                                   dwTargetDeviceNumber:= 2098177, //Controller
                                   objType:= BACnet.CmpBACnet.IEC_BACNET_OBJECT_TYPE.OBJ_ANALOG_VALUE,
                                   objInst:= 8, //Temperaturfühler 
                                   propID:= BACnet.CmpBACnet.IEC_BACNET_PROPERTY_ID.PROP_PRESENT_VALUE,
                                   nIndex:= -1);
    END_IF
    IF readProp.xExecute AND readProp.xBusy AND readProp.iState = 3 THEN
                    IF readPropCnt MOD 2 = 0 THEN // cancel every second request
                                   readProp.xAbort := TRUE;
                                   readPropCancelCnt := readPropCancelCnt + 1;
                    END_IF
    END_IF
    IF NOT readProp.xExecute AND NOT readProp.xAborted AND NOT readProp.xDone THEN
                    readProp.xExecute := TRUE;
                    readPropCnt := readPropCnt + 1;
    END_IF
    IF readProp.xExecute THEN
                    IF readProp.xDone THEN
                                   readProp.xExecute := FALSE;
                    END_IF
                    IF readProp.xError THEN
                                   readProp.xExecute := FALSE;
                                   readPropErrorCnt := readPropErrorCnt + 1;
                    END_IF
                    IF readProp.xAborted THEN
                                   readProp.xExecute := FALSE;
                                   readProp.xAbort := FALSE;
                    END_IF
    END_IF
    readProp();
    IF readProp.xDone OR readProp.xError THEN
                    IF readProp.xError THEN
                                   // handle error
                                   ;
                    ELSE
                                   readPropVal := BACnet.GetRealFromContents(readProp.result);
                    END_IF
    END_IF
    

    Der Controller liefert über Yabe (ein kleiner Bacnet explorer) Werte ab.

    Ich bin für jeden Wink und Hinweis dankbar.

    Dirk

     
  • Thomas - 2019-09-09

    Moin Dirk,
    das erste was mir auffällt, das Du "initDone" nicht zurück (bzw. auf TRUE) setzt. == >> RegisterToServer wird x-Mal ausgeführt

    Ich habe gerade noch mal den Code aus dem FAQ probiert, der arbeitet korrekt.

    fbReadProperty  : BACnet.BACnetClientReadProperty;
    xReadExecute    : BOOL;
    lrReadValue     : LREAL;
    
    xInitDone       : BOOL := FALSE;
    

    IF NOT xInitDone THEN
    fbReadProperty.RegisterToServer(BACnet_Client);
    fbReadProperty(dwTargetDeviceNumber := 718,
    objType := BACnet.CmpBACnet.IEC_BACNET_OBJECT_TYPE.OBJ_ANALOG_VALUE,
    objInst := 1,
    propID := BACnet.CmpBACnet.IEC_BACNET_PROPERTY_ID.PROP_PRESENT_VALUE);
    xInitDone := TRUE;
    ELSE
    fbReadProperty(xExecute := xReadExecute);
    IF fbReadProperty.xDone THEN
    xReadExecute := FALSE;
    lrReadValue := BACnet.GetRealFromContents(fbReadProperty.result);
    END_IF
    END_IF

    Auch der gesonderte Aufruf von "readProp();" erscheint mir überflüssig.

    Gruß, viel Erfolg

     
  • dirkf - 2019-09-11

    Hallo.

    das Problem konnte glücklicherweise gelöst werden.
    Warum es genau zum Timeout kam konnte ich nicht ermitteln.
    Behoben wurde das ganze für die unter Windows10 installierte Version durch die Installation des Funktionupdates 1903.

    Dirk

     

Log in to post a comment.