CODESYS - das IEC 61131-3 Programmiersystem

Willkommen im offiziellen CODESYS - Forum von 3S-Smart Software Solutions | A member of the CODESYS Group
Deutsche Version English version russian version 
Aktuelle Zeit: Fr Sep 20, 2019 7:50 am

Alle Zeiten sind UTC




Ein neues Thema erstellen  Auf das Thema antworten  [ 3 Beiträge ] 
Autor Nachricht
BeitragVerfasst: Mi Sep 04, 2019 11:44 am 
Offline

Registriert: Di Mai 14, 2019 11:16 am
Beiträge: 2
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.
Code:
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


Zuletzt geändert von dirkf am Mi Sep 11, 2019 7:41 am, insgesamt 1-mal geändert.

Nach oben
   
BeitragVerfasst: Mo Sep 09, 2019 12:35 pm 
Offline

Registriert: Mi Okt 12, 2016 11:28 am
Beiträge: 24
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


Nach oben
   
BeitragVerfasst: Mi Sep 11, 2019 7:49 am 
Offline

Registriert: Di Mai 14, 2019 11:16 am
Beiträge: 2
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


Nach oben
   
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen  Auf das Thema antworten  [ 3 Beiträge ] 

Alle Zeiten sind UTC


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 2 Gäste


Sie dürfen keine neuen Themen in diesem Forum erstellen.
Sie dürfen keine Antworten zu Themen in diesem Forum erstellen.
Sie dürfen Ihre Beiträge in diesem Forum nicht ändern.
Sie dürfen Ihre Beiträge in diesem Forum nicht löschen.
Sie dürfen keine Dateianhänge in diesem Forum erstellen.

Suche nach:
Gehe zu:  
Powered by phpBB® Forum Software © phpBB Limited
Deutsche Übersetzung durch phpBB.de