Add Detector Static Surveying MWD

This commit is contained in:
ngfrolov 2022-07-20 09:49:36 +05:00
parent 48cee90d91
commit 39b3753bd3
13 changed files with 6261 additions and 12 deletions

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,39 @@
using Microsoft.EntityFrameworkCore.Migrations;
#nullable disable
namespace AsbCloudDb.Migrations
{
public partial class Add_Well_operation_StaticSurveying : Migration
{
protected override void Up(MigrationBuilder migrationBuilder)
{
migrationBuilder.UpdateData(
table: "t_well_operation_category",
keyColumn: "id",
keyValue: 20,
column: "name",
value: "Промывка перед наращиванием");
migrationBuilder.InsertData(
table: "t_well_operation_category",
columns: new[] { "id", "code", "name" },
values: new object[] { 21, 0, "Статический замер телесистемы" });
}
protected override void Down(MigrationBuilder migrationBuilder)
{
migrationBuilder.DeleteData(
table: "t_well_operation_category",
keyColumn: "id",
keyValue: 21);
migrationBuilder.UpdateData(
table: "t_well_operation_category",
keyColumn: "id",
keyValue: 20,
column: "name",
value: "Шаблонировка перед наращиванием");
}
}
}

View File

@ -4178,7 +4178,13 @@ namespace AsbCloudDb.Migrations
{
Id = 20,
Code = 0,
Name = "Шаблонировка перед наращиванием"
Name = "Промывка перед наращиванием"
},
new
{
Id = 21,
Code = 0,
Name = "Статический замер телесистемы"
},
new
{

View File

@ -684,6 +684,7 @@ namespace AsbCloudDb.Model
new WellOperationCategory {Id = 18, Name = "Проработка перед наращиванием", Code = 0 },
new WellOperationCategory {Id = 19, Name = "Шаблонировка перед наращиванием", Code = 0 },
new WellOperationCategory {Id = 20, Name = "Промывка перед наращиванием", Code = 0 },
new WellOperationCategory {Id = 21, Name = "Статический замер телесистемы", Code = 0 },
// Операции ручного ввода
new WellOperationCategory {Id = 1001, Name = "Бурение", Code = 0 },

View File

@ -279,6 +279,27 @@ namespace AsbCloudInfrastructure.Services.DetectOperations.Detectors
}
return false;
}
protected static bool RisesFromBegin(
DetectableTelemetry[] telemetry,
Func<DetectableTelemetry, double> getter,
int begin,
int count,
double deviation)
{
var beginPointValue = getter(telemetry[begin]);
var end = begin + count;
end = end < telemetry.Length ? end : telemetry.Length;
var step = count > 15 ? count / 5 : count > 3 ? 3 : 1;
for (var i = begin; i < end; i += step)
{
var item = telemetry[i];
var itemValue = getter(item);
if ( itemValue - beginPointValue > deviation)
return true;
}
return false;
}
}
#nullable disable

View File

@ -2,7 +2,6 @@
namespace AsbCloudInfrastructure.Services.DetectOperations.Detectors
{
#nullable enable
/// <summary>
/// Промывка перед наращиванием
@ -41,7 +40,7 @@ namespace AsbCloudInfrastructure.Services.DetectOperations.Detectors
var delta = point0.WellDepth - point0.BitDepth;
if ((delta > 0.03d )
&& (point0.Pressure > 15)
&& DeviatesFromBegin(telemetry, t=>t.BlockPosition, position, 300, 1))
&& ContainsDeviationApprox(telemetry, t=>t.BlockPosition, position, 60, 0.03))
return true;
return false;

View File

@ -43,9 +43,7 @@ namespace AsbCloudInfrastructure.Services.DetectOperations.Detectors
if (lineRotorSpeed.IsAverageYLessThan(5))
return true;
var lineWellDepth = MakeInterpolationLine(d => d.WellDepth, telemetry, position, 30);
if (!lineWellDepth.IsYIncreases(1))
if (!DeviatesFromBegin(telemetry, t => t.WellDepth, position, 60, 0.003))
return true;
return false;

