private void AssetsDocumentReceived(MTConnectAssets.Document document) { log.Trace("MTConnect Assets Document Received @ " + DateTime.Now.ToString("o")); UpdateConnectedStatus(true); if (document.Assets != null) { var assets = new List <AssetDefinition>(); foreach (var asset in document.Assets.Assets) { assets.Add(Create(_deviceId, document.Header.InstanceId, asset)); } if (assets.Count > 0) { AssetsReceived?.Invoke(this, assets); } } }
private void ProcessAssetResponse(MTConnectAssets.Document document) { AssetsReceived?.Invoke(document); }
private async Task Run() { long instanceId = -1; bool initialize = true; do { var probe = new Probe(BaseUrl, DeviceName); probe.Timeout = Timeout; probe.Error += MTConnectErrorRecieved; probe.ConnectionError += ProcessConnectionError; var probeDoc = await probe.Execute(); if (probeDoc != null) { // Raise ProbeReceived Event ProbeReceived?.Invoke(probeDoc); do { // Get All Assets var assets = new Asset(BaseUrl); assets.Error += MTConnectErrorRecieved; var assetsDoc = await assets.Execute(); if (assetsDoc != null) { AssetsReceived?.Invoke(assetsDoc); } var current = new Current(BaseUrl, DeviceName); current.Timeout = Timeout; current.Error += MTConnectErrorRecieved; current.ConnectionError += ProcessConnectionError; var currentDoc = await current.Execute(); if (currentDoc != null) { // Check if FirstSequence is larger than previously Sampled if (!initialize) { initialize = SampleRange.From > 0 && currentDoc.Header.FirstSequence > SampleRange.From; } if (initialize) { // Raise CurrentReceived Event CurrentReceived?.Invoke(currentDoc); // Check Assets if (currentDoc.DeviceStreams.Count > 0) { var deviceStream = currentDoc.DeviceStreams.Find(o => o.Name == DeviceName); if (deviceStream != null && deviceStream.DataItems != null) { CheckAssetChanged(deviceStream.DataItems); } } } // Check if Agent InstanceID has changed (Agent has been reset) if (initialize || instanceId != currentDoc.Header.InstanceId) { SampleRange.Reset(); instanceId = currentDoc.Header.InstanceId; // Restart entire request sequence if new Agent Instance Id is read (probe could have changed) if (!initialize) { break; } } long from; if (initialize) { from = currentDoc.Header.NextSequence; } else { // If recovering from Error then use last Sample Range that was sampled successfully // Try to get Buffer minus 100 (to account for time between current and sample requests) from = currentDoc.Header.LastSequence - (currentDoc.Header.BufferSize - 100); from = Math.Max(from, currentDoc.Header.FirstSequence); from = Math.Max(SampleRange.From, from); } long to; if (initialize) { to = from; } else { // Get up to the MaximumSampleCount to = currentDoc.Header.NextSequence; to = Math.Min(to, from + MaximumSampleCount); } // Set the SampleRange for subsequent samples SampleRange.From = from; SampleRange.To = to; initialize = false; // Create the Url to use for the Sample Stream string url = CreateSampleUrl(BaseUrl, DeviceName, Interval, from, MaximumSampleCount); // Create and Start the Sample Stream if (sampleStream != null) { sampleStream.Stop(); } sampleStream = new Stream(url, "MTConnectStreams"); sampleStream.Timeout = Timeout; sampleStream.XmlReceived += ProcessSampleResponse; sampleStream.ConnectionError += ProcessConnectionError; await sampleStream.Run(); } } while (!stop.WaitOne(RetryInterval, true)); } } while (!stop.WaitOne(RetryInterval, true)); Stopped?.Invoke(); }