/// <summary>
 /// Изменение значения аналогого датчика
 /// </summary>
 /// <param name="sender"></param>
 /// <param name="e"></param>
 private void ViewIOSensorsTabbedDocument_ValueChanged(object sender, EventArgs e)
 {
     Kontel.Relkon.Components.Documents.DebuggerTabbedDocuments.ViewIOSensorsTabbedDocument.AnalogSensorControl Sender = (Kontel.Relkon.Components.Documents.DebuggerTabbedDocuments.ViewIOSensorsTabbedDocument.AnalogSensorControl)sender;
     if (_engine.EngineStatus == DebuggerEngineStatus.Started)
     {
         Kontel.Relkon.Classes.ControllerVar m_var = _solution.Vars.GetVarByName(Sender.SensorName);
         _engine.AddWriteItem(m_var.Address, m_var.Memory, Sender.GetData(), "Analog_W_" + m_var.Name, null, null);
     }
 }
        /// <summary>
        /// Остановка опросов датчиков
        /// </summary>
        private void RemoveReadItems()
        {
            //Остановка чения стандартных датчиков
            //Остановка чтения цифровых датчиков
            IList <int> m_key = _inVarsDigital.Keys;

            for (int i = 0; i < _inVarsDigital.Count; i++)
            {
                try { _engine.RemoveReadItem(_inVarsDigital[m_key[i]].Address, _inVarsDigital[m_key[i]].Memory, "DIN_" + m_key[i]); }
                catch { }
            }
            m_key = _outVarsDigital.Keys;
            for (int i = 0; i < _outVarsDigital.Count; i++)
            {
                try { _engine.RemoveReadItem(_outVarsDigital[m_key[i]].Address, _outVarsDigital[m_key[i]].Memory, "DOUT_" + m_key[i]); }
                catch {}
            }
            //Остановка чения аналоговых датчиков
            for (int i = 0; i < this.ascInputs.Length; i++)
            {
                Kontel.Relkon.Classes.ControllerVar m_var = _solution.Vars.GetVarByName(this.ascInputs[i].SensorName);
                try { _engine.RemoveReadItem(m_var.Address, m_var.Memory, this.ascInputs[i]); }
                catch {}
            }
            for (int i = 0; i < this.ascOutputs.Length; i++)
            {
                Kontel.Relkon.Classes.ControllerVar m_var = _solution.Vars.GetVarByName(this.ascOutputs[i].SensorName);
                try { _engine.RemoveReadItem(m_var.Address, m_var.Memory, this.ascOutputs[i]); }
                catch {}
            }
            //Остановка чтения остальных вкладок
            for (int i = 0; i < tpBloks.Count; i++)
            {
                TD.SandDock.TabPage tp = tpBloks[tpBloks.Keys[i]];
                if ((_deletedPage == -1 || _deletedPage != (int)(((DisplayBlock)tp.Controls[0]).bDelete.Tag)) && tp.Controls.Count > 0 /*tp.Disposing*/)
                {
                    ((DisplayBlock)tp.Controls[0]).RemoveReadItems();
                }
            }
        }
        /// <summary>
        /// Событие при двойном щелчке по таблице прочитанных переменных
        /// (перенос их в дерево)
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void dgVars_DoubleClick(object sender, EventArgs e)
        {
            try
            {
                if (_IsHeader)
                {
                    _IsHeader = false; return;
                }

                //Если поле не редактируемое, то переместить переменную
                if ((this.dgVars.RowCount > 0) && (this.dgVars.CurrentCell.ReadOnly == true))
                {
                    //Добавление переменной в дерево
                    String m_name = (String)this.dgVars.CurrentRow.Cells[0].Value;
                    Kontel.Relkon.Classes.ControllerVar m_newVar = _solution.Vars.GetVarByName(m_name);
                    if (m_newVar == null)
                    {
                        //если написать строку,то не отображаются переменные, которых нет в _solution, но есть в _enging
                        //иначевозникает ошибка при открытии проекта, послеоткрытия файла отладчика
                        //this.Table.Rows.Remove(this.Table.Rows[this.dgVars.CurrentRow.Index]);
                        return;
                    }
                    DataRow m_CurrentRow = (DataRow)this.Table.Rows[this.dgVars.CurrentRow.Index];
                    for (int i = 0; i < this.Table.Rows.Count; i++)
                    {
                        if ((String)this.Table.Rows[i][0] == m_name)
                        {
                            m_CurrentRow = (DataRow)this.Table.Rows[i];
                            break;
                        }
                    }

                    if (m_newVar is ControllerSystemVar)
                    {
                        this.tvVars.Nodes["sys"].Nodes.Add(m_newVar.Name);
                    }
                    else if (m_newVar is ControllerEmbeddedVar)
                    {
                        this.tvVars.Nodes["emb"].Nodes.Add(m_newVar.Name);
                    }
                    else if (m_newVar is ControllerIOVar)
                    {
                        this.tvVars.Nodes["io"].Nodes.Add(m_newVar.Name);
                    }
                    else if (m_newVar is ControllerUserVar)
                    {
                        this.tvVars.Nodes["usr"].Nodes.Add(m_newVar.Name);
                    }
                    else
                    {
                        return;
                    }

                    //Удаление переменной из списка опрашиваемых
                    if (_vars.ContainsKey((String)m_newVar.Name))
                    {
                        for (int i = 0; i < _engine.Parameters.ReadingVars.Count; i++)
                        {
                            if (_engine.Parameters.ReadingVars[i].Name == m_newVar.Name)
                            {
                                Kontel.Relkon.DebuggerParameters.VarDescription m_VarDescription = _engine.Parameters.ReadingVars[i];
                                _engine.Parameters.ReadingVars.Remove(m_VarDescription);
                            }
                        }
                        _engine.RemoveReadItem(m_newVar.Address, m_newVar.Memory, m_CurrentRow /*.ItemArray[0].ToString()*/);
                        _vars.Remove((String)m_newVar.Name);
                    }
                    //Удаление переменной из таблицы

                    this.Table.Rows.Remove(m_CurrentRow);
                }
            }
            catch (Exception ex)
            {
                Utils.ErrorMessage("dgVars_DoubleClick:" + ex.Message);
                return;
            }
        }
 /// <summary>
 /// Событие при оканчании редактирования значения переменной
 /// </summary>
 /// <param name="sender"></param>
 /// <param name="e"></param>
 private void dgVars_CellEndEdit(object sender, DataGridViewCellEventArgs e)
 {
     try
     {
         //Определение правильности введенного значения
         bool m_error = false;
         //Определение изменяемой переменной
         Kontel.Relkon.Classes.ControllerVar m_newVar = _solution.Vars.GetVarByName((String)this.dgVars[0, e.RowIndex].Value);
         DataRow m_CurrentRow = (DataRow)this.Table.Rows[this.dgVars.CurrentRow.Index];
         for (int i = 0; i < this.Table.Rows.Count; i++)
         {
             if ((String)this.Table.Rows[i][0] == this._EditVar)
             {
                 m_CurrentRow = (DataRow)this.Table.Rows[i];
                 break;
             }
         }
         //Определения правльности входных данных. Формирование массива для записи
         Byte[] m_Vars      = new Byte[4];
         Byte[] m_WriteVars = new Byte[m_newVar.Size];
         int    m_SignValue = 0;
         if (m_newVar is ControllerUserVar && ((ControllerUserVar)m_newVar).Array)
         {
             String m_ArrayVar   = (String)this.dgVars[e.ColumnIndex, e.RowIndex].Value;
             String m_CurrentVar = "";
             for (int i = 0; i < m_newVar.Size; i++)
             {
                 if (m_ArrayVar.IndexOf(' ') > 0)
                 {
                     m_CurrentVar = m_ArrayVar.Substring(0, m_ArrayVar.IndexOf(' '));
                     m_ArrayVar   = m_ArrayVar.Substring(m_ArrayVar.IndexOf(' ') + 1);
                 }
                 else
                 {
                     m_CurrentVar = m_ArrayVar;
                     m_ArrayVar   = "";
                 }
                 if (this.codingType == 16)
                 {
                     try { if (!((Convert.ToInt64(Convert.ToByte(AppliedMath.HexToDec(m_CurrentVar))) <= long.Parse(m_CurrentRow[2].ToString())) && ((Convert.ToInt64(Convert.ToByte(AppliedMath.HexToDec(m_CurrentVar)))) >= long.Parse(m_CurrentRow[3].ToString()))))
                           {
                               m_error = true;
                           }
                     }
                     catch { m_error = true; }
                     if ((AppliedMath.IsValidHexNumber(m_CurrentVar)) && (!m_error))
                     {
                         m_WriteVars[i] = Convert.ToByte(AppliedMath.HexToDec(m_CurrentVar));
                     }
                     else
                     {
                         m_error = true; break;
                     }
                 }
                 else
                 {
                     if ((AppliedMath.IsValidDecNumber(m_CurrentVar)) && ((Convert.ToInt64(m_CurrentVar) <= long.Parse(m_CurrentRow[2].ToString())) && (Convert.ToInt64(m_CurrentVar) >= long.Parse(m_CurrentRow[3].ToString()))))
                     {
                         m_WriteVars[i] = Convert.ToByte(m_CurrentVar);
                     }
                     else
                     {
                         m_error = true; break;
                     }
                 }
                 if ((m_ArrayVar.Trim() == "") && (i < m_newVar.Size - 1))
                 {
                     m_error = true;
                     break;
                 }
             }
         }
         else
         {
             String m_CurrentValue = "";
             if (this.codingType == 10)
             {
                 m_CurrentValue = (String)(this.dgVars[e.ColumnIndex, e.RowIndex].Value);
             }
             else
             {
                 if (m_newVar.Size == 4)
                 {
                     m_CurrentValue = Convert.ToString((UInt32)(AppliedMath.HexToDec((String)this.dgVars[e.ColumnIndex, e.RowIndex].Value)));
                 }
                 else
                 {
                     m_CurrentValue = Convert.ToString(AppliedMath.HexToDec((String)this.dgVars[e.ColumnIndex, e.RowIndex].Value));
                 }
             }
             try { long i = long.Parse(m_CurrentValue); }
             catch { m_error = true; }
             if ((!m_error) && ((Convert.ToInt64(m_CurrentValue) <= long.Parse(m_CurrentRow[2].ToString())) && (Convert.ToInt64(m_CurrentValue) >= long.Parse(m_CurrentRow[3].ToString()))))
             {
                 //Преобразование
                 if (this.codingType == 10)
                 {
                     if (m_newVar.HasSign)
                     {
                         m_SignValue = Convert.ToInt32(this.dgVars[e.ColumnIndex, e.RowIndex].Value);
                     }
                     else
                     {
                         if (m_newVar.Size == 4)
                         {
                             UInt32 m_Value = 0;
                             m_Value = Convert.ToUInt32(this.dgVars[e.ColumnIndex, e.RowIndex].Value);
                             for (int i = 0; i < 4; i++)
                             {
                                 m_Vars[i] = (Byte)(m_Value % 256);
                                 m_Value   = m_Value / 256;
                             }
                             Array.Reverse(m_Vars);
                             m_SignValue = AppliedMath.BytesToInt(m_Vars);
                         }
                         else
                         {
                             m_SignValue = Convert.ToInt32(this.dgVars[e.ColumnIndex, e.RowIndex].Value);
                         }
                     }
                 }
                 else
                 {
                     m_SignValue = Convert.ToInt32(AppliedMath.HexToDec((String)this.dgVars[e.ColumnIndex, e.RowIndex].Value));
                 }
                 m_Vars = AppliedMath.IntToBytes(m_SignValue);
                 //закоментированный вариант корректно опрашивает только с обратным порядокм байт
                 //if (_engine.Parameters.InverseByteOrder) Array.Reverse(m_Vars);
                 //for (int i = 0; i < m_WriteVars.Length; i++) m_WriteVars[i] = m_Vars[i];
                 for (int i = 0; i < m_WriteVars.Length; i++)
                 {
                     m_WriteVars[i] = m_Vars[i + (4 - m_WriteVars.Length)];
                 }
                 if (_engine.Parameters.InverseByteOrder)
                 {
                     Array.Reverse(m_WriteVars);
                 }
             }
             else
             {
                 m_error = true;
             }
         }
         if (m_error)
         {
             this.dgVars[e.ColumnIndex, e.RowIndex].Value = this._EditCellText;
         }
         else
         {
             //Запись переменной в память
             _engine.AddWriteItem(m_newVar.Address, m_newVar.Memory, m_WriteVars, "vars_write_" + m_newVar.Name, null, null);
         }
         this._EditVar = "";
     }
     catch (Exception ex)
     {
         this.dgVars[e.ColumnIndex, e.RowIndex].Value = this._EditCellText;
         this._EditVar = "";
         Utils.ErrorMessage("dgVars_CellEndEdit: " + ex.Message);
         return;
     }
 }
        /// <summary>
        /// Событтие при двойном щелчке по дереву не прочитаннх переменных
        /// (формировани запроса на их чтение)
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void tvVars_NodeMouseDoubleClick(object sender, System.Windows.Forms.TreeNodeMouseClickEventArgs e)
        {
            if ((e.Node.Nodes.Count == 0) && ((e.Node.Text.CompareTo("Системные переменные") != 0) && (e.Node.Text.CompareTo("Пользовательские переменные") != 0) && (e.Node.Text.CompareTo("Заводские установки") != 0)))
            {
                Kontel.Relkon.Classes.ControllerVar m_newVar = _solution.Vars.GetVarByName(e.Node.Text);
                if (m_newVar == null)
                {
                    return;
                }

                if (!_vars.ContainsKey(e.Node.Text))
                {
                    _vars.Add(e.Node.Text, m_newVar);

                    //Добавление записи с читаемой переменной


                    Int64 m_Max = 0;
                    Int64 m_Min = 0;
                    if (m_newVar.HasSign)
                    {
                        switch (m_newVar.Size)
                        {
                        case 1: m_Max = sbyte.MaxValue; m_Min = sbyte.MinValue; break;

                        case 2: m_Max = Int16.MaxValue; m_Min = Int16.MinValue; break;

                        case 4: m_Max = Int32.MaxValue; m_Min = Int32.MinValue; break;

                        default: m_Max = sbyte.MaxValue; m_Min = sbyte.MinValue; break;
                        }
                    }
                    else
                    {
                        switch (m_newVar.Size)
                        {
                        case 1: m_Max = Byte.MaxValue; m_Min = Byte.MinValue; break;

                        case 2: m_Max = UInt16.MaxValue; m_Min = UInt16.MinValue; break;

                        case 4: m_Max = UInt32.MaxValue; m_Min = UInt32.MinValue; break;

                        default: m_Max = Byte.MaxValue; m_Min = Byte.MinValue; break;
                        }
                    }

                    DataRow m_row = this.Table.NewRow();
                    m_row[0] = m_newVar.Name;
                    m_row[2] = m_Max;
                    m_row[3] = m_Min;
                    m_row[4] = m_newVar.Size;
                    m_row[5] = m_newVar.Address;
                    m_row[6] = m_newVar.Memory;
                    m_row[7] = ("0x00000000".Insert("0x00000000".Length - ("" + AppliedMath.DecToHex(m_newVar.Address)).Length, "" + AppliedMath.DecToHex(m_newVar.Address))).Substring(0, 10);
                    m_row[8] = new byte[m_newVar.Size];
                    m_row[9] = m_newVar.Real;
                    this.BuildDisplayValue(m_row);

                    this.Table.Rows.Add(m_row);
                    //Запоминаем что читаем эту переменную в параметры отладчика
                    Kontel.Relkon.DebuggerParameters.VarDescription m_VarDescription = new Kontel.Relkon.DebuggerParameters.VarDescription();
                    m_VarDescription.Address    = m_newVar.Address;
                    m_VarDescription.MemoryType = m_newVar.Memory;
                    m_VarDescription.Name       = m_newVar.Name;
                    m_VarDescription.Size       = m_newVar.Size;
                    m_VarDescription.Real       = m_newVar.Real;
                    m_VarDescription.Type       = e.Node.Parent.Index;
                    _engine.Parameters.ReadingVars.Add(m_VarDescription);
                    //Добавление переменной на опрос
                    if (this._IsReading)
                    {
                        for (int i = 0; i < this.Table.Rows.Count; i++)
                        {
                            if (this.Table.Rows[i][0].ToString() == m_newVar.Name)
                            {
                                try { _engine.AddReadItem(m_newVar.Address, m_newVar.Memory, m_newVar.Size, this.Table.Rows[i], null, CallBack); }
                                catch { }
                            }
                        }
                    }
                }
                this.tvVars.Nodes.Remove(e.Node);
            }
        }