Изменения в алгоритмах определения операций по проработке и шаблонировке.

This commit is contained in:
ngfrolov 2022-07-01 17:04:44 +05:00
parent 69ac4c74d5
commit 78dca86f81
10 changed files with 284 additions and 51 deletions

View File

@ -1,5 +1,6 @@
using AsbCloudDb.Model;
using System;
using System.Collections.Generic;
using System.Linq;
namespace AsbCloudInfrastructure.Services.DetectOperations.Detectors
@ -26,9 +27,9 @@ namespace AsbCloudInfrastructure.Services.DetectOperations.Detectors
{
positionEnd += stepLength;
if ((positionEnd > end))
positionEnd = end;
break;
if ((positionEnd == end) || DetectEnd(telemetry, positionEnd, previousOperation))
if (DetectEnd(telemetry, positionEnd, previousOperation))
{
result = MakeOperation(idTelemetry, telemetry, begin, positionEnd);
return true;
@ -132,6 +133,131 @@ namespace AsbCloudInfrastructure.Services.DetectOperations.Detectors
var result = (double)(pEnd.WellDepth - pBegin.WellDepth) / (pEnd.DateTime - pBegin.DateTime).TotalHours;
return result;
}
/// <summary>
/// Расчет статистики по массиву данных за интервал
/// </summary>
/// <param name="telemetry"></param>
/// <param name="getter"></param>
/// <param name="begin"></param>
/// <param name="count"></param>
/// <returns></returns>
protected static (double min, double max, double sum, int count) CalcStat(
DetectableTelemetry[] telemetry,
Func<DetectableTelemetry, double> getter,
int begin,
int count)
{
var sum = 0d;
var min = double.MaxValue;
var max = double.MinValue;
var end = begin + count;
end = end < telemetry.Length ? end : telemetry.Length;
for (var i = begin; i < end; i++)
{
var item = telemetry[i];
var itemValue = getter(item);
if (min > itemValue)
min = itemValue;
if (max < itemValue)
max = itemValue;
sum += itemValue;
}
return (min, max, sum, end - begin);
}
/// <summary>
/// Максимальное отклонение от среднего за интервал
/// </summary>
/// <param name="telemetry"></param>
/// <param name="getter"></param>
/// <param name="begin"></param>
/// <param name="count"></param>
/// <returns></returns>
protected static double CalcMaxDeviation(
DetectableTelemetry[] telemetry,
Func<DetectableTelemetry, double> getter,
int begin,
int count)
{
var stat = CalcStat(telemetry, getter, begin, count);
var avg = stat.sum / stat.count;
var dev1 = avg - stat.min;
var dev2 = stat.max - avg;
var dev = dev1 > dev2 ? dev1 : dev2;
return dev;
}
/// <summary>
/// Определяет наличие разброса значений в интервале большего указанного значения.
/// </summary>
/// <param name="telemetry"></param>
/// <param name="getter"></param>
/// <param name="begin"></param>
/// <param name="count"></param>
/// <param name="deviation"></param>
/// <returns></returns>
protected static bool ContainsDeviation(
DetectableTelemetry[] telemetry,
Func<DetectableTelemetry, double> getter,
int begin,
int count,
double deviation)
{
var min = double.MaxValue;
var max = double.MinValue;
var end = begin + count;
end = end < telemetry.Length ? end : telemetry.Length;
for (var i = begin; i < end; i ++)
{
var item = telemetry[i];
var itemValue = getter(item);
if (min > itemValue)
min = itemValue;
if (max < itemValue)
max = itemValue;
if(max - min > deviation)
return true;
}
return false;
}
/// <summary>
/// Определяет наличие разброса значений в интервале большего указанного значения. По нескольким значениям из интервала.
/// </summary>
/// <param name="telemetry"></param>
/// <param name="getter"></param>
/// <param name="begin"></param>
/// <param name="count"></param>
/// <param name="deviation"></param>
/// <returns></returns>
protected static bool ContainsDeviationApprox(
DetectableTelemetry[] telemetry,
Func<DetectableTelemetry, double> getter,
int begin,
int count,
double deviation)
{
var min = double.MaxValue;
var max = double.MinValue;
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 (min > itemValue)
min = itemValue;
if (max < itemValue)
max = itemValue;
if (max - min > deviation)
return true;
}
return false;
}
}
#nullable disable

View File

