/// <summary>
 /// Установка значений в поля размер считывания и начальный адрес
 /// </summary>
 private void SetValues()
 {
     if (_HexAddressCoding)
     {
         if (this._Address == 0)
         {
             this.tbStartAddress.Text = "0x00";
         }
         else
         {
             this.tbStartAddress.Text = "0x" + AppliedMath.DecToHex(this._Address);
         }
     }
     else
     {
         this.tbStartAddress.Text = "" + this._Address;
     }
     if (_HexSizeCoding)
     {
         this.tbReadingSize.Text = "0x" + AppliedMath.DecToHex(this._Size);
     }
     else
     {
         this.tbReadingSize.Text = "" + this._Size;
     }
 }
示例#2
0
        /// <summary>
        /// Формирование значения переменной для отображения
        /// </summary>
        /// <param name="address"></param>
        /// <returns></returns>
        private string BuildDisplayValue(byte[] buffer, int size, bool hasSign)
        {
            if (buffer == null || size == 0)
            {
                return("Ошибка");
            }

            byte[] Buffer = buffer;
            long   Value  = 0;

            if (_engine.Parameters.InverseByteOrder)
            {
                Array.Reverse(Buffer);
            }
            Value = AppliedMath.BytesToLong(Buffer);
            //Определение типа переменной
            if (hasSign)
            {
                switch (size)
                {
                case 1: Value = (sbyte)Value; break;

                case 2: Value = (Int16)Value; break;

                case 4: Value = (Int32)Value; break;
                }
            }
            else
            {
                switch (size)
                {
                case 1: Value = (Byte)Value; break;

                case 2: Value = (UInt16)Value; break;

                case 4: Value = (UInt32)Value; break;
                }
            }
            //Формирвание прочитанного значения
            String m_StrVar = this._EditCellText;

            switch (codingType)
            {
            case 16:
                String m_Str = Convert.ToString(Value, codingType);
                if (m_Str.Length > size * 2)
                {
                    int m_CutIndex = m_Str.Length - size * 2;
                    m_Str = m_Str.Substring(m_CutIndex);
                }
                m_Str    = "0x" + Utils.AddChars('0', m_Str, 8 /*(int)m_row.ItemArray[4] * 2*/);
                m_StrVar = m_Str.ToUpper();
                break;

            default:
                m_StrVar = Convert.ToString(Value, codingType).ToUpper();
                break;
            }
            return(m_StrVar.Replace('X', 'x'));
        }
        /// <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 StartAddress_Leave(object sender, EventArgs e)
 {
     try
     {
         if (this.tbStartAddress.Text[0] == '0' && this.tbStartAddress.Text[1] == 'x')
         {
             _Address          = AppliedMath.HexToDec(this.tbStartAddress.Text);
             _HexAddressCoding = true;
         }
         else
         {
             _Address          = int.Parse(this.tbStartAddress.Text);
             _HexAddressCoding = false;
         }
     }
     catch
     {
         SetValues();
         return;
     }
     if (this._Address == 0 && this.ddlMemoryType.Text == "SD Card")
     {
         this._Address = 1;
     }
     if (this._Address >= MaxMemoryValue())
     {
         this._Address = MaxMemoryValue() - 1;
     }
     if (this._Size + this._Address > MaxMemoryValue())
     {
         this._Size = MaxMemoryValue() - this._Address;
     }
     _engine.Parameters.ViewMemoryAddress = _Address;
     this.SetValues();
 }
        /// <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);
            }
        }
示例#6
0
        /// <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);
            }
        }
示例#7
0
 /// <summary>
 /// Выполняет инициализацию полей класса
 /// </summary>
 /// <param name="ModuleNumber">Физический номер модуля</param>
 protected void Init(int ModuleNumber)
 {
     this.ModuleNumber = ModuleNumber;
     this.GenerateVarsNames(this.ModuleNumber);
     this.Req10msDefinition = "0x" + Utils.AddChars('0', AppliedMath.DecToHex(this.ModuleNumber), 4);
     foreach (ModuleVarDescription VarDescription in this.VarNames)
     {
         this.Req10msDefinition += ", (unsigned int)&" + VarDescription.DisplayName;
     }
     this.Req10msDefinition += ", (unsigned int)&E" + this.VarNames[0].DisplayName;
 }
