/// <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="sructName"></param> private void AddStruct(string structName) { DataRow m_row; //Запоминаем что читаем эту переменную в параметры отладчика Kontel.Relkon.DebuggerParameters.StructDescription m_StructDescription = new Kontel.Relkon.DebuggerParameters.StructDescription(); foreach (DataRow dr in this.StructsTable.Rows) { if (dr[0].ToString() == structName) { m_StructDescription.Address = (int)dr[1]; m_StructDescription.MemoryType = GetMemoryType(dr[2].ToString()); m_StructDescription.Name = dr[0].ToString(); m_StructDescription.Size = (int)dr[3]; m_StructDescription.Type = 0; break; } } foreach (DataRow dr in this.VarsTable.Rows) { if (dr[1].ToString() == structName) { //Добавление переменной структуры в таблицу опрашиваемых m_row = this.DisplayVarsTable.NewRow(); m_row[0] = dr[0]; m_row[1] = dr[1]; m_row[2] = 0; m_row[5] = dr[2]; m_row[6] = dr[3]; m_row[7] = dr[4]; if ((bool)dr[5]) { switch ((int)dr[4]) { case 1: m_row[8] = sbyte.MaxValue; m_row[9] = sbyte.MinValue; break; case 2: m_row[8] = short.MaxValue; m_row[9] = short.MinValue; break; case 4: m_row[8] = int.MaxValue; m_row[9] = int.MinValue; break; } } else { switch ((int)dr[4]) { case 1: m_row[8] = byte.MaxValue; m_row[9] = byte.MinValue; break; case 2: m_row[8] = ushort.MaxValue; m_row[9] = ushort.MinValue; break; case 4: m_row[8] = uint.MaxValue; m_row[9] = uint.MinValue; break; } } m_row[3] = BuildDisplayAddress((int)dr[3]); m_row[4] = BuildDisplayValue((byte[])m_row[2], (int)m_row[7], (long)m_row[9] < 0); this.DisplayVarsTable.Rows.Add(m_row); AddRowToAsk(m_row); //Добавление переменной к структуре Kontel.Relkon.DebuggerParameters.VarDescription m_VarDescription = new Kontel.Relkon.DebuggerParameters.VarDescription(); m_VarDescription.Address = (int)dr[3]; m_VarDescription.MemoryType = GetMemoryType(dr[2].ToString()); m_VarDescription.Name = dr[0].ToString(); m_VarDescription.Size = (int)dr[4]; m_StructDescription.Vars.Add(m_VarDescription); } } _engine.Parameters.ReadingStructs.Add(m_StructDescription); //Добавление пустой строки для разделения структур m_row = this.DisplayVarsTable.NewRow(); this.DisplayVarsTable.Rows.Add(m_row); }
/// <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); } }