/// <summary> /// Creates an array of item value result objects from the callback data. /// </summary> internal static DaValue[] GetItemValues( int dwCount, object[] pvValues, short[] pwQualities, System.Runtime.InteropServices.ComTypes.FILETIME[] pftTimeStamps, int[] pErrors) { // contruct the item value results. DaValue[] values = new DaValue[dwCount]; for (int ii = 0; ii < dwCount; ii++) { DaValue value = values[ii] = new DaValue(); value.Error = pErrors[ii]; if (pErrors[ii] >= 0) { value.Value = ComUtils.ProcessComValue(pvValues[ii]); value.Quality = pwQualities[ii]; value.Timestamp = ComUtils.GetDateTime(pftTimeStamps[ii]); } } // return results return(values); }
/// <summary> /// Updates the base event. /// </summary> private void UpdateBaseEvent(BaseEventState instance, EventType eventType, ONEVENTSTRUCT e) { BinaryEncoder encoder = new BinaryEncoder(ServiceMessageContext.GlobalContext); encoder.WriteString(null, e.szSource); encoder.WriteString(null, e.szConditionName); encoder.WriteInt32(null, e.ftActiveTime.dwHighDateTime); encoder.WriteInt32(null, e.ftActiveTime.dwLowDateTime); encoder.WriteInt32(null, e.dwCookie); byte[] eventId = encoder.CloseAndReturnBuffer(); NodeId eventTypeId = AeParsedNodeId.Construct(e.dwEventType, e.dwEventCategory, e.szConditionName, m_namespaceIndex); NodeId sourceNode = AeModelUtils.ConstructIdForSource(e.szSource, null, m_namespaceIndex); string sourceName = e.szSource; DateTime time = ComUtils.GetDateTime(e.ftTime); DateTime receiveTime = DateTime.UtcNow; LocalizedText message = e.szMessage; ushort severity = (ushort)e.dwSeverity; instance.TypeDefinitionId = eventTypeId; instance.SetChildValue(m_defaultContext, Opc.Ua.BrowseNames.EventId, eventId, false); instance.SetChildValue(m_defaultContext, Opc.Ua.BrowseNames.EventType, eventTypeId, false); instance.SetChildValue(m_defaultContext, Opc.Ua.BrowseNames.SourceNode, sourceNode, false); instance.SetChildValue(m_defaultContext, Opc.Ua.BrowseNames.SourceName, sourceName, false); instance.SetChildValue(m_defaultContext, Opc.Ua.BrowseNames.Time, time, false); instance.SetChildValue(m_defaultContext, Opc.Ua.BrowseNames.ReceiveTime, receiveTime, false); instance.SetChildValue(m_defaultContext, Opc.Ua.BrowseNames.Message, message, false); instance.SetChildValue(m_defaultContext, Opc.Ua.BrowseNames.Severity, severity, false); }
/// <summary> /// Updates the status node. /// </summary> protected override bool UpdateStatus() { // get the status from the server. ComDaClient client = DefaultClient; OPCSERVERSTATUS?status = client.GetStatus(); // check the client has been abandoned. if (!Object.ReferenceEquals(client, DefaultClient)) { return(false); } // update the server status. lock (StatusNodeLock) { if (status != null) { StatusNode.SetStatusCode(DefaultSystemContext, StatusCodes.Good, DateTime.UtcNow); StatusNode.ServerState.Value = Utils.Format("{0}", status.Value.dwServerState); StatusNode.CurrentTime.Value = ComUtils.GetDateTime(status.Value.ftCurrentTime); StatusNode.LastUpdateTime.Value = ComUtils.GetDateTime(status.Value.ftLastUpdateTime); StatusNode.StartTime.Value = ComUtils.GetDateTime(status.Value.ftStartTime); StatusNode.VendorInfo.Value = status.Value.szVendorInfo; StatusNode.SoftwareVersion.Value = Utils.Format("{0}.{1}.{2}", status.Value.wMajorVersion, status.Value.wMinorVersion, status.Value.wBuildNumber); } else { StatusNode.SetStatusCode(DefaultSystemContext, StatusCodes.BadOutOfService, DateTime.UtcNow); } StatusNode.ClearChangeMasks(DefaultSystemContext, true); return(status != null); } }
public void OnReadComplete(int dwTransid, int hGroup, int hrMasterquality, int hrMastererror, int dwCount, int[] phClientItems, object[] pvValues, short[] pwQualities, System.Runtime.InteropServices.ComTypes.FILETIME[] pftTimeStamps, int[] pErrors) { var items = new OpcItemState[dwCount]; for (int i = 0; i < dwCount; i++) { var item = new OpcItemState(); item.ClientHandle = phClientItems[i]; item.DataValue = pvValues[i]; item.ErrorCode = pErrors[i]; item.Quality = pwQualities[i]; item.Timestamp = ComUtils.GetDateTime(pftTimeStamps[i]); items[i] = item; } _group.OnReadComplete(new ReadCompleteEventArgs(dwTransid, hGroup, hrMasterquality, hrMastererror, items)); }
public OpcItemState[] Read(OpcDataSource source, int[] serverHandles) { var ppItemValues = IntPtr.Zero; var ppErrors = IntPtr.Zero; SyncIO.Read((OPCDATASOURCE)source, serverHandles.Length, serverHandles, out ppItemValues, out ppErrors); var errors = ComUtils.GetInt32s(ref ppErrors, serverHandles.Length, true); var values = GetStructures <OPCITEMSTATE>(ppItemValues, serverHandles.Length) .Zip(errors, (v, e) => new OpcItemState { ClientHandle = v.hClient, DataValue = v.vDataValue, ErrorCode = e, Quality = v.wQuality, Timestamp = ComUtils.GetDateTime(v.ftTimeStamp) }) .ToArray(); return(values); }
/// <summary> /// Unmarshals and deallocates a OPCITEMSTATE structures. /// </summary> internal static DaValue[] GetItemValues(ref IntPtr pInput, int count, bool deallocate) { DaValue[] output = null; if (pInput != IntPtr.Zero && count > 0) { output = new DaValue[count]; IntPtr pos = pInput; for (int ii = 0; ii < count; ii++) { OpcRcw.Da.OPCITEMSTATE result = (OpcRcw.Da.OPCITEMSTATE)Marshal.PtrToStructure(pos, typeof(OpcRcw.Da.OPCITEMSTATE)); DaValue value = new DaValue(); value.Value = ComUtils.ProcessComValue(result.vDataValue); value.Quality = result.wQuality; value.Timestamp = ComUtils.GetDateTime(result.ftTimeStamp); output[ii] = value; if (deallocate) { Marshal.DestroyStructure(pos, typeof(OpcRcw.Da.OPCITEMSTATE)); } pos = (IntPtr)(pos.ToInt32() + Marshal.SizeOf(typeof(OpcRcw.Da.OPCITEMSTATE))); } if (deallocate) { Marshal.FreeCoTaskMem(pInput); pInput = IntPtr.Zero; } } return(output); }
public OpcServerStatus GetStatus() { var ppStatus = IntPtr.Zero; _server.GetStatus(out ppStatus); var status = Marshal.PtrToStructure <OPCSERVERSTATUS>(ppStatus); Marshal.DestroyStructure <OPCSERVERSTATUS>(ppStatus); Marshal.FreeCoTaskMem(ppStatus); return(new OpcServerStatus { BandWidth = status.dwBandWidth, BuildNumber = status.wBuildNumber, CurrentTime = ComUtils.GetDateTime(status.ftCurrentTime), GroupCount = status.dwGroupCount, LastUpdateTime = ComUtils.GetDateTime(status.ftLastUpdateTime), MajorVersion = status.wMajorVersion, MinorVersion = status.wMinorVersion, ServerState = (OpcServerState)status.dwServerState, StartTime = ComUtils.GetDateTime(status.ftStartTime), VendorInfo = status.szVendorInfo }); }
/// <summary> /// Updates the condition event. /// </summary> private void UpdateAlarm(AlarmConditionState instance, EventType eventType, ONEVENTSTRUCT e) { instance.NodeId = AeParsedNodeId.ConstructIdForCondition(e.szSource, e.dwEventCategory, e.szConditionName, m_namespaceIndex); // find the condition class. NodeId classId = AeParsedNodeId.Construct(e.dwEventType, e.dwEventCategory, null, m_namespaceIndex); AeEventTypeState conditionClassType = m_cache.FindType(m_defaultContext, classId); if (conditionClassType != null) { instance.SetChildValue(m_defaultContext, Opc.Ua.BrowseNames.ConditionClassId, classId, false); instance.SetChildValue(m_defaultContext, Opc.Ua.BrowseNames.ConditionClassName, conditionClassType.EventType.Description, false); } else { instance.SetChildValue(m_defaultContext, Opc.Ua.BrowseNames.ConditionClassId, Opc.Ua.ObjectTypeIds.BaseConditionClassType, false); instance.SetChildValue(m_defaultContext, Opc.Ua.BrowseNames.ConditionClassName, "BaseConditionClass", false); } instance.SetChildValue(m_defaultContext, Opc.Ua.BrowseNames.ConditionName, e.szConditionName, false);; instance.SetChildValue(m_defaultContext, Opc.Ua.BrowseNames.ClientUserId, e.szActorID, false); instance.SetChildValue(m_defaultContext, Opc.Ua.BrowseNames.Quality, ComUtils.GetQualityCode(e.wQuality), false); bool acknowledged = (e.wNewState & Constants.CONDITION_ACKED) != 0; bool active = (e.wNewState & Constants.CONDITION_ACTIVE) != 0; bool enabled = (e.wNewState & Constants.CONDITION_ENABLED) != 0; bool retain = enabled & (active || !acknowledged); LocalizedText effectiveDisplayName = ConditionStateNames.Inactive; if (!enabled) { effectiveDisplayName = ConditionStateNames.Disabled; } else if (!acknowledged) { effectiveDisplayName = ConditionStateNames.Unacknowledged; } else if (active) { effectiveDisplayName = ConditionStateNames.Active; } instance.SetChildValue(m_defaultContext, Opc.Ua.BrowseNames.Retain, true, false); instance.EnabledState = new TwoStateVariableState(instance); instance.EnabledState.BrowseName = Opc.Ua.BrowseNames.EnabledState; instance.EnabledState.Value = new LocalizedText((enabled) ? ConditionStateNames.Enabled : ConditionStateNames.Disabled); instance.EnabledState.SetChildValue(m_defaultContext, Opc.Ua.BrowseNames.Id, enabled, false); instance.EnabledState.SetChildValue(m_defaultContext, Opc.Ua.BrowseNames.EffectiveDisplayName, effectiveDisplayName, false); instance.AckedState = new TwoStateVariableState(instance); instance.AckedState.BrowseName = Opc.Ua.BrowseNames.AckedState; instance.AckedState.Value = new LocalizedText((acknowledged) ? ConditionStateNames.Acknowledged : ConditionStateNames.Unacknowledged); instance.AckedState.SetChildValue(m_defaultContext, Opc.Ua.BrowseNames.Id, acknowledged, false); instance.ActiveState = new TwoStateVariableState(instance); instance.ActiveState.BrowseName = Opc.Ua.BrowseNames.ActiveState; instance.ActiveState.Value = new LocalizedText((active) ? ConditionStateNames.Active : ConditionStateNames.Inactive); instance.ActiveState.SetChildValue(m_defaultContext, Opc.Ua.BrowseNames.Id, active, false); instance.ActiveState.SetChildValue(m_defaultContext, Opc.Ua.BrowseNames.TransitionTime, ComUtils.GetDateTime(e.ftActiveTime), false); if (!String.IsNullOrEmpty(e.szSubconditionName)) { instance.ActiveState.SetChildValue(m_defaultContext, Opc.Ua.BrowseNames.EffectiveDisplayName, e.szSubconditionName, false); } }