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
etxAbort
Les sorties
xBusy
,xDone
,xError
, etxAborted
Entrées et sorties pour les paramètres et résultats de la demande du 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
.