Stores information about an HDA item.
コード例 #1
0
ファイル: ComHdaClient.cs プロジェクト: OPCFoundation/UA-.NET
        /// <summary>
        /// Releases the handles for the items.
        /// </summary>
        public void ReleaseItemHandles(HdaItem[] items)
        {
            if (items == null)
            {
                return;
            }

            int[] serverHandles = new int[items.Length];

            for (int ii = 0; ii < items.Length; ii++)
            {
                serverHandles[ii] = items[ii].ServerHandle;
            }

            int[] errors = ReleaseItemHandles(serverHandles);

            for (int ii = 0; ii < items.Length; ii++)
            {
                items[ii].ServerHandle = 0;
                items[ii].Error = ResultIds.E_FAIL;

                if (errors != null)
                {
                    items[ii].Error = errors[ii];
                }
            }
        }
コード例 #2
0
ファイル: ComHdaClient.cs プロジェクト: OPCFoundation/UA-.NET
        /// <summary>
        /// Reads the values for all available attributes.
        /// </summary>
        /// <param name="item">The item.</param>
        /// <returns>The list of attribute values for the item.</returns>
        public HdaAttributeValue[] ReadAvailableAttributes(HdaItem item)
        {
            if (item == null)
            {
                return null;
            }

            // get the supported attributes.
            if (m_supportedAttributes == null)
            {
                UpdateServerMetadata();
            }

            HdaAttribute[] supportedAttributes = m_supportedAttributes;

            if (supportedAttributes == null || supportedAttributes.Length == 0)
            {
                return null;
            }

            // read the attribute values.
            int[] attributeIds = new int[supportedAttributes.Length];

            for (int ii = 0; ii < supportedAttributes.Length; ii++)
            {
                attributeIds[ii] = Utils.ToInt32(supportedAttributes[ii].Id);
            }

            return ReadAttributeValues(item.ServerHandle, attributeIds);
        }
コード例 #3
0
ファイル: ComHdaClient.cs プロジェクト: OPCFoundation/UA-.NET
        /// <summary>
        /// Get handles for the specified items.
        /// </summary>
        public HdaItem[] GetItems(params string[] itemIds)
        {
            string methodName = "IOPCHDA_Server.GetItemHandles";

            if (itemIds == null)
            {
                return null;
            }

            IntPtr pphServer;
            IntPtr ppErrors;

            try
            {
                IOPCHDA_Server server = BeginComCall<IOPCHDA_Server>(methodName, true);

                server.GetItemHandles(
                    itemIds.Length,
                    itemIds,
                    new int[itemIds.Length],
                    out pphServer,
                    out ppErrors);
            }
            catch (Exception e)
            {
                ComCallError(methodName, e);
                return null;
            }
            finally
            {
                EndComCall(methodName);
            }

            int[] serverHandles = ComUtils.GetInt32s(ref pphServer, itemIds.Length, true);
            int[] errors = ComUtils.GetInt32s(ref ppErrors, itemIds.Length, true);

            HdaItem[] results = new HdaItem[itemIds.Length];

            for (int ii = 0; ii < results.Length; ii++)
            {
                HdaItem result = results[ii] = new HdaItem();

                result.ItemId = itemIds[ii];
                result.ServerHandle = serverHandles[ii];
                result.Error = errors[ii];
            }

            return results;
        }
コード例 #4
0
ファイル: ComHdaClient.cs プロジェクト: OPCFoundation/UA-.NET
        /// <summary>
        /// Deletes the raw data for an item.
        /// </summary>
        private int[] DeleteAtTime(HdaItem item, DateTimeCollection timestamps)
        {
            string methodName = "IOPCHDA_SyncUpdate.DeleteAtTime";

            int count = timestamps.Count;
            int[] serverHandles = new int[count];
            System.Runtime.InteropServices.ComTypes.FILETIME[] pTimestamps = new System.Runtime.InteropServices.ComTypes.FILETIME[count];

            for (int ii = 0; ii < count; ii++)
            {
                serverHandles[ii] = item.ServerHandle;
                pTimestamps[ii] = ComUtils.GetFILETIME(timestamps[ii]);
            }

            IntPtr ppErrors;

            try
            {
                IOPCHDA_SyncUpdate server = BeginComCall<IOPCHDA_SyncUpdate>(methodName, true);

                server.DeleteAtTime(
                    count,
                    serverHandles,
                    pTimestamps,
                    out ppErrors);
            }
            catch (Exception e)
            {
                ComCallError(methodName, e);

                int[] errors = new int[count];

                for (int ii = 0; ii < count; ii++)
                {
                    errors[ii] = ResultIds.E_FAIL;
                }

                return errors;
            }
            finally
            {
                EndComCall(methodName);
            }

            return ComUtils.GetInt32s(ref ppErrors, count, true);
        }
