public void Process(HeaderInfo info, IEnumerable <IndexedValue <TimeAndInterval> > values) { var base_group = 50; var group = 50; var variation = 1; switch (info.variation) { case GroupVariation.Group50Var1: group = 50; variation = 1; break; case GroupVariation.Group50Var3: group = 50; variation = 3; break; case GroupVariation.Group50Var4: group = 50; variation = 4; break; } foreach (var idxvalue in values) { var DNP3_Value = new DNP3_Value { address = idxvalue.Index, base_group = base_group, group = group, variation = variation, value = idxvalue.Value.interval, valueBSON = new BsonDocumentWrapper(idxvalue.Value), valueString = idxvalue.Value.ToString(), cot = info.isEvent ? 3 : 20, serverTimestamp = DateTime.Now, hasSourceTimestamp = true, sourceTimestamp = (new DateTime()).AddSeconds(idxvalue.Value.time), timeStampQuality = TimestampQuality.SYNCHRONIZED, qOnline = true, qRestart = false, qCommLost = false, qRemoteForced = false, qLocalForced = false, qOverrange = false, qRollover = false, qDiscontinuity = false, qReferenceError = false, qTransient = false, conn_number = ConnectionNumber }; DNP3DataQueue.Enqueue(DNP3_Value); if (LogLevel >= LogLevelDetailed) { Log(ConnectionName + ": TimeAndInterval, Ind: " + idxvalue.Index + " " + idxvalue.Value.ToString(), LogLevelDetailed); } } }
public void Process(HeaderInfo info, IEnumerable <IndexedValue <AnalogOutputInt16> > values) { var base_group = 41; var group = 41; var variation = 2; switch (info.variation) { case GroupVariation.Group41Var0: group = 41; variation = 0; break; case GroupVariation.Group41Var2: group = 41; variation = 2; break; } foreach (var idxvalue in values) { var DNP3_Value = new DNP3_Value { address = idxvalue.Index, base_group = base_group, group = group, variation = variation, value = idxvalue.Value.value, valueBSON = new BsonDocumentWrapper(idxvalue.Value), valueString = idxvalue.Value.ToString(), cot = info.isEvent ? 3 : 20, serverTimestamp = DateTime.Now, hasSourceTimestamp = false, sourceTimestamp = new DateTime(), timeStampQuality = TimestampQuality.INVALID, qOnline = true, qRestart = false, qCommLost = false, qRemoteForced = false, qLocalForced = false, qOverrange = false, qRollover = false, qDiscontinuity = false, qReferenceError = false, qTransient = false, conn_number = ConnectionNumber }; DNP3DataQueue.Enqueue(DNP3_Value); if (LogLevel >= LogLevelDetailed) { Log(ConnectionName + ": AnalogOutputInt16, Ind: " + idxvalue.Index + " " + idxvalue.Value.ToString(), LogLevelDetailed); } } }
public void Process(HeaderInfo info, IEnumerable <IndexedValue <BinaryCommandEvent> > values) { var base_group = 13; var group = 13; var variation = 1; switch (info.variation) { case GroupVariation.Group13Var1: group = 13; variation = 1; break; case GroupVariation.Group13Var2: group = 13; variation = 2; break; } foreach (var idxvalue in values) { var DNP3_Value = new DNP3_Value { address = idxvalue.Index, base_group = base_group, group = group, variation = variation, value = System.Convert.ToDouble(idxvalue.Value.Value), valueBSON = new BsonDocumentWrapper(idxvalue.Value), valueString = idxvalue.Value.ToString(), cot = info.isEvent ? 3 : 20, serverTimestamp = DateTime.Now, hasSourceTimestamp = (idxvalue.Value.Timestamp.ToEpoch() != 0), sourceTimestamp = idxvalue.Value.Timestamp.Value.Date, timeStampQuality = idxvalue.Value.Timestamp.Quality, qOnline = idxvalue.Value.Status == 0, // success qRestart = false, qCommLost = false, qRemoteForced = false, qLocalForced = false, qOverrange = false, qRollover = false, qDiscontinuity = false, qReferenceError = false, qTransient = false, conn_number = ConnectionNumber }; DNP3DataQueue.Enqueue(DNP3_Value); if (LogLevel >= LogLevelDetailed) { Log(ConnectionName + ": BinaryCommandEvent, Ind: " + idxvalue.Index + " " + idxvalue.Value.ToString(), LogLevelDetailed); } } }
public void Process(HeaderInfo info, IEnumerable <IndexedValue <OctetString> > values) { var base_group = 110; var group = 110; switch (info.variation) { case GroupVariation.Group110Var0: group = 110; break; case GroupVariation.Group111Var0: group = 111; break; } foreach (var idxvalue in values) { var DNP3_Value = new DNP3_Value { address = idxvalue.Index, base_group = base_group, group = group, variation = idxvalue.Value.Bytes.Length, value = idxvalue.Value.Bytes.Length, valueBSON = BsonValue.Create(idxvalue.Value.Bytes), valueString = System.Text.Encoding.Default.GetString(idxvalue.Value.Bytes), cot = info.isEvent ? 3 : 20, serverTimestamp = DateTime.Now, hasSourceTimestamp = false, sourceTimestamp = new DateTime(), timeStampQuality = TimestampQuality.INVALID, qOnline = true, qRestart = false, qCommLost = false, qRemoteForced = false, qLocalForced = false, qOverrange = false, qRollover = false, qDiscontinuity = false, qReferenceError = false, qTransient = false, conn_number = ConnectionNumber }; DNP3DataQueue.Enqueue(DNP3_Value); if (LogLevel >= LogLevelDetailed) { Log(ConnectionName + ": OctetString, Ind: " + idxvalue.Index + " " + idxvalue.Value.ToString(), LogLevelDetailed); } } }
public void Process(HeaderInfo info, IEnumerable <IndexedValue <Binary> > values) { var base_group = 1; var group = 1; var variation = 0; switch (info.variation) { case GroupVariation.Group1Var0: group = 1; variation = 0; break; case GroupVariation.Group1Var1: group = 1; variation = 1; break; case GroupVariation.Group1Var2: group = 1; variation = 2; break; case GroupVariation.Group2Var0: group = 2; variation = 0; break; case GroupVariation.Group2Var1: group = 2; variation = 1; break; case GroupVariation.Group2Var2: group = 2; variation = 2; break; case GroupVariation.Group2Var3: group = 2; variation = 3; break; } foreach (var idxvalue in values) { var DNP3_Value = new DNP3_Value { address = idxvalue.Index, base_group = base_group, group = group, variation = variation, value = idxvalue.Value.Value ? 1 : 0, valueBSON = new BsonDocumentWrapper(idxvalue.Value), valueString = idxvalue.Value.ToString(), cot = info.isEvent ? 3 : 20, serverTimestamp = DateTime.Now, hasSourceTimestamp = (idxvalue.Value.Timestamp.ToEpoch() != 0), sourceTimestamp = idxvalue.Value.Timestamp.Value.Date, timeStampQuality = idxvalue.Value.Timestamp.Quality, qOnline = idxvalue.Value.Quality.IsSet(BinaryQuality.ONLINE), qRestart = idxvalue.Value.Quality.IsSet(BinaryQuality.RESTART), qCommLost = idxvalue.Value.Quality.IsSet(BinaryQuality.COMM_LOST), qRemoteForced = idxvalue.Value.Quality.IsSet(BinaryQuality.REMOTE_FORCED), qLocalForced = idxvalue.Value.Quality.IsSet(BinaryQuality.LOCAL_FORCED), qOverrange = false, qRollover = false, qDiscontinuity = false, qReferenceError = false, qTransient = false, conn_number = ConnectionNumber }; DNP3DataQueue.Enqueue(DNP3_Value); if (LogLevel >= LogLevelDetailed) { Log(ConnectionName + ": Binary, Ind: " + idxvalue.Index + " " + idxvalue.Value.ToString(), LogLevelDetailed); } } }
// This process updates acquired values in the mongodb collection for realtime data static async void ProcessMongo(JSONSCADAConfig jsConfig) { do { try { var Client = ConnectMongoClient(jsConfig); var DB = Client.GetDatabase(jsConfig.mongoDatabaseName); var collection = DB.GetCollection <rtData>(RealtimeDataCollectionName); var collection_cmd = DB .GetCollection <rtCommand>(CommandsQueueCollectionName); var listWrites = new List <WriteModel <rtData> >(); do { bool isMongoLive = DB .RunCommandAsync((Command <BsonDocument>) "{ping:1}") .Wait(1000); if (!isMongoLive) { throw new Exception("Error on MongoDB connection "); } DNP3_Value iv; while (DNP3DataQueue.TryDequeue(out iv)) { DateTime tt = DateTime.MinValue; BsonValue bsontt = BsonNull.Value; try { if (iv.hasSourceTimestamp) { bsontt = BsonValue.Create(iv.sourceTimestamp); } } catch { tt = DateTime.MinValue; bsontt = BsonNull.Value; } string valueString; if (iv.valueString == "") { valueString = iv.value.ToString(); } else { valueString = iv.valueString; } //below code will update one record of the data var update = new BsonDocument { { "$set", new BsonDocument { { "sourceDataUpdate", new BsonDocument { { "valueAtSource", BsonValue .Create(iv.value) }, { "valueStringAtSource", BsonValue .Create(valueString) }, { "valueJSONAtSource", iv.valueBSON }, { "asduAtSource", BsonValue .Create(iv.group.ToString() + " " + iv.variation.ToString()) }, { "causeOfTransmissionAtSource", BsonValue.Create(iv.cot.ToString()) }, { "timeTagAtSource", bsontt }, { "timeTagAtSourceOk", BsonValue .Create(iv.timeStampQuality == TimestampQuality.SYNCHRONIZED) }, { "timeTag", BsonValue .Create(iv.serverTimestamp) }, { "notTopicalAtSource", BsonValue .Create(iv.qCommLost) }, { "invalidAtSource", BsonValue .Create(iv.qCommLost || iv.qReferenceError || !iv.qOnline) }, { "overflowAtSource", BsonValue .Create(iv.qOverrange) }, { "blockedAtSource", BsonValue .Create(!iv.qOnline) }, { "substitutedAtSource", BsonValue .Create(iv.qRemoteForced || iv.qLocalForced) }, { "carryAtSource", BsonValue .Create(iv.qRollover) }, { "transientAtSource", BsonValue .Create(iv.qTransient) }, { "originator", BsonValue .Create(ProtocolDriverName + "|" + iv.conn_number) } } } } } }; var filt = new rtFilt { protocolSourceConnectionNumber = iv.conn_number, protocolSourceCommonAddress = iv.base_group, protocolSourceObjectAddress = iv.address }; Log("MongoDB - ADD - Connection: " + iv.conn_number + " Group: " + iv.base_group + " Address: " + iv.address + " Value: " + iv.value, LogLevelDetailed); listWrites .Add(new UpdateOneModel <rtData>(filt .ToBsonDocument(), update)); } if (listWrites.Count > 0) { Log("MongoDB - Bulk write " + listWrites.Count); var bulkWriteResult = await collection.BulkWriteAsync(listWrites); listWrites.Clear(); } else { Thread.Sleep(100); } }while (true); } catch (Exception e) { Log("Exception Mongo"); Log(e); Log(e .ToString() .Substring(0, e.ToString().IndexOf(Environment.NewLine))); System.Threading.Thread.Sleep(3000); while (DNP3DataQueue.Count > DataBufferLimit // do not let data queue grow more than a limit ) { Log("Dequeue Data", LogLevelDetailed); DNP3_Value iv; DNP3DataQueue.TryDequeue(out iv); } } }while (true); }