/// <summary> /// Вычисление массива data по значению датчика /// </summary> private void ComputeData() { byte[] b = new byte[2]; b = AppliedMath.IntToBytes((int)this.nudValue.Value); switch (data.Length) { case 1: this.data[0] = b[3]; break; case 2: if (this.singleByte) { this.data[0] = b[3]; this.data[1] = 0; } else { b = AppliedMath.IntToBytes((int)(this.nudValue.Value)); this.data[0] = b[2]; this.data[1] = b[3]; //this.data[0] = b[3]; //this.data[1] = b[2]; } break; } if (this.InverseByteOrder) { Array.Reverse(this.data); } }
/// <summary> /// Возвращает масив байт который обрузует блок из 4 переменных /// </summary> /// <param name="Vars">Список всех переменных, которые попадают в заданый блок</param> /// <param name="VarSize">Размер переменной, относительно который вычисляется блок</param> private int[] CreateVarBytesArray(List <ControllerEmbeddedVar> Vars, int VarSize, bool InverseByteOrder) { int[] res = new int[4]; switch (VarSize) { case 1: res[0] = (int)Vars[0].Value; res[1] = (int)Vars[3].Value; res[2] = (int)Vars[4].Value; res[3] = (int)Vars[6].Value; break; case 2: res[0] = !InverseByteOrder?AppliedMath.Hi((int)Vars[1].Value) : AppliedMath.Low((int)Vars[1].Value); res[1] = !InverseByteOrder?AppliedMath.Low((int)Vars[1].Value) : AppliedMath.Hi((int)Vars[1].Value); res[2] = !InverseByteOrder?AppliedMath.Hi((int)Vars[5].Value) : AppliedMath.Low((int)Vars[5].Value); res[3] = !InverseByteOrder?AppliedMath.Low((int)Vars[5].Value) : AppliedMath.Hi((int)Vars[5].Value); break; case 4: byte[] tmp = InverseByteOrder ? Utils.ReflectArray(AppliedMath.IntToBytes((int)Vars[2].Value)) : AppliedMath.IntToBytes((int)Vars[2].Value); for (int i = 0; i < 4; i++) { res[i] = tmp[i]; } break; } return(res); }
/// <summary> /// Записть измененного знаячения при завершении редактирования ячейки /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void dgv_askStructs_CellEndEdit(object sender, DataGridViewCellEventArgs e) { //Определение правильности введенного значения bool m_error = false; //Определение изменяемой переменной DataRow m_CurrentRow = (DataRow)this.DisplayVarsTable.Rows[this.dgv_askStructs.CurrentRow.Index]; //Определения правльности входных данных. Формирование массива для записи Byte[] m_Vars = new Byte[4]; Byte[] m_WriteVars = new Byte[(int)m_CurrentRow[7]]; int m_SignValue = 0; String m_CurrentValue = ""; if (this.dgv_askStructs[e.ColumnIndex, e.RowIndex].Value.ToString().Trim() != "") { if (this.codingType == 10) { m_CurrentValue = (String)(this.dgv_askStructs[e.ColumnIndex, e.RowIndex].Value); } else { if ((int)m_CurrentRow[7] == 4) { m_CurrentValue = Convert.ToString((UInt32)(AppliedMath.HexToDec((String)this.dgv_askStructs[e.ColumnIndex, e.RowIndex].Value))); } else { m_CurrentValue = Convert.ToString(AppliedMath.HexToDec((String)this.dgv_askStructs[e.ColumnIndex, e.RowIndex].Value)); } if (this.dgv_askStructs[e.ColumnIndex, e.RowIndex].Value.ToString().Contains("-")) { m_error = true; } } try { long i = long.Parse(m_CurrentValue); } catch { m_error = true; } } else { m_error = true; } if ((!m_error) && ((Convert.ToInt64(m_CurrentValue) <= (long)m_CurrentRow[8]) && (Convert.ToInt64(m_CurrentValue) >= (long)m_CurrentRow[9]))) { //Преобразование if (!((long)m_CurrentRow[9] < 0 || (int)m_CurrentRow[7] == 4)) { UInt32 m_Value = 0; m_Value = Convert.ToUInt32(m_CurrentValue); 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(m_CurrentValue); } m_Vars = AppliedMath.IntToBytes(m_SignValue); Array.Reverse(m_Vars); for (int i = 0; i < m_WriteVars.Length; i++) { m_WriteVars[i] = m_Vars[i]; } if (!_engine.Parameters.InverseByteOrder) { Array.Reverse(m_WriteVars); } } else { m_error = true; } if (m_error) { this.dgv_askStructs[e.ColumnIndex, e.RowIndex].Value = this._EditCellText; } else { //Запись переменной в память _engine.AddWriteItem((int)m_CurrentRow[6], GetMemoryType(m_CurrentRow[5].ToString()), m_WriteVars, "vars_write_" + m_CurrentRow[1].ToString() + "_" + m_CurrentRow[0].ToString(), null, null); } this._EditRow = null; }
/// <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; } }