예제 #1
0
            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);
                    }
                }
            }
예제 #2
0
            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);
                    }
                }
            }
예제 #3
0
            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);
                    }
                }
            }
예제 #4
0
            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);
                    }
                }
            }
예제 #5
0
            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);
                    }
                }
            }
예제 #6
0
        // 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);
        }