コード例 #1
0
ファイル: CtrlElemGroup.cs プロジェクト: firebitsbr/scada-36
        private void numGrElemCnt_ValueChanged(object sender, EventArgs e)
        {
            // изменение количества элементов в группе
            if (elemGroup != null)
            {
                int oldElemCnt = elemGroup.Elems.Count;
                int newElemCnt = (int)numGrElemCnt.Value;

                if (oldElemCnt < newElemCnt)
                {
                    // добавление новых элементов
                    ElemTypes elemType = elemGroup.DefElemType;
                    for (int elemInd = oldElemCnt; elemInd < newElemCnt; elemInd++)
                    {
                        elemGroup.Elems.Add(new Elem()
                        {
                            ElemType = elemType
                        });
                    }
                }
                else if (oldElemCnt > newElemCnt)
                {
                    // удаление лишних элементов
                    for (int i = newElemCnt; i < oldElemCnt; i++)
                    {
                        elemGroup.Elems.RemoveAt(newElemCnt);
                    }
                }

                OnObjectChanged(TreeUpdateTypes.UpdateSignals);
            }
        }
コード例 #2
0
ファイル: ModbusUtils.cs プロジェクト: firebitsbr/scada-36
        /// <summary>
        /// Получить количество элементов (количество адресов) в зависимости от типа элемента
        /// </summary>
        public static int GetElemCount(ElemTypes elemType)
        {
            switch (elemType)
            {
            case ElemTypes.ULong:
            case ElemTypes.Long:
            case ElemTypes.Double:
                return(4);

            case ElemTypes.UInt:
            case ElemTypes.Int:
            case ElemTypes.Float:
                return(2);

            default:
                return(1);
            }
        }
コード例 #3
0
ファイル: CtrlElemGroup.cs プロジェクト: firebitsbr/scada-36
        private void cbGrTableType_SelectedIndexChanged(object sender, EventArgs e)
        {
            // изменение типа таблицы данных группы элементов
            if (elemGroup != null)
            {
                TableTypes tableType  = (TableTypes)cbGrTableType.SelectedIndex;
                int        maxElemCnt = DataUnit.GetMaxElemCnt(tableType);

                bool cancel = elemGroup.Elems.Count > maxElemCnt &&
                              MessageBox.Show(string.Format(KpPhrases.ElemRemoveWarning, maxElemCnt),
                                              CommonPhrases.QuestionCaption, MessageBoxButtons.YesNoCancel,
                                              MessageBoxIcon.Question) != DialogResult.Yes;

                if (cancel)
                {
                    cbGrTableType.SelectedIndexChanged -= cbGrTableType_SelectedIndexChanged;
                    cbGrTableType.SelectedIndex         = (int)elemGroup.TableType;
                    cbGrTableType.SelectedIndexChanged += cbGrTableType_SelectedIndexChanged;
                }
                else
                {
                    // ограничение макс. количества элементов в группе
                    if (numGrElemCnt.Value > maxElemCnt)
                    {
                        numGrElemCnt.Value = maxElemCnt;
                    }
                    numGrElemCnt.Maximum = maxElemCnt;

                    // установка типа таблицы данных
                    elemGroup.TableType = tableType;
                    elemGroup.UpdateFuncCode();
                    ShowFuncCode(elemGroup);

                    // установка типа элементов группы по умолчанию
                    ElemTypes elemType = elemGroup.DefElemType;
                    foreach (Elem elem in elemGroup.Elems)
                    {
                        elem.ElemType = elemType;
                    }

                    OnObjectChanged(TreeUpdateTypes.CurrentNode | TreeUpdateTypes.ChildNodes);
                }
            }
        }
