/// <summary> /// Вычисляет текущее значение параметра Нагрузка на долото /// </summary> /// <param name="v1">Давление в текущий момент</param> /// <param name="v2">Клинья в текущий момент</param> /// <param name="v3">Вес на крюке</param> /// <param name="v4">Вес колонны</param> /// <param name="locking_weight_hook">Блокировочное значение веса на крюке</param> /// <param name="locking_pressure">Блокировочное значение давления</param> /// <param name="r_weight">Возможные методы расчета состояния Вес на крюке</param> public void Calculate(P0004 v1, P0012 v2, P0102 v3, P0200 v4, float locking_weight_hook, float locking_pressure, TechnologicalRegimeWeightHook r_weight) { if (slim.TryEnterWriteLock(300)) { try { if (float.IsNaN(v3.Value) || float.IsNaN(v4.Value) || float.IsNaN(v1.Value)) { _value = float.NaN; } else { _value = 0; if (WeightHookForWeightOrWedges(v3, v2, locking_weight_hook, r_weight) == TProcResult.True) { if (v1.Value > locking_pressure) // Pr>БЗ { _value = v4.Value - v3.Value; } } } } finally { slim.ExitWriteLock(); } } }
/// <summary> /// Определяет состояние Вес на крюке по весу или клиньям /// </summary> /// <param name="v1">Вес на крюке в текущий момент</param> /// <param name="v2">Положение клиньев в текущий момент</param> /// <param name="locking_weight_hook">Блокировочное значение веса на крюке. Глобальный параметр для всей технологии, по умолчанию == 0</param> /// <param name="r_weight">Определять состояние по весу или клиньям</param> /// <returns>Возвращает одно из трёх состояний: есть, нету, неизвестно</returns> public TProcResult WeightHookForWeightOrWedges(P0102 v1, P0012 v2, float locking_weight_hook, TechnologicalRegimeWeightHook r_weight) { switch (r_weight) { case TechnologicalRegimeWeightHook.Wedges: return(WeightHookForWedges(v2)); case TechnologicalRegimeWeightHook.Weight: return(WeightHookForWeight(v1, locking_weight_hook)); case TechnologicalRegimeWeightHook.WeightOrWedges: if (WeightHookForWeight(v1, locking_weight_hook) != TProcResult.True) { return(WeightHookForWedges(v2)); } else { return(TProcResult.True); } default: break; } return(TProcResult.Default); }
/// <summary> /// Вычисляет текущее значение параметра Положение инструмента /// </summary> /// <param name="v1">Положение тальблока в текущий момент</param> /// <param name="v2">Вес на крюке в текущий момент</param> /// <param name="v3">Длина инструмента в текущий момент</param> /// <param name="v4">Клинья АСУ</param> /// <param name="v5">Глубина забоя</param> /// <param name="currentTime">Текущее время технологического процесса</param> /// <param name="locking_weight_hook">Блокировочное_значение_веса_на_крюке</param> /// <param name="r_weight">Метод расчета веса на крюке</param> public void Calculate(P0005 v1, P0102 v2, P0202 v3, P0012 v4, P0205 v5, DateTime currentTime, float locking_weight_hook, TechnologicalRegimeWeightHook r_weight) { if (slim.TryEnterWriteLock(300)) { try { if (float.IsNaN(_value)) { _value = 0; } switch (v3.ModeProccess) { case P0202.TModeProcess.mpBase: if ((WeightHookForWeightOrWedges(v2, v4, locking_weight_hook, r_weight) == TProcResult.True) && !float.IsNaN(v1.Value)) { _value = v3.Value - v1.Value; } break; case P0202.TModeProcess.mpSetUser: /*if ((WeightHookForWeightOrWedges(v2, v4, locking_weight_hook, r_weight) * == TProcResult.True) && !float.IsNaN(v1.Value)) * { * _value = v3.Value - v1.Value; * } * else * { * _value = v3.Value; * }*/ break; case P0202.TModeProcess.mpCMDzaboi: //_value = v2.Value; break; case P0202.TModeProcess.mpCMDmodifyDepth: break; default: break; } } finally { slim.ExitWriteLock(); } } }
/// <summary> /// Вычисляет текущее значение параметра Положение инструмента /// </summary> /// <param name="v1">Положение тальблока в текущий момент</param> /// <param name="v2">Вес на крюке в текущий момент</param> /// <param name="v3">Длина инструмента в текущий момент</param> /// <param name="v4">Клинья АСУ</param> /// <param name="v5">Глубина забоя</param> /// <param name="currentTime">Текущее время технологического процесса</param> /// <param name="locking_weight_hook">Блокировочное_значение_веса_на_крюке</param> /// <param name="r_weight">Метод расчета веса на крюке</param> public void Calculate(P0005 v1, P0102 v2, P0202 v3, P0012 v4, P0205 v5, DateTime currentTime, float locking_weight_hook, TechnologicalRegimeWeightHook r_weight) { if (slim.TryEnterWriteLock(300)) { try { if (float.IsNaN(_value)) _value = 0; switch (v3.ModeProccess) { case P0202.TModeProcess.mpBase: if ((WeightHookForWeightOrWedges(v2, v4, locking_weight_hook, r_weight) == TProcResult.True) && !float.IsNaN(v1.Value)) { _value = v3.Value - v1.Value; } break; case P0202.TModeProcess.mpSetUser: /*if ((WeightHookForWeightOrWedges(v2, v4, locking_weight_hook, r_weight) == TProcResult.True) && !float.IsNaN(v1.Value)) { _value = v3.Value - v1.Value; } else { _value = v3.Value; }*/ break; case P0202.TModeProcess.mpCMDzaboi: //_value = v2.Value; break; case P0202.TModeProcess.mpCMDmodifyDepth: break; default: break; } } finally { slim.ExitWriteLock(); } } }
// -------------- вспомогательные функции -------------- /// <summary> /// Вычисляет текущее значение параметра Длина инструмента /// </summary> /// <param name="v1">Положение тальблока в текущий момент</param> /// <param name="клинья">Положение клиньев в текущий момент</param> /// <param name="вес_колонны">Вес на крюке в текущий момент</param> /// <param name="locking_weight_hook">Блокировочное значение веса на крюке.</param> /// <param name="r_weight">Метод расчета веса на крюке</param> /// <returns>Вычисленное значение параметра</returns> private float current_length_instrument(P0005 v1, P0012 v2, P0102 v3, float locking_weight_hook, TechnologicalRegimeWeightHook r_weight) { if (float.IsNaN(v1.Value)) { return(_value); } else { switch (weight_status) { case WeightStatus.wsClear: if (WeightHookForWeightOrWedges(v3, v2, locking_weight_hook, r_weight) == TProcResult.True) { _value = _value + v1.Value - last_talblock; last_talblock = v1.Value; weight_status = WeightStatus.wsWeight; } return(_value); case WeightStatus.wsWeight: if (WeightHookForWeightOrWedges(v3, v2, locking_weight_hook, r_weight) == TProcResult.True) { last_talblock = v1.Value; } else { weight_status = WeightStatus.wsClear; } return(_value); case WeightStatus.Default: weight_status = WeightStatus.wsClear; break; default: break; } return(_value); } }
/// <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="currentTime">Текущее технологическое время</param> /// <param name="locking_weight_hook">Блокировочное значение веса на крюке</param> /// <param name="size_layout_bottom_column">Размер компоновки низа колонны</param> /// <param name="r_weight">Метод расчета веса на крюке</param> public void Calculate(P0005 v1, P0102 v2, P0012 v3, P0204 v4, P0205 v5, P0203 v6, DateTime currentTime, float locking_weight_hook, float size_layout_bottom_column, float size_layout_top_column, TechnologicalRegimeWeightHook r_weight) { if (slim.TryEnterWriteLock(300)) { try { switch (mode_proccess) { case TModeProcess.mpBase: _value = current_length_instrument(v1, v3, v2, locking_weight_hook, r_weight); break; case TModeProcess.mpSetUser: mode_proccess = TModeProcess.mpBase; if (WeightHookForWeightOrWedges(v2, v3, locking_weight_hook, r_weight) != TProcResult.True || float.IsNaN(v1.Value)) { v4.Calculate(_value); } if (_value <= (size_layout_bottom_column + size_layout_top_column)) { v6.CorrectLenghtInstrument(0.0f); v6.Calculate(0.0f); } else { float _tmp = _value - (size_layout_bottom_column + size_layout_top_column); v6.CorrectLenghtInstrument(_tmp); } break; case TModeProcess.mpCMDzaboi: mode_proccess = TModeProcess.mpBase; if (WeightHookForWeightOrWedges(v2, v3, locking_weight_hook, r_weight) != TProcResult.True || float.IsNaN(v1.Value)) { _value = current_length_instrument(v1, v3, v2, locking_weight_hook, r_weight); } else { last_talblock = v1.Value; weight_status = WeightStatus.wsWeight; _value = v5.Value + v1.Value; if (_value <= (size_layout_bottom_column + size_layout_top_column)) { v6.CorrectLenghtInstrument(0.0f); v6.Calculate(0.0f); } else { float _tmp = _value - (size_layout_bottom_column + size_layout_top_column); v6.CorrectLenghtInstrument(_tmp); } } break; case TModeProcess.mpCMDmodifyDepth: if (WeightHookForWeightOrWedges(v2, v3, locking_weight_hook, r_weight) != TProcResult.True || float.IsNaN(v1.Value)) { weight_status = WeightStatus.wsClear; if (v5.Value < _value) { _value = v5.Value; if (_value <= (size_layout_bottom_column + size_layout_top_column)) { v6.CorrectLenghtInstrument(0.0f); v6.Calculate(0.0f); } else { float _tmp = _value - (size_layout_bottom_column + size_layout_top_column); v6.CorrectLenghtInstrument(_tmp); } } v4.Calculate(_value); } else { last_talblock = v1.Value; weight_status = WeightStatus.wsWeight; if (v5.Value < (_value - v1.Value)) { _value = v5.Value + v1.Value; if (_value <= (size_layout_bottom_column + size_layout_top_column)) { v6.CorrectLenghtInstrument(0.0f); v6.Calculate(0.0f); } else { float _tmp = _value - (size_layout_bottom_column + size_layout_top_column); v6.CorrectLenghtInstrument(_tmp); } } } mode_proccess = TModeProcess.mpBase; break; default: break; } } finally { slim.ExitWriteLock(); } } }
// -------------- вспомогательные функции -------------- /// <summary> /// Вычисляет текущее значение параметра Длина инструмента /// </summary> /// <param name="v1">Положение тальблока в текущий момент</param> /// <param name="клинья">Положение клиньев в текущий момент</param> /// <param name="вес_колонны">Вес на крюке в текущий момент</param> /// <param name="locking_weight_hook">Блокировочное значение веса на крюке.</param> /// <param name="r_weight">Метод расчета веса на крюке</param> /// <returns>Вычисленное значение параметра</returns> private float current_length_instrument(P0005 v1, P0012 v2, P0102 v3, float locking_weight_hook, TechnologicalRegimeWeightHook r_weight) { if (float.IsNaN(v1.Value)) { return _value; } else { switch (weight_status) { case WeightStatus.wsClear: if (WeightHookForWeightOrWedges(v3, v2, locking_weight_hook, r_weight) == TProcResult.True) { _value = _value + v1.Value - last_talblock; last_talblock = v1.Value; weight_status = WeightStatus.wsWeight; } return _value; case WeightStatus.wsWeight: if (WeightHookForWeightOrWedges(v3, v2, locking_weight_hook, r_weight) == TProcResult.True) { last_talblock = v1.Value; } else { weight_status = WeightStatus.wsClear; } return _value; case WeightStatus.Default: weight_status = WeightStatus.wsClear; break; default: break; } return _value; } }
// -------------------- вспомогательные функции -------------------- /// <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(); } } }
/// <summary> /// Определяет состояние Вес на крюке по весу или клиньям /// </summary> /// <param name="v1">Вес на крюке в текущий момент</param> /// <param name="v2">Положение клиньев в текущий момент</param> /// <param name="locking_weight_hook">Блокировочное значение веса на крюке. Глобальный параметр для всей технологии, по умолчанию == 0</param> /// <param name="r_weight">Определять состояние по весу или клиньям</param> /// <returns>Возвращает одно из трёх состояний: есть, нету, неизвестно</returns> public TProcResult WeightHookForWeightOrWedges(P0102 v1, P0012 v2, float locking_weight_hook, TechnologicalRegimeWeightHook r_weight) { switch (r_weight) { case TechnologicalRegimeWeightHook.Wedges: return WeightHookForWedges(v2); case TechnologicalRegimeWeightHook.Weight: return WeightHookForWeight(v1, locking_weight_hook); case TechnologicalRegimeWeightHook.WeightOrWedges: if (WeightHookForWeight(v1, locking_weight_hook) != TProcResult.True) { return WeightHookForWedges(v2); } else return TProcResult.True; default: break; } return TProcResult.Default; }