示例#8
0
        /// <summary>
        /// Для заданной переменной преобразует ее значение из массива байт в целое число
        /// </summary>
        private long GetVarValue(DebuggerParameters.VarDescription var, byte[] data)
        {
            if (this.debuggerEngine.Parameters.InverseByteOrder)
            {
                data = Utils.ReflectArray <byte>(data);
            }
            long res = AppliedMath.BytesToLong(data);

            switch (var.Size)
            {
            case 1:
                if (var.HasSign)
                {
                    res = (sbyte)res;
                }
                else
                {
                    res = (byte)res;
                }
                break;

            case 2:
                if (var.HasSign)
                {
                    res = (short)res;
                }
                else
                {
                    res = (ushort)res;
                }
                break;

            case 4:
                if (var.HasSign)
                {
                    res = (int)res;
                }
                else
                {
                    res = (uint)res;
                }
                break;
            }
            return(res);
        }
 /// <summary>
 /// Событие при смене типа памяти
 /// </summary>
 /// <param name="sender"></param>
 /// <param name="e"></param>
 private void MemoryType_SelectedValueChanged(object sender, EventArgs e)
 {
     _Address = AppliedMath.HexToDec(this.tbStartAddress.Text);
     if (this._Address == 0 && this.ddlMemoryType.Text == "SD Card")
     {
         this._Address = 1;
     }
     if (this._Address >= MaxMemoryValue())
     {
         this._Address = MaxMemoryValue() - 1;
     }
     if (this._Size + this._Address > MaxMemoryValue())
     {
         this._Size = MaxMemoryValue() - this._Address;
     }
     this.SetValues();
     _engine.Parameters.ViewMemoryType = GetMemoryType(this.ddlMemoryType.Text);
 }
示例#10
0
        /// <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);
        }
示例#11
0
        /// <summary>
        /// Событие при потере фокуса полем "Размер считывания"
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void ReadingSize_Leave(object sender, EventArgs e)
        {
            try
            {
                if (this.tbReadingSize.Text[0] == '0' && this.tbReadingSize.Text[1] == 'x')
                {
                    this._Size     = AppliedMath.HexToDec(this.tbReadingSize.Text);
                    _HexSizeCoding = true;
                }
                else
                {
                    _Size          = int.Parse(this.tbReadingSize.Text);
                    _HexSizeCoding = false;
                }
            }
            catch
            {
                SetValues();
                return;
            }
            if (this._Size == 0)
            {
                this._Size = 1;
            }
            int m_size = 32767 / this.heMemory.SymbolHeight * this.heMemory.SegmentSize;

            if (this._Size > m_size)
            {
                this._Size = m_size;
            }
            if (this._Size + _Address > MaxMemoryValue())
            {
                this._Size = MaxMemoryValue() - this._Address;
            }
            _engine.Parameters.ReadingSize = _Size;
            this.SetValues();
        }
示例#12
0
 /// <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));
 }
示例#13
0
 /// <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;
     }
 }
