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.
PROGRAMPLC_PRGVAR
  initDone : BOOL :=FALSE;
  readProp : BACnet.BACnetClientReadProperty;
  readPropCnt : INT :=0;
  readPropErrorCnt : INT :=0;
  readPropCancelCnt : INT :=0;
  readPropVal : REAL;END_VARIFNOTinitDoneTHEN
        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_IFIFreadProp.xExecuteANDreadProp.xBusyANDreadProp.iState=3THEN
        IFreadPropCntMOD2=0THEN//canceleverysecondrequest
                readProp.xAbort :=TRUE;
                readPropCancelCnt :=readPropCancelCnt+1;
        END_IFEND_IFIFNOTreadProp.xExecuteANDNOTreadProp.xAbortedANDNOTreadProp.xDoneTHEN
        readProp.xExecute :=TRUE;
        readPropCnt :=readPropCnt+1;END_IFIFreadProp.xExecuteTHEN
        IFreadProp.xDoneTHEN
                readProp.xExecute :=FALSE;
        END_IF
        IFreadProp.xErrorTHEN
                readProp.xExecute :=FALSE;
                readPropErrorCnt :=readPropErrorCnt+1;
        END_IF
        IFreadProp.xAbortedTHEN
                readProp.xExecute :=FALSE;
                readProp.xAbort :=FALSE;
        END_IFEND_IFreadProp();IFreadProp.xDoneORreadProp.xErrorTHEN
        IFreadProp.xErrorTHEN
                //handleerror
                ;
        ELSE
                readPropVal :=BACnet.GetRealFromContents(readProp.result);
        END_IFEND_IF
Der Controller liefert über Yabe (ein kleiner Bacnet explorer) Werte ab.
Ich bin für jeden Wink und Hinweis dankbar.
Dirk
If you would like to refer to this comment somewhere else in this project, copy and paste the following link:
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
If you would like to refer to this comment somewhere else in this project, copy and paste the following link:
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.
Der Controller liefert über Yabe (ein kleiner Bacnet explorer) Werte ab.
Ich bin für jeden Wink und Hinweis dankbar.
Dirk
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.
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
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