示例#1
0
        private async Task OpenIsolationPoints(Dictionary <long, DiscreteModbusData> isolationPoints)
        {
            var scadaCommandingClient     = ScadaCommandingClient.CreateClient();
            var enumerableCommandedValues = await CommandedValues.GetEnumerableDictionaryAsync();

            foreach (long measurementGid in isolationPoints.Keys)
            {
                await UpdateCommandedValues(measurementGid, enumerableCommandedValues);

                var value = (ushort)DiscreteCommandingType.OPEN;

                if (isolationPoints[measurementGid].Value == (ushort)DiscreteCommandingType.CLOSE && await GetCommandedValuesCondition(measurementGid, value))
                {
                    await scadaCommandingClient.SendSingleDiscreteCommand(measurementGid,
                                                                          value,
                                                                          CommandOriginType.OUTAGE_SIMULATOR);

                    var commandedValue = new CommandedValue()
                    {
                        MeasurementGid = measurementGid,
                        Value          = value,
                        TimeOfCreation = DateTime.UtcNow,
                    };

                    await CommandedValues.SetAsync(measurementGid, commandedValue);
                }
            }
        }
示例#2
0
        private async Task <bool> GetCommandedValuesCondition(long measurementGid, ushort commandValue)
        {
            var result = true;
            var enumerableCommandedValues = await CommandedValues.GetEnumerableDictionaryAsync();

            if (enumerableCommandedValues.ContainsKey(measurementGid))
            {
                var commandedValue = enumerableCommandedValues[measurementGid];

                if (commandedValue.Value == commandValue)
                {
                    result = false;
                }
            }

            return(result);
        }
示例#3
0
        private async Task UpdateCommandedValues(long measurementGid, Dictionary <long, CommandedValue> commandedValues)
        {
            if (commandedValues.ContainsKey(measurementGid))
            {
                var commandedValue = commandedValues[measurementGid];

                var difference = DateTime.UtcNow.Subtract(commandedValue.TimeOfCreation);

                if (difference.TotalMilliseconds >= CommandedValueIntervalUpperLimit)
                {
                    if ((await CommandedValues.TryRemoveAsync(measurementGid)).HasValue)
                    {
                        Logger.LogDebug($"{baseLogString} OpenIsolationPoints => Value succesfully set to scadaDataValue. Commanded value for gid 0x{measurementGid:X16} removed from rel dictionary '{ReliableDictionaryNames.CommandedValues}'.");
                    }
                }
            }
        }