forked from ddrilling/AsbCloudServer
Фикс авто определения операций
This commit is contained in:
parent
7a6f922a97
commit
0570c4f4e4
50
AsbCloudApp/Data/DetectedOperation/EnabledSubsystemsFlags.cs
Normal file
50
AsbCloudApp/Data/DetectedOperation/EnabledSubsystemsFlags.cs
Normal file
@ -0,0 +1,50 @@
|
|||||||
|
using System;
|
||||||
|
|
||||||
|
namespace AsbCloudApp.Data.DetectedOperation;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Флаги включенных подсистем
|
||||||
|
/// </summary>
|
||||||
|
[Flags]
|
||||||
|
public enum EnabledSubsystemsFlags
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// Автоподача долота
|
||||||
|
/// </summary>
|
||||||
|
AutoRotor = 1 << 0,
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// БУРЕНИЕ В СЛАЙДЕ
|
||||||
|
/// </summary>
|
||||||
|
AutoSlide = 1 << 1,
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// ПРОРАБОТКА
|
||||||
|
/// </summary>
|
||||||
|
AutoConditionig = 1 << 2,
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// СПУСК СПО
|
||||||
|
/// </summary>
|
||||||
|
AutoSinking = 1 << 3,
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// ПОДЪЕМ СПО
|
||||||
|
/// </summary>
|
||||||
|
AutoLifting = 1 << 4,
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// ПОДЪЕМ С ПРОРАБОТКОЙ
|
||||||
|
/// </summary>
|
||||||
|
AutoLiftingWithConditionig = 1 << 5,
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// блокировка
|
||||||
|
/// </summary>
|
||||||
|
AutoBlocknig = 1 << 6,
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// осцилляция
|
||||||
|
/// </summary>
|
||||||
|
AutoOscillation = 1 << 7,
|
||||||
|
}
|
@ -41,7 +41,7 @@ namespace AsbCloudDb.Model
|
|||||||
[Column("value"), Comment("Ключевой показатель операции")]
|
[Column("value"), Comment("Ключевой показатель операции")]
|
||||||
public double Value { get; set; }
|
public double Value { get; set; }
|
||||||
|
|
||||||
[Column("enabled_subsystems"), Comment("флаги аключенных подсистем")]
|
[Column("enabled_subsystems"), Comment("флаги включенных подсистем")]
|
||||||
public int EnabledSubsystems { get; set; }
|
public int EnabledSubsystems { get; set; }
|
||||||
|
|
||||||
[Column("extra_data", TypeName = "jsonb"), Comment("доп. инфо по операции")]
|
[Column("extra_data", TypeName = "jsonb"), Comment("доп. инфо по операции")]
|
||||||
@ -57,61 +57,5 @@ namespace AsbCloudDb.Model
|
|||||||
|
|
||||||
public override string ToString()
|
public override string ToString()
|
||||||
=> $"{IdCategory}\t{DateStart:G}\t{DateEnd:G}\t{DurationMinutes:#0.#}\t{DepthStart:#0.#}\t{DepthEnd:#0.#}";
|
=> $"{IdCategory}\t{DateStart:G}\t{DateEnd:G}\t{DurationMinutes:#0.#}\t{DepthStart:#0.#}\t{DepthEnd:#0.#}";
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Флаги аключенных подсистем
|
|
||||||
/// </summary>
|
|
||||||
[Flags]
|
|
||||||
public enum EnabledSubsystemsFlags
|
|
||||||
{
|
|
||||||
/// <summary>
|
|
||||||
/// Автоподача долота
|
|
||||||
/// </summary>
|
|
||||||
AutoRotor = 1 << 0,
|
|
||||||
/// <summary>
|
|
||||||
/// БУРЕНИЕ В СЛАЙДЕ
|
|
||||||
/// </summary>
|
|
||||||
AutoSlide = 1 << 1,
|
|
||||||
/// <summary>
|
|
||||||
/// ПРОРАБОТКА
|
|
||||||
/// </summary>
|
|
||||||
AutoConditionig = 1 << 2,
|
|
||||||
/// <summary>
|
|
||||||
/// СПУСК СПО
|
|
||||||
/// </summary>
|
|
||||||
AutoSinking = 1 << 3,
|
|
||||||
/// <summary>
|
|
||||||
/// ПОДЪЕМ СПО
|
|
||||||
/// </summary>
|
|
||||||
AutoLifting = 1 << 4,
|
|
||||||
/// <summary>
|
|
||||||
/// ПОДЪЕМ С ПРОРАБОТКОЙ
|
|
||||||
/// </summary>
|
|
||||||
AutoLiftingWithConditionig = 1 << 5,
|
|
||||||
/// <summary>
|
|
||||||
/// блокировка
|
|
||||||
/// </summary>
|
|
||||||
AutoBlocknig = 1 << 6,
|
|
||||||
/// <summary>
|
|
||||||
/// Спин-мастер
|
|
||||||
/// </summary>
|
|
||||||
AutoSpinMaster = 1 << 7,
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Есть ли флаг подсистемы у операции
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="flag"></param>
|
|
||||||
/// <returns></returns>
|
|
||||||
public bool HasSubsystemFlag(EnabledSubsystemsFlags flag)
|
|
||||||
=> HasSubsystemFlag((int)flag);
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Есть ли флаг/флаги подсистемы у операции
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="flags"></param>
|
|
||||||
/// <returns></returns>
|
|
||||||
public bool HasSubsystemFlag(int flags)
|
|
||||||
=> (EnabledSubsystems & flags) > 0;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
@ -8,8 +8,8 @@ using System.Linq;
|
|||||||
using System.Reflection;
|
using System.Reflection;
|
||||||
using System.Threading;
|
using System.Threading;
|
||||||
using System.Threading.Tasks;
|
using System.Threading.Tasks;
|
||||||
|
using AsbCloudApp.Data.DetectedOperation;
|
||||||
using AsbCloudInfrastructure.Services.DetectOperations.Detectors;
|
using AsbCloudInfrastructure.Services.DetectOperations.Detectors;
|
||||||
using AsbCloudApp.Repositories;
|
|
||||||
|
|
||||||
namespace AsbCloudInfrastructure.Services.DetectOperations;
|
namespace AsbCloudInfrastructure.Services.DetectOperations;
|
||||||
|
|
||||||
@ -46,13 +46,11 @@ public class DetectedOperationExportService
|
|||||||
private const int columnComment = 10;
|
private const int columnComment = 10;
|
||||||
|
|
||||||
private readonly IAsbCloudDbContext dbContext;
|
private readonly IAsbCloudDbContext dbContext;
|
||||||
private readonly IWellOperationRepository wellOperationRepository;
|
|
||||||
|
|
||||||
public DetectedOperationExportService(IAsbCloudDbContext dbContext, IWellOperationRepository wellOperationRepository)
|
public DetectedOperationExportService(IAsbCloudDbContext dbContext)
|
||||||
{
|
{
|
||||||
this.dbContext = dbContext;
|
this.dbContext = dbContext;
|
||||||
this.wellOperationRepository = wellOperationRepository;
|
}
|
||||||
}
|
|
||||||
|
|
||||||
public async Task<Stream> ExportAsync(int idWell, int idDomain, CancellationToken cancellationToken)
|
public async Task<Stream> ExportAsync(int idWell, int idDomain, CancellationToken cancellationToken)
|
||||||
{
|
{
|
||||||
@ -151,8 +149,8 @@ public class DetectedOperationExportService
|
|||||||
private static string GetCategoryName(IEnumerable<WellOperationCategory> wellOperationCategories, DetectedOperation current)
|
private static string GetCategoryName(IEnumerable<WellOperationCategory> wellOperationCategories, DetectedOperation current)
|
||||||
{
|
{
|
||||||
var idCategory = current.IdCategory;
|
var idCategory = current.IdCategory;
|
||||||
if (idCategory == WellOperationCategory.IdSlide
|
if (idCategory == WellOperationCategory.IdSlide &&
|
||||||
&& current.HasSubsystemFlag(DetectedOperation.EnabledSubsystemsFlags.AutoSpinMaster))
|
EnabledSubsystemsFlags.AutoOscillation.HasEnabledSubsystems(current.EnabledSubsystems))
|
||||||
return "Бурение в слайде с осцилляцией";
|
return "Бурение в слайде с осцилляцией";
|
||||||
|
|
||||||
var category = wellOperationCategories.FirstOrDefault(o => o.Id == current.IdCategory);
|
var category = wellOperationCategories.FirstOrDefault(o => o.Id == current.IdCategory);
|
||||||
|
@ -1,6 +1,7 @@
|
|||||||
using AsbCloudDb.Model;
|
using AsbCloudDb.Model;
|
||||||
using System;
|
using System;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
|
using AsbCloudApp.Data.DetectedOperation;
|
||||||
|
|
||||||
namespace AsbCloudInfrastructure.Services.DetectOperations.Detectors
|
namespace AsbCloudInfrastructure.Services.DetectOperations.Detectors
|
||||||
{
|
{
|
||||||
@ -159,39 +160,35 @@ namespace AsbCloudInfrastructure.Services.DetectOperations.Detectors
|
|||||||
private static int DetectEnabledSubsystems(DetectableTelemetry[] telemetry, int begin, int end, IDictionary<string, object> extraData)
|
private static int DetectEnabledSubsystems(DetectableTelemetry[] telemetry, int begin, int end, IDictionary<string, object> extraData)
|
||||||
{
|
{
|
||||||
var enabledSubsystems = 0;
|
var enabledSubsystems = 0;
|
||||||
|
|
||||||
if(extraData.TryGetValue(DetectorDrilling.ExtraDataKeyHasOscillation, out var hasOscillation)
|
|
||||||
&& hasOscillation is true)
|
|
||||||
{
|
|
||||||
enabledSubsystems |= (int)DetectedOperation.EnabledSubsystemsFlags.AutoSpinMaster;
|
|
||||||
|
|
||||||
return enabledSubsystems;
|
|
||||||
}
|
|
||||||
|
|
||||||
for (var i = begin; i < end; i += 2)
|
for (var i = begin; i < end; i += 2)
|
||||||
{
|
{
|
||||||
var mode = telemetry[i].Mode;
|
var mode = telemetry[i].Mode;
|
||||||
|
|
||||||
|
if (extraData.TryGetValue(DetectorDrilling.ExtraDataKeyHasOscillation, out var hasOscillation)
|
||||||
|
&& hasOscillation is true)
|
||||||
|
enabledSubsystems |= (int)EnabledSubsystemsFlags.AutoOscillation;
|
||||||
|
|
||||||
if(mode == 1)
|
if(mode == 1)
|
||||||
enabledSubsystems |= (int)DetectedOperation.EnabledSubsystemsFlags.AutoRotor;
|
enabledSubsystems |= (int)EnabledSubsystemsFlags.AutoRotor;
|
||||||
|
|
||||||
if (mode == 3)
|
if (mode == 3)
|
||||||
enabledSubsystems |= (int)DetectedOperation.EnabledSubsystemsFlags.AutoSlide;
|
enabledSubsystems |= (int)EnabledSubsystemsFlags.AutoSlide;
|
||||||
|
|
||||||
if (mode == 2)
|
if (mode == 2)
|
||||||
enabledSubsystems |= (int)DetectedOperation.EnabledSubsystemsFlags.AutoConditionig;
|
enabledSubsystems |= (int)EnabledSubsystemsFlags.AutoConditionig;
|
||||||
|
|
||||||
if (mode == 4)
|
if (mode == 4)
|
||||||
enabledSubsystems |= (int)DetectedOperation.EnabledSubsystemsFlags.AutoSinking;
|
enabledSubsystems |= (int)EnabledSubsystemsFlags.AutoSinking;
|
||||||
|
|
||||||
if (mode == 5)
|
if (mode == 5)
|
||||||
enabledSubsystems |= (int)DetectedOperation.EnabledSubsystemsFlags.AutoLifting;
|
enabledSubsystems |= (int)EnabledSubsystemsFlags.AutoLifting;
|
||||||
|
|
||||||
if (mode == 6)
|
if (mode == 6)
|
||||||
enabledSubsystems |= (int)DetectedOperation.EnabledSubsystemsFlags.AutoLiftingWithConditionig;
|
enabledSubsystems |= (int)EnabledSubsystemsFlags.AutoLiftingWithConditionig;
|
||||||
|
|
||||||
if (mode == 10)
|
if (mode == 10)
|
||||||
enabledSubsystems |= (int)DetectedOperation.EnabledSubsystemsFlags.AutoBlocknig;
|
enabledSubsystems |= (int)EnabledSubsystemsFlags.AutoBlocknig;
|
||||||
}
|
}
|
||||||
|
|
||||||
return enabledSubsystems;
|
return enabledSubsystems;
|
||||||
|
@ -64,7 +64,7 @@ public class DetectorDrilling : DetectorAbstract
|
|||||||
{
|
{
|
||||||
[ExtraDataKeyAvgRotorSpeed] = avgRotorSpeed,
|
[ExtraDataKeyAvgRotorSpeed] = avgRotorSpeed,
|
||||||
[ExtraDataKeyDispersionOfNormalizedRotorSpeed] = dispersionOfNormalizedRotorSpeed,
|
[ExtraDataKeyDispersionOfNormalizedRotorSpeed] = dispersionOfNormalizedRotorSpeed,
|
||||||
[ExtraDataKeyHasOscillation] = avgRotorSpeed > 5 && dispersionOfNormalizedRotorSpeed > dispersionOfNormalizedRotorSpeedThreshold
|
[ExtraDataKeyHasOscillation] = avgRotorSpeed > 1 && dispersionOfNormalizedRotorSpeed > dispersionOfNormalizedRotorSpeedThreshold
|
||||||
};
|
};
|
||||||
return (idCategory, extraData);
|
return (idCategory, extraData);
|
||||||
}
|
}
|
||||||
@ -73,19 +73,8 @@ public class DetectorDrilling : DetectorAbstract
|
|||||||
{
|
{
|
||||||
var telemetryRange = telemetry[begin..end]
|
var telemetryRange = telemetry[begin..end]
|
||||||
.OrderBy(t => t.DateTime).ToList();
|
.OrderBy(t => t.DateTime).ToList();
|
||||||
|
|
||||||
for (var i = telemetryRange.Count - 1; i >= 0 && telemetryRange.Count > 1; i--)
|
var avgRotorSpeed = telemetryRange.Average(t => t.RotorSpeed);
|
||||||
{
|
|
||||||
if (Math.Abs(telemetryRange[i].WellDepth - telemetryRange[i - 1].WellDepth) < 0.001d)
|
|
||||||
{
|
|
||||||
telemetryRange.RemoveAt(i);
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
var avgRotorSpeed = telemetryRange.Average(t => t.RotorSpeed);
|
|
||||||
var dispersion = telemetryRange.Average(t => Math.Pow(t.RotorSpeed / avgRotorSpeed - 1, 2));
|
var dispersion = telemetryRange.Average(t => Math.Pow(t.RotorSpeed / avgRotorSpeed - 1, 2));
|
||||||
return (avgRotorSpeed, dispersion);
|
return (avgRotorSpeed, dispersion);
|
||||||
}
|
}
|
||||||
|
@ -0,0 +1,15 @@
|
|||||||
|
using AsbCloudApp.Data.DetectedOperation;
|
||||||
|
|
||||||
|
namespace AsbCloudInfrastructure.Services.DetectOperations;
|
||||||
|
|
||||||
|
public static class EnabledSubsystemsFlagsExtensions
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// Есть ли флаг подсистемы у операции
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="flags"></param>
|
||||||
|
/// <param name="enabledSubsystems"></param>
|
||||||
|
/// <returns></returns>
|
||||||
|
public static bool HasEnabledSubsystems(this EnabledSubsystemsFlags flags, int enabledSubsystems)
|
||||||
|
=> (enabledSubsystems & (int)flags) > 0;
|
||||||
|
}
|
@ -24,4 +24,4 @@
|
|||||||
## Метод определения бурения в роторе, слайде с осцилляцией
|
## Метод определения бурения в роторе, слайде с осцилляцией
|
||||||
Необходимо рассчитать десперсию нормированных оборотов ротора по(по среднему значению)
|
Необходимо рассчитать десперсию нормированных оборотов ротора по(по среднему значению)
|
||||||
1. Если полученное значение больше константы(0,2), то мы подтвердили что бурение в роторе.
|
1. Если полученное значение больше константы(0,2), то мы подтвердили что бурение в роторе.
|
||||||
2. Если полученное значение меньше константы, то это бурение в слайде с осцилляцией.
|
2. Если полученное значение меньше константы, и средние обороты ротора больше 1, то это бурение ~~~~в слайде с осцилляцией.
|
Loading…
Reference in New Issue
Block a user