/// <summary> /// Определяет состояние "Бурение" по параметрам давление и Нагрузка на долото /// </summary> /// <param name="v1">Давление в текущий момент</param> /// <param name="v2">Нагрузка на долото в текущий момент</param> /// <param name="locking_pressure">Блокировочное значение давления.</param> /// <param name="locking_value_load">Блокировочное значение нагрузки.</param> /// <param name="r_drilling">Определяет метод расчета режима бурения</param> /// <returns>Возвращает одно из трёх состояний: есть, нету, неизвестно</returns> public TProcResult StateDrillingPressureAndLoadBit(P0004 v1, P0201 v2, float locking_pressure, float locking_value_load, TechnologicalRegimDrilling r_drilling) { switch (r_drilling) { case TechnologicalRegimDrilling.Pressure: return StateDrillingPressureInWell(v1, locking_pressure); case TechnologicalRegimDrilling.PressureAndLoad: TProcResult result = StateDrillingPressureInWell(v1, locking_pressure); if (result == TProcResult.True) { return StateDrillingLoadOnBit(v2, locking_value_load); } else return result; default: break; } return TProcResult.Default; }
/// <summary> /// Определяет состояние "Бурение" по параметрам давление и Нагрузка на долото /// </summary> /// <param name="v1">Давление в текущий момент</param> /// <param name="v2">Нагрузка на долото в текущий момент</param> /// <param name="locking_pressure">Блокировочное значение давления.</param> /// <param name="locking_value_load">Блокировочное значение нагрузки.</param> /// <param name="r_drilling">Определяет метод расчета режима бурения</param> /// <returns>Возвращает одно из трёх состояний: есть, нету, неизвестно</returns> public TProcResult StateDrillingPressureAndLoadBit(P0004 v1, P0201 v2, float locking_pressure, float locking_value_load, TechnologicalRegimDrilling r_drilling) { switch (r_drilling) { case TechnologicalRegimDrilling.Pressure: return(StateDrillingPressureInWell(v1, locking_pressure)); case TechnologicalRegimDrilling.PressureAndLoad: TProcResult result = StateDrillingPressureInWell(v1, locking_pressure); if (result == TProcResult.True) { return(StateDrillingLoadOnBit(v2, locking_value_load)); } else { return(result); } default: break; } return(TProcResult.Default); }
/// <summary> /// Определят состояние "Бурение" по нагрузке на долото /// </summary> /// <param name="v1">Нагрузка на долото в текущий момент</param> /// <param name="locking_value_load">Блокировочное значение нагрузки</param> /// <returns>Возвращает одно из трёх состояний: есть, нету, неизвестно</returns> public TProcResult StateDrillingLoadOnBit(P0201 v1, float locking_value_load) { if (!float.IsNaN(v1.Value)) { if (v1.Value > locking_value_load) { return TProcResult.True; } else return TProcResult.False; } return TProcResult.Default; }
/// <summary> /// Определят состояние "Бурение" по нагрузке на долото /// </summary> /// <param name="v1">Нагрузка на долото в текущий момент</param> /// <param name="locking_value_load">Блокировочное значение нагрузки</param> /// <returns>Возвращает одно из трёх состояний: есть, нету, неизвестно</returns> public TProcResult StateDrillingLoadOnBit(P0201 v1, float locking_value_load) { if (!float.IsNaN(v1.Value)) { if (v1.Value > locking_value_load) { return(TProcResult.True); } else { return(TProcResult.False); } } return(TProcResult.Default); }
/// <summary> /// Инициализирует новый экземпляр класса /// </summary> public Technology() { c_slim = new ReaderWriterLockSlim(LockRecursionPolicy.SupportsRecursion); cal_slim = new ReaderWriterLockSlim(LockRecursionPolicy.SupportsRecursion); p1 = new SGT.P0001(Guid.Empty); p2 = new SGT.P0002(Guid.Empty); p3 = new SGT.P0003(Guid.Empty); p4 = new SGT.P0004(Guid.Empty); p5 = new SGT.P0005(Guid.Empty); p6 = new SGT.P0006(Guid.Empty); p6_1 = new SGT.P06_1(Guid.Empty); p6_2 = new SGT.P06_2(Guid.Empty); p6_3 = new SGT.P06_3(Guid.Empty); p6_4 = new SGT.P06_4(Guid.Empty); p6_5 = new SGT.P06_5(Guid.Empty); p6_6 = new SGT.P06_6(Guid.Empty); p6_7 = new SGT.P06_7(Guid.Empty); p6_8 = new SGT.P06_8(Guid.Empty); p6_9 = new SGT.P06_9(Guid.Empty); p7 = new SGT.P0007(Guid.Empty); p7_1 = new SGT.P07_1(Guid.Empty); p7_2 = new SGT.P07_2(Guid.Empty); p7_3 = new SGT.P07_3(Guid.Empty); p7_4 = new SGT.P07_4(Guid.Empty); p7_5 = new SGT.P07_5(Guid.Empty); p7_6 = new SGT.P07_6(Guid.Empty); p7_7 = new SGT.P07_7(Guid.Empty); p7_8 = new SGT.P07_8(Guid.Empty); p7_9 = new SGT.P07_9(Guid.Empty); p7_10 = new SGT.P7_10(Guid.Empty); p7_11 = new SGT.P7_11(Guid.Empty); p7_12 = new SGT.P7_12(Guid.Empty); p7_13 = new SGT.P7_13(Guid.Empty); p8 = new SGT.P0008(Guid.Empty); p8_1 = new SGT.P08_1(Guid.Empty); p9 = new SGT.P0009(Guid.Empty); p9_1 = new SGT.P09_1(Guid.Empty); p9_2 = new SGT.P09_2(Guid.Empty); p9_3 = new SGT.P09_3(Guid.Empty); p9_4 = new SGT.P09_4(Guid.Empty); p9_5 = new SGT.P09_5(Guid.Empty); p9_6 = new SGT.P09_6(Guid.Empty); p9_7 = new SGT.P09_7(Guid.Empty); p9_8 = new SGT.P09_8(Guid.Empty); p9_9 = new SGT.P09_9(Guid.Empty); p9_10 = new SGT.P9_10(Guid.Empty); p9_11 = new SGT.P9_11(Guid.Empty); p9_12 = new SGT.P9_12(Guid.Empty); p9_13 = new SGT.P9_13(Guid.Empty); p10 = new P0010(Guid.Empty); p11 = new P0011(Guid.Empty); p11_1 = new P11_1(Guid.Empty); p12 = new P0012(Guid.Empty); p13 = new P0013(Guid.Empty); p14 = new P0014(Guid.Empty); p14_1 = new P14_1(Guid.Empty); p15 = new P0015(Guid.Empty); p16 = new P0016(Guid.Empty); p17 = new P0017(Guid.Empty); p18 = new P0018(Guid.Empty); p101 = new P0101(Guid.Empty); p102 = new P0102(Guid.Empty); p103 = new P0103(Guid.Empty); p104 = new P0104(Guid.Empty); p105 = new P0105(Guid.Empty); p106 = new P0106(Guid.Empty); p107 = new P0107(Guid.Empty); p108 = new P0108(Guid.Empty); p109 = new P0109(Guid.Empty); p110 = new P0110(Guid.Empty); p112 = new P0112(Guid.Empty); p113 = new P0113(Guid.Empty); p114 = new P0114(Guid.Empty); p116 = new P0116(Guid.Empty); p117 = new P0117(Guid.Empty); p118 = new P0118(Guid.Empty); p200 = new P0200(Guid.Empty); p201 = new P0201(Guid.Empty); p202 = new P0202(Guid.Empty); p203 = new P0203(Guid.Empty); p204 = new P0204(Guid.Empty); p205 = new P0205(Guid.Empty); p206 = new P0206(Guid.Empty); p207 = new P0207(Guid.Empty); p208 = new P0208(Guid.Empty); p209 = new P0209(Guid.Empty); p210 = new P0210(Guid.Empty); p211 = new P0211(Guid.Empty); p212 = new P0212(Guid.Empty); p213 = new P0213(Guid.Empty); currentTime = DateTime.MinValue; driller_console = -1; driller_console_weight_column = -1; }
// -------------------- вспомогательные функции -------------------- /// <summary> /// Вычисляет текущее значение параметра Состояние процесса бурения , если вес на крюке true /// </summary> /// <param name="v1">Давление в текущий момент</param> /// <param name="v2">Клинья в текущий момент</param> /// <param name="v3">Вес на крюке в текущий момент</param> /// <param name="v4">Скорость тальблока в текущий момент</param> /// <param name="v5">Обороты ротора в текущий момент</param> /// <param name="v6">Нагрузка на долото в текущий момент</param> /// <param name="v8">Положение инструмента в текущий момент</param> /// <param name="v9">Глубина забоя в текущий момент</param> /// <param name="currentTime">текущее технологическое время</param> /// <param name="locking_weight_hook">Блокировочное значение веса на крюке</param> /// <param name="interval_pzr">Интервал ПЗР</param> /// <param name="drilling_interval">Интервал бурения</param> /// <param name="size_bottom_hole_zone">Размер призабойной зоны</param> /// <param name="locking_pressure">Блокировочное значение давления</param> /// <param name="locking_value_rotor_speed">Блокировочное значение оборотов ротора</param> /// <param name="locking_value_load">Блокировочное значение нагрузки</param> /// <param name="locking_speed_talbloka">Блокировочное значение скорости тальблока</param> /// <param name="r_drilling">Метод расчета режима бурения</param> /// <param name="r_study">Метод расчета проработка</param> /// <param name="r_weight">Метод расчета технологического режима</param> private float TrueBranch(P0004 v1, P0012 v2, P0102 v3, P0103 v4, P0110 v5, P0201 v6, P0204 v8, P0205 v9, DateTime currentTime, float locking_weight_hook, float interval_pzr, float drilling_interval, float size_bottom_hole_zone, float locking_pressure, float locking_value_rotor_speed, float locking_value_load, float locking_speed_talbloka, TechnologicalRegimDrilling r_drilling, TechnologicalRegimStudy r_study, TechnologicalRegimeWeightHook r_weight) { float tLp = v9.Value - drilling_interval; float Lp = (interval_pzr >= tLp) ? tLp : interval_pzr; // Над забоем if (v8.Value > Lp) // Dd>Lp { if (!float.IsNaN(v1.Value)) { if (v8.Value <= (v9.Value - drilling_interval)) // Dd<Cd-Id {// СПО if (v1.Value > locking_pressure) // Pr>БЗ { switch (StudySpeedTalblokAndRotationRotor(v5, v4, locking_value_rotor_speed, locking_speed_talbloka, r_study)) { case TProcResult.True: // Проработка tech_stage = "СПО"; tech_regime = "Проработка"; tech_hook = "Над забоем"; return НадЗабоем_СПО_Проработка; case TProcResult.False: // Промывка tech_stage = "СПО"; tech_regime = "Промывка"; tech_hook = "Над забоем"; return НадЗабоем_СПО_Промывка; default: tech_stage = string.Empty; tech_regime = string.Empty; tech_hook = string.Empty; return Техпроцесс_Default; } } else { //СПО tech_stage = "СПО"; tech_regime = "СПО"; tech_hook = "Над забоем"; return НадЗабоем_СПО_СПО; } } else { // Бурение if (v8.Value <= (v9.Value - size_bottom_hole_zone)) // В Pp? { // Не попали в призабойную зону if (v1.Value > locking_pressure) // Pr>БЗ { switch (StudySpeedTalblokAndRotationRotor(v5, v4, locking_value_rotor_speed, locking_speed_talbloka, r_study)) { case TProcResult.True: // Проработка tech_stage = "Бурение"; tech_regime = "Проработка"; tech_hook = "Над забоем"; return НадЗабоем_Бурение_Проработка; case TProcResult.False: // Промывка tech_stage = "Бурение"; tech_regime = "Промывка"; tech_hook = "Над забоем"; return НадЗабоем_Бурение_Промывка; default: return Техпроцесс_Default; } } else { //Наращивание tech_stage = "Бурение"; tech_regime = "Наращивание"; tech_hook = "Над забоем"; return НадЗабоем_Бурение_Наращивание; } } else { // Попали в призабойную зону switch (StateDrillingPressureAndLoadBit(v1, v6, locking_pressure, locking_value_load, r_drilling)) // Pr>БЗ { case TProcResult.True: // Бурение tech_stage = "Бурение"; tech_regime = "Бурение"; tech_hook = "Над забоем"; return НадЗабоем_Бурение_Бурение; case TProcResult.False: //Наращивание tech_stage = "Бурение"; tech_regime = "Наращивание"; tech_hook = "Над забоем"; return НадЗабоем_Бурение_Наращивание; default: tech_stage = string.Empty; tech_regime = string.Empty; tech_hook = string.Empty; return Техпроцесс_Default; } } } } else { tech_stage = string.Empty; tech_regime = string.Empty; tech_hook = string.Empty; return Техпроцесс_Default; } } else { //ПЗР tech_stage = "ПЗР"; tech_regime = "ПЗР"; tech_hook = "Над забоем"; return НадЗабоем_ПЗР_ПЗР; } }
/// <summary> /// Вычисляет текущее значение параметра Состояние процесса бурения /// </summary> /// <param name="v1">Давление в текущий момент</param> /// <param name="v2">Клинья в текущий момент</param> /// <param name="v3">Вес на крюке в текущий момент</param> /// <param name="v4">Скорость тальблока в текущий момент</param> /// <param name="v5">Обороты ротора в текущий момент</param> /// <param name="v6">Нагрузка на долото в текущий момент</param> /// <param name="v8">Положение инструмента в текущий момент</param> /// <param name="v9">Глубина забоя в текущий момент</param> /// <param name="currentTime">текущее технологическое время</param> /// <param name="locking_weight_hook">Блокировочное значение веса на крюке</param> /// <param name="interval_pzr">Интервал ПЗР</param> /// <param name="drilling_interval">Интервал бурения</param> /// <param name="size_bottom_hole_zone">Размер призабойной зоны</param> /// <param name="locking_pressure">Блокировочное значение давления</param> /// <param name="locking_value_rotor_speed">Блокировочное значение оборотов ротора</param> /// <param name="locking_value_load">Блокировочное значение нагрузки</param> /// <param name="locking_speed_talbloka">Блокировочное значение скорости тальблока</param> /// <param name="r_drilling">Метод расчета режима бурения</param> /// <param name="r_study">Метод расчета проработка</param> /// <param name="r_weight">Метод расчета технологического режима</param> public void Calculate( P0004 v1, P0012 v2, P0102 v3, P0103 v4, P0110 v5, P0201 v6, P0204 v8, P0205 v9, DateTime currentTime, float locking_weight_hook, float interval_pzr, float drilling_interval, float size_bottom_hole_zone, float locking_pressure, float locking_value_rotor_speed, float locking_value_load, float locking_speed_talbloka, TechnologicalRegimDrilling r_drilling, TechnologicalRegimStudy r_study, TechnologicalRegimeWeightHook r_weight) { if (slim.TryEnterWriteLock(300)) { try { if (float.IsNaN(v8.Value)) { _value = Техпроцесс_Default; tech_stage = string.Empty; tech_regime = string.Empty; tech_hook = string.Empty; return; } else if (float.IsNaN(v8.Value)) { _value = Техпроцесс_Default; tech_stage = string.Empty; tech_regime = string.Empty; tech_hook = string.Empty; return; } else if (float.IsNaN(v9.Value)) { _value = Техпроцесс_Default; tech_stage = string.Empty; tech_regime = string.Empty; tech_hook = string.Empty; return; } TProcResult result = WeightHookForWeightOrWedges(v3, v2, locking_weight_hook, r_weight); switch (result) { case TProcResult.True: _value = TrueBranch(v1, v2, v3, v4, v5, v6, v8, v9, currentTime, locking_weight_hook, interval_pzr, drilling_interval, size_bottom_hole_zone, locking_pressure, locking_value_rotor_speed, locking_value_load, locking_speed_talbloka, r_drilling, r_study, r_weight); break; case TProcResult.False: float tLp = v9.Value - drilling_interval; float Lp = (interval_pzr >= tLp) ? tLp : interval_pzr; // Пустой крюк if (v8.Value > Lp) // Dd>Lp { if (v8.Value <= (v9.Value - drilling_interval)) // Dd<Cd-Id { // СПО // СПО tech_stage = "СПО"; tech_regime = "СПО"; tech_hook = "Пустой крюк"; _value = ПустойКрюк_СПО_СПО; } else { // Бурение //Наращивание tech_stage = "Бурение"; tech_regime = "Наращивание"; tech_hook = "Пустой крюк"; _value = ПустойКрюк_Бурение_Наращивание; } } else { //ПЗР //ПЗР tech_stage = "ПЗР"; tech_regime = "ПЗР"; tech_hook = "Пустой крюк"; _value = ПустойКрюк_ПЗР_ПЗР; } break; case TProcResult.Default: tech_stage = string.Empty; tech_regime = string.Empty; tech_hook = string.Empty; _value = Техпроцесс_Default; break; default: break; } } finally { slim.ExitWriteLock(); } } }