示例#14
0
        /// <summary>
        /// Построение прочитанног значения в зависимости от кодировки
        /// </summary>
        /// <param name="row"></param>
        private void BuildDisplayValue(DataRow row)
        {
            DataRow m_row = row;

            byte[] Buffer = (byte[])m_row.ItemArray[8];

            bool real = (bool)row.ItemArray[9];
            int  size = (int)row.ItemArray[4];

            long   Value  = 0;
            double dValue = 0;

            if (_engine.Parameters.InverseByteOrder && !real)
            {
                Array.Reverse(Buffer);
            }

            if (real)
            {
                if (size == 8)
                {
                    dValue = BitConverter.ToDouble(Buffer, 0);
                }
                else
                {
                    dValue = (double)BitConverter.ToSingle(Buffer, 0);
                }
            }
            else
            {
                Value = AppliedMath.BytesToLong(Buffer);


                if (_vars[m_row.ItemArray[0].ToString()].HasSign)
                {
                    switch ((int)m_row.ItemArray[4])
                    {
                    case 1: Value = (sbyte)Value; break;

                    case 2: Value = (Int16)Value; break;

                    case 4: Value = (Int32)Value; break;
                    }
                }
                else
                {
                    switch ((int)m_row.ItemArray[4])
                    {
                    case 1: Value = (Byte)Value; break;

                    case 2: Value = (UInt16)Value; break;

                    case 4: Value = (UInt32)Value; break;
                    }
                }
            }

            //Добавление прочитанного значения
            String m_StrVar = this._EditCellText;
            String varName  = m_row.ItemArray[0].ToString();
            bool   array    = false;

            array = _vars[varName] is ControllerUserVar && ((ControllerUserVar)_vars[varName]).Array;

            if (!array)
            {
                array = _vars[varName] is ControllerSystemVar && ((ControllerSystemVar)_vars[varName]).Array;
            }

            if (array)
            {//обработка значения если это массив
                switch (codingType)
                {
                case 16:
                    String m_Str  = "";
                    String m_Byte = "";
                    foreach (Byte m_byte in Buffer)
                    {
                        m_Byte = Convert.ToString(m_byte, codingType);
                        switch (m_Byte.Length)
                        {
                        case 0: m_Byte = "00" + m_Byte; break;

                        case 1: m_Byte = "0" + m_Byte; break;

                        default: break;
                        }
                        m_Str += m_Byte + " ";
                    }
                    m_StrVar = m_Str.ToUpper();
                    break;

                default:
                    String m_Str1 = "";
                    foreach (Byte m_byte in Buffer)
                    {
                        m_Str1 += Convert.ToString(m_byte, codingType) + " ";
                    }
                    m_StrVar = m_Str1.ToUpper();
                    break;
                }
            }
            else
            {
                switch (codingType)
                {
                case 16:
                    String m_Str = Convert.ToString(Value, codingType);
                    if (m_Str.Length > (int)m_row.ItemArray[4] * 2)
                    {
                        int m_CutIndex = m_Str.Length - (int)m_row.ItemArray[4] * 2;
                        m_Str = m_Str.Substring(m_CutIndex);
                    }
                    m_Str    = "0x" + Utils.AddChars('0', m_Str, 8 /*(int)m_row.ItemArray[4] * 2*/);
                    m_StrVar = m_Str.ToUpper();
                    break;

                default:
                    if (real)
                    {
                        m_StrVar = dValue.ToString("F2");
                    }
                    else
                    {
                        m_StrVar = Convert.ToString(Value, codingType).ToUpper();
                    }
                    break;
                }
            }
            m_row[1] = m_StrVar.Replace('X', 'x');
        }