@ -30,9 +30,31 @@ namespace AsbCloudInfrastructure.Services.DetectOperations.Detectors
if (point0.RotorSpeed < 10)
return false;
if (!ContainsDeviationApprox(telemetry, d => d.BlockPosition, position, 60, 0.03))
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 < 0.03d || delta > 30)
return true;
if (point0.Pressure < 15)
return true;
if (point0.BlockPosition > 31)
return true;
if (point0.RotorSpeed < 10)
return true;
return false;
}
protected override bool IsValid(DetectableTelemetry[] telemetry, int begin, int end)
=> IsValidByWellDepthDoesNotChange(telemetry, begin, end);
}

View File

@ -18,6 +18,9 @@ namespace AsbCloudInfrastructure.Services.DetectOperations.Detectors
if (delta > 2.5d)
return false;
if (point0.Pressure > 15)
return false;
if (point0.BlockPosition > 8)
return false;

View File

@ -1,4 +1,5 @@
using AsbCloudDb.Model;
using System.Collections.Generic;
namespace AsbCloudInfrastructure.Services.DetectOperations.Detectors
{
@ -30,9 +31,31 @@ namespace AsbCloudInfrastructure.Services.DetectOperations.Detectors
if (point0.RotorSpeed > 10)
return false;
if (!ContainsDeviationApprox(telemetry, d => d.BlockPosition, position, 60, 0.03))
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 < 0.03d || delta > 30)
return true;
if (point0.Pressure < 15)
return true;
if (point0.BlockPosition > 31)
return true;
if (point0.RotorSpeed > 10)
return true;
return false;
}
protected override bool IsValid(DetectableTelemetry[] telemetry, int begin, int end)
=> IsValidByWellDepthDoesNotChange(telemetry, begin, end);
}

View File

@ -95,7 +95,9 @@ namespace AsbCloudInfrastructure.Services.DetectOperations
var affected = 0;
foreach (var item in JounedlastDetectedDates)
{
var stopwatch = Stopwatch.StartNew();
var newOperations = await DetectOperationsAsync(item.IdTelemetry, item.LastDate ?? DateTimeOffset.MinValue, db, token);
stopwatch.Stop();
if (newOperations.Any())
{
db.DetectedOperations.AddRange(newOperations);
@ -161,13 +163,9 @@ namespace AsbCloudInfrastructure.Services.DetectOperations
}
if (isDetected)
{
startDate = detectedOperations.Last().DateEnd;
}
startDate = lastDetectedOperation.DateEnd;
else
{
startDate = data[positionEnd].DateTime;
}
}
return detectedOperations;

View File

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

View File

@ -1,44 +0,0 @@
> Из писма Гранова А.П. от 19.04.2022 13:29 "Алгоритм определения наращивания БИ.docx"
# Алгоритм определения времени в клиньях
## Описание:
Наращивание бурильного инструмента операция, во время которой после добуривания очередной трубы/ свечи
циркуляция выключается, инструмент разгружается в клиньях (остается только вес крюкоблока и ВСП),
происходит развинчивание трубы от верхнего силового привода, берется очередная труба/ свеча,
свинчивается с инструментом в клиньях, свинчивается с верхним силовым приводом, происходит подъем инструмента,
вес на крюке увеличивается. Далее включается циркуляция и происходит механическое бурение.
Наращиванию предшествует механическое бурение (наличие давления, увеличение глубины забоя) и
после наращивания механическое бурение возобновляется (наличие давления, Увеличение глубины забоя).
> Это не учитывать в методе, так как предыдущая и последующая операция могут быть определены не корректно.
Наращивается определяется как время между:
- разгрузкой инструмента на клинья (остается только вес крюкоблока и ВСП).
При этом давление менее 15 атм. В случае давления более 15 атм считать началом операции как
снижение давления менее 15 атм и началом движения талевого блока вверх.
- снятие инструмента с клиньев (вес увеличивается более, чем на 1т).
- При этом движение талевого блока происходит вверх.
## Метод определения:
> Исправлено на совещании от 19.04.2022 16:50
> Исправлено задачей в кайтен от 12.05.2022 16:49
считать время в клиньях только при соотношении глубина забоя - глубина долота меньше 2,5 метра
```
Признак начала операции =
(параметр «вес на крюке» < 22 тонн) И
(давление < 15 атм) И
(положение талевого блока < 8) И
(глубина забоя - глубина долота < 2,5)
Признак окончания операции =
(вес на крюке > 22 ) И
(давление > 15 атм)
```

View File