コード例 #4
0
ファイル: CtrlCmd.cs プロジェクト: xxq860725/scada
        private void cbCmdElemType_SelectedIndexChanged(object sender, EventArgs e)
        {
            // изменение типа элементов
            if (modbusCmd != null)
            {
                ElemTypes newElemType = (ElemTypes)cbCmdElemType.SelectedIndex;

                if (modbusCmd.TableType == TableTypes.HoldingRegisters && newElemType == ElemTypes.Bool)
                {
                    // отмена выбора типа Bool для регистров хранения
                    cbCmdElemType.SelectedIndexChanged -= cbCmdElemType_SelectedIndexChanged;
                    cbCmdElemType.SelectedIndex         = (int)modbusCmd.ElemType;
                    cbCmdElemType.SelectedIndexChanged += cbCmdElemType_SelectedIndexChanged;
                }
                else
                {
                    modbusCmd.ElemType  = newElemType;
                    numCmdElemCnt.Value = ModbusUtils.GetElemCount(modbusCmd.ElemType);
                    OnObjectChanged(TreeUpdateTypes.None);
                }
            }
        }
コード例 #5
0
ファイル: Modbus.cs プロジェクト: raydtang/scada
 /// <summary>
 /// Получить длину элемента (количество адресов) в зависимости от типа элемента
 /// </summary>
 public static int GetElemLength(ElemTypes elemType)
 {
     switch (elemType)
     {
         case ElemTypes.ULong:
         case ElemTypes.Long:
         case ElemTypes.Double:
             return 4;
         case ElemTypes.UInt:
         case ElemTypes.Int:
         case ElemTypes.Float:
             return 2;
         default:
             return 1;
     }
 }
コード例 #6
0
        /// <summary>
        /// Загрузить шаблон устройства
        /// </summary>
        public bool Load(string fileName, out string errMsg)
        {
            SetToDefault();

            try
            {
                // загрузка шаблона устройства
                XmlDocument xmlDoc = new XmlDocument();
                xmlDoc.Load(fileName);

                // загрузка настроек шаблона
                XmlNode settingsNode = xmlDoc.DocumentElement.SelectSingleNode("Settings");
                if (settingsNode != null)
                {
                    Sett.LoadFromXml((XmlElement)settingsNode);
                }

                // загрузка групп элементов
                XmlNode elemGroupsNode = xmlDoc.DocumentElement.SelectSingleNode("ElemGroups");
                if (elemGroupsNode != null)
                {
                    int kpTagInd = 0;

                    foreach (XmlElement elemGroupElem in elemGroupsNode.ChildNodes)
                    {
                        TableTypes tableType = elemGroupElem.GetAttrAsEnum <TableTypes>("tableType");
                        ElemGroup  elemGroup = new ElemGroup(tableType);
                        elemGroup.Name          = elemGroupElem.GetAttribute("name");
                        elemGroup.Address       = (ushort)elemGroupElem.GetAttrAsInt("address");
                        elemGroup.Active        = elemGroupElem.GetAttrAsBool("active", true);
                        elemGroup.StartKPTagInd = kpTagInd;
                        elemGroup.StartSignal   = kpTagInd + 1;

                        XmlNodeList elemNodes   = elemGroupElem.SelectNodes("Elem");
                        ElemTypes   defElemType = elemGroup.DefElemType;

                        foreach (XmlElement elemElem in elemNodes)
                        {
                            Elem elem = new Elem();
                            elem.Name     = elemElem.GetAttribute("name");
                            elem.ElemType = elemElem.GetAttrAsEnum("type", defElemType);

                            if (elemGroup.ByteOrderEnabled)
                            {
                                elem.ByteOrderStr = elemElem.GetAttribute("byteOrder");
                                elem.ByteOrder    = ModbusUtils.ParseByteOrder(elem.ByteOrderStr);
                                if (elem.ByteOrder == null)
                                {
                                    elem.ByteOrder = Sett.GetDefByteOrder(elem.Length);
                                }
                            }

                            elemGroup.Elems.Add(elem);
                        }

                        if (0 < elemGroup.Elems.Count && elemGroup.Elems.Count <= DataUnit.GetMaxElemCnt(tableType))
                        {
                            ElemGroups.Add(elemGroup);
                            kpTagInd += elemGroup.Elems.Count;
                        }
                    }
                }

                // загрузка команд
                XmlNode cmdsNode = xmlDoc.DocumentElement.SelectSingleNode("Cmds");
                if (cmdsNode != null)
                {
                    foreach (XmlElement cmdElem in cmdsNode.ChildNodes)
                    {
                        ModbusCmd cmd = new ModbusCmd(
                            cmdElem.GetAttrAsEnum <TableTypes>("tableType"),
                            cmdElem.GetAttrAsBool("multiple"),
                            cmdElem.GetAttrAsInt("elemCnt", 1));
                        cmd.ElemType = cmdElem.GetAttrAsEnum("elemType", cmd.DefElemType);
                        cmd.Address  = (ushort)cmdElem.GetAttrAsInt("address");
                        cmd.Name     = cmdElem.GetAttribute("name");
                        cmd.CmdNum   = cmdElem.GetAttrAsInt("cmdNum");

                        if (cmd.ByteOrderEnabled)
                        {
                            cmd.ByteOrderStr = cmdElem.GetAttribute("byteOrder");
                            cmd.ByteOrder    = ModbusUtils.ParseByteOrder(cmd.ByteOrderStr);
                            if (cmd.ByteOrder == null)
                            {
                                cmd.ByteOrder = Sett.GetDefByteOrder(cmd.ElemCnt);
                            }
                        }

                        if (0 < cmd.CmdNum && cmd.CmdNum <= ushort.MaxValue)
                        {
                            Cmds.Add(cmd);
                        }
                    }
                }

                errMsg = "";
                return(true);
            }
            catch (Exception ex)
            {
                errMsg = ModbusPhrases.LoadTemplateError + ":" + Environment.NewLine + ex.Message;
                return(false);
            }
        }