示例#15
0
        /// <summary>
        /// Генерирует h-файл с определениями модулей
        /// </summary>
        private string GenerateModulesHeader()
        {
            int count = 0;


            int[] groupesReqTime = new int[8];

            List <IOModule>[] groupes = new List <IOModule> [8];

            List <IOModule> Req1msMod   = new List <IOModule>();
            List <IOModule> Req5msMod   = new List <IOModule>();
            List <IOModule> Req10msMod  = new List <IOModule>();
            List <IOModule> Req100msMod = new List <IOModule>();

            for (int i = 0; i < 8; i++)
            {
                groupes[i] = new List <IOModule>();
            }


            foreach (IOModule mod in this.codeModel.IOModules.Values)
            {
                switch (mod.Period)
                {
                case 1:
                    Req1msMod.Add(mod);
                    break;

                case 5:
                    Req5msMod.Add(mod);
                    break;

                case 10:
                    Req10msMod.Add(mod);
                    break;

                case 100:
                    Req100msMod.Add(mod);
                    break;
                }
            }

            foreach (IOModule mod in Req1msMod)
            {
                for (int i = 0; i < groupes.Length; i++)
                {
                    groupes[i].Add(mod);
                }
            }

            count = 0;
            foreach (IOModule mod in Req5msMod)
            {
                if (count == 0)
                {
                    for (int i = 0; i < 8; i = i + 2)
                    {
                        groupes[i].Add(mod);
                    }
                }
                else
                {
                    for (int i = 1; i < 8; i = i + 2)
                    {
                        groupes[i].Add(mod);
                    }
                }
                count++;
                if (count == 2)
                {
                    count = 0;
                }
            }

            count = 0;
            foreach (IOModule mod in Req10msMod)
            {
                groupes[count].Add(mod);
                groupes[count + 4].Add(mod);
                count++;
                if (count == 4)
                {
                    count = 0;
                }
            }

            count = 0;
            foreach (IOModule mod in Req100msMod)
            {
                groupes[count].Add(mod);
                count++;
                if (count == 8)
                {
                    count = 0;
                }
            }

            for (int i = 0; i < groupes.Length; i++)
            {
                double totalReqTime = 0.2;
                double totalRepTime = 2;

                foreach (IOModule m in groupes[i])
                {
                    totalReqTime += m.RequestTime;
                    totalRepTime += m.ReplyTime;
                }
                int t1 = totalReqTime > (int)totalReqTime ? ((int)totalReqTime) + 1 : (int)totalReqTime;
                int t2 = totalRepTime > (int)totalRepTime ? ((int)totalRepTime) + 1 : (int)totalRepTime;
                groupesReqTime[i] = t1 + t2;
            }

            int d = MaxValueInArray(groupesReqTime);

            foreach (IOModule mod in Req1msMod)
            {
                mod.RealPeriod = d;
            }

            int[] p = new int[4];

            p[0] = groupesReqTime[0] + groupesReqTime[1];
            p[1] = groupesReqTime[2] + groupesReqTime[3];
            p[2] = groupesReqTime[4] + groupesReqTime[5];
            p[3] = groupesReqTime[6] + groupesReqTime[7];

            d = MaxValueInArray(p);

            foreach (IOModule mod in Req5msMod)
            {
                mod.RealPeriod = d;
            }

            p = new int[2];

            p[0] = groupesReqTime[0] + groupesReqTime[1] + groupesReqTime[2] + groupesReqTime[3];
            p[1] = groupesReqTime[4] + groupesReqTime[5] + groupesReqTime[6] + groupesReqTime[7];

            d = MaxValueInArray(p);

            foreach (IOModule mod in Req10msMod)
            {
                mod.RealPeriod = d;
            }

            d = 0;
            for (int i = 0; i < 8; i++)
            {
                d += groupesReqTime[i];
            }

            foreach (IOModule mod in Req100msMod)
            {
                mod.RealPeriod = d;
            }

            StringBuilder modulesh   = new StringBuilder();
            StringBuilder iodefinesh = new StringBuilder();

            StringBuilder DIODefines = new StringBuilder();
            StringBuilder AIODefines = new StringBuilder();

            foreach (IOModule module in this.codeModel.IOModules.Values)
            {
                if (module is DigitalModule)
                {
                    DIODefines.AppendLine("#define " + module.VarNames[0].DisplayName + " " + module.VarNames[0].SystemName);
                }
                else
                {
                    AnalogModule amodule = (AnalogModule)module;
                    for (int i = 0; i < amodule.VarNames.Length; i++)
                    {
                        AIODefines.AppendLine("#define " + amodule.VarNames[i].DisplayName + " " + amodule.VarNames[i].SystemName);
                        AIODefines.AppendLine("#define " + amodule.SingleByteVarNames[i].DisplayName + " (" + amodule.VarNames[i].SystemName + ">>8)");
                    }
                }
            }

            iodefinesh.AppendLine(DIODefines.ToString());
            iodefinesh.AppendLine(AIODefines.ToString());

            modulesh.AppendLine("const unsigned char mod_table[]={");
            for (int i = 0; i < groupes.Length; i++)
            {
                if (groupes[i].Count != 0)
                {
                    foreach (IOModule mod in groupes[i])
                    {
                        modulesh.Append("0x" + Utils.AddChars('0', AppliedMath.DecToHex(mod.ModuleNumber), 2) + ", ");
                    }
                    modulesh.AppendLine("0x00,");
                }
            }
            modulesh.Append("0x00");
            modulesh.AppendLine("};");

            try
            {
                File.WriteAllText(this.solution.DirectoryName + "\\iodefines.h", iodefinesh.ToString());
            }
            catch (Exception ex)
            {
                this.Errors.Add(new CompilationError(ex.Message, this.codeModel.FileName, -1, false));
            }

            return(modulesh.ToString());
        }