@ -0,0 +1,31 @@
# Алгоритм определения шаблонировки перед наращиванием
## Описание
Проработка перед наращиванием бурильного инструмента операция, во время которой после добуривания очередной трубы/ свечи начинается подъем и спуск бурильного инструмента с вращением. Следующей операцией после проработки будет либо шаблонировка (аналогично проработке, но без вращения), либо разгрузка инструмента в клинья (снижение веса на крюке) - наращивание
Проработка перед наращиванием определяется как время между:
- начало подъема/ спуска бурильного инструмента с вращением
- разгрузкой инструмента на клинья (остается только вес крюкоблока и ВСП). При этом давление менее 15 атм. ЛИБО
- начало подъема/ спуска бурильного инструмента БЕЗ вращения
- считать время на проработку только при соотношении глубина забоя - глубина долота не больше меньше 30 метров
## Метод определения
Признак начала операции =
( предыдущая операция НЕ удержание в клиньях) И
( расстояние от долота до забоя > 0.03м ) И
( расстояние от долота до забоя < 30м ) И
( давление > 15 атм ) И
( положение блока < 31м ) И
( обороты ротора > 10 об/м ) И
( высота блока изменяется больше чем на 0.03м в течении 60 сек с начала операции);
Признак окончания операции =
( расстояние от долота до забоя < 0.03м ) ИЛИ
( расстояние от долота до забоя < 30м ) ИЛИ
( давление < 15 атм ) ИЛИ
( положение блока > 31м ) ИЛИ
( обороты ротора < 10 об/м );
## Ключевой параметр
Продолжительность операции.

View File

@ -0,0 +1,21 @@
# Алгоритм определения времени в клиньях
## Описание
Наращивание бурильного инструмента операция, во время которой после добуривания очередной трубы/ свечи циркуляция выключается, инструмент разгружается в клиньях (остается только вес крюкоблока и ВСП), происходит развинчивание трубы от верхнего силового привода, берется очередная труба/ свеча, свинчивается с инструментом в клиньях, свинчивается с верхним силовым приводом, происходит подъем инструмента, вес на крюке увеличивается. Далее включается циркуляция и происходит механическое бурение.
Наращивается определяется как время между:
- разгрузкой инструмента на клинья (остается только вес крюкоблока и ВСП). При этом давление менее 15 атм. В случае давления более 15 атм считать началом операции как снижение давления менее 15 атм и началом движения талевого блока вверх.
- снятие инструмента с клиньев (вес увеличивается более, чем на 1т). При этом движение талевого блока происходит вверх.
## Метод определения
Признак начала операции =
( расстояние от долота до забоя < 2.5м ) И
( положение талевого блока < 8 ) И
( вес на крюке < 20 тонн ) И
( давление < 15 атм );
Признак окончания операции = НЕ выполняется признак начала операции;
## Ключевой параметр
Продолжительность операции.

View File

@ -0,0 +1,31 @@
# Алгоритм определения шаблонировки перед наращиванием
## Описание
Шаблонировкаперед наращиванием бурильного инструмента операция, во время которой после добуривания очередной трубы/ свечи начинается подъем и спуск бурильного инструмента БЕЗ вращения. Следующей операцией после шаблонировки будет либо проработка (аналогично шаблонировке, но С вращением), либо разгрузка инструмента в клинья (снижение веса на крюке) - наращивание
Шаблонировка перед наращиванием определяется как время между:
- начало подъема/ спуска бурильного инструмента БЕЗ вращения
- разгрузкой инструмента на клинья (остается только вес крюкоблока и ВСП). При этом давление менее 15 атм. ЛИБО
- начало подъема/ спуска бурильного инструмента БЕЗ вращения
- считать время на шаблонировку только при соотношении глубина забоя - глубина долота не больше меньше 30 метров
## Метод определения
Признак начала операции =
( предыдущая операция НЕ удержание в клиньях) И
( расстояние от долота до забоя > 0.03м ) И
( расстояние от долота до забоя < 30м ) И
( давление > 15 атм ) И
( положение блока < 31м ) И
( обороты ротора < 10 об/м ) И
( высота блока изменяется больше чем на 0.03м в течении 60 сек с начала операции);
Признак окончания операции =
( расстояние от долота до забоя < 0.03м ) ИЛИ
( расстояние от долота до забоя < 30м ) ИЛИ
( давление < 15 атм ) ИЛИ
( положение блока > 31м ) ИЛИ
( обороты ротора > 10 об/м );
## Ключевой параметр
Продолжительность операции.