/// <summary> /// Устанавливает новые значения переменных заводских установок при изменении значения какой либо одной /// </summary> public void SetEmbeddedVarValue(string VarName, long value, bool InverseByteOrder) { ControllerEmbeddedVar WorkingVar = this.GetVarByName(VarName); if (WorkingVar == null) { return; } WorkingVar.Value = value; List <ControllerEmbeddedVar> vars = this.GetAllAssignedEmbeddedVars(VarName); int[] ibytes = this.CreateVarBytesArray(vars, WorkingVar.Size, InverseByteOrder); byte[] bytes = { (byte)ibytes[0], (byte)ibytes[1], (byte)ibytes[2], (byte)ibytes[3] }; // Установка значений однобайтных переменных vars[0].Value = ibytes[0]; vars[3].Value = ibytes[1]; vars[4].Value = ibytes[2]; vars[6].Value = ibytes[3]; // Установка значений двухбайтных переменных if (WorkingVar != vars[1]) { vars[1].Value = AppliedMath.BytesToInt(InverseByteOrder ? Utils.ReflectArray <byte>(Utils.GetSubArray <byte>(bytes, 0, 2)) : Utils.GetSubArray <byte>(bytes, 0, 2)); } if (WorkingVar != vars[5]) { vars[5].Value = AppliedMath.BytesToInt(InverseByteOrder ? Utils.ReflectArray <byte>(Utils.GetSubArray <byte>(bytes, 2)) : Utils.GetSubArray <byte>(bytes, 2)); } // Установка значений четырехбайтной переменной if (WorkingVar != vars[2]) { vars[2].Value = (uint)AppliedMath.BytesToInt(InverseByteOrder ? Utils.ReflectArray <byte>(bytes) : bytes); } }
/// <summary> /// Читает размер буффера с контроллера на базе процессора MB90F347 /// </summary> /// <param name="port">Порт, через который осуществляется чтение; должен быть уже открыт</param> private int ReadMB90F347BufferSize(Relkon37SerialPort port) { byte[] addresses = { 340, 344 }; int res = int.MaxValue; for (int i = 0; i < 2; i++) { byte[] response = port.ReadEEPROM(addresses[i], 2); if (this.Parameters.InverseByteOrder) { Array.Reverse(response); } int SRX = AppliedMath.BytesToInt(response); response = port.ReadEEPROM(addresses[i] + 4, 2); if (this.InverseByteOrder) { Array.Reverse(response); } NRX = AppliedMath.BytesToInt(response); res = Math.Min(res, NRX - SRX + 1); } 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> /// По массиву data вычисляет значение датчика /// </summary> private int ComputeValue() { byte[] b = this.InverseByteOrder ? Utils.ReflectArray <byte>(this.data) : this.data; return(this.SigleByte ? b[0] : AppliedMath.BytesToInt(b)); }
/// <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; } }