示例#16
0
 /// <summary>
 /// Формирование адреса для отображения
 /// </summary>
 /// <param name="address"></param>
 /// <returns></returns>
 private string BuildDisplayAddress(int address)
 {
     return(("0x00000000".Insert("0x00000000".Length - ("" + AppliedMath.DecToHex(address)).Length, "" + AppliedMath.DecToHex(address))).Substring(0, 10));
 }
示例#17
0
        /// <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);
            }
        }
示例#18
0
        /// <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;
        }
示例#19
0
        public override void GeneratePultCode()
        {
            StringBuilder      code   = new StringBuilder();
            IndentedTextWriter writer = new IndentedTextWriter(new StringWriter(code));

            writer.WriteLine("/***********PultDataCI***************/");
            for (int i = 0; i < this.pultModel.Rows.Count; i++)
            {
                writer.WriteLine("const unsigned char str" + (i + 1).ToString() + "[][" + this.pultModel.Type.SymbolsInRow + "] = {");
                writer.Indent++;
                foreach (View view in this.pultModel.Rows[i].Views)
                {
                    if (!view.Enabled)
                    {
                        continue;
                    }
                    writer.WriteLine("\"" + this.ConvertStringToSTM32F107Format(view) + "\",");
                }

                if (this.pultModel.Rows[i].Views.Count > 0)
                {
                    View view = this.pultModel.Rows[i].Views[this.pultModel.Rows[i].Views.Count - 1];
                    writer.WriteLine("\"" + this.ConvertStringToSTM32F107Format(view) + "\"");
                }
                writer.Indent--;
                writer.WriteLine("};");
            }


            writer.WriteLine("void print_var(void)");
            writer.WriteLine("{");
            writer.Indent++;
            for (int i = 1; i < this.pultModel.Rows.Count + 1; i++)
            {
                writer.WriteLine("switch(_Sys.S" + i + ")");
                writer.WriteLine("{");
                writer.Indent++;
                for (int j = 0; j < this.pultModel.Rows[i - 1].EnabledViews.Count; j++)
                {
                    View view = this.pultModel.Rows[i - 1].EnabledViews[j];
                    if (view.Vars.Count == 0)
                    {
                        continue;
                    }
                    view.Vars.Sort(PultVar.CompareByPosition);
                    writer.WriteLine("case " + j + ":");
                    writer.Indent++;
                    foreach (PultVar v in view.Vars)
                    {
                        int afterDot = Math.Min(3, GetNumberOfDigitsAfterDotInMask(v.Mask));
                        int s        = afterDot == 0 ? v.Mask.Length : v.Mask.Length - 1;
                        s = Math.Min(7, s);
                        RelkonCodeVarDefenition var = solution.GetRelkonCodeVarDefenitionByName(v.Name);
                        if (var != null)
                        {
                            if (v.ReadOnly)
                            {
                                if (var.Type == "float")
                                {
                                    writer.WriteLine("print_float(" + v.Name + ", " + i + ", " + (v.Position + 1).ToString() + ", "
                                                     + s + ", " + afterDot + ");");
                                }
                                else
                                {
                                    writer.WriteLine("print_long((long)" + v.Name + ", " + i + ", " + (v.Position + 1).ToString() + ", "
                                                     + s
                                                     + ", " + afterDot + ");");
                                }
                            }
                            else
                            {
                                writer.WriteLine("print_edit((void*)&" + var.Name + ", " + i
                                                 + ", " + ++v.Position + ", "
                                                 + s
                                                 + ", " + afterDot + ", 0x" + AppliedMath.DecToHex(GetTypeCodeOfVar(var, v.HasSign)) + ");");
                            }
                        }
                        else
                        {
                            if (v.Name == "HOUR" ||
                                v.Name == "MIN" ||
                                v.Name == "SEC" ||
                                v.Name == "DATE" ||
                                v.Name == "MONTH" ||
                                v.Name == "YEAR")
                            {
                                if (v.ReadOnly)
                                {
                                    writer.WriteLine("print_long((long)" + "times." + v.Name.ToLower() + ", " + i + ", " + (v.Position + 1).ToString() + ", "
                                                     + s
                                                     + ", " + afterDot + ");");
                                }
                                else
                                {
                                    writer.WriteLine("print_time(" + i + "," + (v.Position + 1).ToString() + "," + v.Name + "_TYPE);");
                                }
                                continue;
                            }
                            Match m = Regex.Match(v.Name, @"\bEE(\d+)");
                            if (m.Success)
                            {
                                if (v.ReadOnly)
                                {
                                    writer.WriteLine("print_long((long)" + v.Name + ", " + i + ", " + (v.Position + 1).ToString() + ", "
                                                     + s
                                                     + ", " + afterDot + ");");
                                }
                                else
                                {
                                    writer.WriteLine("print_edit_ee(" + int.Parse(m.Groups[1].Value) + ", " + i
                                                     + ", " + ++v.Position + ", "
                                                     + s
                                                     + ", " + afterDot + ", 0x" + AppliedMath.DecToHex(GetTypeCodeOfEEVar(v.Name, v.HasSign)) + ");");
                                }
                                continue;
                            }

                            for (int k = 1; k < 9; k++)
                            {
                                v.Name = Regex.Replace(v.Name, @"\bADC" + k + "\b", "_Sys_ADC[" + (k - 1).ToString() + "]");
                                //Match m = Regex.Match(v.Name, );
                                //v.Name = v.Name.Replace("ADC" + k, "_Sys_ADC[" + (k - 1).ToString() + "]");
                            }

                            if (v.ReadOnly)
                            {
                                writer.WriteLine("print_long((long)" + v.Name + ", " + i + ", " + (v.Position + 1).ToString() + ", "
                                                 + (afterDot == 0 ? v.Mask.Length : v.Mask.Length - 1).ToString()
                                                 + ", " + afterDot + ");");
                            }
                            else
                            {
                                if (v.Name.Contains("ADC") || v.Name.Contains("DAC"))
                                {
                                    writer.WriteLine("print_edit((void*)&" + v.Name + ", " + i
                                                     + ", " + ++v.Position + ", "
                                                     + (afterDot == 0 ? v.Mask.Length : v.Mask.Length - 1).ToString()
                                                     + ", " + afterDot + ", 0x02);");
                                }
                                else
                                {
                                    writer.WriteLine("print_edit((void*)&" + v.Name + ", " + i
                                                     + ", " + ++v.Position + ", "
                                                     + (afterDot == 0 ? v.Mask.Length : v.Mask.Length - 1).ToString()
                                                     + ", " + afterDot + ", 0x01);");
                                }
                            }
                        }
                    }
                    writer.WriteLine("break;");
                    writer.Indent--;
                }
                writer.WriteLine("default: break;");
                writer.Indent--;
                writer.WriteLine("}");
            }
            writer.Indent--;
            writer.WriteLine("}");
            writer.WriteLine("");
            writer.Close();
            try
            {
                using (StreamWriter wr = new StreamWriter(this.solution.DirectoryName + "\\fc_u.c", true, Encoding.Default))
                {
                    wr.Write(code.ToString());
                }
            }
            catch (Exception ex)
            {
                this.Errors.Add(new Kontel.Relkon.Classes.CompilationError(ex.Message, this.solution.DirectoryName + "\\fc_u.c", -1, false));
            }
        }