Esempio n. 1
0
 def _make_monitored_item_request(self, node, attr, mfilter, queuesize):
     rv = ua.ReadValueId()
     rv.NodeId = node.nodeid
     rv.AttributeId = attr
     # rv.IndexRange //We leave it null, then the entire array is returned
     mparams = ua.MonitoringParameters()
     with self._lock:
         self._client_handle += 1
         mparams.ClientHandle = self._client_handle
     mparams.SamplingInterval = self.parameters.RequestedPublishingInterval
     mparams.QueueSize = queuesize
     mparams.DiscardOldest = True
     if mfilter:
         mparams.Filter = mfilter
     mir = ua.MonitoredItemCreateRequest()
     mir.ItemToMonitor = rv
     mir.MonitoringMode = ua.MonitoringMode.Reporting
     mir.RequestedParameters = mparams
     return mir
Esempio n. 2
0
    def _subscribe(self, node, attr, mfilter=None, queuesize=0):
        rv = ua.ReadValueId()
        rv.NodeId = node.nodeid
        rv.AttributeId = attr
        # rv.IndexRange //We leave it null, then the entire array is returned
        mparams = ua.MonitoringParameters()
        self._client_handle += 1
        mparams.ClientHandle = self._client_handle
        mparams.SamplingInterval = self.parameters.RequestedPublishingInterval
        mparams.QueueSize = queuesize
        mparams.DiscardOldest = True
        if mfilter:
            mparams.Filter = mfilter

        mir = ua.MonitoredItemCreateRequest()
        mir.ItemToMonitor = rv
        mir.MonitoringMode = ua.MonitoringMode.Reporting
        mir.RequestedParameters = mparams

        params = ua.CreateMonitoredItemsParameters()
        params.SubscriptionId = self.subscription_id
        params.ItemsToCreate.append(mir)
        params.TimestampsToReturn = ua.TimestampsToReturn.Neither

        with self._lock:
            results = self.server.create_monitored_items(params)
            result = results[0]
            result.StatusCode.check()

            data = SubscriptionItemData()
            data.client_handle = mparams.ClientHandle
            data.node = node
            data.attribute = attr
            data.server_handle = result.MonitoredItemId
            data.mfilter = ua.downcast_extobject(result.FilterResult)
            self._monitoreditems_map[mparams.ClientHandle] = data

        return result.MonitoredItemId
Esempio n. 3
0
 def create_monitored_items(self, nodes, index):
     monitored_items = []
     if not isinstance(nodes, list):
         nodes = [nodes]
     for node in nodes:
         # Set item to monitor
         rv = ua.ReadValueId()
         rv.NodeId = node.nodeid
         rv.AttributeId = ua.AttributeIds.Value
         # Set monitoring parameters
         mparams = ua.MonitoringParameters()
         self._client_handle += 1
         mparams.ClientHandle = self._client_handle
         mparams.SamplingInterval = self.samplingInterval
         mparams.QueueSize = self.queueSize
         mparams.DiscardOldest = self.discardOldest
         # Create monitored item filter
         if self.dataChangeFilter:
             mfilter = ua.DataChangeFilter()
             mfilter.Trigger = ua.DataChangeTrigger(self.dataChangeTrigger)
             if self.deadbandType == ua.DeadbandType.Absolute:
                 if node.get_data_value(
                 ).Value.VariantType in self.numericTypes:
                     mfilter.DeadbandType = self.deadbandType
                     mfilter.DeadbandValue = self.deadbandValue  # absolute float value or from 0 to 100 for percentage deadband
                 else:
                     self.deadbandType = ua.DeadbandType.None_
                     mfilter.DeadbandType = self.deadbandType
             elif self.deadbandType == ua.DeadbandType.Percent:
                 has_EURange = False
                 if node.get_type_definition(
                 ).Identifier == ua.object_ids.ObjectIds.AnalogItemType:
                     # Get node properties
                     descriptions = node.get_references(
                         ua.ObjectIds.HasProperty,
                         ua.BrowseDirection.Forward, ua.NodeClass.Variable,
                         False)
                     for desc in descriptions:
                         if desc.BrowseName.Name == "EURange" and self.get_node(
                                 desc.NodeId).get_value() is not None:
                             has_EURange = True
                 if has_EURange:
                     mfilter.DeadbandType = self.deadbandType
                     mfilter.DeadbandValue = self.deadbandValue  # absolute float value or from 0 to 100 for percentage deadband
                 else:
                     self.deadbandType = ua.DeadbandType.None_
                     mfilter.DeadbandType = self.deadbandType
         else:
             mfilter = None
         mparams.Filter = mfilter
         # Create monitored item request
         mir = ua.MonitoredItemCreateRequest()
         mir.ItemToMonitor = rv
         mir.MonitoringMode = ua.MonitoringMode.Reporting
         mir.RequestedParameters = mparams
         # Append to list
         monitored_items.append(mir)
     sub, monitored_items_handles = self._datachange_subs[index]
     handles = sub.create_monitored_items(monitored_items)
     for i in range(len(handles)):
         handle = handles[i]
         if type(handle) == ua.StatusCode:
             handle.check()
         monitored_items_handles[nodes[i].nodeid] = handle