コード例 #7
0
        /// <summary>
        /// Отобразить свойства элемента
        /// </summary>
        private void ShowElemProps(ElemInfo elemInfo)
        {
            if (elemInfo == null)
            {
                txtElemName.Text      = "";
                txtElemAddress.Text   = "";
                txtElemSignal.Text    = "";
                rbBool.Checked        = true;
                txtElemByteOrder.Text = "";
                gbElem.Enabled        = false;
            }
            else
            {
                txtElemName.Text    = elemInfo.Elem.Name;
                txtElemAddress.Text = elemInfo.AddressRange;
                txtElemSignal.Text  = elemInfo.Signal.ToString();
                ElemTypes elemType = elemInfo.Elem.ElemType;

                if (elemType == ElemTypes.Bool)
                {
                    rbUShort.Enabled         = rbShort.Enabled = rbUInt.Enabled = rbInt.Enabled =
                        rbULong.Enabled      = rbLong.Enabled = rbFloat.Enabled = rbDouble.Enabled = false;
                    rbBool.Enabled           = true;
                    txtElemByteOrder.Text    = "";
                    txtElemByteOrder.Enabled = false;
                }
                else
                {
                    rbUShort.Enabled         = rbShort.Enabled = rbUInt.Enabled = rbInt.Enabled =
                        rbULong.Enabled      = rbLong.Enabled = rbFloat.Enabled = rbDouble.Enabled = true;
                    rbBool.Enabled           = false;
                    txtElemByteOrder.Text    = elemInfo.Elem.ByteOrderStr;
                    txtElemByteOrder.Enabled = true;
                }

                switch (elemType)
                {
                case ElemTypes.UShort:
                    rbUShort.Checked = true;
                    break;

                case ElemTypes.Short:
                    rbShort.Checked = true;
                    break;

                case ElemTypes.UInt:
                    rbUInt.Checked = true;
                    break;

                case ElemTypes.Int:
                    rbInt.Checked = true;
                    break;

                case ElemTypes.ULong:
                    rbULong.Checked = true;
                    break;

                case ElemTypes.Long:
                    rbLong.Checked = true;
                    break;

                case ElemTypes.Float:
                    rbFloat.Checked = true;
                    break;

                case ElemTypes.Double:
                    rbDouble.Checked = true;
                    break;

                default:
                    rbBool.Checked = true;
                    break;
                }

                gbElem.Enabled = true;
            }
        }
コード例 #8
0
ファイル: Modbus.cs プロジェクト: iyus/scada
 /// <summary>
 /// Получить длину элемента (количество адресов) в зависимости от типа элемента
 /// </summary>
 public static int GetElemLength(ElemTypes elemType)
 {
     return elemType == ElemTypes.UInt || elemType == ElemTypes.Int || elemType == ElemTypes.Float ?
         2 : 1;
 }