コード例 #5
0
ファイル: ComHdaClient.cs プロジェクト: OPCFoundation/UA-.NET
        /// <summary>
        /// Deletes the raw data for an item.
        /// </summary>
        private StatusCode DeleteRaw(HdaItem item, DateTime startTime, DateTime endTime)
        {
            string methodName = "IOPCHDA_SyncUpdate.DeleteRaw";

            OPCHDA_TIME htStartTime = ConvertTime(startTime);
            OPCHDA_TIME htEndTime = ConvertTime(endTime);

            IntPtr ppErrors;

            try
            {
                IOPCHDA_SyncUpdate server = BeginComCall<IOPCHDA_SyncUpdate>(methodName, true);

                server.DeleteRaw(
                    ref htStartTime,
                    ref htEndTime,
                    1,
                    new int[] { item.ServerHandle },
                    out ppErrors);
            }
            catch (Exception e)
            {
                ComCallError(methodName, e);
                return StatusCodes.BadUnexpectedError;
            }
            finally
            {
                EndComCall(methodName);
            }

            int[] errors = ComUtils.GetInt32s(ref ppErrors, 1, true);
            return MapErrorCodeToUpdateStatus(errors[0]);
        }
コード例 #6
0
ファイル: ComHdaClient.cs プロジェクト: OPCFoundation/UA-.NET
        /// <summary>
        /// Insert annotations.
        /// </summary>
        private StatusCode InsertAnnotations(
            HdaItem item,
            DataValueCollection values,
            out int[] errors)
        {
            errors = null;
            string methodName = "IOPCHDA_SyncAnnotations.Insert";

            int dwNumItems = values.Count;
            int[] phServer = new int[dwNumItems];
            System.Runtime.InteropServices.ComTypes.FILETIME[] ftTimeStamps = new System.Runtime.InteropServices.ComTypes.FILETIME[dwNumItems];
            OPCHDA_ANNOTATION[] pAnnotationValues = new OPCHDA_ANNOTATION[dwNumItems];

            IntPtr ppErrors;

            try
            {
                for (int ii = 0; ii < dwNumItems; ii++)
                {
                    DataValue value = values[ii];

                    phServer[ii] = item.ServerHandle;
                    ftTimeStamps[ii] = ComUtils.GetFILETIME(value.SourceTimestamp);
                    pAnnotationValues[ii] = new OPCHDA_ANNOTATION();

                    // pass an empty structure if the annotation is not valid.
                    pAnnotationValues[ii].dwNumValues = 0;

                    Annotation annotation = value.GetValue<Annotation>(null);

                    if (annotation != null && !String.IsNullOrEmpty(annotation.Message))
                    {
                        pAnnotationValues[ii].dwNumValues = 1;
                        pAnnotationValues[ii].ftAnnotationTime = ComUtils.GetFILETIMEs(new DateTime[] { annotation.AnnotationTime });
                        pAnnotationValues[ii].ftTimeStamps = ComUtils.GetFILETIMEs(new DateTime[] { value.SourceTimestamp });
                        pAnnotationValues[ii].szAnnotation = ComUtils.GetUnicodeStrings(new string[] { annotation.Message });
                        pAnnotationValues[ii].szUser = ComUtils.GetUnicodeStrings(new string[] { annotation.UserName });
                    }
                }

                IOPCHDA_SyncAnnotations server = BeginComCall<IOPCHDA_SyncAnnotations>(methodName, true);

                server.Insert(
                    dwNumItems,
                    phServer,
                    ftTimeStamps,
                    pAnnotationValues,
                    out ppErrors);

                // check for error.
                errors = ComUtils.GetInt32s(ref ppErrors, dwNumItems, true);
                
                // set bad type error for invalid annotations.
                for (int ii = 0; ii < dwNumItems; ii++)
                {
                    if (pAnnotationValues[ii].dwNumValues == 0)
                    {
                        errors[ii] = ResultIds.E_BADTYPE;
                    }
                }
            }
            catch (Exception e)
            {
                ComCallError(methodName, e);
                return StatusCodes.BadUnexpectedError;
            }
            finally
            {
                EndComCall(methodName);

                // free allocated memory.
                for (int ii = 0; ii < dwNumItems; ii++)
                {
                    if (pAnnotationValues[ii].dwNumValues == 0)
                    {
                        continue;
                    }

                    IntPtr[] pointers = new IntPtr[1];
                    Marshal.Copy(pAnnotationValues[ii].szUser, pointers, 0, 1);
                    Marshal.FreeCoTaskMem(pointers[0]);

                    Marshal.Copy(pAnnotationValues[ii].szAnnotation, pointers, 0, 1);
                    Marshal.FreeCoTaskMem(pointers[0]);

                    Marshal.FreeCoTaskMem(pAnnotationValues[ii].ftAnnotationTime);
                    Marshal.FreeCoTaskMem(pAnnotationValues[ii].ftTimeStamps);
                    Marshal.FreeCoTaskMem(pAnnotationValues[ii].szUser);
                    Marshal.FreeCoTaskMem(pAnnotationValues[ii].szAnnotation);
                }
            }

            return StatusCodes.Good;
        }