View File

@ -43,9 +43,7 @@ namespace AsbCloudInfrastructure.Services.DetectOperations.Detectors
if (lineRotorSpeed.IsAverageYGreaterThan(5))
return true;
var lineWellDepth = MakeInterpolationLine(d => d.WellDepth, telemetry, position, 30);
if (!lineWellDepth.IsYIncreases(1))
if (!DeviatesFromBegin(telemetry, t => t.WellDepth, position, 60, 0.003))
return true;
return false;

View File

@ -0,0 +1,70 @@
using AsbCloudDb.Model;
namespace AsbCloudInfrastructure.Services.DetectOperations.Detectors
{
#nullable enable
/// <summary>
/// Статический замер телесистемы
/// </summary>
internal class DetectorStaticSurveying: DetectorAbstract
{
public DetectorStaticSurveying()
: base(21) { }
protected override bool DetectBegin(DetectableTelemetry[] telemetry, int position, DetectedOperation? previousOperation)
{
var point0 = telemetry[position];
if (point0.Pressure < 15)
return false;
var delta = point0.WellDepth - point0.BitDepth;
if (delta > 2.5d)
return false;
if (point0.RotorSpeed > 15)
return false;
if (ContainsDeviation(telemetry, t => t.BlockPosition, position, 60, 0.03))
return false;
if (ContainsDeviation(telemetry, t => t.Pressure, position, 60, 10))
return false;
return true;
}
protected override bool DetectEnd(DetectableTelemetry[] telemetry, int position, DetectedOperation? previousOperation)
{
var point0 = telemetry[position];
var delta = point0.WellDepth - point0.BitDepth;
if (delta > 2.5d)
return true;
if (point0.RotorSpeed > 15)
return true;
if (RisesFromBegin(telemetry, t => t.Pressure, position, 10, 10))
return true;
if (ContainsDeviation(telemetry, t => t.BlockPosition, position, 10, 0.03))
return false;
//if (DeviatesFromBegin(telemetry, t => t.Pressure, position, 60, 10))
// return false;
return false;
}
protected override bool IsValid(DetectableTelemetry[] telemetry, int begin, int end)
=> IsValidByWellDepthDoesNotChange(telemetry, begin, end);
protected override double CalcValue(DetectableTelemetry[] telemetry, int begin, int end)
=> CalcDeltaMinutes(telemetry, begin, end);
}
#nullable disable
}

View File

@ -25,6 +25,7 @@ namespace AsbCloudInfrastructure.Services.DetectOperations
new DetectorDevelopment(),
new DetectorTemplating(),
new DetectorSlipsTime(),
//new DetectorStaticSurveying(),
new DetectorFlashing(),
};

View File

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

View File

@ -19,7 +19,7 @@
Признак окончания операции =
( расстояние от долота до забоя > 0.03м ) И
( давление > 15 атм ) И
( высота блока изменяется больше чем на 1м в течении 300 сек с начала операции);
( высота блока изменяется больше чем на 0.03м в течении 60 сек с начала операции);
## Ключевой параметр

View File

@ -0,0 +1,21 @@
# Статический замер телесистемы
Статический замер телесистемы перед бурением - операция после удержания в клиньях и наращивания очередной трубы/ свечи.
Замер ТС (статический замер) при бурении свечами (промежуточный замер) - операция при добуривании одной трубки, без наращивании и удержания в клиньях.
## метод определения 1
Признак начала операции =
( давление > 15 атм ) И
( расстояние от долота до забоя < 2.5м ) И
( обороты ротора < 15 об/м ) И
( движение тал.блока в течении 60 сек изменяется менее чем на 3 см ) И
( давление за следующие 60 сек изменяется менее чем на 10 атм )
Признак окончания операции =
( расстояние от долота до забоя > 2.5м ) ИЛИ
( обороты ротора > 15 об/м ) ИЛИ
( давление за следующие 10 сек вырастет на 10 атм ) ИЛИ
( движение тал.блока в течении 60 сек изменяется более чем на 3 см )
## Ключевой параметр
Продолжительность операции.