/// <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); } }