Skip to main content

Utilisation de BACnet Blocs fonctionnels clients

En plus de BACnet objets, BACnet les clients peuvent également être insérés en tant que "périphériques" sous un BACnet serveur.

Comme les objets et le serveur, chaque appareil client apporte également un bloc fonction instancié sous le même nom que l'appareil client.

Contrairement à BACnet des objets, un BACnet le client ne nécessite pas de configuration complexe (statique). Par conséquent, un bloc fonction client peut être utilisé même sans créer de BACnet client en tant que « appareil ». Dans ce cas, cependant, il doit être "connecté" à son BACnet serveur au moyen de RegisterToServer() dans IEC le code, et être activé de cette manière. Cette "activation" se produit automatiquement lorsqu'un BACnet le client est inséré en tant que "périphérique".

Le BACnet les blocs fonctionnels client implémentent le « modèle de comportement commun » et fournissent donc des entrées et des sorties pour le contrôle de flux.

  • Contributions xExecute et xAbort

  • Les sorties xBusy, xDone, xError, et xAborted

  • Entrées et sorties pour les paramètres et résultats de la demande du client

Exemple 2. Exemple de code CEI pour une action client

Le code suivant utilise le bloc fonction BACnetClientReadProperty du BACnet bibliothèque pour envoyer une demande de propriété de lecture client à un utilisateur spécifique BACnet périphérique client dans le BACnet réseau. La réponse reçue est lue dans une variable locale :

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:= 43,
        objType:= BACnet.CmpBACnet.IEC_BACNET_OBJECT_TYPE.OBJ_ANALOG_VALUE,
        objInst:= 1,
        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


Tant qu'une requête client envoie une réponse, le contenu de la réponse est fourni sous la forme d'une ou plusieurs variables de sortie, comme dans l'exemple ci-dessus. Cependant, cela peut varier en fonction de l'action du client. L'exemple utilise également la fonction auxiliaire GetRealFromContents() pour lire la variable de sortie readProp.result de type IEC_BACNET_PROPERTY_CONTENTS.