/// <summary> /// Reads the status from the server. /// </summary> public OPCSERVERSTATUS?GetStatus() { string methodName = "IOPCServer.GetStatus"; try { IOPCServer server = BeginComCall <IOPCServer>(methodName, true); IntPtr ppServerStatus; server.GetStatus(out ppServerStatus); OpcRcw.Da.OPCSERVERSTATUS pStatus = (OpcRcw.Da.OPCSERVERSTATUS)Marshal.PtrToStructure(ppServerStatus, typeof(OpcRcw.Da.OPCSERVERSTATUS)); Marshal.DestroyStructure(ppServerStatus, typeof(OpcRcw.Da.OPCSERVERSTATUS)); Marshal.FreeCoTaskMem(ppServerStatus); return(pStatus); } catch (Exception e) { ComCallError(methodName, e); return(null); } finally { EndComCall(methodName); } }
/// <summary> /// Returns the current server status. /// </summary> /// <returns>The current server status.</returns> public ServerStatus GetStatus() { ServerStatus output = null; lock (this) { if (m_server == null) { throw new Exception("The remote server is not currently connected."); } // initialize arguments. IntPtr pStatus = IntPtr.Zero; // invoke COM method. try { ((IOPCServer)m_server).GetStatus(out pStatus); } catch (Exception e) { throw Interop.CreateException("IOPCServer.GetStatus", e); } if (pStatus != IntPtr.Zero) { OpcRcw.Da.OPCSERVERSTATUS status = (OpcRcw.Da.OPCSERVERSTATUS)Marshal.PtrToStructure(pStatus, typeof(OpcRcw.Da.OPCSERVERSTATUS)); output = new ServerStatus(); output.VendorInfo = status.szVendorInfo; output.ProductVersion = String.Format("{0}.{1}.{2}", status.wMajorVersion, status.wMinorVersion, status.wBuildNumber); output.ServerState = (serverState)status.dwServerState; output.StatusInfo = null; output.StartTime = Interop.GetFILETIME(OpcDa.Client.Com.Convert.GetFileTime(status.ftStartTime)); output.CurrentTime = Interop.GetFILETIME(OpcDa.Client.Com.Convert.GetFileTime(status.ftCurrentTime)); output.LastUpdateTime = Interop.GetFILETIME(OpcDa.Client.Com.Convert.GetFileTime(status.ftLastUpdateTime)); Marshal.DestroyStructure(pStatus, typeof(OpcRcw.Da.OPCSERVERSTATUS)); Marshal.FreeCoTaskMem(pStatus); pStatus = IntPtr.Zero; } } return(output); }
///<summary> /// IOPCServer::GetStatus - Gets a current status information about the Server. ///</summary> public void GetStatus(out System.IntPtr ppServerStatus) { lock (m_lock) { // intialize default values. OpcRcw.Da.OPCSERVERSTATUS status = new OPCSERVERSTATUS(); status.ftStartTime = ComUtils.GetFILETIME(m_startTime); status.ftCurrentTime = ComUtils.GetFILETIME(DateTime.UtcNow); status.ftLastUpdateTime = ComUtils.GetFILETIME(m_lastUpdateTime); status.dwBandWidth = -1; status.dwGroupCount = m_groups.Count; status.wReserved = 0; status.dwServerState = OPCSERVERSTATE.OPC_STATUS_FAILED; status.wMajorVersion = 0; status.wMinorVersion = 0; status.wBuildNumber = 0; status.szVendorInfo = null; try { UpdateServerStatus(ref status); } catch (Exception e) { Utils.Trace(e, "Error reading server status."); // return a status structure with a failed state. } // marshal parameters. ppServerStatus = Marshal.AllocCoTaskMem(Marshal.SizeOf(typeof(OpcRcw.Da.OPCSERVERSTATUS))); Marshal.StructureToPtr(status, ppServerStatus, false); } }