Add new operation - TemplatingWhileDrilling

This commit is contained in:
ngfrolov 2022-08-10 15:51:41 +05:00
parent 499f7cc4e2
commit 1dcfd93c0b
12 changed files with 6427 additions and 6 deletions

View File

@ -0,0 +1,25 @@
using Microsoft.EntityFrameworkCore.Migrations;
#nullable disable
namespace AsbCloudDb.Migrations
{
public partial class Add_new_operation_DetectorTemplatingWhileDrilling : Migration
{
protected override void Up(MigrationBuilder migrationBuilder)
{
migrationBuilder.InsertData(
table: "t_well_operation_category",
columns: new[] { "id", "code", "key_value_name", "key_value_units", "name" },
values: new object[] { 23, 0, "dT", "мин", "Шаблонировка при бурении" });
}
protected override void Down(MigrationBuilder migrationBuilder)
{
migrationBuilder.DeleteData(
table: "t_well_operation_category",
keyColumn: "id",
keyValue: 23);
}
}
}

View File

@ -4279,6 +4279,14 @@ namespace AsbCloudDb.Migrations
Name = "Промывка"
},
new
{
Id = 23,
Code = 0,
KeyValueName = "dT",
KeyValueUnits = "мин",
Name = "Шаблонировка при бурении"
},
new
{
Id = 1001,
Code = 0,

View File

@ -26,6 +26,7 @@
new () {Id = 20, Name = "Промывка перед наращиванием", Code = 0, KeyValueName = "dT", KeyValueUnits = "мин" },
new () {Id = 21, Name = "Статический замер телесистемы", Code = 0, KeyValueName = "dT", KeyValueUnits = "мин" },
new () {Id = 22, Name = "Промывка", Code = 0, KeyValueName = "dT", KeyValueUnits = "мин" },
new () {Id = 23, Name = "Шаблонировка при бурении", Code = 0, KeyValueName = "dT", KeyValueUnits = "мин" },
// Операции ручного ввода
new () {Id = 1001, Name = "Бурение", Code = 0, KeyValueName = "МСП", KeyValueUnits = "м/ч" },

View File

@ -31,6 +31,9 @@ namespace AsbCloudInfrastructure.Services.DetectOperations.Detectors
if (point0.BlockPosition < 3)
return false;
if (ContainsDeviationApprox(telemetry, t => t.WellDepth, position, 150, 0.0001))
return false;
return true;
}

View File

@ -38,9 +38,9 @@ namespace AsbCloudInfrastructure.Services.DetectOperations.Detectors
if (point0.Pressure < 25)
return IdReasonOfEnd_PressureIsLo;
var lineRotorSpeed = MakeInterpolationLine(d => d.RotorSpeed, telemetry, position, 10);
var lineRotorSpeed = MakeInterpolationLine(d => d.RotorSpeed, telemetry, position, 60);
if (lineRotorSpeed.IsAverageYLessThan(5))
if (lineRotorSpeed.IsAverageYLessThan(10))
return IdReasonOfEnd_AvgRotorSpeedIsLo;
if (!DeviatesFromBegin(telemetry, t => t.WellDepth, position, 150, 0.003))

View File

@ -38,9 +38,9 @@ namespace AsbCloudInfrastructure.Services.DetectOperations.Detectors
if (point0.Pressure < 25)
return IdReasonOfEnd_PressureIsLo;
var lineRotorSpeed = MakeInterpolationLine(d => d.RotorSpeed, telemetry, position, 10);
var lineRotorSpeed = MakeInterpolationLine(d => d.RotorSpeed, telemetry, position, 60);
if (lineRotorSpeed.IsAverageYGreaterThan(5))
if (lineRotorSpeed.IsAverageYGreaterThan(10))
return IdReasonOfEnd_AvgRotorSpeedIsHi;
if (!DeviatesFromBegin(telemetry, t => t.WellDepth, position, 150, 0.003))

View File

@ -0,0 +1,54 @@
using AsbCloudDb.Model;
namespace AsbCloudInfrastructure.Services.DetectOperations.Detectors
{
#nullable enable
/// <summary>
/// Шаблонировка при бурении
/// </summary>
internal class DetectorTemplatingWhileDrilling : DetectorAbstract
{
public DetectorTemplatingWhileDrilling()
: base(23) { }
protected override double CalcValue(DetectableTelemetry[] telemetry, int begin, int end)
=> CalcDeltaMinutes(telemetry, begin, end);
protected override bool DetectBegin(DetectableTelemetry[] telemetry, int position, DetectedOperation? previousOperation)
{
if (previousOperation?.IdCategory != 22)
return false;
var point0 = telemetry[position];
if (point0.Pressure < 15)
return false;
if (point0.RotorSpeed < 1)
return false;
if (RisesFromBegin(telemetry, t => t.BlockPosition, position, 30, 0.5))
return false;
return true;
}
protected override int DetectEnd(DetectableTelemetry[] telemetry, int position, DetectedOperation? previousOperation)
{
var point0 = telemetry[position];
var delta = point0.WellDepth - point0.BitDepth;
if ((delta > 0.03d )
&& (point0.Pressure > 15)
&& (!ContainsDeviationApprox(telemetry, t=>t.BlockPosition, position, 60, 0.03)))
return IdReasonOfEnd_Custom1;
return IdReasonOfEnd_NotDetected;
}
protected override bool IsValid(DetectableTelemetry[] telemetry, int begin, int end)
=> IsValidByWellDepthDoesNotChange(telemetry, begin, end);
}
#nullable disable
}

View File

@ -28,6 +28,7 @@ namespace AsbCloudInfrastructure.Services.DetectOperations
new DetectorStaticSurveying(),
new DetectorFlashingBeforeConnection(),
new DetectorFlashing(),
new DetectorTemplatingWhileDrilling(),
};
public OperationDetectionBackgroundService(IConfiguration configuration)

View File

@ -12,7 +12,7 @@
Признак окончания операции =
( расстояние от долота до забоя > 0.03м ) ИЛИ
( давление < 25атм ) ИЛИ
( среднее арифметическое оборотов ротора за 10 сек < 5 об/м ) ИЛИ
( среднее арифметическое оборотов ротора за 60 сек < 10 об/м ) ИЛИ
( глубина забоя в течении следующих 150 сек не изменяется больше чем на 0.003 );
## Метод определения бурения в слайде

View File

@ -14,7 +14,8 @@
( предыдущая операция == бурение в роторе или слайде)
( расстояние от долота до забоя < 0,05м ) И
( давление > 15 атм ) И
( положение блока > 3м )
( положение блока > 3м ) И
( глубина забоя изменяется менее чем на 0,0001м в течении 150 сек)
Признак окончания операции =
( расстояние от долота до забоя > 0.03м ) И

View File

@ -0,0 +1,20 @@
# Алгоритм определения Шаблонировки при бурении
## Описание
Шаблонировка при бурении -
## Метод определения
Признак начала операции =
( предыдущая операция == промывка)
( давление > 15 атм ) И
( положение блока увеличится на 0,5м за следующие 30сек ) И
( Обороты ротора меньше 1)
Признак окончания операции =
( высота блока не изменяется больше чем на 0.03м в течении 60 сек после окончания операции) И
( расстояние от долота до забоя > 0.03м ) И
( давление > 15 атм )
## Ключевой параметр
Продолжительность операции.