/// <summary> /// Вычисляет текущее значение параметра Глубина забоя /// </summary> /// <param name="v1">Положение инструмента в текущий момент</param> /// <param name="v2">Длина инструмента</param> public void Calculate(P0204 v1, P0202 v2) { if (slim.TryEnterWriteLock(300)) { try { float vNew = float.NaN; if (float.IsNaN(_value)) _value = 0; switch (v2.ModeProccess) { case P0202.TModeProcess.mpBase: vNew = v1.Value; if (!float.IsNaN(vNew)) { if (vNew > _value) { _value = vNew; } } break; case P0202.TModeProcess.mpSetUser: /*vNew = v1.Value; if (vNew > _value) { _value = vNew; } v2.ModeProccess = P0202.TModeProcess.mpBase;*/ break; case P0202.TModeProcess.mpCMDzaboi: //v2.ModeProccess = P0202.TModeProcess.mpBase; break; case P0202.TModeProcess.mpCMDmodifyDepth: /*vNew = v1.Value; v2.ModeProccess = P0202.TModeProcess.mpBase; if (vNew > _value) { _value = vNew; }*/ 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="currentTime">Текущее технологическое время</param> /// <param name="size_layout_bottom_column">Размер компоновки низа колонны</param> /// <param name="size_layout_top_column">Размер компоновки верха колонны</param> public void Calculate(P0202 v1, DateTime currentTime, float size_layout_bottom_column, float size_layout_top_column) { if (slim.TryEnterWriteLock(300)) { try { if (float.IsNaN(_value)) { _value = 0; } switch (v1.ModeProccess) { case P0202.TModeProcess.mpBase: if (alg == CalculateCandleAlgorithm.LenghtOfCandleCount) { calculate_candle(v1, size_layout_bottom_column, size_layout_top_column); _value = calculate_candle_count(v1, size_layout_bottom_column, size_layout_top_column); } else { _value = calculate_candle(v1, size_layout_bottom_column, size_layout_top_column); } break; case P0202.TModeProcess.mpSetUser: //length_instrument = v1.Value; break; case P0202.TModeProcess.mpCMDzaboi: //_value = calculate_candle(v1, size_layout_bottom_column); break; case P0202.TModeProcess.mpCMDmodifyDepth: //_value = calculate_candle(v1, size_layout_bottom_column); 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="size_layout_bottom_column">Размер компоновки низа колонны</param> /// <param name="size_layout_top_column">Размер компоновки верха колонны</param> /// <returns></returns> protected float calculate_candle_count(P0202 v1, float size_layout_bottom_column, float size_layout_top_column) { if (calculateTotal()) { try { if (tubes != null) { if (!float.IsNaN(v1.Value) && !float.IsInfinity(v1.Value) && !float.IsNegativeInfinity(v1.Value) && !float.IsPositiveInfinity(v1.Value)) { float dlina = v1.Value - (size_layout_bottom_column + size_layout_top_column); if (dlina < 0) { return(0.0f); } for (int index = 0; index < tubes.Count; index++) { if (tubes[index] != null && tubes[index].Lenght > 0) { float a = Math.Abs(dlina - tubes[index].Total); if (a <= deviation) { return(tubes[index].Number); } else if (dlina < tubes[index].Total) { if (index <= 0) { return(0.0f); } else { float d1 = dlina - tubes[index - 1].Total; float d2 = tubes[index].Total - dlina; if (d1 < d2) { v1.setValue(tubes[index - 1].Total + (size_layout_bottom_column + size_layout_top_column)); return(tubes[index - 1].Number); } else { v1.setValue(tubes[index].Total + (size_layout_bottom_column + size_layout_top_column)); return(tubes[index].Number); } } } } else { break; } } int lastIndex = -1; for (int index = 0; index < tubes.Count; index++) { if (tubes[index].Lenght <= 0) { lastIndex = index - 1; break; } } if (lastIndex > -1 && lastIndex < tubes.Count) { return(tubes[lastIndex].Number + 1); } else { return(0.0f); } //return (tubes[tubes.Count - 1].Number + 1); } } } catch { } } return(float.NaN); }
// ------------ вспомогательные функции ------------ /// <summary> /// Внутренняя процедура расчёта количества свечей, имеет побочный эффект /// </summary> /// <param name="v1">Длина инструмента</param> /// <param name="size_layout_bottom_column">Размер компоновки низа колонны</param> /// <param name="size_layout_top_column">Размер компоновки верха колонны</param> /// <returns></returns> private float calculate_candle(P0202 v1, float size_layout_bottom_column, float size_layout_top_column) { float dlina = v1.Value; float result = _value; if (!float.IsNaN(dlina)) { if (dlina <= (size_layout_bottom_column + size_layout_top_column)) { result = 0; length_instrument = 0; } else { float old = length_instrument; dlina = dlina - (size_layout_bottom_column + size_layout_top_column); float dd = Math.Abs(dlina - old); if (dd > lower_size_candle) { if (old < dlina) { // инструмент вырос while (dd > upper_size_candle) { dd = dd - size_candle; length_instrument = length_instrument + size_candle; result = result + 1; } if (dd >= lower_size_candle) { length_instrument = dlina; result = result + 1; } } else { // инструмент стал меньше while (dd > upper_size_candle) { dd = dd - size_candle; length_instrument = length_instrument - size_candle; result = result - 1; } if (dd >= lower_size_candle) { length_instrument = dlina; result = result - 1; } if (length_instrument <= 0) { result = 0; length_instrument = 0; } if (result < 0) { result = 0; } } } } } return(result); }
/// <summary> /// Вычисляет текущее значение параметра Глубина забоя /// </summary> /// <param name="v1">Положение инструмента в текущий момент</param> /// <param name="v2">Длина инструмента</param> public void Calculate(P0204 v1, P0202 v2) { if (slim.TryEnterWriteLock(300)) { try { float vNew = float.NaN; if (float.IsNaN(_value)) { _value = 0; } switch (v2.ModeProccess) { case P0202.TModeProcess.mpBase: vNew = v1.Value; if (!float.IsNaN(vNew)) { if (vNew > _value) { _value = vNew; } } break; case P0202.TModeProcess.mpSetUser: /*vNew = v1.Value; * if (vNew > _value) * { * _value = vNew; * } * v2.ModeProccess = P0202.TModeProcess.mpBase;*/ break; case P0202.TModeProcess.mpCMDzaboi: //v2.ModeProccess = P0202.TModeProcess.mpBase; break; case P0202.TModeProcess.mpCMDmodifyDepth: /*vNew = v1.Value; * v2.ModeProccess = P0202.TModeProcess.mpBase; * * if (vNew > _value) * { * _value = vNew; * }*/ break; default: break; } } finally { slim.ExitWriteLock(); } } }
/// <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> /// Внутренняя процедура расчёта количества свечей, имеет побочный эффект /// </summary> /// <param name="v1">Длина инструмента</param> /// <param name="size_layout_bottom_column">Размер компоновки низа колонны</param> /// <param name="size_layout_top_column">Размер компоновки верха колонны</param> /// <returns></returns> private float calculate_candle(P0202 v1, float size_layout_bottom_column, float size_layout_top_column) { float dlina = v1.Value; float result = _value; if (!float.IsNaN(dlina)) { if (dlina <= (size_layout_bottom_column + size_layout_top_column)) { result = 0; length_instrument = 0; } else { float old = length_instrument; dlina = dlina - (size_layout_bottom_column + size_layout_top_column); float dd = Math.Abs(dlina - old); if (dd > lower_size_candle) { if (old < dlina) { // инструмент вырос while (dd > upper_size_candle) { dd = dd - size_candle; length_instrument = length_instrument + size_candle; result = result + 1; } if (dd >= lower_size_candle) { length_instrument = dlina; result = result + 1; } } else { // инструмент стал меньше while (dd > upper_size_candle) { dd = dd - size_candle; length_instrument = length_instrument - size_candle; result = result - 1; } if (dd >= lower_size_candle) { length_instrument = dlina; result = result - 1; } if (length_instrument <= 0) { result = 0; length_instrument = 0; } if (result < 0) { result = 0; } } } } } return result; }
/// <summary> /// Внутренняя процедура расчёта количества свечей, побочных эффектов не имеет =) /// </summary> /// <param name="size_layout_bottom_column">Размер компоновки низа колонны</param> /// <param name="size_layout_top_column">Размер компоновки верха колонны</param> /// <returns></returns> protected float calculate_candle_count(P0202 v1, float size_layout_bottom_column, float size_layout_top_column) { if (calculateTotal()) { try { if (tubes != null) { if (!float.IsNaN(v1.Value) && !float.IsInfinity(v1.Value) && !float.IsNegativeInfinity(v1.Value) && !float.IsPositiveInfinity(v1.Value)) { float dlina = v1.Value - (size_layout_bottom_column + size_layout_top_column); if (dlina < 0) return 0.0f; for (int index = 0; index < tubes.Count; index++) { if (tubes[index] != null && tubes[index].Lenght > 0) { float a = Math.Abs(dlina - tubes[index].Total); if (a <= deviation) { return tubes[index].Number; } else if (dlina < tubes[index].Total) { if (index <= 0) { return 0.0f; } else { float d1 = dlina - tubes[index - 1].Total; float d2 = tubes[index].Total - dlina; if (d1 < d2) { v1.setValue(tubes[index - 1].Total + (size_layout_bottom_column + size_layout_top_column)); return tubes[index - 1].Number; } else { v1.setValue(tubes[index].Total + (size_layout_bottom_column + size_layout_top_column)); return tubes[index].Number; } } } } else break; } int lastIndex = -1; for (int index = 0; index < tubes.Count; index++) { if (tubes[index].Lenght <= 0) { lastIndex = index - 1; break; } } if (lastIndex > -1 && lastIndex < tubes.Count) { return tubes[lastIndex].Number + 1; } else return 0.0f; //return (tubes[tubes.Count - 1].Number + 1); } } } catch { } } return float.NaN; }
/// <summary> /// Вычисляет текущее значение Количество опущенных свеч /// </summary> /// <param name="v1">Длина инструмента</param> /// <param name="currentTime">Текущее технологическое время</param> /// <param name="size_layout_bottom_column">Размер компоновки низа колонны</param> /// <param name="size_layout_top_column">Размер компоновки верха колонны</param> public void Calculate(P0202 v1, DateTime currentTime, float size_layout_bottom_column, float size_layout_top_column) { if (slim.TryEnterWriteLock(300)) { try { if (float.IsNaN(_value)) _value = 0; switch (v1.ModeProccess) { case P0202.TModeProcess.mpBase: if (alg == CalculateCandleAlgorithm.LenghtOfCandleCount) { calculate_candle(v1, size_layout_bottom_column, size_layout_top_column); _value = calculate_candle_count(v1, size_layout_bottom_column, size_layout_top_column); } else _value = calculate_candle(v1, size_layout_bottom_column, size_layout_top_column); break; case P0202.TModeProcess.mpSetUser: //length_instrument = v1.Value; break; case P0202.TModeProcess.mpCMDzaboi: //_value = calculate_candle(v1, size_layout_bottom_column); break; case P0202.TModeProcess.mpCMDmodifyDepth: //_value = calculate_candle(v1, size_layout_bottom_column); break; default: break; } } finally { slim.ExitWriteLock(); } } }