コード例 #7
0
ファイル: ComHdaClient.cs プロジェクト: OPCFoundation/UA-.NET
        /// <summary>
        /// Update data
        /// </summary>
        private StatusCode UpdateData(
            HdaItem item,
            PerformUpdateType updateType,
            DataValueCollection values, 
            out int[] errors)
        {
            errors = null;
            string methodName = "IOPCHDA_SyncUpdate.Insert";

            int dwNumItems = values.Count;
            int[] phServer = new int[dwNumItems];
            System.Runtime.InteropServices.ComTypes.FILETIME[] ftTimeStamps = new System.Runtime.InteropServices.ComTypes.FILETIME[dwNumItems];
            object[] vDataValues = new object[dwNumItems];
            int[] pdwQualities = new int[dwNumItems];

            for (int ii = 0; ii < dwNumItems; ii++)
            {
                DataValue value = values[ii];

                phServer[ii] = item.ServerHandle;
                vDataValues[ii] = ComUtils.GetVARIANT(value.WrappedValue);
                pdwQualities[ii] = Utils.ToInt32(ComUtils.GetHdaQualityCode(value.StatusCode));
                ftTimeStamps[ii] = ComUtils.GetFILETIME(value.SourceTimestamp);
            }

            IntPtr ppErrors = IntPtr.Zero;

            try
            {
                IOPCHDA_SyncUpdate server = BeginComCall<IOPCHDA_SyncUpdate>(methodName, true);

                switch (updateType)
                {
                    case PerformUpdateType.Insert:
                    {
                        server.Insert(
                            dwNumItems,
                            phServer,
                            ftTimeStamps,
                            vDataValues,
                            pdwQualities,
                            out ppErrors);

                        break;
                    }

                    case PerformUpdateType.Update:
                    {
                        server.InsertReplace(
                            dwNumItems,
                            phServer,
                            ftTimeStamps,
                            vDataValues,
                            pdwQualities,
                            out ppErrors);

                        break;
                    }

                    case PerformUpdateType.Replace:
                    {
                        server.Replace(
                            dwNumItems,
                            phServer,
                            ftTimeStamps,
                            vDataValues,
                            pdwQualities,
                            out ppErrors);

                        break;
                    }
                }

                // check for error.
                errors = ComUtils.GetInt32s(ref ppErrors, dwNumItems, true);
            }
            catch (Exception e)
            {
                ComCallError(methodName, e);
                return StatusCodes.BadUnexpectedError;
            }
            finally
            {
                EndComCall(methodName);
            }

            return StatusCodes.Good;
        }