diff --git a/ScadaComm/OpenKPs/KpModbus/FrmDevTemplate.Designer.cs b/ScadaComm/OpenKPs/KpModbus/FrmDevTemplate.Designer.cs
deleted file mode 100644
index eccd93616..000000000
--- a/ScadaComm/OpenKPs/KpModbus/FrmDevTemplate.Designer.cs
+++ /dev/null
@@ -1,915 +0,0 @@
-namespace Scada.Comm.Devices.KpModbus
-{
- partial class FrmDevTemplate
- {
- ///
- /// Required designer variable.
- ///
- private System.ComponentModel.IContainer components = null;
-
- ///
- /// Clean up any resources being used.
- ///
- /// true if managed resources should be disposed; otherwise, false.
- protected override void Dispose(bool disposing)
- {
- if (disposing && (components != null))
- {
- components.Dispose();
- }
- base.Dispose(disposing);
- }
-
- #region Windows Form Designer generated code
-
- ///
- /// Required method for Designer support - do not modify
- /// the contents of this method with the code editor.
- ///
- private void InitializeComponent()
- {
- this.components = new System.ComponentModel.Container();
- System.Windows.Forms.TreeNode treeNode3 = new System.Windows.Forms.TreeNode("Группы элементов");
- System.Windows.Forms.TreeNode treeNode4 = new System.Windows.Forms.TreeNode("Команды");
- System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(FrmDevTemplate));
- this.treeView = new System.Windows.Forms.TreeView();
- this.imageList = new System.Windows.Forms.ImageList(this.components);
- this.toolStrip = new System.Windows.Forms.ToolStrip();
- this.btnNew = new System.Windows.Forms.ToolStripButton();
- this.btnOpen = new System.Windows.Forms.ToolStripButton();
- this.btnSave = new System.Windows.Forms.ToolStripButton();
- this.btnSaveAs = new System.Windows.Forms.ToolStripButton();
- this.toolStripSeparator = new System.Windows.Forms.ToolStripSeparator();
- this.btnAddElemGroup = new System.Windows.Forms.ToolStripButton();
- this.btnAddElem = new System.Windows.Forms.ToolStripButton();
- this.btnAddCmd = new System.Windows.Forms.ToolStripButton();
- this.btnMoveUp = new System.Windows.Forms.ToolStripButton();
- this.btnMoveDown = new System.Windows.Forms.ToolStripButton();
- this.btnDelete = new System.Windows.Forms.ToolStripButton();
- this.gbDevTemplate = new System.Windows.Forms.GroupBox();
- this.gbElemGroup = new System.Windows.Forms.GroupBox();
- this.chkGrActive = new System.Windows.Forms.CheckBox();
- this.lblGrElemCnt = new System.Windows.Forms.Label();
- this.numGrElemCnt = new System.Windows.Forms.NumericUpDown();
- this.txtGrName = new System.Windows.Forms.TextBox();
- this.lblGrName = new System.Windows.Forms.Label();
- this.numGrAddress = new System.Windows.Forms.NumericUpDown();
- this.lblGrAddress = new System.Windows.Forms.Label();
- this.lblGrTableType = new System.Windows.Forms.Label();
- this.cbGrTableType = new System.Windows.Forms.ComboBox();
- this.gbElem = new System.Windows.Forms.GroupBox();
- this.lblByteOrderExample = new System.Windows.Forms.Label();
- this.txtByteOrder = new System.Windows.Forms.TextBox();
- this.lblByteOrder = new System.Windows.Forms.Label();
- this.rbDouble = new System.Windows.Forms.RadioButton();
- this.rbLong = new System.Windows.Forms.RadioButton();
- this.rbULong = new System.Windows.Forms.RadioButton();
- this.rbBool = new System.Windows.Forms.RadioButton();
- this.rbFloat = new System.Windows.Forms.RadioButton();
- this.rbInt = new System.Windows.Forms.RadioButton();
- this.rbUInt = new System.Windows.Forms.RadioButton();
- this.rbShort = new System.Windows.Forms.RadioButton();
- this.lblElemType = new System.Windows.Forms.Label();
- this.rbUShort = new System.Windows.Forms.RadioButton();
- this.txtElemAddress = new System.Windows.Forms.TextBox();
- this.lblElemAddress = new System.Windows.Forms.Label();
- this.txtElemSignal = new System.Windows.Forms.TextBox();
- this.lblElemSignal = new System.Windows.Forms.Label();
- this.txtElemName = new System.Windows.Forms.TextBox();
- this.lblElemName = new System.Windows.Forms.Label();
- this.gbCmd = new System.Windows.Forms.GroupBox();
- this.chkCmdMultiple = new System.Windows.Forms.CheckBox();
- this.lblCmdElemCnt = new System.Windows.Forms.Label();
- this.numCmdElemCnt = new System.Windows.Forms.NumericUpDown();
- this.txtCmdName = new System.Windows.Forms.TextBox();
- this.lblCmdName = new System.Windows.Forms.Label();
- this.lblCmdNum = new System.Windows.Forms.Label();
- this.numCmdNum = new System.Windows.Forms.NumericUpDown();
- this.numCmdAddress = new System.Windows.Forms.NumericUpDown();
- this.lblCmdAddress = new System.Windows.Forms.Label();
- this.lblCmdTableType = new System.Windows.Forms.Label();
- this.cbCmdTableType = new System.Windows.Forms.ComboBox();
- this.openFileDialog = new System.Windows.Forms.OpenFileDialog();
- this.saveFileDialog = new System.Windows.Forms.SaveFileDialog();
- this.toolStrip.SuspendLayout();
- this.gbDevTemplate.SuspendLayout();
- this.gbElemGroup.SuspendLayout();
- ((System.ComponentModel.ISupportInitialize)(this.numGrElemCnt)).BeginInit();
- ((System.ComponentModel.ISupportInitialize)(this.numGrAddress)).BeginInit();
- this.gbElem.SuspendLayout();
- this.gbCmd.SuspendLayout();
- ((System.ComponentModel.ISupportInitialize)(this.numCmdElemCnt)).BeginInit();
- ((System.ComponentModel.ISupportInitialize)(this.numCmdNum)).BeginInit();
- ((System.ComponentModel.ISupportInitialize)(this.numCmdAddress)).BeginInit();
- this.SuspendLayout();
- //
- // treeView
- //
- this.treeView.HideSelection = false;
- this.treeView.ImageIndex = 0;
- this.treeView.ImageList = this.imageList;
- this.treeView.Location = new System.Drawing.Point(13, 19);
- this.treeView.Name = "treeView";
- treeNode3.ImageKey = "group.png";
- treeNode3.Name = "grsNode";
- treeNode3.SelectedImageKey = "group.png";
- treeNode3.Text = "Группы элементов";
- treeNode4.ImageIndex = 2;
- treeNode4.Name = "cmdsNode";
- treeNode4.SelectedImageKey = "cmds.png";
- treeNode4.Text = "Команды";
- this.treeView.Nodes.AddRange(new System.Windows.Forms.TreeNode[] {
- treeNode3,
- treeNode4});
- this.treeView.SelectedImageIndex = 0;
- this.treeView.ShowRootLines = false;
- this.treeView.Size = new System.Drawing.Size(254, 372);
- this.treeView.TabIndex = 0;
- this.treeView.AfterSelect += new System.Windows.Forms.TreeViewEventHandler(this.treeView_AfterSelect);
- //
- // imageList
- //
- this.imageList.ImageStream = ((System.Windows.Forms.ImageListStreamer)(resources.GetObject("imageList.ImageStream")));
- this.imageList.TransparentColor = System.Drawing.Color.Transparent;
- this.imageList.Images.SetKeyName(0, "group.png");
- this.imageList.Images.SetKeyName(1, "elem.png");
- this.imageList.Images.SetKeyName(2, "cmds.png");
- this.imageList.Images.SetKeyName(3, "cmd.png");
- //
- // toolStrip
- //
- this.toolStrip.Items.AddRange(new System.Windows.Forms.ToolStripItem[] {
- this.btnNew,
- this.btnOpen,
- this.btnSave,
- this.btnSaveAs,
- this.toolStripSeparator,
- this.btnAddElemGroup,
- this.btnAddElem,
- this.btnAddCmd,
- this.btnMoveUp,
- this.btnMoveDown,
- this.btnDelete});
- this.toolStrip.Location = new System.Drawing.Point(0, 0);
- this.toolStrip.Name = "toolStrip";
- this.toolStrip.Size = new System.Drawing.Size(590, 25);
- this.toolStrip.TabIndex = 0;
- this.toolStrip.Text = "toolStrip1";
- //
- // btnNew
- //
- this.btnNew.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image;
- this.btnNew.Image = ((System.Drawing.Image)(resources.GetObject("btnNew.Image")));
- this.btnNew.ImageTransparentColor = System.Drawing.Color.Magenta;
- this.btnNew.Name = "btnNew";
- this.btnNew.Size = new System.Drawing.Size(23, 22);
- this.btnNew.ToolTipText = "Создать новый шаблон";
- this.btnNew.Click += new System.EventHandler(this.btnNew_Click);
- //
- // btnOpen
- //
- this.btnOpen.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image;
- this.btnOpen.Image = ((System.Drawing.Image)(resources.GetObject("btnOpen.Image")));
- this.btnOpen.ImageTransparentColor = System.Drawing.Color.Magenta;
- this.btnOpen.Name = "btnOpen";
- this.btnOpen.Size = new System.Drawing.Size(23, 22);
- this.btnOpen.ToolTipText = "Открыть шаблон";
- this.btnOpen.Click += new System.EventHandler(this.btnOpen_Click);
- //
- // btnSave
- //
- this.btnSave.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image;
- this.btnSave.Image = ((System.Drawing.Image)(resources.GetObject("btnSave.Image")));
- this.btnSave.ImageTransparentColor = System.Drawing.Color.Magenta;
- this.btnSave.Name = "btnSave";
- this.btnSave.Size = new System.Drawing.Size(23, 22);
- this.btnSave.ToolTipText = "Сохранить шаблон";
- this.btnSave.Click += new System.EventHandler(this.btnSave_Click);
- //
- // btnSaveAs
- //
- this.btnSaveAs.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image;
- this.btnSaveAs.Image = ((System.Drawing.Image)(resources.GetObject("btnSaveAs.Image")));
- this.btnSaveAs.ImageTransparentColor = System.Drawing.Color.Magenta;
- this.btnSaveAs.Name = "btnSaveAs";
- this.btnSaveAs.Size = new System.Drawing.Size(23, 22);
- this.btnSaveAs.ToolTipText = "Сохранить шаблон как";
- this.btnSaveAs.Click += new System.EventHandler(this.btnSave_Click);
- //
- // toolStripSeparator
- //
- this.toolStripSeparator.Name = "toolStripSeparator";
- this.toolStripSeparator.Size = new System.Drawing.Size(6, 25);
- //
- // btnAddElemGroup
- //
- this.btnAddElemGroup.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image;
- this.btnAddElemGroup.Image = ((System.Drawing.Image)(resources.GetObject("btnAddElemGroup.Image")));
- this.btnAddElemGroup.ImageTransparentColor = System.Drawing.Color.Magenta;
- this.btnAddElemGroup.Name = "btnAddElemGroup";
- this.btnAddElemGroup.Size = new System.Drawing.Size(23, 22);
- this.btnAddElemGroup.ToolTipText = "Добавить группу элементов";
- this.btnAddElemGroup.Click += new System.EventHandler(this.btnAddElemGroup_Click);
- //
- // btnAddElem
- //
- this.btnAddElem.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image;
- this.btnAddElem.Image = ((System.Drawing.Image)(resources.GetObject("btnAddElem.Image")));
- this.btnAddElem.ImageTransparentColor = System.Drawing.Color.Magenta;
- this.btnAddElem.Name = "btnAddElem";
- this.btnAddElem.Size = new System.Drawing.Size(23, 22);
- this.btnAddElem.ToolTipText = "Добавить элемент";
- this.btnAddElem.Click += new System.EventHandler(this.btnAddElem_Click);
- //
- // btnAddCmd
- //
- this.btnAddCmd.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image;
- this.btnAddCmd.Image = ((System.Drawing.Image)(resources.GetObject("btnAddCmd.Image")));
- this.btnAddCmd.ImageTransparentColor = System.Drawing.Color.Magenta;
- this.btnAddCmd.Name = "btnAddCmd";
- this.btnAddCmd.Size = new System.Drawing.Size(23, 22);
- this.btnAddCmd.ToolTipText = "Добавить команду";
- this.btnAddCmd.Click += new System.EventHandler(this.btnAddCmd_Click);
- //
- // btnMoveUp
- //
- this.btnMoveUp.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image;
- this.btnMoveUp.Image = ((System.Drawing.Image)(resources.GetObject("btnMoveUp.Image")));
- this.btnMoveUp.ImageTransparentColor = System.Drawing.Color.Magenta;
- this.btnMoveUp.Name = "btnMoveUp";
- this.btnMoveUp.Size = new System.Drawing.Size(23, 22);
- this.btnMoveUp.ToolTipText = "Переместить вверх";
- this.btnMoveUp.Click += new System.EventHandler(this.btnMoveUp_Click);
- //
- // btnMoveDown
- //
- this.btnMoveDown.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image;
- this.btnMoveDown.Image = ((System.Drawing.Image)(resources.GetObject("btnMoveDown.Image")));
- this.btnMoveDown.ImageTransparentColor = System.Drawing.Color.Magenta;
- this.btnMoveDown.Name = "btnMoveDown";
- this.btnMoveDown.Size = new System.Drawing.Size(23, 22);
- this.btnMoveDown.ToolTipText = "Переместить вниз";
- this.btnMoveDown.Click += new System.EventHandler(this.btnMoveDown_Click);
- //
- // btnDelete
- //
- this.btnDelete.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image;
- this.btnDelete.Image = ((System.Drawing.Image)(resources.GetObject("btnDelete.Image")));
- this.btnDelete.ImageTransparentColor = System.Drawing.Color.Magenta;
- this.btnDelete.Name = "btnDelete";
- this.btnDelete.Size = new System.Drawing.Size(23, 22);
- this.btnDelete.ToolTipText = "Удалить";
- this.btnDelete.Click += new System.EventHandler(this.btnDelete_Click);
- //
- // gbDevTemplate
- //
- this.gbDevTemplate.Controls.Add(this.treeView);
- this.gbDevTemplate.Location = new System.Drawing.Point(12, 28);
- this.gbDevTemplate.Name = "gbDevTemplate";
- this.gbDevTemplate.Padding = new System.Windows.Forms.Padding(10, 3, 10, 10);
- this.gbDevTemplate.Size = new System.Drawing.Size(280, 404);
- this.gbDevTemplate.TabIndex = 1;
- this.gbDevTemplate.TabStop = false;
- this.gbDevTemplate.Text = "Шаблон устройства";
- //
- // gbElemGroup
- //
- this.gbElemGroup.Controls.Add(this.chkGrActive);
- this.gbElemGroup.Controls.Add(this.lblGrElemCnt);
- this.gbElemGroup.Controls.Add(this.numGrElemCnt);
- this.gbElemGroup.Controls.Add(this.txtGrName);
- this.gbElemGroup.Controls.Add(this.lblGrName);
- this.gbElemGroup.Controls.Add(this.numGrAddress);
- this.gbElemGroup.Controls.Add(this.lblGrAddress);
- this.gbElemGroup.Controls.Add(this.lblGrTableType);
- this.gbElemGroup.Controls.Add(this.cbGrTableType);
- this.gbElemGroup.Location = new System.Drawing.Point(298, 28);
- this.gbElemGroup.Name = "gbElemGroup";
- this.gbElemGroup.Padding = new System.Windows.Forms.Padding(10, 3, 10, 10);
- this.gbElemGroup.Size = new System.Drawing.Size(280, 167);
- this.gbElemGroup.TabIndex = 2;
- this.gbElemGroup.TabStop = false;
- this.gbElemGroup.Text = "Параметры группы элементов";
- //
- // chkGrActive
- //
- this.chkGrActive.AutoSize = true;
- this.chkGrActive.Location = new System.Drawing.Point(13, 19);
- this.chkGrActive.Name = "chkGrActive";
- this.chkGrActive.Size = new System.Drawing.Size(85, 17);
- this.chkGrActive.TabIndex = 0;
- this.chkGrActive.Text = "Активность";
- this.chkGrActive.UseVisualStyleBackColor = true;
- this.chkGrActive.CheckedChanged += new System.EventHandler(this.chkGrActive_CheckedChanged);
- //
- // lblGrElemCnt
- //
- this.lblGrElemCnt.AutoSize = true;
- this.lblGrElemCnt.Location = new System.Drawing.Point(140, 118);
- this.lblGrElemCnt.Name = "lblGrElemCnt";
- this.lblGrElemCnt.Size = new System.Drawing.Size(124, 13);
- this.lblGrElemCnt.TabIndex = 7;
- this.lblGrElemCnt.Text = "Количество элементов";
- //
- // numGrElemCnt
- //
- this.numGrElemCnt.Location = new System.Drawing.Point(143, 134);
- this.numGrElemCnt.Maximum = new decimal(new int[] {
- 2000,
- 0,
- 0,
- 0});
- this.numGrElemCnt.Minimum = new decimal(new int[] {
- 1,
- 0,
- 0,
- 0});
- this.numGrElemCnt.Name = "numGrElemCnt";
- this.numGrElemCnt.Size = new System.Drawing.Size(124, 20);
- this.numGrElemCnt.TabIndex = 8;
- this.numGrElemCnt.Value = new decimal(new int[] {
- 1,
- 0,
- 0,
- 0});
- this.numGrElemCnt.ValueChanged += new System.EventHandler(this.numGrElemCnt_ValueChanged);
- //
- // txtGrName
- //
- this.txtGrName.Location = new System.Drawing.Point(13, 55);
- this.txtGrName.Name = "txtGrName";
- this.txtGrName.Size = new System.Drawing.Size(254, 20);
- this.txtGrName.TabIndex = 2;
- this.txtGrName.TextChanged += new System.EventHandler(this.txtGrName_TextChanged);
- //
- // lblGrName
- //
- this.lblGrName.AutoSize = true;
- this.lblGrName.Location = new System.Drawing.Point(10, 39);
- this.lblGrName.Name = "lblGrName";
- this.lblGrName.Size = new System.Drawing.Size(83, 13);
- this.lblGrName.TabIndex = 1;
- this.lblGrName.Text = "Наименование";
- //
- // numGrAddress
- //
- this.numGrAddress.Location = new System.Drawing.Point(13, 134);
- this.numGrAddress.Maximum = new decimal(new int[] {
- 65536,
- 0,
- 0,
- 0});
- this.numGrAddress.Minimum = new decimal(new int[] {
- 1,
- 0,
- 0,
- 0});
- this.numGrAddress.Name = "numGrAddress";
- this.numGrAddress.Size = new System.Drawing.Size(124, 20);
- this.numGrAddress.TabIndex = 6;
- this.numGrAddress.Value = new decimal(new int[] {
- 1,
- 0,
- 0,
- 0});
- this.numGrAddress.ValueChanged += new System.EventHandler(this.numGrAddress_ValueChanged);
- //
- // lblGrAddress
- //
- this.lblGrAddress.AutoSize = true;
- this.lblGrAddress.Location = new System.Drawing.Point(10, 118);
- this.lblGrAddress.Name = "lblGrAddress";
- this.lblGrAddress.Size = new System.Drawing.Size(113, 13);
- this.lblGrAddress.TabIndex = 5;
- this.lblGrAddress.Text = "Адрес нач. элемента";
- //
- // lblGrTableType
- //
- this.lblGrTableType.AutoSize = true;
- this.lblGrTableType.Location = new System.Drawing.Point(10, 78);
- this.lblGrTableType.Name = "lblGrTableType";
- this.lblGrTableType.Size = new System.Drawing.Size(90, 13);
- this.lblGrTableType.TabIndex = 3;
- this.lblGrTableType.Text = "Таблица данных";
- //
- // cbGrTableType
- //
- this.cbGrTableType.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;
- this.cbGrTableType.FormattingEnabled = true;
- this.cbGrTableType.Items.AddRange(new object[] {
- "Discrete Inputs (Дискретные входы, 1X)",
- "Coils (Флаги, 0X)",
- "Input Registers (Входные регистры, 3X)",
- "Holding Registers (Регистры хранения, 4X)"});
- this.cbGrTableType.Location = new System.Drawing.Point(13, 94);
- this.cbGrTableType.Name = "cbGrTableType";
- this.cbGrTableType.Size = new System.Drawing.Size(254, 21);
- this.cbGrTableType.TabIndex = 4;
- this.cbGrTableType.SelectedIndexChanged += new System.EventHandler(this.cbGrTableType_SelectedIndexChanged);
- //
- // gbElem
- //
- this.gbElem.Controls.Add(this.lblByteOrderExample);
- this.gbElem.Controls.Add(this.txtByteOrder);
- this.gbElem.Controls.Add(this.lblByteOrder);
- this.gbElem.Controls.Add(this.rbDouble);
- this.gbElem.Controls.Add(this.rbLong);
- this.gbElem.Controls.Add(this.rbULong);
- this.gbElem.Controls.Add(this.rbBool);
- this.gbElem.Controls.Add(this.rbFloat);
- this.gbElem.Controls.Add(this.rbInt);
- this.gbElem.Controls.Add(this.rbUInt);
- this.gbElem.Controls.Add(this.rbShort);
- this.gbElem.Controls.Add(this.lblElemType);
- this.gbElem.Controls.Add(this.rbUShort);
- this.gbElem.Controls.Add(this.txtElemAddress);
- this.gbElem.Controls.Add(this.lblElemAddress);
- this.gbElem.Controls.Add(this.txtElemSignal);
- this.gbElem.Controls.Add(this.lblElemSignal);
- this.gbElem.Controls.Add(this.txtElemName);
- this.gbElem.Controls.Add(this.lblElemName);
- this.gbElem.Location = new System.Drawing.Point(298, 91);
- this.gbElem.Name = "gbElem";
- this.gbElem.Padding = new System.Windows.Forms.Padding(10, 3, 10, 10);
- this.gbElem.Size = new System.Drawing.Size(280, 271);
- this.gbElem.TabIndex = 3;
- this.gbElem.TabStop = false;
- this.gbElem.Text = "Параметры элемента";
- //
- // lblByteOrderExample
- //
- this.lblByteOrderExample.AutoSize = true;
- this.lblByteOrderExample.ForeColor = System.Drawing.SystemColors.GrayText;
- this.lblByteOrderExample.Location = new System.Drawing.Point(143, 242);
- this.lblByteOrderExample.Name = "lblByteOrderExample";
- this.lblByteOrderExample.Size = new System.Drawing.Size(113, 13);
- this.lblByteOrderExample.TabIndex = 18;
- this.lblByteOrderExample.Text = "Например, 01234567";
- //
- // txtByteOrder
- //
- this.txtByteOrder.Location = new System.Drawing.Point(13, 238);
- this.txtByteOrder.Name = "txtByteOrder";
- this.txtByteOrder.Size = new System.Drawing.Size(124, 20);
- this.txtByteOrder.TabIndex = 17;
- this.txtByteOrder.TextChanged += new System.EventHandler(this.txtByteOrder_TextChanged);
- //
- // lblByteOrder
- //
- this.lblByteOrder.AutoSize = true;
- this.lblByteOrder.Location = new System.Drawing.Point(10, 222);
- this.lblByteOrder.Name = "lblByteOrder";
- this.lblByteOrder.Size = new System.Drawing.Size(77, 13);
- this.lblByteOrder.TabIndex = 16;
- this.lblByteOrder.Text = "Порядок байт";
- //
- // rbDouble
- //
- this.rbDouble.AutoSize = true;
- this.rbDouble.Location = new System.Drawing.Point(143, 179);
- this.rbDouble.Name = "rbDouble";
- this.rbDouble.Size = new System.Drawing.Size(98, 17);
- this.rbDouble.TabIndex = 14;
- this.rbDouble.TabStop = true;
- this.rbDouble.Text = "double (8 байт)";
- this.rbDouble.UseVisualStyleBackColor = true;
- this.rbDouble.CheckedChanged += new System.EventHandler(this.rbType_CheckedChanged);
- //
- // rbLong
- //
- this.rbLong.AutoSize = true;
- this.rbLong.Location = new System.Drawing.Point(143, 156);
- this.rbLong.Name = "rbLong";
- this.rbLong.Size = new System.Drawing.Size(86, 17);
- this.rbLong.TabIndex = 12;
- this.rbLong.TabStop = true;
- this.rbLong.Text = "long (8 байт)";
- this.rbLong.UseVisualStyleBackColor = true;
- this.rbLong.CheckedChanged += new System.EventHandler(this.rbType_CheckedChanged);
- //
- // rbULong
- //
- this.rbULong.AutoSize = true;
- this.rbULong.Location = new System.Drawing.Point(13, 156);
- this.rbULong.Name = "rbULong";
- this.rbULong.Size = new System.Drawing.Size(92, 17);
- this.rbULong.TabIndex = 11;
- this.rbULong.TabStop = true;
- this.rbULong.Text = "ulong (8 байт)";
- this.rbULong.UseVisualStyleBackColor = true;
- this.rbULong.CheckedChanged += new System.EventHandler(this.rbType_CheckedChanged);
- //
- // rbBool
- //
- this.rbBool.AutoSize = true;
- this.rbBool.Location = new System.Drawing.Point(13, 202);
- this.rbBool.Name = "rbBool";
- this.rbBool.Size = new System.Drawing.Size(80, 17);
- this.rbBool.TabIndex = 15;
- this.rbBool.TabStop = true;
- this.rbBool.Text = "bool (1 бит)";
- this.rbBool.UseVisualStyleBackColor = true;
- this.rbBool.CheckedChanged += new System.EventHandler(this.rbType_CheckedChanged);
- //
- // rbFloat
- //
- this.rbFloat.AutoSize = true;
- this.rbFloat.Location = new System.Drawing.Point(13, 179);
- this.rbFloat.Name = "rbFloat";
- this.rbFloat.Size = new System.Drawing.Size(92, 17);
- this.rbFloat.TabIndex = 13;
- this.rbFloat.TabStop = true;
- this.rbFloat.Text = "float (4 байта)";
- this.rbFloat.UseVisualStyleBackColor = true;
- this.rbFloat.CheckedChanged += new System.EventHandler(this.rbType_CheckedChanged);
- //
- // rbInt
- //
- this.rbInt.AutoSize = true;
- this.rbInt.Location = new System.Drawing.Point(143, 133);
- this.rbInt.Name = "rbInt";
- this.rbInt.Size = new System.Drawing.Size(83, 17);
- this.rbInt.TabIndex = 10;
- this.rbInt.TabStop = true;
- this.rbInt.Text = "int (4 байта)";
- this.rbInt.UseVisualStyleBackColor = true;
- this.rbInt.CheckedChanged += new System.EventHandler(this.rbType_CheckedChanged);
- //
- // rbUInt
- //
- this.rbUInt.AutoSize = true;
- this.rbUInt.Location = new System.Drawing.Point(13, 133);
- this.rbUInt.Name = "rbUInt";
- this.rbUInt.Size = new System.Drawing.Size(89, 17);
- this.rbUInt.TabIndex = 9;
- this.rbUInt.TabStop = true;
- this.rbUInt.Text = "uint (4 байта)";
- this.rbUInt.UseVisualStyleBackColor = true;
- this.rbUInt.CheckedChanged += new System.EventHandler(this.rbType_CheckedChanged);
- //
- // rbShort
- //
- this.rbShort.AutoSize = true;
- this.rbShort.Location = new System.Drawing.Point(143, 110);
- this.rbShort.Name = "rbShort";
- this.rbShort.Size = new System.Drawing.Size(95, 17);
- this.rbShort.TabIndex = 8;
- this.rbShort.TabStop = true;
- this.rbShort.Text = "short (2 байта)";
- this.rbShort.UseVisualStyleBackColor = true;
- this.rbShort.CheckedChanged += new System.EventHandler(this.rbType_CheckedChanged);
- //
- // lblElemType
- //
- this.lblElemType.AutoSize = true;
- this.lblElemType.Location = new System.Drawing.Point(10, 94);
- this.lblElemType.Name = "lblElemType";
- this.lblElemType.Size = new System.Drawing.Size(29, 13);
- this.lblElemType.TabIndex = 6;
- this.lblElemType.Text = "Тип:";
- //
- // rbUShort
- //
- this.rbUShort.AutoSize = true;
- this.rbUShort.Location = new System.Drawing.Point(13, 110);
- this.rbUShort.Name = "rbUShort";
- this.rbUShort.Size = new System.Drawing.Size(101, 17);
- this.rbUShort.TabIndex = 7;
- this.rbUShort.TabStop = true;
- this.rbUShort.Text = "ushort (2 байта)";
- this.rbUShort.UseVisualStyleBackColor = true;
- this.rbUShort.CheckedChanged += new System.EventHandler(this.rbType_CheckedChanged);
- //
- // txtElemAddress
- //
- this.txtElemAddress.Location = new System.Drawing.Point(13, 71);
- this.txtElemAddress.Name = "txtElemAddress";
- this.txtElemAddress.ReadOnly = true;
- this.txtElemAddress.Size = new System.Drawing.Size(124, 20);
- this.txtElemAddress.TabIndex = 3;
- //
- // lblElemAddress
- //
- this.lblElemAddress.AutoSize = true;
- this.lblElemAddress.Location = new System.Drawing.Point(10, 55);
- this.lblElemAddress.Name = "lblElemAddress";
- this.lblElemAddress.Size = new System.Drawing.Size(38, 13);
- this.lblElemAddress.TabIndex = 2;
- this.lblElemAddress.Text = "Адрес";
- //
- // txtElemSignal
- //
- this.txtElemSignal.Location = new System.Drawing.Point(143, 71);
- this.txtElemSignal.Name = "txtElemSignal";
- this.txtElemSignal.ReadOnly = true;
- this.txtElemSignal.Size = new System.Drawing.Size(124, 20);
- this.txtElemSignal.TabIndex = 5;
- //
- // lblElemSignal
- //
- this.lblElemSignal.AutoSize = true;
- this.lblElemSignal.Location = new System.Drawing.Point(140, 55);
- this.lblElemSignal.Name = "lblElemSignal";
- this.lblElemSignal.Size = new System.Drawing.Size(61, 13);
- this.lblElemSignal.TabIndex = 4;
- this.lblElemSignal.Text = "Сигнал КП";
- //
- // txtElemName
- //
- this.txtElemName.Location = new System.Drawing.Point(13, 32);
- this.txtElemName.Name = "txtElemName";
- this.txtElemName.Size = new System.Drawing.Size(254, 20);
- this.txtElemName.TabIndex = 1;
- this.txtElemName.TextChanged += new System.EventHandler(this.txtElemName_TextChanged);
- //
- // lblElemName
- //
- this.lblElemName.AutoSize = true;
- this.lblElemName.Location = new System.Drawing.Point(10, 16);
- this.lblElemName.Name = "lblElemName";
- this.lblElemName.Size = new System.Drawing.Size(83, 13);
- this.lblElemName.TabIndex = 0;
- this.lblElemName.Text = "Наименование";
- //
- // gbCmd
- //
- this.gbCmd.Controls.Add(this.chkCmdMultiple);
- this.gbCmd.Controls.Add(this.lblCmdElemCnt);
- this.gbCmd.Controls.Add(this.numCmdElemCnt);
- this.gbCmd.Controls.Add(this.txtCmdName);
- this.gbCmd.Controls.Add(this.lblCmdName);
- this.gbCmd.Controls.Add(this.lblCmdNum);
- this.gbCmd.Controls.Add(this.numCmdNum);
- this.gbCmd.Controls.Add(this.numCmdAddress);
- this.gbCmd.Controls.Add(this.lblCmdAddress);
- this.gbCmd.Controls.Add(this.lblCmdTableType);
- this.gbCmd.Controls.Add(this.cbCmdTableType);
- this.gbCmd.Location = new System.Drawing.Point(298, 226);
- this.gbCmd.Name = "gbCmd";
- this.gbCmd.Padding = new System.Windows.Forms.Padding(10, 3, 10, 10);
- this.gbCmd.Size = new System.Drawing.Size(280, 206);
- this.gbCmd.TabIndex = 4;
- this.gbCmd.TabStop = false;
- this.gbCmd.Text = "Параметры команды";
- //
- // chkCmdMultiple
- //
- this.chkCmdMultiple.AutoSize = true;
- this.chkCmdMultiple.Location = new System.Drawing.Point(13, 98);
- this.chkCmdMultiple.Name = "chkCmdMultiple";
- this.chkCmdMultiple.Size = new System.Drawing.Size(155, 17);
- this.chkCmdMultiple.TabIndex = 4;
- this.chkCmdMultiple.Text = "Множественная команда";
- this.chkCmdMultiple.UseVisualStyleBackColor = true;
- this.chkCmdMultiple.CheckedChanged += new System.EventHandler(this.chkCmdMultiple_CheckedChanged);
- //
- // lblCmdElemCnt
- //
- this.lblCmdElemCnt.AutoSize = true;
- this.lblCmdElemCnt.Location = new System.Drawing.Point(140, 118);
- this.lblCmdElemCnt.Name = "lblCmdElemCnt";
- this.lblCmdElemCnt.Size = new System.Drawing.Size(124, 13);
- this.lblCmdElemCnt.TabIndex = 7;
- this.lblCmdElemCnt.Text = "Количество элементов";
- //
- // numCmdElemCnt
- //
- this.numCmdElemCnt.Location = new System.Drawing.Point(143, 134);
- this.numCmdElemCnt.Maximum = new decimal(new int[] {
- 2000,
- 0,
- 0,
- 0});
- this.numCmdElemCnt.Minimum = new decimal(new int[] {
- 1,
- 0,
- 0,
- 0});
- this.numCmdElemCnt.Name = "numCmdElemCnt";
- this.numCmdElemCnt.Size = new System.Drawing.Size(124, 20);
- this.numCmdElemCnt.TabIndex = 8;
- this.numCmdElemCnt.Value = new decimal(new int[] {
- 1,
- 0,
- 0,
- 0});
- this.numCmdElemCnt.ValueChanged += new System.EventHandler(this.numCmdElemCnt_ValueChanged);
- //
- // txtCmdName
- //
- this.txtCmdName.Location = new System.Drawing.Point(13, 32);
- this.txtCmdName.Name = "txtCmdName";
- this.txtCmdName.Size = new System.Drawing.Size(254, 20);
- this.txtCmdName.TabIndex = 1;
- this.txtCmdName.TextChanged += new System.EventHandler(this.txtCmdName_TextChanged);
- //
- // lblCmdName
- //
- this.lblCmdName.AutoSize = true;
- this.lblCmdName.Location = new System.Drawing.Point(10, 16);
- this.lblCmdName.Name = "lblCmdName";
- this.lblCmdName.Size = new System.Drawing.Size(83, 13);
- this.lblCmdName.TabIndex = 0;
- this.lblCmdName.Text = "Наименование";
- //
- // lblCmdNum
- //
- this.lblCmdNum.AutoSize = true;
- this.lblCmdNum.Location = new System.Drawing.Point(10, 157);
- this.lblCmdNum.Name = "lblCmdNum";
- this.lblCmdNum.Size = new System.Drawing.Size(108, 13);
- this.lblCmdNum.TabIndex = 9;
- this.lblCmdNum.Text = "Номер команды КП";
- //
- // numCmdNum
- //
- this.numCmdNum.Location = new System.Drawing.Point(13, 173);
- this.numCmdNum.Maximum = new decimal(new int[] {
- 65535,
- 0,
- 0,
- 0});
- this.numCmdNum.Minimum = new decimal(new int[] {
- 1,
- 0,
- 0,
- 0});
- this.numCmdNum.Name = "numCmdNum";
- this.numCmdNum.Size = new System.Drawing.Size(124, 20);
- this.numCmdNum.TabIndex = 10;
- this.numCmdNum.Value = new decimal(new int[] {
- 1,
- 0,
- 0,
- 0});
- this.numCmdNum.ValueChanged += new System.EventHandler(this.numCmdNum_ValueChanged);
- //
- // numCmdAddress
- //
- this.numCmdAddress.Location = new System.Drawing.Point(13, 134);
- this.numCmdAddress.Maximum = new decimal(new int[] {
- 65536,
- 0,
- 0,
- 0});
- this.numCmdAddress.Minimum = new decimal(new int[] {
- 1,
- 0,
- 0,
- 0});
- this.numCmdAddress.Name = "numCmdAddress";
- this.numCmdAddress.Size = new System.Drawing.Size(124, 20);
- this.numCmdAddress.TabIndex = 6;
- this.numCmdAddress.Value = new decimal(new int[] {
- 1,
- 0,
- 0,
- 0});
- this.numCmdAddress.ValueChanged += new System.EventHandler(this.numCmdAddress_ValueChanged);
- //
- // lblCmdAddress
- //
- this.lblCmdAddress.AutoSize = true;
- this.lblCmdAddress.Location = new System.Drawing.Point(10, 118);
- this.lblCmdAddress.Name = "lblCmdAddress";
- this.lblCmdAddress.Size = new System.Drawing.Size(90, 13);
- this.lblCmdAddress.TabIndex = 5;
- this.lblCmdAddress.Text = "Адрес элемента";
- //
- // lblCmdTableType
- //
- this.lblCmdTableType.AutoSize = true;
- this.lblCmdTableType.Location = new System.Drawing.Point(10, 55);
- this.lblCmdTableType.Name = "lblCmdTableType";
- this.lblCmdTableType.Size = new System.Drawing.Size(90, 13);
- this.lblCmdTableType.TabIndex = 2;
- this.lblCmdTableType.Text = "Таблица данных";
- //
- // cbCmdTableType
- //
- this.cbCmdTableType.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;
- this.cbCmdTableType.FormattingEnabled = true;
- this.cbCmdTableType.Items.AddRange(new object[] {
- "Coils (Флаги, 0X)",
- "Holding Registers (Регистры хранения, 4X)"});
- this.cbCmdTableType.Location = new System.Drawing.Point(13, 71);
- this.cbCmdTableType.Name = "cbCmdTableType";
- this.cbCmdTableType.Size = new System.Drawing.Size(254, 21);
- this.cbCmdTableType.TabIndex = 3;
- this.cbCmdTableType.SelectedIndexChanged += new System.EventHandler(this.cbCmdTableType_SelectedIndexChanged);
- //
- // openFileDialog
- //
- this.openFileDialog.DefaultExt = "*.xml";
- this.openFileDialog.Filter = "Файлы шаблонов (*.xml)|*.xml|Все файлы (*.*)|*.*";
- this.openFileDialog.FilterIndex = 0;
- this.openFileDialog.Title = "Открыть файл";
- //
- // saveFileDialog
- //
- this.saveFileDialog.DefaultExt = "*.xml";
- this.saveFileDialog.Filter = "Файлы шаблонов (*.xml)|*.xml|Все файлы (*.*)|*.*";
- this.saveFileDialog.FilterIndex = 0;
- this.saveFileDialog.Title = "Сохранить файл";
- //
- // FrmDevTemplate
- //
- this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
- this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
- this.ClientSize = new System.Drawing.Size(590, 444);
- this.Controls.Add(this.gbElemGroup);
- this.Controls.Add(this.gbElem);
- this.Controls.Add(this.gbCmd);
- this.Controls.Add(this.gbDevTemplate);
- this.Controls.Add(this.toolStrip);
- this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedDialog;
- this.MaximizeBox = false;
- this.MinimizeBox = false;
- this.Name = "FrmDevTemplate";
- this.ShowInTaskbar = false;
- this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent;
- this.Text = "MODBUS. Редактор шаблонов устройств";
- this.FormClosing += new System.Windows.Forms.FormClosingEventHandler(this.FrmDevTemplate_FormClosing);
- this.Load += new System.EventHandler(this.FrmDevTemplate_Load);
- this.toolStrip.ResumeLayout(false);
- this.toolStrip.PerformLayout();
- this.gbDevTemplate.ResumeLayout(false);
- this.gbElemGroup.ResumeLayout(false);
- this.gbElemGroup.PerformLayout();
- ((System.ComponentModel.ISupportInitialize)(this.numGrElemCnt)).EndInit();
- ((System.ComponentModel.ISupportInitialize)(this.numGrAddress)).EndInit();
- this.gbElem.ResumeLayout(false);
- this.gbElem.PerformLayout();
- this.gbCmd.ResumeLayout(false);
- this.gbCmd.PerformLayout();
- ((System.ComponentModel.ISupportInitialize)(this.numCmdElemCnt)).EndInit();
- ((System.ComponentModel.ISupportInitialize)(this.numCmdNum)).EndInit();
- ((System.ComponentModel.ISupportInitialize)(this.numCmdAddress)).EndInit();
- this.ResumeLayout(false);
- this.PerformLayout();
-
- }
-
- #endregion
-
- private System.Windows.Forms.TreeView treeView;
- private System.Windows.Forms.ToolStrip toolStrip;
- private System.Windows.Forms.ToolStripButton btnSave;
- private System.Windows.Forms.ToolStripButton btnOpen;
- private System.Windows.Forms.ToolStripButton btnNew;
- private System.Windows.Forms.ToolStripButton btnAddElemGroup;
- private System.Windows.Forms.ToolStripButton btnAddCmd;
- private System.Windows.Forms.ToolStripButton btnMoveUp;
- private System.Windows.Forms.ToolStripButton btnMoveDown;
- private System.Windows.Forms.ToolStripButton btnDelete;
- private System.Windows.Forms.ToolStripSeparator toolStripSeparator;
- private System.Windows.Forms.ImageList imageList;
- private System.Windows.Forms.GroupBox gbDevTemplate;
- private System.Windows.Forms.GroupBox gbElemGroup;
- private System.Windows.Forms.GroupBox gbElem;
- private System.Windows.Forms.GroupBox gbCmd;
- private System.Windows.Forms.Label lblGrTableType;
- private System.Windows.Forms.ComboBox cbGrTableType;
- private System.Windows.Forms.Label lblGrAddress;
- private System.Windows.Forms.NumericUpDown numGrAddress;
- private System.Windows.Forms.TextBox txtGrName;
- private System.Windows.Forms.Label lblGrName;
- private System.Windows.Forms.NumericUpDown numGrElemCnt;
- private System.Windows.Forms.Label lblGrElemCnt;
- private System.Windows.Forms.TextBox txtElemName;
- private System.Windows.Forms.Label lblElemName;
- private System.Windows.Forms.TextBox txtElemSignal;
- private System.Windows.Forms.Label lblElemSignal;
- private System.Windows.Forms.TextBox txtElemAddress;
- private System.Windows.Forms.Label lblElemAddress;
- private System.Windows.Forms.NumericUpDown numCmdAddress;
- private System.Windows.Forms.Label lblCmdAddress;
- private System.Windows.Forms.Label lblCmdTableType;
- private System.Windows.Forms.ComboBox cbCmdTableType;
- private System.Windows.Forms.Label lblCmdNum;
- private System.Windows.Forms.NumericUpDown numCmdNum;
- private System.Windows.Forms.TextBox txtCmdName;
- private System.Windows.Forms.Label lblCmdName;
- private System.Windows.Forms.OpenFileDialog openFileDialog;
- private System.Windows.Forms.SaveFileDialog saveFileDialog;
- private System.Windows.Forms.ToolStripButton btnSaveAs;
- private System.Windows.Forms.Label lblElemType;
- private System.Windows.Forms.RadioButton rbUShort;
- private System.Windows.Forms.RadioButton rbShort;
- private System.Windows.Forms.RadioButton rbInt;
- private System.Windows.Forms.RadioButton rbUInt;
- private System.Windows.Forms.RadioButton rbFloat;
- private System.Windows.Forms.RadioButton rbBool;
- private System.Windows.Forms.ToolStripButton btnAddElem;
- private System.Windows.Forms.Label lblCmdElemCnt;
- private System.Windows.Forms.NumericUpDown numCmdElemCnt;
- private System.Windows.Forms.CheckBox chkCmdMultiple;
- private System.Windows.Forms.RadioButton rbDouble;
- private System.Windows.Forms.RadioButton rbLong;
- private System.Windows.Forms.RadioButton rbULong;
- private System.Windows.Forms.Label lblByteOrder;
- private System.Windows.Forms.TextBox txtByteOrder;
- private System.Windows.Forms.Label lblByteOrderExample;
- private System.Windows.Forms.CheckBox chkGrActive;
- }
-}
\ No newline at end of file
diff --git a/ScadaComm/OpenKPs/KpModbus/KpModbus.csproj b/ScadaComm/OpenKPs/KpModbus/KpModbus.csproj
index a605276c8..55b59b71c 100644
--- a/ScadaComm/OpenKPs/KpModbus/KpModbus.csproj
+++ b/ScadaComm/OpenKPs/KpModbus/KpModbus.csproj
@@ -49,22 +49,59 @@
-
+
+
+
+
+
+
+
+
+
+
+
+
+ UserControl
+
+
+ CtrlCmd.cs
+
+
+ UserControl
+
+
+ CtrlElem.cs
+
+
+ UserControl
+
+
+ CtrlElemGroup.cs
+
+
+
Form
-
+
FrmDevProps.cs
-
+
Form
-
+
FrmDevTemplate.cs
-
+
-
+
+
+ Form
+
+
+ FrmTemplateSettings.cs
+
+
True
@@ -73,18 +110,34 @@
-
+
+ CtrlCmd.cs
+
+
+ CtrlElem.cs
+
+
+ CtrlElemGroup.cs
+
+
FrmDevProps.cs
-
+
FrmDevTemplate.cs
+
+ FrmTemplateSettings.cs
+
ResXFileCodeGenerator
Resources.Designer.cs
+
+ Designer
+ PreserveNewest
+
Designer
PreserveNewest
@@ -98,15 +151,23 @@
+
+
+
+
+
+
+
+
+
+
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ text/microsoft-resx
+
+
+ 2.0
+
+
+ System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
\ No newline at end of file
diff --git a/ScadaComm/OpenKPs/KpModbus/Modbus/UI/CtrlElem.Designer.cs b/ScadaComm/OpenKPs/KpModbus/Modbus/UI/CtrlElem.Designer.cs
new file mode 100644
index 000000000..4d88943a7
--- /dev/null
+++ b/ScadaComm/OpenKPs/KpModbus/Modbus/UI/CtrlElem.Designer.cs
@@ -0,0 +1,314 @@
+namespace Scada.Comm.Devices.Modbus.UI
+{
+ partial class CtrlElem
+ {
+ ///
+ /// Required designer variable.
+ ///
+ private System.ComponentModel.IContainer components = null;
+
+ ///
+ /// Clean up any resources being used.
+ ///
+ /// true if managed resources should be disposed; otherwise, false.
+ protected override void Dispose(bool disposing)
+ {
+ if (disposing && (components != null))
+ {
+ components.Dispose();
+ }
+ base.Dispose(disposing);
+ }
+
+ #region Component Designer generated code
+
+ ///
+ /// Required method for Designer support - do not modify
+ /// the contents of this method with the code editor.
+ ///
+ private void InitializeComponent()
+ {
+ this.gbElem = new System.Windows.Forms.GroupBox();
+ this.lblElemByteOrderExample = new System.Windows.Forms.Label();
+ this.txtElemByteOrder = new System.Windows.Forms.TextBox();
+ this.lblElemByteOrder = new System.Windows.Forms.Label();
+ this.rbDouble = new System.Windows.Forms.RadioButton();
+ this.rbLong = new System.Windows.Forms.RadioButton();
+ this.rbULong = new System.Windows.Forms.RadioButton();
+ this.rbBool = new System.Windows.Forms.RadioButton();
+ this.rbFloat = new System.Windows.Forms.RadioButton();
+ this.rbInt = new System.Windows.Forms.RadioButton();
+ this.rbUInt = new System.Windows.Forms.RadioButton();
+ this.rbShort = new System.Windows.Forms.RadioButton();
+ this.lblElemType = new System.Windows.Forms.Label();
+ this.rbUShort = new System.Windows.Forms.RadioButton();
+ this.txtElemAddress = new System.Windows.Forms.TextBox();
+ this.lblElemAddress = new System.Windows.Forms.Label();
+ this.txtElemSignal = new System.Windows.Forms.TextBox();
+ this.lblElemSignal = new System.Windows.Forms.Label();
+ this.txtElemName = new System.Windows.Forms.TextBox();
+ this.lblElemName = new System.Windows.Forms.Label();
+ this.gbElem.SuspendLayout();
+ this.SuspendLayout();
+ //
+ // gbElem
+ //
+ this.gbElem.Controls.Add(this.lblElemByteOrderExample);
+ this.gbElem.Controls.Add(this.txtElemByteOrder);
+ this.gbElem.Controls.Add(this.lblElemByteOrder);
+ this.gbElem.Controls.Add(this.rbDouble);
+ this.gbElem.Controls.Add(this.rbLong);
+ this.gbElem.Controls.Add(this.rbULong);
+ this.gbElem.Controls.Add(this.rbBool);
+ this.gbElem.Controls.Add(this.rbFloat);
+ this.gbElem.Controls.Add(this.rbInt);
+ this.gbElem.Controls.Add(this.rbUInt);
+ this.gbElem.Controls.Add(this.rbShort);
+ this.gbElem.Controls.Add(this.lblElemType);
+ this.gbElem.Controls.Add(this.rbUShort);
+ this.gbElem.Controls.Add(this.txtElemAddress);
+ this.gbElem.Controls.Add(this.lblElemAddress);
+ this.gbElem.Controls.Add(this.txtElemSignal);
+ this.gbElem.Controls.Add(this.lblElemSignal);
+ this.gbElem.Controls.Add(this.txtElemName);
+ this.gbElem.Controls.Add(this.lblElemName);
+ this.gbElem.Location = new System.Drawing.Point(0, 0);
+ this.gbElem.Name = "gbElem";
+ this.gbElem.Padding = new System.Windows.Forms.Padding(10, 3, 10, 10);
+ this.gbElem.Size = new System.Drawing.Size(280, 271);
+ this.gbElem.TabIndex = 0;
+ this.gbElem.TabStop = false;
+ this.gbElem.Text = "Element parameters";
+ //
+ // lblElemByteOrderExample
+ //
+ this.lblElemByteOrderExample.AutoSize = true;
+ this.lblElemByteOrderExample.ForeColor = System.Drawing.SystemColors.GrayText;
+ this.lblElemByteOrderExample.Location = new System.Drawing.Point(143, 242);
+ this.lblElemByteOrderExample.Name = "lblElemByteOrderExample";
+ this.lblElemByteOrderExample.Size = new System.Drawing.Size(118, 13);
+ this.lblElemByteOrderExample.TabIndex = 18;
+ this.lblElemByteOrderExample.Text = "For example, 01234567";
+ //
+ // txtElemByteOrder
+ //
+ this.txtElemByteOrder.Location = new System.Drawing.Point(13, 238);
+ this.txtElemByteOrder.Name = "txtElemByteOrder";
+ this.txtElemByteOrder.Size = new System.Drawing.Size(124, 20);
+ this.txtElemByteOrder.TabIndex = 17;
+ this.txtElemByteOrder.TextChanged += new System.EventHandler(this.txtByteOrder_TextChanged);
+ //
+ // lblElemByteOrder
+ //
+ this.lblElemByteOrder.AutoSize = true;
+ this.lblElemByteOrder.Location = new System.Drawing.Point(10, 222);
+ this.lblElemByteOrder.Name = "lblElemByteOrder";
+ this.lblElemByteOrder.Size = new System.Drawing.Size(55, 13);
+ this.lblElemByteOrder.TabIndex = 16;
+ this.lblElemByteOrder.Text = "Byte order";
+ //
+ // rbDouble
+ //
+ this.rbDouble.AutoSize = true;
+ this.rbDouble.Location = new System.Drawing.Point(143, 179);
+ this.rbDouble.Name = "rbDouble";
+ this.rbDouble.Size = new System.Drawing.Size(100, 17);
+ this.rbDouble.TabIndex = 14;
+ this.rbDouble.TabStop = true;
+ this.rbDouble.Text = "double (8 bytes)";
+ this.rbDouble.UseVisualStyleBackColor = true;
+ this.rbDouble.CheckedChanged += new System.EventHandler(this.rbType_CheckedChanged);
+ //
+ // rbLong
+ //
+ this.rbLong.AutoSize = true;
+ this.rbLong.Location = new System.Drawing.Point(143, 156);
+ this.rbLong.Name = "rbLong";
+ this.rbLong.Size = new System.Drawing.Size(88, 17);
+ this.rbLong.TabIndex = 12;
+ this.rbLong.TabStop = true;
+ this.rbLong.Text = "long (8 bytes)";
+ this.rbLong.UseVisualStyleBackColor = true;
+ this.rbLong.CheckedChanged += new System.EventHandler(this.rbType_CheckedChanged);
+ //
+ // rbULong
+ //
+ this.rbULong.AutoSize = true;
+ this.rbULong.Location = new System.Drawing.Point(13, 156);
+ this.rbULong.Name = "rbULong";
+ this.rbULong.Size = new System.Drawing.Size(94, 17);
+ this.rbULong.TabIndex = 11;
+ this.rbULong.TabStop = true;
+ this.rbULong.Text = "ulong (8 bytes)";
+ this.rbULong.UseVisualStyleBackColor = true;
+ this.rbULong.CheckedChanged += new System.EventHandler(this.rbType_CheckedChanged);
+ //
+ // rbBool
+ //
+ this.rbBool.AutoSize = true;
+ this.rbBool.Location = new System.Drawing.Point(13, 202);
+ this.rbBool.Name = "rbBool";
+ this.rbBool.Size = new System.Drawing.Size(74, 17);
+ this.rbBool.TabIndex = 15;
+ this.rbBool.TabStop = true;
+ this.rbBool.Text = "bool (1 bit)";
+ this.rbBool.UseVisualStyleBackColor = true;
+ this.rbBool.CheckedChanged += new System.EventHandler(this.rbType_CheckedChanged);
+ //
+ // rbFloat
+ //
+ this.rbFloat.AutoSize = true;
+ this.rbFloat.Location = new System.Drawing.Point(13, 179);
+ this.rbFloat.Name = "rbFloat";
+ this.rbFloat.Size = new System.Drawing.Size(88, 17);
+ this.rbFloat.TabIndex = 13;
+ this.rbFloat.TabStop = true;
+ this.rbFloat.Text = "float (4 bytes)";
+ this.rbFloat.UseVisualStyleBackColor = true;
+ this.rbFloat.CheckedChanged += new System.EventHandler(this.rbType_CheckedChanged);
+ //
+ // rbInt
+ //
+ this.rbInt.AutoSize = true;
+ this.rbInt.Location = new System.Drawing.Point(143, 133);
+ this.rbInt.Name = "rbInt";
+ this.rbInt.Size = new System.Drawing.Size(79, 17);
+ this.rbInt.TabIndex = 10;
+ this.rbInt.TabStop = true;
+ this.rbInt.Text = "int (4 bytes)";
+ this.rbInt.UseVisualStyleBackColor = true;
+ this.rbInt.CheckedChanged += new System.EventHandler(this.rbType_CheckedChanged);
+ //
+ // rbUInt
+ //
+ this.rbUInt.AutoSize = true;
+ this.rbUInt.Location = new System.Drawing.Point(13, 133);
+ this.rbUInt.Name = "rbUInt";
+ this.rbUInt.Size = new System.Drawing.Size(85, 17);
+ this.rbUInt.TabIndex = 9;
+ this.rbUInt.TabStop = true;
+ this.rbUInt.Text = "uint (4 bytes)";
+ this.rbUInt.UseVisualStyleBackColor = true;
+ this.rbUInt.CheckedChanged += new System.EventHandler(this.rbType_CheckedChanged);
+ //
+ // rbShort
+ //
+ this.rbShort.AutoSize = true;
+ this.rbShort.Location = new System.Drawing.Point(143, 110);
+ this.rbShort.Name = "rbShort";
+ this.rbShort.Size = new System.Drawing.Size(91, 17);
+ this.rbShort.TabIndex = 8;
+ this.rbShort.TabStop = true;
+ this.rbShort.Text = "short (2 bytes)";
+ this.rbShort.UseVisualStyleBackColor = true;
+ this.rbShort.CheckedChanged += new System.EventHandler(this.rbType_CheckedChanged);
+ //
+ // lblElemType
+ //
+ this.lblElemType.AutoSize = true;
+ this.lblElemType.Location = new System.Drawing.Point(10, 94);
+ this.lblElemType.Name = "lblElemType";
+ this.lblElemType.Size = new System.Drawing.Size(34, 13);
+ this.lblElemType.TabIndex = 6;
+ this.lblElemType.Text = "Type:";
+ //
+ // rbUShort
+ //
+ this.rbUShort.AutoSize = true;
+ this.rbUShort.Location = new System.Drawing.Point(13, 110);
+ this.rbUShort.Name = "rbUShort";
+ this.rbUShort.Size = new System.Drawing.Size(97, 17);
+ this.rbUShort.TabIndex = 7;
+ this.rbUShort.TabStop = true;
+ this.rbUShort.Text = "ushort (2 bytes)";
+ this.rbUShort.UseVisualStyleBackColor = true;
+ this.rbUShort.CheckedChanged += new System.EventHandler(this.rbType_CheckedChanged);
+ //
+ // txtElemAddress
+ //
+ this.txtElemAddress.Location = new System.Drawing.Point(13, 71);
+ this.txtElemAddress.Name = "txtElemAddress";
+ this.txtElemAddress.ReadOnly = true;
+ this.txtElemAddress.Size = new System.Drawing.Size(124, 20);
+ this.txtElemAddress.TabIndex = 3;
+ //
+ // lblElemAddress
+ //
+ this.lblElemAddress.AutoSize = true;
+ this.lblElemAddress.Location = new System.Drawing.Point(10, 55);
+ this.lblElemAddress.Name = "lblElemAddress";
+ this.lblElemAddress.Size = new System.Drawing.Size(45, 13);
+ this.lblElemAddress.TabIndex = 2;
+ this.lblElemAddress.Text = "Address";
+ //
+ // txtElemSignal
+ //
+ this.txtElemSignal.Location = new System.Drawing.Point(143, 71);
+ this.txtElemSignal.Name = "txtElemSignal";
+ this.txtElemSignal.ReadOnly = true;
+ this.txtElemSignal.Size = new System.Drawing.Size(124, 20);
+ this.txtElemSignal.TabIndex = 5;
+ //
+ // lblElemSignal
+ //
+ this.lblElemSignal.AutoSize = true;
+ this.lblElemSignal.Location = new System.Drawing.Point(140, 55);
+ this.lblElemSignal.Name = "lblElemSignal";
+ this.lblElemSignal.Size = new System.Drawing.Size(36, 13);
+ this.lblElemSignal.TabIndex = 4;
+ this.lblElemSignal.Text = "Signal";
+ //
+ // txtElemName
+ //
+ this.txtElemName.Location = new System.Drawing.Point(13, 32);
+ this.txtElemName.Name = "txtElemName";
+ this.txtElemName.Size = new System.Drawing.Size(254, 20);
+ this.txtElemName.TabIndex = 1;
+ this.txtElemName.TextChanged += new System.EventHandler(this.txtElemName_TextChanged);
+ //
+ // lblElemName
+ //
+ this.lblElemName.AutoSize = true;
+ this.lblElemName.Location = new System.Drawing.Point(10, 16);
+ this.lblElemName.Name = "lblElemName";
+ this.lblElemName.Size = new System.Drawing.Size(35, 13);
+ this.lblElemName.TabIndex = 0;
+ this.lblElemName.Text = "Name";
+ //
+ // CtrlElem
+ //
+ this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
+ this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+ this.Controls.Add(this.gbElem);
+ this.Name = "CtrlElem";
+ this.Size = new System.Drawing.Size(280, 271);
+ this.gbElem.ResumeLayout(false);
+ this.gbElem.PerformLayout();
+ this.ResumeLayout(false);
+
+ }
+
+ #endregion
+
+ private System.Windows.Forms.GroupBox gbElem;
+ private System.Windows.Forms.Label lblElemByteOrderExample;
+ private System.Windows.Forms.TextBox txtElemByteOrder;
+ private System.Windows.Forms.Label lblElemByteOrder;
+ private System.Windows.Forms.RadioButton rbDouble;
+ private System.Windows.Forms.RadioButton rbLong;
+ private System.Windows.Forms.RadioButton rbULong;
+ private System.Windows.Forms.RadioButton rbBool;
+ private System.Windows.Forms.RadioButton rbFloat;
+ private System.Windows.Forms.RadioButton rbInt;
+ private System.Windows.Forms.RadioButton rbUInt;
+ private System.Windows.Forms.RadioButton rbShort;
+ private System.Windows.Forms.Label lblElemType;
+ private System.Windows.Forms.RadioButton rbUShort;
+ private System.Windows.Forms.TextBox txtElemAddress;
+ private System.Windows.Forms.Label lblElemAddress;
+ private System.Windows.Forms.TextBox txtElemSignal;
+ private System.Windows.Forms.Label lblElemSignal;
+ private System.Windows.Forms.TextBox txtElemName;
+ private System.Windows.Forms.Label lblElemName;
+ }
+}
diff --git a/ScadaComm/OpenKPs/KpModbus/Modbus/UI/CtrlElem.cs b/ScadaComm/OpenKPs/KpModbus/Modbus/UI/CtrlElem.cs
new file mode 100644
index 000000000..52e32c9c7
--- /dev/null
+++ b/ScadaComm/OpenKPs/KpModbus/Modbus/UI/CtrlElem.cs
@@ -0,0 +1,219 @@
+/*
+ * Copyright 2017 Mikhail Shiryaev
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ *
+ * Product : Rapid SCADA
+ * Module : KpModbus
+ * Summary : The control for editing element
+ *
+ * Author : Mikhail Shiryaev
+ * Created : 2012
+ * Modified : 2017
+ */
+
+using Scada.Comm.Devices.Modbus.Protocol;
+using Scada.UI;
+using System;
+using System.ComponentModel;
+using System.Windows.Forms;
+
+namespace Scada.Comm.Devices.Modbus.UI
+{
+ ///
+ /// The control for editing element
+ /// Элемент управления для редактирования элемента Modbus
+ ///
+ public partial class CtrlElem : UserControl
+ {
+ private ElemInfo elemInfo;
+
+
+ ///
+ /// Конструктор
+ ///
+ public CtrlElem()
+ {
+ InitializeComponent();
+ elemInfo = null;
+ }
+
+
+ ///
+ /// Получить или установить редактируемый элемент
+ ///
+ public ElemInfo ElemInfo
+ {
+ get
+ {
+ return elemInfo;
+ }
+ set
+ {
+ elemInfo = null; // чтобы не вызывалось событие ObjectChanged
+ ShowElemProps(value);
+ elemInfo = value;
+ }
+ }
+
+
+ ///
+ /// Отобразить свойства элемента
+ ///
+ 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;
+ }
+ }
+
+ ///
+ /// Вызвать событие ObjectChanged
+ ///
+ private void OnObjectChanged(object changeArgument)
+ {
+ ObjectChanged?.Invoke(this, new ObjectChangedEventArgs(elemInfo, changeArgument));
+ }
+
+ ///
+ /// Установить фокус ввода
+ ///
+ public void SetFocus()
+ {
+ txtElemName.Select();
+ }
+
+
+ ///
+ /// Событие возникающее при изменении свойств редактируемого объекта
+ ///
+ [Category("Property Changed")]
+ public event ObjectChangedEventHandler ObjectChanged;
+
+
+ private void txtElemName_TextChanged(object sender, EventArgs e)
+ {
+ // изменение наименования элемента
+ if (elemInfo != null)
+ {
+ elemInfo.Elem.Name = txtElemName.Text;
+ OnObjectChanged(TreeUpdateTypes.CurrentNode);
+ }
+ }
+
+ private void rbType_CheckedChanged(object sender, EventArgs e)
+ {
+ // изменение типа элемента
+ if (elemInfo != null && ((RadioButton)sender).Checked)
+ {
+ Elem elem = elemInfo.Elem;
+
+ if (rbUShort.Checked)
+ elem.ElemType = ElemTypes.UShort;
+ else if (rbShort.Checked)
+ elem.ElemType = ElemTypes.Short;
+ else if (rbUInt.Checked)
+ elem.ElemType = ElemTypes.UInt;
+ else if (rbInt.Checked)
+ elem.ElemType = ElemTypes.Int;
+ else if (rbULong.Checked)
+ elem.ElemType = ElemTypes.ULong;
+ else if (rbLong.Checked)
+ elem.ElemType = ElemTypes.Long;
+ else if (rbFloat.Checked)
+ elem.ElemType = ElemTypes.Float;
+ else if (rbDouble.Checked)
+ elem.ElemType = ElemTypes.Double;
+ else
+ elem.ElemType = ElemTypes.Bool;
+
+ txtElemAddress.Text = elemInfo.AddressRange;
+ OnObjectChanged(TreeUpdateTypes.CurrentNode | TreeUpdateTypes.NextSiblings);
+ }
+ }
+
+ private void txtByteOrder_TextChanged(object sender, EventArgs e)
+ {
+ // изменение порядка байт элемента
+ if (elemInfo != null)
+ {
+ elemInfo.Elem.ByteOrderStr = txtElemByteOrder.Text;
+ OnObjectChanged(TreeUpdateTypes.None);
+ }
+ }
+ }
+}
diff --git a/ScadaComm/OpenKPs/KpModbus/Modbus/UI/CtrlElem.resx b/ScadaComm/OpenKPs/KpModbus/Modbus/UI/CtrlElem.resx
new file mode 100644
index 000000000..1af7de150
--- /dev/null
+++ b/ScadaComm/OpenKPs/KpModbus/Modbus/UI/CtrlElem.resx
@@ -0,0 +1,120 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ text/microsoft-resx
+
+
+ 2.0
+
+
+ System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
\ No newline at end of file
diff --git a/ScadaComm/OpenKPs/KpModbus/Modbus/UI/CtrlElemGroup.Designer.cs b/ScadaComm/OpenKPs/KpModbus/Modbus/UI/CtrlElemGroup.Designer.cs
new file mode 100644
index 000000000..2b493e884
--- /dev/null
+++ b/ScadaComm/OpenKPs/KpModbus/Modbus/UI/CtrlElemGroup.Designer.cs
@@ -0,0 +1,244 @@
+namespace Scada.Comm.Devices.Modbus.UI
+{
+ partial class CtrlElemGroup
+ {
+ ///
+ /// Required designer variable.
+ ///
+ private System.ComponentModel.IContainer components = null;
+
+ ///
+ /// Clean up any resources being used.
+ ///
+ /// true if managed resources should be disposed; otherwise, false.
+ protected override void Dispose(bool disposing)
+ {
+ if (disposing && (components != null))
+ {
+ components.Dispose();
+ }
+ base.Dispose(disposing);
+ }
+
+ #region Component Designer generated code
+
+ ///
+ /// Required method for Designer support - do not modify
+ /// the contents of this method with the code editor.
+ ///
+ private void InitializeComponent()
+ {
+ this.gbElemGroup = new System.Windows.Forms.GroupBox();
+ this.lblGrAddressHint = new System.Windows.Forms.Label();
+ this.txtGrFuncCode = new System.Windows.Forms.TextBox();
+ this.lblGrFuncCode = new System.Windows.Forms.Label();
+ this.chkGrActive = new System.Windows.Forms.CheckBox();
+ this.lblGrElemCnt = new System.Windows.Forms.Label();
+ this.numGrElemCnt = new System.Windows.Forms.NumericUpDown();
+ this.txtGrName = new System.Windows.Forms.TextBox();
+ this.lblGrName = new System.Windows.Forms.Label();
+ this.numGrAddress = new System.Windows.Forms.NumericUpDown();
+ this.lblGrAddress = new System.Windows.Forms.Label();
+ this.lblGrTableType = new System.Windows.Forms.Label();
+ this.cbGrTableType = new System.Windows.Forms.ComboBox();
+ this.gbElemGroup.SuspendLayout();
+ ((System.ComponentModel.ISupportInitialize)(this.numGrElemCnt)).BeginInit();
+ ((System.ComponentModel.ISupportInitialize)(this.numGrAddress)).BeginInit();
+ this.SuspendLayout();
+ //
+ // gbElemGroup
+ //
+ this.gbElemGroup.Controls.Add(this.lblGrAddressHint);
+ this.gbElemGroup.Controls.Add(this.txtGrFuncCode);
+ this.gbElemGroup.Controls.Add(this.lblGrFuncCode);
+ this.gbElemGroup.Controls.Add(this.chkGrActive);
+ this.gbElemGroup.Controls.Add(this.lblGrElemCnt);
+ this.gbElemGroup.Controls.Add(this.numGrElemCnt);
+ this.gbElemGroup.Controls.Add(this.txtGrName);
+ this.gbElemGroup.Controls.Add(this.lblGrName);
+ this.gbElemGroup.Controls.Add(this.numGrAddress);
+ this.gbElemGroup.Controls.Add(this.lblGrAddress);
+ this.gbElemGroup.Controls.Add(this.lblGrTableType);
+ this.gbElemGroup.Controls.Add(this.cbGrTableType);
+ this.gbElemGroup.Location = new System.Drawing.Point(0, 0);
+ this.gbElemGroup.Name = "gbElemGroup";
+ this.gbElemGroup.Padding = new System.Windows.Forms.Padding(10, 3, 10, 10);
+ this.gbElemGroup.Size = new System.Drawing.Size(280, 245);
+ this.gbElemGroup.TabIndex = 0;
+ this.gbElemGroup.TabStop = false;
+ this.gbElemGroup.Text = "Element group parameters";
+ //
+ // lblGrAddressHint
+ //
+ this.lblGrAddressHint.AutoSize = true;
+ this.lblGrAddressHint.Location = new System.Drawing.Point(140, 177);
+ this.lblGrAddressHint.Name = "lblGrAddressHint";
+ this.lblGrAddressHint.Size = new System.Drawing.Size(29, 13);
+ this.lblGrAddressHint.TabIndex = 9;
+ this.lblGrAddressHint.Text = "DEC";
+ //
+ // txtGrFuncCode
+ //
+ this.txtGrFuncCode.Location = new System.Drawing.Point(13, 134);
+ this.txtGrFuncCode.Name = "txtGrFuncCode";
+ this.txtGrFuncCode.ReadOnly = true;
+ this.txtGrFuncCode.Size = new System.Drawing.Size(124, 20);
+ this.txtGrFuncCode.TabIndex = 6;
+ //
+ // lblGrFuncCode
+ //
+ this.lblGrFuncCode.AutoSize = true;
+ this.lblGrFuncCode.Location = new System.Drawing.Point(10, 118);
+ this.lblGrFuncCode.Name = "lblGrFuncCode";
+ this.lblGrFuncCode.Size = new System.Drawing.Size(75, 13);
+ this.lblGrFuncCode.TabIndex = 5;
+ this.lblGrFuncCode.Text = "Function code";
+ //
+ // chkGrActive
+ //
+ this.chkGrActive.AutoSize = true;
+ this.chkGrActive.Location = new System.Drawing.Point(13, 19);
+ this.chkGrActive.Name = "chkGrActive";
+ this.chkGrActive.Size = new System.Drawing.Size(56, 17);
+ this.chkGrActive.TabIndex = 0;
+ this.chkGrActive.Text = "Active";
+ this.chkGrActive.UseVisualStyleBackColor = true;
+ this.chkGrActive.CheckedChanged += new System.EventHandler(this.chkGrActive_CheckedChanged);
+ //
+ // lblGrElemCnt
+ //
+ this.lblGrElemCnt.AutoSize = true;
+ this.lblGrElemCnt.Location = new System.Drawing.Point(10, 196);
+ this.lblGrElemCnt.Name = "lblGrElemCnt";
+ this.lblGrElemCnt.Size = new System.Drawing.Size(75, 13);
+ this.lblGrElemCnt.TabIndex = 10;
+ this.lblGrElemCnt.Text = "Element count";
+ //
+ // numGrElemCnt
+ //
+ this.numGrElemCnt.Location = new System.Drawing.Point(13, 212);
+ this.numGrElemCnt.Maximum = new decimal(new int[] {
+ 2000,
+ 0,
+ 0,
+ 0});
+ this.numGrElemCnt.Minimum = new decimal(new int[] {
+ 1,
+ 0,
+ 0,
+ 0});
+ this.numGrElemCnt.Name = "numGrElemCnt";
+ this.numGrElemCnt.Size = new System.Drawing.Size(124, 20);
+ this.numGrElemCnt.TabIndex = 11;
+ this.numGrElemCnt.Value = new decimal(new int[] {
+ 1,
+ 0,
+ 0,
+ 0});
+ this.numGrElemCnt.ValueChanged += new System.EventHandler(this.numGrElemCnt_ValueChanged);
+ //
+ // txtGrName
+ //
+ this.txtGrName.Location = new System.Drawing.Point(13, 55);
+ this.txtGrName.Name = "txtGrName";
+ this.txtGrName.Size = new System.Drawing.Size(254, 20);
+ this.txtGrName.TabIndex = 2;
+ this.txtGrName.TextChanged += new System.EventHandler(this.txtGrName_TextChanged);
+ //
+ // lblGrName
+ //
+ this.lblGrName.AutoSize = true;
+ this.lblGrName.Location = new System.Drawing.Point(10, 39);
+ this.lblGrName.Name = "lblGrName";
+ this.lblGrName.Size = new System.Drawing.Size(35, 13);
+ this.lblGrName.TabIndex = 1;
+ this.lblGrName.Text = "Name";
+ //
+ // numGrAddress
+ //
+ this.numGrAddress.Location = new System.Drawing.Point(13, 173);
+ this.numGrAddress.Maximum = new decimal(new int[] {
+ 65536,
+ 0,
+ 0,
+ 0});
+ this.numGrAddress.Minimum = new decimal(new int[] {
+ 1,
+ 0,
+ 0,
+ 0});
+ this.numGrAddress.Name = "numGrAddress";
+ this.numGrAddress.Size = new System.Drawing.Size(124, 20);
+ this.numGrAddress.TabIndex = 8;
+ this.numGrAddress.Value = new decimal(new int[] {
+ 1,
+ 0,
+ 0,
+ 0});
+ this.numGrAddress.ValueChanged += new System.EventHandler(this.numGrAddress_ValueChanged);
+ //
+ // lblGrAddress
+ //
+ this.lblGrAddress.AutoSize = true;
+ this.lblGrAddress.Location = new System.Drawing.Point(10, 157);
+ this.lblGrAddress.Name = "lblGrAddress";
+ this.lblGrAddress.Size = new System.Drawing.Size(109, 13);
+ this.lblGrAddress.TabIndex = 7;
+ this.lblGrAddress.Text = "Start element address";
+ //
+ // lblGrTableType
+ //
+ this.lblGrTableType.AutoSize = true;
+ this.lblGrTableType.Location = new System.Drawing.Point(10, 78);
+ this.lblGrTableType.Name = "lblGrTableType";
+ this.lblGrTableType.Size = new System.Drawing.Size(56, 13);
+ this.lblGrTableType.TabIndex = 3;
+ this.lblGrTableType.Text = "Data table";
+ //
+ // cbGrTableType
+ //
+ this.cbGrTableType.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;
+ this.cbGrTableType.FormattingEnabled = true;
+ this.cbGrTableType.Items.AddRange(new object[] {
+ "Discretes Inputs (1X)",
+ "Coils (0X)",
+ "Input Registers (3X)",
+ "Holding Registers (4X)"});
+ this.cbGrTableType.Location = new System.Drawing.Point(13, 94);
+ this.cbGrTableType.Name = "cbGrTableType";
+ this.cbGrTableType.Size = new System.Drawing.Size(254, 21);
+ this.cbGrTableType.TabIndex = 4;
+ this.cbGrTableType.SelectedIndexChanged += new System.EventHandler(this.cbGrTableType_SelectedIndexChanged);
+ //
+ // CtrlElemGroup
+ //
+ this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
+ this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+ this.Controls.Add(this.gbElemGroup);
+ this.Name = "CtrlElemGroup";
+ this.Size = new System.Drawing.Size(280, 245);
+ this.gbElemGroup.ResumeLayout(false);
+ this.gbElemGroup.PerformLayout();
+ ((System.ComponentModel.ISupportInitialize)(this.numGrElemCnt)).EndInit();
+ ((System.ComponentModel.ISupportInitialize)(this.numGrAddress)).EndInit();
+ this.ResumeLayout(false);
+
+ }
+
+ #endregion
+
+ private System.Windows.Forms.GroupBox gbElemGroup;
+ private System.Windows.Forms.CheckBox chkGrActive;
+ private System.Windows.Forms.Label lblGrElemCnt;
+ private System.Windows.Forms.NumericUpDown numGrElemCnt;
+ private System.Windows.Forms.TextBox txtGrName;
+ private System.Windows.Forms.Label lblGrName;
+ private System.Windows.Forms.NumericUpDown numGrAddress;
+ private System.Windows.Forms.Label lblGrAddress;
+ private System.Windows.Forms.Label lblGrTableType;
+ private System.Windows.Forms.ComboBox cbGrTableType;
+ private System.Windows.Forms.Label lblGrFuncCode;
+ private System.Windows.Forms.TextBox txtGrFuncCode;
+ private System.Windows.Forms.Label lblGrAddressHint;
+ }
+}
diff --git a/ScadaComm/OpenKPs/KpModbus/Modbus/UI/CtrlElemGroup.cs b/ScadaComm/OpenKPs/KpModbus/Modbus/UI/CtrlElemGroup.cs
new file mode 100644
index 000000000..8b733e66d
--- /dev/null
+++ b/ScadaComm/OpenKPs/KpModbus/Modbus/UI/CtrlElemGroup.cs
@@ -0,0 +1,292 @@
+/*
+ * Copyright 2017 Mikhail Shiryaev
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ *
+ * Product : Rapid SCADA
+ * Module : KpModbus
+ * Summary : The control for editing element group
+ *
+ * Author : Mikhail Shiryaev
+ * Created : 2012
+ * Modified : 2017
+ */
+
+using Scada.Comm.Devices.Modbus.Protocol;
+using Scada.UI;
+using System;
+using System.ComponentModel;
+using System.Windows.Forms;
+
+namespace Scada.Comm.Devices.Modbus.UI
+{
+ ///
+ /// The control for editing element group
+ /// Элемент управления для редактирования группы элементов
+ ///
+ public partial class CtrlElemGroup : UserControl
+ {
+ private ElemGroup elemGroup;
+
+
+ ///
+ /// Конструктор
+ ///
+ public CtrlElemGroup()
+ {
+ InitializeComponent();
+ elemGroup = null;
+ Settings = null;
+ }
+
+
+ ///
+ /// Получить признак отображения адресов, начиная с 0
+ ///
+ private bool ZeroAddr
+ {
+ get
+ {
+ return Settings == null ? false : Settings.ZeroAddr;
+ }
+ }
+
+ ///
+ /// Получить смещение адреса
+ ///
+ private int AddrShift
+ {
+ get
+ {
+ return ZeroAddr ? 0 : 1;
+ }
+ }
+
+ ///
+ /// Получить признак отображения адресов в 10-тичной системе
+ ///
+ private bool DecAddr
+ {
+ get
+ {
+ return Settings == null ? false : Settings.DecAddr;
+ }
+ }
+
+ ///
+ /// Получить обозначение системы счисления адресов
+ ///
+ private string AddrNotation
+ {
+ get
+ {
+ return DecAddr ? "DEC" : "HEX";
+ }
+ }
+
+ ///
+ /// Получить или установить ссылку настройки шаблона
+ ///
+ public DeviceTemplate.Settings Settings { get; set; }
+
+ ///
+ /// Получить или установить редактируемую группу элементов
+ ///
+ public ElemGroup ElemGroup
+ {
+ get
+ {
+ return elemGroup;
+ }
+ set
+ {
+ elemGroup = null; // чтобы не вызывалось событие ObjectChanged
+ ShowElemGroupProps(value);
+ elemGroup = value;
+ }
+ }
+
+
+ ///
+ /// Отобразить свойства группы элементов
+ ///
+ private void ShowElemGroupProps(ElemGroup elemGroup)
+ {
+ numGrAddress.Value = 1;
+ numGrAddress.Minimum = AddrShift;
+ numGrAddress.Maximum = ushort.MaxValue + AddrShift;
+ numGrAddress.Hexadecimal = !DecAddr;
+ ShowFuncCode(elemGroup);
+
+ if (elemGroup == null)
+ {
+ chkGrActive.Checked = false;
+ txtGrName.Text = "";
+ cbGrTableType.SelectedIndex = 0;
+ numGrAddress.Value = AddrShift;
+ lblGrAddressHint.Text = "";
+ numGrElemCnt.Value = 1;
+ gbElemGroup.Enabled = false;
+ }
+ else
+ {
+ chkGrActive.Checked = elemGroup.Active;
+ txtGrName.Text = elemGroup.Name;
+ cbGrTableType.SelectedIndex = (int)elemGroup.TableType;
+ numGrAddress.Value = elemGroup.Address + AddrShift;
+ lblGrAddressHint.Text = string.Format(KpPhrases.AddressHint, AddrNotation, AddrShift);
+ numGrElemCnt.Value = 1;
+ numGrElemCnt.Maximum = DataUnit.GetMaxElemCnt(elemGroup.TableType);
+ numGrElemCnt.Value = elemGroup.Elems.Count;
+ gbElemGroup.Enabled = true;
+ }
+ }
+
+ ///
+ /// Отобразить код функции группы элементов
+ ///
+ private void ShowFuncCode(ElemGroup elemGroup)
+ {
+ txtGrFuncCode.Text = elemGroup == null ? "" :
+ string.Format("{0} ({1}H)", elemGroup.FuncCode, elemGroup.FuncCode.ToString("X2"));
+ }
+
+ ///
+ /// Вызвать событие ObjectChanged
+ ///
+ private void OnObjectChanged(object changeArgument)
+ {
+ ObjectChanged?.Invoke(this, new ObjectChangedEventArgs(elemGroup, changeArgument));
+ }
+
+ ///
+ /// Установить фокус ввода
+ ///
+ public void SetFocus()
+ {
+ txtGrName.Select();
+ }
+
+
+ ///
+ /// Событие возникающее при изменении свойств редактируемого объекта
+ ///
+ [Category("Property Changed")]
+ public event ObjectChangedEventHandler ObjectChanged;
+
+
+ private void chkGrActive_CheckedChanged(object sender, EventArgs e)
+ {
+ // изменение активности группы элементов
+ if (elemGroup != null)
+ {
+ elemGroup.Active = chkGrActive.Checked;
+ OnObjectChanged(TreeUpdateTypes.CurrentNode);
+ }
+ }
+
+ private void txtGrName_TextChanged(object sender, EventArgs e)
+ {
+ // изменение наименования группы элементов
+ if (elemGroup != null)
+ {
+ elemGroup.Name = txtGrName.Text;
+ OnObjectChanged(TreeUpdateTypes.CurrentNode);
+ }
+ }
+
+ 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);
+ }
+ }
+ }
+
+ private void numGrAddress_ValueChanged(object sender, EventArgs e)
+ {
+ // изменение адреса начального элемента в группе
+ if (elemGroup != null)
+ {
+ elemGroup.Address = (ushort)(numGrAddress.Value - AddrShift);
+ OnObjectChanged(TreeUpdateTypes.ChildNodes);
+ }
+ }
+
+ 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);
+ }
+ }
+ }
+}
diff --git a/ScadaComm/OpenKPs/KpModbus/Modbus/UI/CtrlElemGroup.resx b/ScadaComm/OpenKPs/KpModbus/Modbus/UI/CtrlElemGroup.resx
new file mode 100644
index 000000000..1af7de150
--- /dev/null
+++ b/ScadaComm/OpenKPs/KpModbus/Modbus/UI/CtrlElemGroup.resx
@@ -0,0 +1,120 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ text/microsoft-resx
+
+
+ 2.0
+
+
+ System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
\ No newline at end of file
diff --git a/ScadaComm/OpenKPs/KpModbus/Modbus/UI/ElemInfo.cs b/ScadaComm/OpenKPs/KpModbus/Modbus/UI/ElemInfo.cs
new file mode 100644
index 000000000..bc91dd80b
--- /dev/null
+++ b/ScadaComm/OpenKPs/KpModbus/Modbus/UI/ElemInfo.cs
@@ -0,0 +1,84 @@
+/*
+ * Copyright 2017 Mikhail Shiryaev
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ *
+ * Product : Rapid SCADA
+ * Module : KpModbus
+ * Summary : Information about Modbus element
+ *
+ * Author : Mikhail Shiryaev
+ * Created : 2012
+ * Modified : 2017
+ */
+
+using Scada.Comm.Devices.Modbus.Protocol;
+
+namespace Scada.Comm.Devices.Modbus.UI
+{
+ ///
+ /// Information about Modbus element
+ /// Информация об элементе Modbus
+ ///
+ public class ElemInfo
+ {
+ ///
+ /// Получить или установить элемент
+ ///
+ public Elem Elem { get; set; }
+
+ ///
+ /// Получить или установить группу элементов, в которую входит элемент
+ ///
+ public ElemGroup ElemGroup { get; set; }
+
+ ///
+ /// Получить или установить ссылку настройки шаблона
+ ///
+ public DeviceTemplate.Settings Settings { get; set; }
+
+ ///
+ /// Получить или установить адрес, начинающийся от 0
+ ///
+ public ushort Address { get; set; }
+
+ ///
+ /// Получить или установить сигнал КП
+ ///
+ public int Signal { get; set; }
+
+ ///
+ /// Получить строковую запись диапазона адресов элемента
+ ///
+ public string AddressRange
+ {
+ get
+ {
+ return ModbusUtils.GetAddressRange(Address, Elem.Length, Settings.ZeroAddr, Settings.DecAddr);
+ }
+ }
+
+ ///
+ /// Получить обозначение элемента в дереве
+ ///
+ public string Caption
+ {
+ get
+ {
+ return (string.IsNullOrEmpty(Elem.Name) ? KpPhrases.DefElemName : Elem.Name) +
+ " (" + AddressRange + ")";
+ }
+ }
+ }
+}
diff --git a/ScadaComm/OpenKPs/KpModbus/FrmDevProps.Designer.cs b/ScadaComm/OpenKPs/KpModbus/Modbus/UI/FrmDevProps.Designer.cs
similarity index 93%
rename from ScadaComm/OpenKPs/KpModbus/FrmDevProps.Designer.cs
rename to ScadaComm/OpenKPs/KpModbus/Modbus/UI/FrmDevProps.Designer.cs
index 31a750296..ccbc33915 100644
--- a/ScadaComm/OpenKPs/KpModbus/FrmDevProps.Designer.cs
+++ b/ScadaComm/OpenKPs/KpModbus/Modbus/UI/FrmDevProps.Designer.cs
@@ -1,4 +1,4 @@
-namespace Scada.Comm.Devices.KpModbus
+namespace Scada.Comm.Devices.Modbus.UI
{
partial class FrmDevProps
{
@@ -60,7 +60,7 @@ private void InitializeComponent()
this.gbDevice.Size = new System.Drawing.Size(259, 65);
this.gbDevice.TabIndex = 1;
this.gbDevice.TabStop = false;
- this.gbDevice.Text = "КП";
+ this.gbDevice.Text = "Device";
//
// btnBrowseDevTemplate
//
@@ -70,7 +70,7 @@ private void InitializeComponent()
this.btnBrowseDevTemplate.Name = "btnBrowseDevTemplate";
this.btnBrowseDevTemplate.Size = new System.Drawing.Size(20, 20);
this.btnBrowseDevTemplate.TabIndex = 2;
- this.toolTip.SetToolTip(this.btnBrowseDevTemplate, "Выбрать шаблон");
+ this.toolTip.SetToolTip(this.btnBrowseDevTemplate, "Browse for template");
this.btnBrowseDevTemplate.UseVisualStyleBackColor = true;
this.btnBrowseDevTemplate.Click += new System.EventHandler(this.btnBrowseDevTemplate_Click);
//
@@ -82,7 +82,7 @@ private void InitializeComponent()
this.btnCreateDevTemplate.Name = "btnCreateDevTemplate";
this.btnCreateDevTemplate.Size = new System.Drawing.Size(20, 20);
this.btnCreateDevTemplate.TabIndex = 3;
- this.toolTip.SetToolTip(this.btnCreateDevTemplate, "Создать новый шаблон");
+ this.toolTip.SetToolTip(this.btnCreateDevTemplate, "Create new template");
this.btnCreateDevTemplate.UseVisualStyleBackColor = true;
this.btnCreateDevTemplate.Click += new System.EventHandler(this.btnCreateDevTemplate_Click);
//
@@ -94,7 +94,7 @@ private void InitializeComponent()
this.btnEditDevTemplate.Name = "btnEditDevTemplate";
this.btnEditDevTemplate.Size = new System.Drawing.Size(20, 20);
this.btnEditDevTemplate.TabIndex = 4;
- this.toolTip.SetToolTip(this.btnEditDevTemplate, "Редактировать шаблон");
+ this.toolTip.SetToolTip(this.btnEditDevTemplate, "Edit template");
this.btnEditDevTemplate.UseVisualStyleBackColor = true;
this.btnEditDevTemplate.Click += new System.EventHandler(this.btnEditDevTemplate_Click);
//
@@ -111,9 +111,9 @@ private void InitializeComponent()
this.lblDevTemplate.AutoSize = true;
this.lblDevTemplate.Location = new System.Drawing.Point(10, 16);
this.lblDevTemplate.Name = "lblDevTemplate";
- this.lblDevTemplate.Size = new System.Drawing.Size(106, 13);
+ this.lblDevTemplate.Size = new System.Drawing.Size(84, 13);
this.lblDevTemplate.TabIndex = 0;
- this.lblDevTemplate.Text = "Шаблон устройства";
+ this.lblDevTemplate.Text = "Device template";
//
// gbCommLine
//
@@ -125,7 +125,7 @@ private void InitializeComponent()
this.gbCommLine.Size = new System.Drawing.Size(259, 66);
this.gbCommLine.TabIndex = 0;
this.gbCommLine.TabStop = false;
- this.gbCommLine.Text = "Линия связи";
+ this.gbCommLine.Text = "Communication line";
//
// cbTransMode
//
@@ -146,9 +146,9 @@ private void InitializeComponent()
this.lblTransMode.AutoSize = true;
this.lblTransMode.Location = new System.Drawing.Point(10, 16);
this.lblTransMode.Name = "lblTransMode";
- this.lblTransMode.Size = new System.Drawing.Size(56, 13);
+ this.lblTransMode.Size = new System.Drawing.Size(46, 13);
this.lblTransMode.TabIndex = 0;
- this.lblTransMode.Text = "Протокол";
+ this.lblTransMode.Text = "Protocol";
//
// btnOK
//
@@ -167,7 +167,7 @@ private void InitializeComponent()
this.btnCancel.Name = "btnCancel";
this.btnCancel.Size = new System.Drawing.Size(75, 23);
this.btnCancel.TabIndex = 3;
- this.btnCancel.Text = "Отмена";
+ this.btnCancel.Text = "Cancel";
this.btnCancel.UseVisualStyleBackColor = true;
this.btnCancel.Click += new System.EventHandler(this.btnCancel_Click);
//
@@ -195,7 +195,7 @@ private void InitializeComponent()
this.Name = "FrmDevProps";
this.ShowInTaskbar = false;
this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent;
- this.Text = "Свойства КП {0}";
+ this.Text = "Device {0} Properties";
this.Load += new System.EventHandler(this.FrmDevProps_Load);
this.gbDevice.ResumeLayout(false);
this.gbDevice.PerformLayout();
diff --git a/ScadaComm/OpenKPs/KpModbus/FrmDevProps.cs b/ScadaComm/OpenKPs/KpModbus/Modbus/UI/FrmDevProps.cs
similarity index 96%
rename from ScadaComm/OpenKPs/KpModbus/FrmDevProps.cs
rename to ScadaComm/OpenKPs/KpModbus/Modbus/UI/FrmDevProps.cs
index 6269ec964..45f035487 100644
--- a/ScadaComm/OpenKPs/KpModbus/FrmDevProps.cs
+++ b/ScadaComm/OpenKPs/KpModbus/Modbus/UI/FrmDevProps.cs
@@ -1,5 +1,5 @@
/*
- * Copyright 2015 Mikhail Shiryaev
+ * Copyright 2017 Mikhail Shiryaev
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -20,7 +20,7 @@
*
* Author : Mikhail Shiryaev
* Created : 2015
- * Modified : 2015
+ * Modified : 2017
*/
using Scada.UI;
@@ -29,7 +29,7 @@
using System.IO;
using System.Windows.Forms;
-namespace Scada.Comm.Devices.KpModbus
+namespace Scada.Comm.Devices.Modbus.UI
{
///
/// Device and communication line properties form
@@ -83,7 +83,7 @@ public static void ShowDialog(int kpNum, KPView.KPProperties kpProps, AppDirs ap
private void FrmDevProps_Load(object sender, EventArgs e)
{
// перевод формы
- Translator.TranslateForm(this, "Scada.Comm.Devices.KpModbus.FrmDevProps", toolTip);
+ Translator.TranslateForm(this, "Scada.Comm.Devices.Modbus.UI.FrmDevProps", toolTip);
// вывод заголовка
Text = string.Format(Text, kpNum);
diff --git a/ScadaComm/OpenKPs/KpModbus/FrmDevProps.resx b/ScadaComm/OpenKPs/KpModbus/Modbus/UI/FrmDevProps.resx
similarity index 64%
rename from ScadaComm/OpenKPs/KpModbus/FrmDevProps.resx
rename to ScadaComm/OpenKPs/KpModbus/Modbus/UI/FrmDevProps.resx
index c4ddb5f80..19dc0a253 100644
--- a/ScadaComm/OpenKPs/KpModbus/FrmDevProps.resx
+++ b/ScadaComm/OpenKPs/KpModbus/Modbus/UI/FrmDevProps.resx
@@ -120,19 +120,19 @@
- iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8
- YQUAAAAZdEVYdFNvZnR3YXJlAEFkb2JlIEltYWdlUmVhZHlxyWU8AAACfUlEQVQ4T52Sa0jTURiH/x/6
- 0CeLsigEI0ukgmFgSPUhouiiZpTahaSLUN66UBi2zWxbUzd30ZUrHeU2XVOn1UoxrBAKQyKstFFiaRYU
- lWI3Sirb09+JS3NQ9OGBc95zfg8v7zkC8FfyShyrlCYnx7R2Cswu5HpbzujZhMuB2J1lJiHdkDy8PiAt
- n6ESZUfV1qRdWSUIdY6irSL8SWONxvCnaJQMeemGxEwDG9OLfQK6OmwMfqj18W3AyY8+Ky67AbdDrQok
- SMgwsjHNRFzqaYTaCiNfB6rGhX++KeWH5zBV5Voqy/KxlqiwFOdyVi/jtCZbdPyWCdU2HV/f2fxhrxim
- Swae1IBMEFw4p+Hza4s/3FSn83HNVUi9U8Plynxc1pM4LUrs5hOcN+VQZpRh1kl9MqHSks+nF6d8bfe0
- KHBXGfnZo4Re9Xiei7VuOXRmweNM2mu2cCglvkKwmk/y8ZkWXuq5Um2g9bp+5NLY1h/ugrZEhu7EMnhj
- JU8rJOzfufajKFgknDMpeP9ESe+d47iderzdCniUNhJsTxGD2xhqjWeweQ2fGpfTX7cYZXo421cHF/tm
- UGo8Tn+HlIsOHfdvi510HhYFe+F+Mt67m/h+az1fmlYw4I7ibfUC2vKmsiM2jKiIoAifwFwo41FzLpcc
- hfAsFx6I7d5L4ntLHF9uruRDfTR9LgmvbPPx6KejSJ1H5MKQBv8rnCrIptauxXM1g7YiwU+rfhLNmsk0
- qKZQkzMDa3YIZ47MYUfMXG90ZGiMX1CkPkqRYh8F0t3ID24dnix7tqxm87qlrFomYYkknAVhIYTODmbm
- tCBmTQ8Sc2P+wdjN/xCw+O8g/AKXhtE7P06zPwAAAABJRU5ErkJggg==
+ iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAALGPC/xhBQAAABl0RVh0U29m
+ dHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAAJ9SURBVDhPnZJrSNNRGIf/H/rQJ4uyKAQjS6SCYWBI
+ 9SGi6KJmlNqFpItQ3rpQGLbNbFtTN3fRlSsd5TZdU6fVSjGsEApDIqy0UWJpFhSVYjdKKtvT34lLc1D0
+ 4YFz3nN+Dy/vOQLwV/JKHKuUJifHtHYKzC7kelvO6NmEy4HYnWUmId2QPLw+IC2foRJlR9XWpF1ZJQh1
+ jqKtIvxJY43G8KdolAx56YbETAMb04t9Aro6bAx+qPXxbcDJjz4rLrsBt0OtCiRIyDCyMc1EXOpphNoK
+ I18HqsaFf74p5YfnMFXlWirL8rGWqLAU53JWL+O0Jlt0/JYJ1TYdX9/Z/GGvGKZLBp7UgEwQXDin4fNr
+ iz/cVKfzcc1VSL1Tw+XKfFzWkzgtSuzmE5w35VBmlGHWSX0yodKSz6cXp3xt97QocFcZ+dmjhF71eJ6L
+ tW45dGbB40zaa7ZwKCW+QrCaT/LxmRZe6rlSbaD1un7k0tjWH+6CtkSG7sQyeGMlTysk7N+59qMoWCSc
+ Myl4/0RJ753juJ16vN0KeJQ2EmxPEYPbGGqNZ7B5DZ8al9NftxhlejjbVwcX+2ZQajxOf4eUiw4d92+L
+ nXQeFgV74X4y3rub+H5rPV+aVjDgjuJt9QLa8qayIzaMqIigCJ/AXCjjUXMulxyF8CwXHojt3kvie0sc
+ X26u5EN9NH0uCa9s8/Hop6NInUfkwpAG/yucKsim1q7FczWDtiLBT6t+Es2ayTSoplCTMwNrdghnjsxh
+ R8xcb3RkaIxfUKQ+SpFiHwXS3cgPbh2eLHu2rGbzuqWsWiZhiSScBWEhhM4OZua0IGZNDxJzY/7B2M3/
+ ELD47yD8ApeG0Ts/TrM/AAAAAElFTkSuQmCC
@@ -140,40 +140,26 @@
- iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8
- YQUAAAAZdEVYdFNvZnR3YXJlAEFkb2JlIEltYWdlUmVhZHlxyWU8AAABe0lEQVQ4T52Q60oCURSFfal6
- h3qNeopewZ9RPyL6YUaJYGBQaGBRBEZFWWpa3lBHzftt7jNntY82Y6Vj0obFPnNm1rfXHheAkYJXKfxW
- IBKHL/QI78ktl9v69rvsAzc41a7/Eksra9hwe47ocTbg+CJBbUYxhi1vCOGbuAXx0e00wH8eo/azGJkN
- k2HTc4bl1XVbVNOAw9N7apPiZt1gUFQGUTHQlwy0+4YzYD8YpTYuPlXTGWTVxFA20BsaaPV11DvaaA2q
- acBe4Jqva5slxcSApnYGOpo9DbW2BqGpOgN2fJFxZM0cmfsij6yj0dVQbWko11Xkq4ozYPsgDFljk8i9
- ceQKTS1+KMhVZLyXZWcA/9MDyaTIBppdfRS53FBRqCnICgreyhJeC9J8QJv25VOrLRUlbqbIGUFGqigh
- QebnrDgfYEf+2pdH5uZ4XkSMzA/pwXyAYEWmfdMlGUma+pIT8ZQRcUfmaPIPAH+5iCwPl334r2ZeLi64
- PgFCxTifYsCFIAAAAABJRU5ErkJggg==
+ iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAALGPC/xhBQAAABl0RVh0U29m
+ dHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAAF7SURBVDhPnZDrSgJRFIV9qXqHeo16il7Bn1E/Ivph
+ RolgYFBoYFEERkVZalreUEfN+23uM2e1jzZjpWPShsU+c2bWt9ceF4CRglcp/FYgEocv9AjvyS2X2/r2
+ u+wDNzjVrv8SSytr2HB7juhxNuD4IkFtRjGGLW8I4Zu4BfHR7TTAfx6j9rMYmQ2TYdNzhuXVdVtU04DD
+ 03tqk+Jm3WBQVAZRMdCXDLT7hjNgPxilNi4+VdMZZNXEUDbQGxpo9XXUO9poDappwF7gmq9rmyXFxICm
+ dgY6mj0NtbYGoak6A3Z8kXFkzRyZ+yKPrKPR1VBtaSjXVeSrijNg+yAMWWOTyL1x5ApNLX4oyFVkvJdl
+ ZwD/0wPJpMgGml19FLncUFGoKcgKCt7KEl4L0nxAm/blU6stFSVupsgZQUaqKCFB5uesOB9gR/7al0fm
+ 5nheRIzMD+nBfIBgRaZ90yUZSZr6khPxlBFxR+Zo8g8Af7mILA+XffivZl4uLrg+AULFOJ9iwIUgAAAA
+ AElFTkSuQmCC
- iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8
- YQUAAAAZdEVYdFNvZnR3YXJlAEFkb2JlIEltYWdlUmVhZHlxyWU8AAADIGlUWHRYTUw6Y29tLmFkb2Jl
- LnhtcAAAAAAAPD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQi
- Pz4gPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iQWRvYmUgWE1QIENv
- cmUgNS4wLWMwNjAgNjEuMTM0Nzc3LCAyMDEwLzAyLzEyLTE3OjMyOjAwICAgICAgICAiPiA8cmRmOlJE
- RiB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiPiA8
- cmRmOkRlc2NyaXB0aW9uIHJkZjphYm91dD0iIiB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20v
- eGFwLzEuMC8iIHhtbG5zOnhtcE1NPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvbW0vIiB4bWxu
- czpzdFJlZj0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL3NUeXBlL1Jlc291cmNlUmVmIyIgeG1w
- OkNyZWF0b3JUb29sPSJBZG9iZSBQaG90b3Nob3AgQ1M1IFdpbmRvd3MiIHhtcE1NOkluc3RhbmNlSUQ9
- InhtcC5paWQ6NTFCODAzNUU0OTdEMTFFMUExRDZCMzlDNUM2REFBRTgiIHhtcE1NOkRvY3VtZW50SUQ9
- InhtcC5kaWQ6NTFCODAzNUY0OTdEMTFFMUExRDZCMzlDNUM2REFBRTgiPiA8eG1wTU06RGVyaXZlZEZy
- b20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDo1MUI4MDM1QzQ5N0QxMUUxQTFENkIzOUM1QzZEQUFF
- OCIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDo1MUI4MDM1RDQ5N0QxMUUxQTFENkIzOUM1QzZEQUFF
- OCIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVu
- ZD0iciI/Ph5ZVVQAAAESSURBVDhPY/j//z9FGKsgNnyoLsNzbU7cfxDeU5lqABPHUIgNr59X4QTS+Hp+
- 4/8LZRBDYHIYitExSPPuDbX/1+w49f9iazFY8wRTU6AURB5DAzIGad65pvj/uwc9/28eyfnf1lYL1txs
- qe8HU4OhCYZBmrcvSwVrvr4/6f+mWZ7/xYT4/qeFasD9D8IommAY2WZkzaVJutboalE4IIzLZmyaQRiF
- A9K8dUE4Ns2ayOqQMZwB0rx5ji9JmkEYzpgxd/H/49s7/j86VwLXHOSiqoGsGBsGE0DNZSAD/v37+3/l
- 5ECibIZhCMHAUJZXWPo/MCQcxCHKZhiGEAwMD0CGAA3IQFdACGMVJAVjFSQe/2cAAKIjwdj3D0MKAAAA
- AElFTkSuQmCC
+ iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAALGPC/xhBQAAABl0RVh0U29m
+ dHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAAESSURBVDhPY/j//z9FGKsgNnyoLsNzbU7cfxDeU5lq
+ ABPHUIgNr59X4QTS+Hp+4/8LZRBDYHIYitExSPPuDbX/1+w49f9iazFY8wRTU6AURB5DAzIGad65pvj/
+ uwc9/28eyfnf1lYL1txsqe8HU4OhCYZBmrcvSwVrvr4/6f+mWZ7/xYT4/qeFasD9D8IommAY2WZkzaVJ
+ utboalE4IIzLZmyaQRiFA9K8dUE4Ns2ayOqQMZwB0rx5ji9JmkEYzpgxd/H/49s7/j86VwLXHOSiqoGs
+ GBsGE0DNZSAD/v37+3/l5ECibIZhCMHAUJZXWPo/MCQcxCHKZhiGEAwMD0CGAA3IQFdACGMVJAVjFSQe
+ /2cAAKIjwdj3D0MKAAAAAElFTkSuQmCC
diff --git a/ScadaComm/OpenKPs/KpModbus/Modbus/UI/FrmDevTemplate.Designer.cs b/ScadaComm/OpenKPs/KpModbus/Modbus/UI/FrmDevTemplate.Designer.cs
new file mode 100644
index 000000000..b44690d3a
--- /dev/null
+++ b/ScadaComm/OpenKPs/KpModbus/Modbus/UI/FrmDevTemplate.Designer.cs
@@ -0,0 +1,353 @@
+namespace Scada.Comm.Devices.Modbus.UI
+{
+ partial class FrmDevTemplate
+ {
+ ///
+ /// Required designer variable.
+ ///
+ private System.ComponentModel.IContainer components = null;
+
+ ///
+ /// Clean up any resources being used.
+ ///
+ /// true if managed resources should be disposed; otherwise, false.
+ protected override void Dispose(bool disposing)
+ {
+ if (disposing && (components != null))
+ {
+ components.Dispose();
+ }
+ base.Dispose(disposing);
+ }
+
+ #region Windows Form Designer generated code
+
+ ///
+ /// Required method for Designer support - do not modify
+ /// the contents of this method with the code editor.
+ ///
+ private void InitializeComponent()
+ {
+ this.components = new System.ComponentModel.Container();
+ System.Windows.Forms.TreeNode treeNode3 = new System.Windows.Forms.TreeNode("Element groups");
+ System.Windows.Forms.TreeNode treeNode4 = new System.Windows.Forms.TreeNode("Commands");
+ System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(FrmDevTemplate));
+ this.treeView = new System.Windows.Forms.TreeView();
+ this.imageList = new System.Windows.Forms.ImageList(this.components);
+ this.toolStrip = new System.Windows.Forms.ToolStrip();
+ this.btnNew = new System.Windows.Forms.ToolStripButton();
+ this.btnOpen = new System.Windows.Forms.ToolStripButton();
+ this.btnSave = new System.Windows.Forms.ToolStripButton();
+ this.btnSaveAs = new System.Windows.Forms.ToolStripButton();
+ this.toolStripSeparator1 = new System.Windows.Forms.ToolStripSeparator();
+ this.btnAddElemGroup = new System.Windows.Forms.ToolStripButton();
+ this.btnAddElem = new System.Windows.Forms.ToolStripButton();
+ this.btnAddCmd = new System.Windows.Forms.ToolStripButton();
+ this.btnMoveUp = new System.Windows.Forms.ToolStripButton();
+ this.btnMoveDown = new System.Windows.Forms.ToolStripButton();
+ this.btnDelete = new System.Windows.Forms.ToolStripButton();
+ this.toolStripSeparator2 = new System.Windows.Forms.ToolStripSeparator();
+ this.btnEditSettings = new System.Windows.Forms.ToolStripButton();
+ this.gbDevTemplate = new System.Windows.Forms.GroupBox();
+ this.openFileDialog = new System.Windows.Forms.OpenFileDialog();
+ this.saveFileDialog = new System.Windows.Forms.SaveFileDialog();
+ this.ctrlElemGroup = new Scada.Comm.Devices.Modbus.UI.CtrlElemGroup();
+ this.ctrlElem = new Scada.Comm.Devices.Modbus.UI.CtrlElem();
+ this.ctrlCmd = new Scada.Comm.Devices.Modbus.UI.CtrlCmd();
+ this.toolStrip.SuspendLayout();
+ this.gbDevTemplate.SuspendLayout();
+ this.SuspendLayout();
+ //
+ // treeView
+ //
+ this.treeView.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)
+ | System.Windows.Forms.AnchorStyles.Left)
+ | System.Windows.Forms.AnchorStyles.Right)));
+ this.treeView.HideSelection = false;
+ this.treeView.ImageIndex = 0;
+ this.treeView.ImageList = this.imageList;
+ this.treeView.Location = new System.Drawing.Point(13, 19);
+ this.treeView.Name = "treeView";
+ treeNode3.ImageKey = "group.png";
+ treeNode3.Name = "grsNode";
+ treeNode3.SelectedImageKey = "group.png";
+ treeNode3.Text = "Element groups";
+ treeNode4.ImageIndex = 2;
+ treeNode4.Name = "cmdsNode";
+ treeNode4.SelectedImageKey = "cmds.png";
+ treeNode4.Text = "Commands";
+ this.treeView.Nodes.AddRange(new System.Windows.Forms.TreeNode[] {
+ treeNode3,
+ treeNode4});
+ this.treeView.SelectedImageIndex = 0;
+ this.treeView.ShowRootLines = false;
+ this.treeView.Size = new System.Drawing.Size(254, 469);
+ this.treeView.TabIndex = 0;
+ this.treeView.AfterSelect += new System.Windows.Forms.TreeViewEventHandler(this.treeView_AfterSelect);
+ //
+ // imageList
+ //
+ this.imageList.ImageStream = ((System.Windows.Forms.ImageListStreamer)(resources.GetObject("imageList.ImageStream")));
+ this.imageList.TransparentColor = System.Drawing.Color.Transparent;
+ this.imageList.Images.SetKeyName(0, "group.png");
+ this.imageList.Images.SetKeyName(1, "group_inactive.png");
+ this.imageList.Images.SetKeyName(2, "elem.png");
+ this.imageList.Images.SetKeyName(3, "cmds.png");
+ this.imageList.Images.SetKeyName(4, "cmd.png");
+ //
+ // toolStrip
+ //
+ this.toolStrip.Items.AddRange(new System.Windows.Forms.ToolStripItem[] {
+ this.btnNew,
+ this.btnOpen,
+ this.btnSave,
+ this.btnSaveAs,
+ this.toolStripSeparator1,
+ this.btnAddElemGroup,
+ this.btnAddElem,
+ this.btnAddCmd,
+ this.btnMoveUp,
+ this.btnMoveDown,
+ this.btnDelete,
+ this.toolStripSeparator2,
+ this.btnEditSettings});
+ this.toolStrip.Location = new System.Drawing.Point(0, 0);
+ this.toolStrip.Name = "toolStrip";
+ this.toolStrip.Size = new System.Drawing.Size(590, 25);
+ this.toolStrip.TabIndex = 0;
+ this.toolStrip.Text = "toolStrip1";
+ //
+ // btnNew
+ //
+ this.btnNew.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image;
+ this.btnNew.Image = ((System.Drawing.Image)(resources.GetObject("btnNew.Image")));
+ this.btnNew.ImageTransparentColor = System.Drawing.Color.Magenta;
+ this.btnNew.Name = "btnNew";
+ this.btnNew.Size = new System.Drawing.Size(23, 22);
+ this.btnNew.ToolTipText = "Create new template";
+ this.btnNew.Click += new System.EventHandler(this.btnNew_Click);
+ //
+ // btnOpen
+ //
+ this.btnOpen.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image;
+ this.btnOpen.Image = ((System.Drawing.Image)(resources.GetObject("btnOpen.Image")));
+ this.btnOpen.ImageTransparentColor = System.Drawing.Color.Magenta;
+ this.btnOpen.Name = "btnOpen";
+ this.btnOpen.Size = new System.Drawing.Size(23, 22);
+ this.btnOpen.ToolTipText = "Open template";
+ this.btnOpen.Click += new System.EventHandler(this.btnOpen_Click);
+ //
+ // btnSave
+ //
+ this.btnSave.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image;
+ this.btnSave.Image = ((System.Drawing.Image)(resources.GetObject("btnSave.Image")));
+ this.btnSave.ImageTransparentColor = System.Drawing.Color.Magenta;
+ this.btnSave.Name = "btnSave";
+ this.btnSave.Size = new System.Drawing.Size(23, 22);
+ this.btnSave.ToolTipText = "Save template";
+ this.btnSave.Click += new System.EventHandler(this.btnSave_Click);
+ //
+ // btnSaveAs
+ //
+ this.btnSaveAs.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image;
+ this.btnSaveAs.Image = ((System.Drawing.Image)(resources.GetObject("btnSaveAs.Image")));
+ this.btnSaveAs.ImageTransparentColor = System.Drawing.Color.Magenta;
+ this.btnSaveAs.Name = "btnSaveAs";
+ this.btnSaveAs.Size = new System.Drawing.Size(23, 22);
+ this.btnSaveAs.ToolTipText = "Save template as";
+ this.btnSaveAs.Click += new System.EventHandler(this.btnSave_Click);
+ //
+ // toolStripSeparator1
+ //
+ this.toolStripSeparator1.Name = "toolStripSeparator1";
+ this.toolStripSeparator1.Size = new System.Drawing.Size(6, 25);
+ //
+ // btnAddElemGroup
+ //
+ this.btnAddElemGroup.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image;
+ this.btnAddElemGroup.Image = ((System.Drawing.Image)(resources.GetObject("btnAddElemGroup.Image")));
+ this.btnAddElemGroup.ImageTransparentColor = System.Drawing.Color.Magenta;
+ this.btnAddElemGroup.Name = "btnAddElemGroup";
+ this.btnAddElemGroup.Size = new System.Drawing.Size(23, 22);
+ this.btnAddElemGroup.ToolTipText = "Add element group";
+ this.btnAddElemGroup.Click += new System.EventHandler(this.btnAddElemGroup_Click);
+ //
+ // btnAddElem
+ //
+ this.btnAddElem.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image;
+ this.btnAddElem.Image = ((System.Drawing.Image)(resources.GetObject("btnAddElem.Image")));
+ this.btnAddElem.ImageTransparentColor = System.Drawing.Color.Magenta;
+ this.btnAddElem.Name = "btnAddElem";
+ this.btnAddElem.Size = new System.Drawing.Size(23, 22);
+ this.btnAddElem.ToolTipText = "Add element";
+ this.btnAddElem.Click += new System.EventHandler(this.btnAddElem_Click);
+ //
+ // btnAddCmd
+ //
+ this.btnAddCmd.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image;
+ this.btnAddCmd.Image = ((System.Drawing.Image)(resources.GetObject("btnAddCmd.Image")));
+ this.btnAddCmd.ImageTransparentColor = System.Drawing.Color.Magenta;
+ this.btnAddCmd.Name = "btnAddCmd";
+ this.btnAddCmd.Size = new System.Drawing.Size(23, 22);
+ this.btnAddCmd.ToolTipText = "Add command";
+ this.btnAddCmd.Click += new System.EventHandler(this.btnAddCmd_Click);
+ //
+ // btnMoveUp
+ //
+ this.btnMoveUp.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image;
+ this.btnMoveUp.Image = ((System.Drawing.Image)(resources.GetObject("btnMoveUp.Image")));
+ this.btnMoveUp.ImageTransparentColor = System.Drawing.Color.Magenta;
+ this.btnMoveUp.Name = "btnMoveUp";
+ this.btnMoveUp.Size = new System.Drawing.Size(23, 22);
+ this.btnMoveUp.ToolTipText = "Move up";
+ this.btnMoveUp.Click += new System.EventHandler(this.btnMoveUp_Click);
+ //
+ // btnMoveDown
+ //
+ this.btnMoveDown.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image;
+ this.btnMoveDown.Image = ((System.Drawing.Image)(resources.GetObject("btnMoveDown.Image")));
+ this.btnMoveDown.ImageTransparentColor = System.Drawing.Color.Magenta;
+ this.btnMoveDown.Name = "btnMoveDown";
+ this.btnMoveDown.Size = new System.Drawing.Size(23, 22);
+ this.btnMoveDown.ToolTipText = "Move down";
+ this.btnMoveDown.Click += new System.EventHandler(this.btnMoveDown_Click);
+ //
+ // btnDelete
+ //
+ this.btnDelete.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image;
+ this.btnDelete.Image = ((System.Drawing.Image)(resources.GetObject("btnDelete.Image")));
+ this.btnDelete.ImageTransparentColor = System.Drawing.Color.Magenta;
+ this.btnDelete.Name = "btnDelete";
+ this.btnDelete.Size = new System.Drawing.Size(23, 22);
+ this.btnDelete.ToolTipText = "Delete";
+ this.btnDelete.Click += new System.EventHandler(this.btnDelete_Click);
+ //
+ // toolStripSeparator2
+ //
+ this.toolStripSeparator2.Name = "toolStripSeparator2";
+ this.toolStripSeparator2.Size = new System.Drawing.Size(6, 25);
+ //
+ // btnEditSettings
+ //
+ this.btnEditSettings.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image;
+ this.btnEditSettings.Image = ((System.Drawing.Image)(resources.GetObject("btnEditSettings.Image")));
+ this.btnEditSettings.ImageTransparentColor = System.Drawing.Color.Magenta;
+ this.btnEditSettings.Name = "btnEditSettings";
+ this.btnEditSettings.Size = new System.Drawing.Size(23, 22);
+ this.btnEditSettings.ToolTipText = "Edit template settings";
+ this.btnEditSettings.Click += new System.EventHandler(this.btnEditSettings_Click);
+ //
+ // gbDevTemplate
+ //
+ this.gbDevTemplate.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)
+ | System.Windows.Forms.AnchorStyles.Left)
+ | System.Windows.Forms.AnchorStyles.Right)));
+ this.gbDevTemplate.Controls.Add(this.treeView);
+ this.gbDevTemplate.Location = new System.Drawing.Point(12, 28);
+ this.gbDevTemplate.Name = "gbDevTemplate";
+ this.gbDevTemplate.Padding = new System.Windows.Forms.Padding(10, 3, 10, 10);
+ this.gbDevTemplate.Size = new System.Drawing.Size(280, 501);
+ this.gbDevTemplate.TabIndex = 1;
+ this.gbDevTemplate.TabStop = false;
+ this.gbDevTemplate.Text = "Device template";
+ //
+ // openFileDialog
+ //
+ this.openFileDialog.DefaultExt = "*.xml";
+ this.openFileDialog.Filter = "Файлы шаблонов (*.xml)|*.xml|Все файлы (*.*)|*.*";
+ this.openFileDialog.FilterIndex = 0;
+ this.openFileDialog.Title = "Открыть файл";
+ //
+ // saveFileDialog
+ //
+ this.saveFileDialog.DefaultExt = "*.xml";
+ this.saveFileDialog.Filter = "Файлы шаблонов (*.xml)|*.xml|Все файлы (*.*)|*.*";
+ this.saveFileDialog.FilterIndex = 0;
+ this.saveFileDialog.Title = "Сохранить файл";
+ //
+ // ctrlElemGroup
+ //
+ this.ctrlElemGroup.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right)));
+ this.ctrlElemGroup.ElemGroup = null;
+ this.ctrlElemGroup.Location = new System.Drawing.Point(298, 28);
+ this.ctrlElemGroup.Name = "ctrlElemGroup";
+ this.ctrlElemGroup.Settings = null;
+ this.ctrlElemGroup.Size = new System.Drawing.Size(280, 245);
+ this.ctrlElemGroup.TabIndex = 2;
+ this.ctrlElemGroup.ObjectChanged += new Scada.UI.ObjectChangedEventHandler(this.ctrlElemGroup_ObjectChanged);
+ //
+ // ctrlElem
+ //
+ this.ctrlElem.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right)));
+ this.ctrlElem.ElemInfo = null;
+ this.ctrlElem.Location = new System.Drawing.Point(298, 201);
+ this.ctrlElem.Name = "ctrlElem";
+ this.ctrlElem.Size = new System.Drawing.Size(280, 271);
+ this.ctrlElem.TabIndex = 3;
+ this.ctrlElem.ObjectChanged += new Scada.UI.ObjectChangedEventHandler(this.ctrlElem_ObjectChanged);
+ //
+ // ctrlCmd
+ //
+ this.ctrlCmd.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right)));
+ this.ctrlCmd.Location = new System.Drawing.Point(298, 205);
+ this.ctrlCmd.ModbusCmd = null;
+ this.ctrlCmd.Name = "ctrlCmd";
+ this.ctrlCmd.Settings = null;
+ this.ctrlCmd.Size = new System.Drawing.Size(280, 324);
+ this.ctrlCmd.TabIndex = 4;
+ this.ctrlCmd.ObjectChanged += new Scada.UI.ObjectChangedEventHandler(this.ctrlCmd_ObjectChanged);
+ //
+ // FrmDevTemplate
+ //
+ this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
+ this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+ this.ClientSize = new System.Drawing.Size(590, 541);
+ this.Controls.Add(this.ctrlElemGroup);
+ this.Controls.Add(this.ctrlElem);
+ this.Controls.Add(this.ctrlCmd);
+ this.Controls.Add(this.gbDevTemplate);
+ this.Controls.Add(this.toolStrip);
+ this.MaximizeBox = false;
+ this.MinimizeBox = false;
+ this.MinimumSize = new System.Drawing.Size(606, 500);
+ this.Name = "FrmDevTemplate";
+ this.ShowIcon = false;
+ this.ShowInTaskbar = false;
+ this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent;
+ this.Text = "MODBUS. Редактор шаблонов устройств";
+ this.FormClosing += new System.Windows.Forms.FormClosingEventHandler(this.FrmDevTemplate_FormClosing);
+ this.Load += new System.EventHandler(this.FrmDevTemplate_Load);
+ this.toolStrip.ResumeLayout(false);
+ this.toolStrip.PerformLayout();
+ this.gbDevTemplate.ResumeLayout(false);
+ this.ResumeLayout(false);
+ this.PerformLayout();
+
+ }
+
+ #endregion
+
+ private System.Windows.Forms.TreeView treeView;
+ private System.Windows.Forms.ToolStrip toolStrip;
+ private System.Windows.Forms.ToolStripButton btnSave;
+ private System.Windows.Forms.ToolStripButton btnOpen;
+ private System.Windows.Forms.ToolStripButton btnNew;
+ private System.Windows.Forms.ToolStripButton btnAddElemGroup;
+ private System.Windows.Forms.ToolStripButton btnAddCmd;
+ private System.Windows.Forms.ToolStripButton btnMoveUp;
+ private System.Windows.Forms.ToolStripButton btnMoveDown;
+ private System.Windows.Forms.ToolStripButton btnDelete;
+ private System.Windows.Forms.ToolStripSeparator toolStripSeparator1;
+ private System.Windows.Forms.ImageList imageList;
+ private System.Windows.Forms.GroupBox gbDevTemplate;
+ private System.Windows.Forms.OpenFileDialog openFileDialog;
+ private System.Windows.Forms.SaveFileDialog saveFileDialog;
+ private System.Windows.Forms.ToolStripButton btnSaveAs;
+ private System.Windows.Forms.ToolStripButton btnAddElem;
+ private CtrlCmd ctrlCmd;
+ private CtrlElem ctrlElem;
+ private CtrlElemGroup ctrlElemGroup;
+ private System.Windows.Forms.ToolStripSeparator toolStripSeparator2;
+ private System.Windows.Forms.ToolStripButton btnEditSettings;
+ }
+}
\ No newline at end of file
diff --git a/ScadaComm/OpenKPs/KpModbus/FrmDevTemplate.cs b/ScadaComm/OpenKPs/KpModbus/Modbus/UI/FrmDevTemplate.cs
similarity index 50%
rename from ScadaComm/OpenKPs/KpModbus/FrmDevTemplate.cs
rename to ScadaComm/OpenKPs/KpModbus/Modbus/UI/FrmDevTemplate.cs
index d677cd6c8..c38b37126 100644
--- a/ScadaComm/OpenKPs/KpModbus/FrmDevTemplate.cs
+++ b/ScadaComm/OpenKPs/KpModbus/Modbus/UI/FrmDevTemplate.cs
@@ -1,5 +1,5 @@
/*
- * Copyright 2016 Mikhail Shiryaev
+ * Copyright 2017 Mikhail Shiryaev
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -20,15 +20,16 @@
*
* Author : Mikhail Shiryaev
* Created : 2012
- * Modified : 2016
+ * Modified : 2017
*/
+using Scada.Comm.Devices.Modbus.Protocol;
using Scada.UI;
using System;
using System.IO;
using System.Windows.Forms;
-namespace Scada.Comm.Devices.KpModbus
+namespace Scada.Comm.Devices.Modbus.UI
{
///
/// Editing device template form
@@ -36,71 +37,24 @@ namespace Scada.Comm.Devices.KpModbus
///
public partial class FrmDevTemplate : Form
{
- ///
- /// Информация об элементе группы
- ///
- private class ElemInfo
- {
- ///
- /// Получить или установить элемент
- ///
- public Modbus.Elem Elem { get; set; }
- ///
- /// Получить или установить группу элементов, в которую входит элемент
- ///
- public Modbus.ElemGroup ElemGroup { get; set; }
- ///
- /// Получить или установить адрес, начинающийся от 0
- ///
- public ushort Address { get; set; }
- ///
- /// Получить или установить сигнал КП
- ///
- public int Signal { get; set; }
- ///
- /// Получить строковую запись диапазона адресов элемента
- ///
- public string AddressRange
- {
- get
- {
- return (Address + 1).ToString() +
- (Elem == null || Elem.Length <= 1 ? "" : " - " + (Address + Elem.Length));
- }
- }
- ///
- /// Получить обозначение элемента в дереве
- ///
- public string Caption
- {
- get
- {
- int addr = Address + 1;
- return (Elem == null || Elem.Name == "" ? KpPhrases.DefElemName : Elem.Name) +
- " (" + AddressRange + ")";
- }
- }
- }
-
///
/// Имя файла нового шаблона устройства
///
private const string NewFileName = "KpModbus_NewTemplate.xml";
- private AppDirs appDirs; // директории приложения
- private string initialFileName; // имя файла шаблона для открытия при запуске формы
- private string fileName; // имя файла шаблона устройства
- private bool saveOnly; // разрешена только команда сохранения при работе с файлами
+ private AppDirs appDirs; // директории приложения
+ private string initialFileName; // имя файла шаблона для открытия при запуске формы
+ private string fileName; // имя файла шаблона устройства
+ private bool saveOnly; // разрешена только команда сохранения при работе с файлами
- private Modbus.DeviceModel devTemplate; // редактируемый шаблон устройства
- private bool modified; // признак изменения шаблона устройства
- private Modbus.ElemGroup selElemGroup; // выбранная группа элементов
- private ElemInfo selElemInfo; // информация о выбранном элементе
- private Modbus.Cmd selCmd; // выбранная команда
- private TreeNode selNode; // выбранный узел дерева
- private TreeNode grsNode; // узел дерева "Группы элементов"
- private TreeNode cmdsNode; // узел дерева "Команды"
- private bool procChangedEv; // обрабатывать события на изменение данных
+ private DeviceTemplate template; // редактируемый шаблон устройства
+ private bool modified; // признак изменения шаблона устройства
+ private ElemGroup selElemGroup; // выбранная группа элементов
+ private ElemInfo selElemInfo; // информация о выбранном элементе
+ private ModbusCmd selCmd; // выбранная команда
+ private TreeNode selNode; // выбранный узел дерева
+ private TreeNode grsNode; // узел дерева "Группы элементов"
+ private TreeNode cmdsNode; // узел дерева "Команды"
///
@@ -115,7 +69,7 @@ private FrmDevTemplate()
fileName = "";
saveOnly = false;
- devTemplate = null;
+ template = null;
modified = false;
selElemGroup = null;
selElemInfo = null;
@@ -123,7 +77,6 @@ private FrmDevTemplate()
selNode = null;
grsNode = treeView.Nodes["grsNode"];
cmdsNode = treeView.Nodes["cmdsNode"];
- procChangedEv = false;
}
@@ -159,12 +112,12 @@ private void SetFormTitle()
///
private void LoadTemplate(string fname)
{
- Modbus.DeviceModel templ = new Modbus.DeviceModel();
+ DeviceTemplate templ = new DeviceTemplate();
string errMsg;
- if (templ.LoadTemplate(fname, out errMsg))
+ if (templ.Load(fname, out errMsg))
{
- devTemplate = templ;
+ template = templ;
fileName = fname;
SetFormTitle();
FillTree();
@@ -206,12 +159,12 @@ private void FillTree()
treeView.SelectedNode = grsNode;
// заполнение узла групп элементов
- foreach (Modbus.ElemGroup elemGroup in devTemplate.ElemGroups)
+ foreach (ElemGroup elemGroup in template.ElemGroups)
grsNode.Nodes.Add(NewElemGroupNode(elemGroup));
// заполнение узла команд
- foreach (Modbus.Cmd cmd in devTemplate.Cmds)
- cmdsNode.Nodes.Add(NewCmdNode(cmd));
+ foreach (ModbusCmd modbusCmd in template.Cmds)
+ cmdsNode.Nodes.Add(NewCmdNode(modbusCmd));
// раскрытие основных узлов дерева
grsNode.Expand();
@@ -224,23 +177,26 @@ private void FillTree()
///
/// Создать узел группы элементов
///
- private TreeNode NewElemGroupNode(Modbus.ElemGroup elemGroup)
+ private TreeNode NewElemGroupNode(ElemGroup elemGroup)
{
string name = elemGroup.Name == "" ? KpPhrases.DefGrName : elemGroup.Name;
- TreeNode grNode = new TreeNode(name + " (" + Modbus.GetTableTypeName(elemGroup.TableType) + ")");
- grNode.ImageKey = grNode.SelectedImageKey = "group.png";
+ TreeNode grNode = new TreeNode(name + " (" + ModbusUtils.GetTableTypeName(elemGroup.TableType) + ")");
+ grNode.ImageKey = grNode.SelectedImageKey = elemGroup.Active ? "group.png" : "group_inactive.png";
grNode.Tag = elemGroup;
ushort elemAddr = elemGroup.Address;
int elemSig = elemGroup.StartKPTagInd + 1;
- foreach (Modbus.Elem elem in elemGroup.Elems)
+ foreach (Elem elem in elemGroup.Elems)
{
- ElemInfo elemInfo = new ElemInfo();
- elemInfo.Elem = elem;
- elemInfo.ElemGroup = elemGroup;
- elemInfo.Address = elemAddr;
- elemInfo.Signal = elemSig++;
+ ElemInfo elemInfo = new ElemInfo()
+ {
+ Elem = elem,
+ ElemGroup = elemGroup,
+ Settings = template.Sett,
+ Address = elemAddr,
+ Signal = elemSig++
+ };
grNode.Nodes.Add(NewElemNode(elemInfo));
elemAddr += (ushort)elem.Length;
@@ -263,16 +219,25 @@ private TreeNode NewElemNode(ElemInfo elemInfo)
///
/// Создать узел команды
///
- private TreeNode NewCmdNode(Modbus.Cmd cmd)
+ private TreeNode NewCmdNode(ModbusCmd modbusCmd)
{
- string name = cmd.Name == "" ? KpPhrases.DefCmdName : cmd.Name;
- TreeNode cmdNode = new TreeNode(name +
- " (" + Modbus.GetTableTypeName(cmd.TableType) + ", " + (cmd.Address + 1) + ")");
+ TreeNode cmdNode = new TreeNode(GetCmdCaption(modbusCmd));
cmdNode.ImageKey = cmdNode.SelectedImageKey = "cmd.png";
- cmdNode.Tag = cmd;
+ cmdNode.Tag = modbusCmd;
return cmdNode;
}
+ ///
+ /// Получить обозначение команды в дереве
+ ///
+ private string GetCmdCaption(ModbusCmd modbusCmd)
+ {
+ return (string.IsNullOrEmpty(modbusCmd.Name) ? KpPhrases.DefCmdName : modbusCmd.Name) +
+ " (" + ModbusUtils.GetTableTypeName(modbusCmd.TableType) + ", " +
+ ModbusUtils.GetAddressRange(modbusCmd.Address, modbusCmd.ElemCnt,
+ template.Sett.ZeroAddr, template.Sett.DecAddr) + ")";
+ }
+
///
/// Обновить узел выбранной группы элементов
///
@@ -280,8 +245,9 @@ private void UpdateElemGroupNode()
{
if (selElemGroup != null)
{
- string name = selElemGroup.Name == "" ? KpPhrases.DefGrName : selElemGroup.Name;
- selNode.Text = name + " (" + Modbus.GetTableTypeName(selElemGroup.TableType) + ")";
+ selNode.ImageKey = selNode.SelectedImageKey = selElemGroup.Active ? "group.png" : "group_inactive.png";
+ selNode.Text = (selElemGroup.Name == "" ? KpPhrases.DefGrName : selElemGroup.Name) +
+ " (" + ModbusUtils.GetTableTypeName(selElemGroup.TableType) + ")";
}
}
@@ -295,9 +261,9 @@ private void UpdateElemNodes(TreeNode grNode = null)
if (grNode == null)
grNode = selNode;
- if (grNode.Tag is Modbus.ElemGroup)
+ if (grNode.Tag is ElemGroup)
{
- Modbus.ElemGroup elemGroup = (Modbus.ElemGroup)grNode.Tag;
+ ElemGroup elemGroup = (ElemGroup)grNode.Tag;
ushort elemAddr = elemGroup.Address;
int elemSig = elemGroup.StartKPTagInd + 1;
@@ -320,12 +286,12 @@ private void UpdateElemNodes(TreeNode grNode = null)
private void UpdateSignals(TreeNode startGrNode)
{
// проверка корректности заданного узла дерева
- if (!(startGrNode.Tag is Modbus.ElemGroup))
+ if (!(startGrNode.Tag is ElemGroup))
return;
// определение начального индекса тегов КП
TreeNode prevGrNode = startGrNode.PrevNode;
- Modbus.ElemGroup prevElemGroup = prevGrNode == null ? null : prevGrNode.Tag as Modbus.ElemGroup;
+ ElemGroup prevElemGroup = prevGrNode == null ? null : prevGrNode.Tag as ElemGroup;
int tagInd = prevElemGroup == null ? 0 : prevElemGroup.StartKPTagInd + prevElemGroup.Elems.Count;
// обновление групп и их элементов
@@ -334,7 +300,7 @@ private void UpdateSignals(TreeNode startGrNode)
for (int i = startGrNode.Index; i < grNodeCnt; i++)
{
TreeNode grNode = grsNode.Nodes[i];
- Modbus.ElemGroup elemGroup = grNode.Tag as Modbus.ElemGroup;
+ ElemGroup elemGroup = grNode.Tag as ElemGroup;
int elemSig = tagInd + 1;
elemGroup.StartKPTagInd = tagInd;
tagInd += elemGroup.Elems.Count;
@@ -353,47 +319,20 @@ private void UpdateSignals(TreeNode startGrNode)
private void UpdateCmdNode()
{
if (selCmd != null)
- {
- string name = selCmd.Name == "" ? KpPhrases.DefCmdName : selCmd.Name;
- selNode.Text = name + " (" + Modbus.GetTableTypeName(selCmd.TableType) + ", " +
- (selCmd.Address + 1) + ")";
- }
+ selNode.Text = GetCmdCaption(selCmd);
}
///
/// Отобразить свойства группы элементов
///
- private void ShowElemGroupProps(Modbus.ElemGroup elemGroup)
+ private void ShowElemGroupProps(ElemGroup elemGroup)
{
- procChangedEv = false;
-
- gbElemGroup.Visible = true;
- gbElem.Visible = false;
- gbCmd.Visible = false;
-
- if (elemGroup == null)
- {
- chkGrActive.Checked = false;
- txtGrName.Text = "";
- cbGrTableType.SelectedIndex = 0;
- numGrAddress.Value = 1;
- numGrElemCnt.Value = 1;
- gbElemGroup.Enabled = false;
- }
- else
- {
- chkGrActive.Checked = elemGroup.Active;
- txtGrName.Text = elemGroup.Name;
- cbGrTableType.SelectedIndex = (int)elemGroup.TableType;
- numGrAddress.Value = elemGroup.Address + 1;
- numGrElemCnt.Value = 1;
- numGrElemCnt.Maximum = Modbus.ElemGroup.GetMaxElemCnt(elemGroup.TableType);
- numGrElemCnt.Value = elemGroup.Elems.Count;
- gbElemGroup.Enabled = true;
- }
-
- procChangedEv = true;
+ ctrlElemGroup.Visible = true;
+ ctrlElemGroup.Settings = template.Sett;
+ ctrlElemGroup.ElemGroup = elemGroup;
+ ctrlElem.Visible = false;
+ ctrlCmd.Visible = false;
}
///
@@ -401,115 +340,22 @@ private void ShowElemGroupProps(Modbus.ElemGroup elemGroup)
///
private void ShowElemProps(ElemInfo elemInfo)
{
- procChangedEv = false;
-
- gbElemGroup.Visible = false;
- gbElem.Visible = true;
- gbCmd.Visible = false;
-
- if (elemInfo == null)
- {
- txtElemName.Text = "";
- txtElemAddress.Text = "";
- txtElemSignal.Text = "";
- rbBool.Checked = true;
- txtByteOrder.Text = "";
- gbElem.Enabled = false;
- }
- else
- {
- txtElemName.Text = elemInfo.Elem.Name;
- txtElemAddress.Text = elemInfo.AddressRange;
- txtElemSignal.Text = elemInfo.Signal.ToString();
- Modbus.ElemTypes elemType = elemInfo.Elem.ElemType;
-
- if (elemType == Modbus.ElemTypes.Bool)
- {
- rbUShort.Enabled = rbShort.Enabled = rbUInt.Enabled = rbInt.Enabled =
- rbULong.Enabled = rbLong.Enabled = rbFloat.Enabled = rbDouble.Enabled = false;
- rbBool.Enabled = true;
- txtByteOrder.Text = "";
- txtByteOrder.Enabled = false;
- }
- else
- {
- rbUShort.Enabled = rbShort.Enabled = rbUInt.Enabled = rbInt.Enabled =
- rbULong.Enabled = rbLong.Enabled = rbFloat.Enabled = rbDouble.Enabled = true;
- rbBool.Enabled = false;
- txtByteOrder.Text = elemInfo.Elem.ByteOrderStr;
- txtByteOrder.Enabled = true;
- }
-
- switch (elemType)
- {
- case Modbus.ElemTypes.UShort:
- rbUShort.Checked = true;
- break;
- case Modbus.ElemTypes.Short:
- rbShort.Checked = true;
- break;
- case Modbus.ElemTypes.UInt:
- rbUInt.Checked = true;
- break;
- case Modbus.ElemTypes.Int:
- rbInt.Checked = true;
- break;
- case Modbus.ElemTypes.ULong:
- rbULong.Checked = true;
- break;
- case Modbus.ElemTypes.Long:
- rbLong.Checked = true;
- break;
- case Modbus.ElemTypes.Float:
- rbFloat.Checked = true;
- break;
- case Modbus.ElemTypes.Double:
- rbDouble.Checked = true;
- break;
- default:
- rbBool.Checked = true;
- break;
- }
-
- gbElem.Enabled = true;
- }
-
- procChangedEv = true;
+ ctrlElemGroup.Visible = false;
+ ctrlElem.Visible = true;
+ ctrlElem.ElemInfo = elemInfo;
+ ctrlCmd.Visible = false;
}
///
/// Отобразить свойства команды
///
- private void ShowCmdProps(Modbus.Cmd cmd)
+ private void ShowCmdProps(ModbusCmd modbusCmd)
{
- procChangedEv = false;
-
- gbElemGroup.Visible = false;
- gbElem.Visible = false;
- gbCmd.Visible = true;
-
- if (cmd == null)
- {
- cbCmdTableType.SelectedIndex = 0;
- numCmdAddress.Value = 1;
- numCmdElemCnt.Value = 1;
- numCmdNum.Value = 1;
- txtCmdName.Text = "";
- gbCmd.Enabled = false;
- }
- else
- {
- cbCmdTableType.SelectedIndex = cmd.TableType == Modbus.TableTypes.Coils ? 0 : 1;
- chkCmdMultiple.Checked = cmd.Multiple;
- numCmdAddress.Value = cmd.Address + 1;
- numCmdElemCnt.Value = cmd.ElemCnt;
- numCmdElemCnt.Enabled = cmd.Multiple;
- numCmdNum.Value = cmd.CmdNum;
- txtCmdName.Text = cmd.Name;
- gbCmd.Enabled = true;
- }
-
- procChangedEv = true;
+ ctrlElemGroup.Visible = false;
+ ctrlElem.Visible = false;
+ ctrlCmd.Visible = true;
+ ctrlCmd.Settings = template.Sett;
+ ctrlCmd.ModbusCmd = modbusCmd;
}
///
@@ -517,12 +363,9 @@ private void ShowCmdProps(Modbus.Cmd cmd)
///
private void DisableProps()
{
- if (gbElemGroup.Visible)
- ShowElemGroupProps(null);
- else if (gbElem.Visible)
- ShowElemProps(null);
- else if (gbCmd.Visible)
- ShowCmdProps(null);
+ ctrlElemGroup.ElemGroup = null;
+ ctrlElem.ElemInfo = null;
+ ctrlCmd.ModbusCmd = null;
}
///
@@ -551,7 +394,7 @@ private bool SaveChanges(bool saveAs)
{
// сохранение шаблона устройства
string errMsg;
- if (devTemplate.SaveTemplate(newFileName, out errMsg))
+ if (template.Save(newFileName, out errMsg))
{
fileName = newFileName;
Modified = false;
@@ -621,13 +464,13 @@ public static void ShowDialog(AppDirs appDirs, bool saveOnly, ref string fileNam
private void FrmDevTemplate_Load(object sender, EventArgs e)
{
// перевод формы
- Translator.TranslateForm(this, "Scada.Comm.Devices.KpModbus.FrmDevTemplate");
+ Translator.TranslateForm(this, "Scada.Comm.Devices.Modbus.UI.FrmDevTemplate");
TranslateTree();
// настройка элементов управления
openFileDialog.InitialDirectory = appDirs.ConfigDir;
saveFileDialog.InitialDirectory = appDirs.ConfigDir;
- gbElem.Top = gbCmd.Top = gbElemGroup.Top;
+ ctrlElem.Top = ctrlCmd.Top = ctrlElemGroup.Top;
if (saveOnly)
{
@@ -638,7 +481,7 @@ private void FrmDevTemplate_Load(object sender, EventArgs e)
if (string.IsNullOrEmpty(initialFileName))
{
saveFileDialog.FileName = NewFileName;
- devTemplate = new Modbus.DeviceModel();
+ template = new DeviceTemplate();
FillTree();
}
else
@@ -660,7 +503,7 @@ private void btnNew_Click(object sender, EventArgs e)
if (CheckChanges())
{
saveFileDialog.FileName = NewFileName;
- devTemplate = new Modbus.DeviceModel();
+ template = new DeviceTemplate();
fileName = "";
SetFormTitle();
FillTree();
@@ -692,11 +535,11 @@ private void btnSave_Click(object sender, EventArgs e)
private void btnAddElemGroup_Click(object sender, EventArgs e)
{
// создание группы элементов и добавление в шаблон устройства
- Modbus.ElemGroup elemGroup = new Modbus.ElemGroup(Modbus.TableTypes.DiscreteInputs);
- elemGroup.Elems.Add(new Modbus.Elem());
- int ind = selNode != null && selNode.Tag is Modbus.ElemGroup ?
- selNode.Index + 1 : devTemplate.ElemGroups.Count;
- devTemplate.ElemGroups.Insert(ind, elemGroup);
+ ElemGroup elemGroup = new ElemGroup(TableTypes.DiscreteInputs);
+ elemGroup.Elems.Add(new Elem());
+ int ind = selNode != null && selNode.Tag is ElemGroup ?
+ selNode.Index + 1 : template.ElemGroups.Count;
+ template.ElemGroups.Insert(ind, elemGroup);
// создание узла дерева группы элементов
TreeNode grNode = NewElemGroupNode(elemGroup);
@@ -704,7 +547,7 @@ private void btnAddElemGroup_Click(object sender, EventArgs e)
UpdateSignals(grNode);
grNode.Expand();
treeView.SelectedNode = grNode;
- txtGrName.Select();
+ ctrlElemGroup.SetFocus();
// установка признака изменения
Modified = true;
@@ -713,8 +556,8 @@ private void btnAddElemGroup_Click(object sender, EventArgs e)
private void btnAddElem_Click(object sender, EventArgs e)
{
// создание элемента и добавление в шаблон устройства
- Modbus.ElemGroup elemGroup = selElemGroup == null ? selElemInfo.ElemGroup : selElemGroup;
- int maxElemCnt = Modbus.ElemGroup.GetMaxElemCnt(elemGroup.TableType);
+ ElemGroup elemGroup = selElemGroup == null ? selElemInfo.ElemGroup : selElemGroup;
+ int maxElemCnt = DataUnit.GetMaxElemCnt(elemGroup.TableType);
if (elemGroup.Elems.Count >= maxElemCnt)
{
@@ -724,8 +567,9 @@ private void btnAddElem_Click(object sender, EventArgs e)
}
ElemInfo elemInfo = new ElemInfo();
- elemInfo.Elem = new Modbus.Elem() { ElemType = elemGroup.DefElemType };
+ elemInfo.Elem = new Elem() { ElemType = elemGroup.DefElemType };
elemInfo.ElemGroup = elemGroup;
+ elemInfo.Settings = template.Sett;
int ind = selNode.Tag is ElemInfo ? selNode.Index + 1 : elemGroup.Elems.Count;
elemGroup.Elems.Insert(ind, elemInfo.Elem);
@@ -736,7 +580,7 @@ private void btnAddElem_Click(object sender, EventArgs e)
UpdateElemNodes(grNode);
UpdateSignals(grNode);
treeView.SelectedNode = elemNode;
- txtElemName.Select();
+ ctrlElem.SetFocus();
// установка признака изменения
Modified = true;
@@ -745,15 +589,15 @@ private void btnAddElem_Click(object sender, EventArgs e)
private void btnAddCmd_Click(object sender, EventArgs e)
{
// создание команды и добавление в шаблон устройства
- Modbus.Cmd cmd = new Modbus.Cmd(Modbus.TableTypes.Coils);
- int ind = selNode != null && selNode.Tag is Modbus.Cmd ? selNode.Index + 1 : devTemplate.Cmds.Count;
- devTemplate.Cmds.Insert(ind, cmd);
+ ModbusCmd modbusCmd = new ModbusCmd(TableTypes.Coils);
+ int ind = selNode != null && selNode.Tag is ModbusCmd ? selNode.Index + 1 : template.Cmds.Count;
+ template.Cmds.Insert(ind, modbusCmd);
// создание узла дерева команды
- TreeNode cmdNode = NewCmdNode(cmd);
+ TreeNode cmdNode = NewCmdNode(modbusCmd);
cmdsNode.Nodes.Insert(ind, cmdNode);
treeView.SelectedNode = cmdNode;
- txtCmdName.Select();
+ ctrlCmd.SetFocus();
// установка признака изменения
Modified = true;
@@ -768,10 +612,10 @@ private void btnMoveUp_Click(object sender, EventArgs e)
if (selElemGroup != null)
{
// перемещение группы элементов вверх
- Modbus.ElemGroup prevElemGroup = prevNode.Tag as Modbus.ElemGroup;
+ ElemGroup prevElemGroup = prevNode.Tag as ElemGroup;
- devTemplate.ElemGroups.RemoveAt(prevInd);
- devTemplate.ElemGroups.Insert(prevInd + 1, prevElemGroup);
+ template.ElemGroups.RemoveAt(prevInd);
+ template.ElemGroups.Insert(prevInd + 1, prevElemGroup);
grsNode.Nodes.RemoveAt(prevInd);
grsNode.Nodes.Insert(prevInd + 1, prevNode);
@@ -796,10 +640,10 @@ private void btnMoveUp_Click(object sender, EventArgs e)
else if (selCmd != null)
{
// перемещение команды вверх
- Modbus.Cmd prevCmd = prevNode.Tag as Modbus.Cmd;
+ ModbusCmd prevCmd = prevNode.Tag as ModbusCmd;
- devTemplate.Cmds.RemoveAt(prevInd);
- devTemplate.Cmds.Insert(prevInd + 1, prevCmd);
+ template.Cmds.RemoveAt(prevInd);
+ template.Cmds.Insert(prevInd + 1, prevCmd);
cmdsNode.Nodes.RemoveAt(prevInd);
cmdsNode.Nodes.Insert(prevInd + 1, prevNode);
@@ -822,10 +666,10 @@ private void btnMoveDown_Click(object sender, EventArgs e)
if (selElemGroup != null)
{
// перемещение группы элементов вниз
- Modbus.ElemGroup nextElemGroup = nextNode.Tag as Modbus.ElemGroup;
+ ElemGroup nextElemGroup = nextNode.Tag as ElemGroup;
- devTemplate.ElemGroups.RemoveAt(nextInd);
- devTemplate.ElemGroups.Insert(nextInd - 1, nextElemGroup);
+ template.ElemGroups.RemoveAt(nextInd);
+ template.ElemGroups.Insert(nextInd - 1, nextElemGroup);
grsNode.Nodes.RemoveAt(nextInd);
grsNode.Nodes.Insert(nextInd - 1, nextNode);
@@ -850,10 +694,10 @@ private void btnMoveDown_Click(object sender, EventArgs e)
else if (selCmd != null)
{
// перемещение команды вниз
- Modbus.Cmd nextCmd = nextNode.Tag as Modbus.Cmd;
+ ModbusCmd nextCmd = nextNode.Tag as ModbusCmd;
- devTemplate.Cmds.RemoveAt(nextInd);
- devTemplate.Cmds.Insert(nextInd - 1, nextCmd);
+ template.Cmds.RemoveAt(nextInd);
+ template.Cmds.Insert(nextInd - 1, nextCmd);
cmdsNode.Nodes.RemoveAt(nextInd);
cmdsNode.Nodes.Insert(nextInd - 1, nextNode);
@@ -872,13 +716,13 @@ private void btnDelete_Click(object sender, EventArgs e)
if (selElemGroup != null)
{
// удаление группы элементов
- devTemplate.ElemGroups.Remove(selElemGroup);
+ template.ElemGroups.Remove(selElemGroup);
grsNode.Nodes.Remove(selNode);
}
else if (selElemInfo != null)
{
// удаление элемента
- Modbus.ElemGroup elemGroup = selElemInfo.ElemGroup;
+ ElemGroup elemGroup = selElemInfo.ElemGroup;
elemGroup.Elems.Remove(selElemInfo.Elem);
TreeNode grNode = selNode.Parent;
grsNode.Nodes.Remove(selNode);
@@ -890,7 +734,7 @@ private void btnDelete_Click(object sender, EventArgs e)
else if (selCmd != null)
{
// удаление команды
- devTemplate.Cmds.Remove(selCmd);
+ template.Cmds.Remove(selCmd);
cmdsNode.Nodes.Remove(selNode);
}
@@ -898,15 +742,27 @@ private void btnDelete_Click(object sender, EventArgs e)
Modified = true;
}
+ private void btnEditSettings_Click(object sender, EventArgs e)
+ {
+ // редактирование настроек шаблона
+ if (FrmTemplateSettings.ShowDialog(template.Sett))
+ {
+ // полное обновление дерева
+ FillTree();
+ // установка признака изменения
+ Modified = true;
+ }
+ }
+
private void treeView_AfterSelect(object sender, TreeViewEventArgs e)
{
// отображение выбранного объекта и его свойств
selNode = e.Node;
object tag = selNode.Tag;
- selElemGroup = tag as Modbus.ElemGroup;
+ selElemGroup = tag as ElemGroup;
selElemInfo = tag as ElemInfo;
- selCmd = tag as Modbus.Cmd;
+ selCmd = tag as ModbusCmd;
if (selElemGroup != null)
ShowElemGroupProps(selElemGroup);
@@ -930,261 +786,90 @@ private void treeView_AfterSelect(object sender, TreeViewEventArgs e)
btnDelete.Enabled = nodeIsOk;
}
-
- private void chkGrActive_CheckedChanged(object sender, EventArgs e)
- {
- // изменение наименования группы элементов
- if (procChangedEv && selElemGroup != null)
- {
- selElemGroup.Active = chkGrActive.Checked;
- Modified = true;
- }
- }
-
- private void txtGrName_TextChanged(object sender, EventArgs e)
- {
- // изменение наименования группы элементов
- if (procChangedEv && selElemGroup != null)
- {
- selElemGroup.Name = txtGrName.Text;
- UpdateElemGroupNode();
- Modified = true;
- }
- }
-
- private void cbGrTableType_SelectedIndexChanged(object sender, EventArgs e)
+ private void ctrlElemGroup_ObjectChanged(object sender, ObjectChangedEventArgs e)
{
- // изменение типа таблицы данных группы элементов
- if (procChangedEv && selElemGroup != null)
- {
- Modbus.TableTypes tableType = (Modbus.TableTypes)cbGrTableType.SelectedIndex;
- int maxElemCnt = Modbus.ElemGroup.GetMaxElemCnt(tableType);
-
- bool cancel = selElemGroup.Elems.Count > maxElemCnt &&
- MessageBox.Show(string.Format(KpPhrases.ElemRemoveWarning, maxElemCnt), CommonPhrases.QuestionCaption,
- MessageBoxButtons.YesNoCancel, MessageBoxIcon.Question) != DialogResult.Yes;
-
- if (cancel)
- {
- procChangedEv = false;
- cbGrTableType.SelectedIndex = (int)selElemGroup.TableType;
- procChangedEv = true;
- }
- else
- {
- // ограничение макс. количества элементов в группе
- if (numGrElemCnt.Value > maxElemCnt)
- numGrElemCnt.Value = maxElemCnt;
- numGrElemCnt.Maximum = maxElemCnt;
-
- // установка типа таблицы данных
- selElemGroup.TableType = tableType;
-
- // установка типа элементов группы по умолчанию
- Modbus.ElemTypes elemType = selElemGroup.DefElemType;
- foreach (Modbus.Elem elem in selElemGroup.Elems)
- elem.ElemType = elemType;
+ // установка признака изменения конфигурации
+ Modified = true;
- // обновление узлов дерева
- UpdateElemGroupNode();
- UpdateElemNodes();
+ // отображение изменений группы элементов в дереве
+ TreeUpdateTypes treeUpdateTypes = (TreeUpdateTypes)e.ChangeArgument;
- Modified = true;
- }
- }
- }
+ if (treeUpdateTypes.HasFlag(TreeUpdateTypes.CurrentNode))
+ UpdateElemGroupNode();
- private void numGrAddress_ValueChanged(object sender, EventArgs e)
- {
- // изменение адреса начального элемента в группе
- if (procChangedEv && selElemGroup != null)
- {
- selElemGroup.Address = (ushort)(numGrAddress.Value - 1);
+ if (treeUpdateTypes.HasFlag(TreeUpdateTypes.ChildNodes))
UpdateElemNodes();
- Modified = true;
- }
- }
- private void numGrElemCnt_ValueChanged(object sender, EventArgs e)
- {
- // изменение количества элементов в группе
- if (procChangedEv && selElemGroup != null)
+ if (treeUpdateTypes.HasFlag(TreeUpdateTypes.UpdateSignals))
{
treeView.BeginUpdate();
- int elemCnt = selElemGroup.Elems.Count;
- int newElemCnt = (int)numGrElemCnt.Value;
+ int oldElemCnt = selNode.Nodes.Count;
+ int newElemCnt = selElemGroup.Elems.Count;
- if (elemCnt < newElemCnt)
+ if (oldElemCnt < newElemCnt)
{
- // добавление новых элементов
- Modbus.ElemTypes elemType = selElemGroup.DefElemType;
- ushort elemLen = (ushort)Modbus.Elem.GetElemLength(elemType);
+ // добавление узлов дерева для новых элементов
ushort elemAddr = selElemGroup.Address;
for (int elemInd = 0; elemInd < newElemCnt; elemInd++)
{
- if (elemInd < elemCnt)
- {
- elemAddr += (ushort)selElemGroup.Elems[elemInd].Length;
- }
- else
+ Elem elem = selElemGroup.Elems[elemInd];
+
+ if (elemInd >= oldElemCnt)
{
- ElemInfo elemInfo = new ElemInfo();
- elemInfo.Elem = new Modbus.Elem() { ElemType = elemType };
- elemInfo.Address = elemAddr;
- elemInfo.ElemGroup = selElemGroup;
+ ElemInfo elemInfo = new ElemInfo()
+ {
+ Elem = elem,
+ ElemGroup = selElemGroup,
+ Settings = template.Sett,
+ Address = elemAddr
+ };
- selElemGroup.Elems.Add(elemInfo.Elem);
selNode.Nodes.Add(NewElemNode(elemInfo));
- elemAddr += elemLen;
}
+
+ elemAddr += (ushort)elem.Length;
}
}
- else if (elemCnt > newElemCnt)
+ else if (oldElemCnt > newElemCnt)
{
- // удаление лишних элементов
- for (int i = newElemCnt; i < elemCnt; i++)
+ // удаление лишних узлов дерева
+ for (int i = newElemCnt; i < oldElemCnt; i++)
{
- selElemGroup.Elems.RemoveAt(newElemCnt);
selNode.Nodes.RemoveAt(newElemCnt);
}
}
UpdateSignals(selNode);
- Modified = true;
treeView.EndUpdate();
}
}
- private void txtElemName_TextChanged(object sender, EventArgs e)
+ private void ctrlElem_ObjectChanged(object sender, ObjectChangedEventArgs e)
{
- // изменение наименования элемента
- if (procChangedEv && selElemInfo != null)
- {
- selElemInfo.Elem.Name = txtElemName.Text;
- selNode.Text = selElemInfo.Caption;
- Modified = true;
- }
- }
+ // установка признака изменения конфигурации
+ Modified = true;
- private void rbType_CheckedChanged(object sender, EventArgs e)
- {
- // изменение типа элемента
- if (procChangedEv && selElemInfo != null)
- {
- Modbus.Elem elem = selElemInfo.Elem;
-
- if (rbUShort.Checked)
- elem.ElemType = Modbus.ElemTypes.UShort;
- else if (rbShort.Checked)
- elem.ElemType = Modbus.ElemTypes.Short;
- else if (rbUInt.Checked)
- elem.ElemType = Modbus.ElemTypes.UInt;
- else if (rbInt.Checked)
- elem.ElemType = Modbus.ElemTypes.Int;
- else if (rbULong.Checked)
- elem.ElemType = Modbus.ElemTypes.ULong;
- else if (rbLong.Checked)
- elem.ElemType = Modbus.ElemTypes.Long;
- else if (rbFloat.Checked)
- elem.ElemType = Modbus.ElemTypes.Float;
- else if (rbDouble.Checked)
- elem.ElemType = Modbus.ElemTypes.Double;
- else
- elem.ElemType = Modbus.ElemTypes.Bool;
+ // отображение изменений элемента в дереве
+ TreeUpdateTypes treeUpdateTypes = (TreeUpdateTypes)e.ChangeArgument;
- txtElemAddress.Text = selElemInfo.AddressRange;
+ if (treeUpdateTypes.HasFlag(TreeUpdateTypes.CurrentNode))
selNode.Text = selElemInfo.Caption;
- UpdateElemNodes(selNode.Parent);
- Modified = true;
- }
- }
-
- private void txtByteOrder_TextChanged(object sender, EventArgs e)
- {
- // изменение порядка байт элемента
- if (procChangedEv && selElemInfo != null)
- {
- selElemInfo.Elem.ByteOrderStr = txtByteOrder.Text;
- Modified = true;
- }
- }
-
-
- private void cbCmdTableType_SelectedIndexChanged(object sender, EventArgs e)
- {
- // изменение типа таблицы данных команды
- if (procChangedEv && selCmd != null)
- {
- selCmd.TableType = cbCmdTableType.SelectedIndex == 0 ?
- Modbus.TableTypes.Coils : Modbus.TableTypes.HoldingRegisters;
-
- // ограничение макс. количества элементов в группе
- int maxElemCnt = Modbus.ElemGroup.GetMaxElemCnt(selCmd.TableType);
- if (numGrElemCnt.Value > maxElemCnt)
- numGrElemCnt.Value = maxElemCnt;
- numGrElemCnt.Maximum = maxElemCnt;
-
- // обновление узла дерева команды
- UpdateCmdNode();
-
- Modified = true;
- }
- }
-
- private void chkCmdMultiple_CheckedChanged(object sender, EventArgs e)
- {
- // изменение множественности команды
- if (procChangedEv && selCmd != null)
- {
- selCmd.Multiple = chkCmdMultiple.Checked;
- numCmdElemCnt.Enabled = selCmd.Multiple;
- if (!selCmd.Multiple)
- numCmdElemCnt.Value = 1;
- Modified = true;
- }
- }
- private void numCmdAddress_ValueChanged(object sender, EventArgs e)
- {
- // изменение адреса команды
- if (procChangedEv && selCmd != null)
- {
- selCmd.Address = (ushort)(numCmdAddress.Value - 1);
- UpdateCmdNode();
- Modified = true;
- }
+ if (treeUpdateTypes.HasFlag(TreeUpdateTypes.NextSiblings))
+ UpdateElemNodes(selNode.Parent);
}
- private void numCmdElemCnt_ValueChanged(object sender, EventArgs e)
+ private void ctrlCmd_ObjectChanged(object sender, ObjectChangedEventArgs e)
{
- // изменение количества элементов команды
- if (procChangedEv && selCmd != null)
- {
- selCmd.ElemCnt = (int)numCmdElemCnt.Value;
- Modified = true;
- }
- }
+ // установка признака изменения конфигурации
+ Modified = true;
- private void numCmdNum_ValueChanged(object sender, EventArgs e)
- {
- // изменение номера команды КП
- if (procChangedEv && selCmd != null)
- {
- selCmd.CmdNum = (int)numCmdNum.Value;
- Modified = true;
- }
- }
+ // отображение изменений команды в дереве
+ TreeUpdateTypes treeUpdateTypes = (TreeUpdateTypes)e.ChangeArgument;
- private void txtCmdName_TextChanged(object sender, EventArgs e)
- {
- // изменение наименования команды
- if (procChangedEv && selCmd != null)
- {
- selCmd.Name = txtCmdName.Text;
+ if (treeUpdateTypes.HasFlag(TreeUpdateTypes.CurrentNode))
UpdateCmdNode();
- Modified = true;
- }
}
}
}
diff --git a/ScadaComm/OpenKPs/KpModbus/FrmDevTemplate.resx b/ScadaComm/OpenKPs/KpModbus/Modbus/UI/FrmDevTemplate.resx
similarity index 81%
rename from ScadaComm/OpenKPs/KpModbus/FrmDevTemplate.resx
rename to ScadaComm/OpenKPs/KpModbus/Modbus/UI/FrmDevTemplate.resx
index bb86ef3a6..359502d2e 100644
--- a/ScadaComm/OpenKPs/KpModbus/FrmDevTemplate.resx
+++ b/ScadaComm/OpenKPs/KpModbus/Modbus/UI/FrmDevTemplate.resx
@@ -124,8 +124,8 @@
AAEAAAD/////AQAAAAAAAAAMAgAAAFdTeXN0ZW0uV2luZG93cy5Gb3JtcywgVmVyc2lvbj00LjAuMC4w
LCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODkFAQAAACZTeXN0
- ZW0uV2luZG93cy5Gb3Jtcy5JbWFnZUxpc3RTdHJlYW1lcgEAAAAERGF0YQcCAgAAAAkDAAAADwMAAAD8
- CgAAAk1TRnQBSQFMAgEBBAEAAaABAAGgAQABEAEAARABAAT/AQkBAAj/AUIBTQE2AQQGAAE2AQQCAAEo
+ ZW0uV2luZG93cy5Gb3Jtcy5JbWFnZUxpc3RTdHJlYW1lcgEAAAAERGF0YQcCAgAAAAkDAAAADwMAAAB2
+ DAAAAk1TRnQBSQFMAgEBBQEAAfgBAAH4AQABEAEAARABAAT/AQkBAAj/AUIBTQE2AQQGAAE2AQQCAAEo
AwABQAMAASADAAEBAQABCAYAAQgYAAGAAgABgAMAAoABAAGAAwABgAEAAYABAAKAAgADwAEAAcAB3AHA
AQAB8AHKAaYBAAEzBQABMwEAATMBAAEzAQACMwIAAxYBAAMcAQADIgEAAykBAANVAQADTQEAA0IBAAM5
AQABgAF8Af8BAAJQAf8BAAGTAQAB1gEAAf8B7AHMAQABxgHWAe8BAAHWAucBAAGQAakBrQIAAf8BMwMA
@@ -153,25 +153,32 @@
AcwBAAH/AZkB/wEAAf8BzAIAAf8BzAEzAQAB/wHMAWYBAAH/AcwBmQEAAf8CzAEAAf8BzAH/AQAC/wEz
AQABzAH/AWYBAAL/AZkBAAL/AcwBAAJmAf8BAAFmAf8BZgEAAWYC/wEAAf8CZgEAAf8BZgH/AQAC/wFm
AQABIQEAAaUBAANfAQADdwEAA4YBAAOWAQADywEAA7IBAAPXAQAD3QEAA+MBAAPqAQAD8QEAA/gBAAHw
- AfsB/wEAAaQCoAEAA4ADAAH/AgAB/wMAAv8BAAH/AwAB/wEAAf8BAAL/AgAD//8A/wD/AP8AEAAB/z4A
- Af8BpgH/HAAB9AGCAfQdAAH/Aa0BtAGmAf8IAAH/CwABoAEaAZkB7wH3AQAB9AGwAoIB9BoAApEBtAHc
- AdsBtAGmAf8GAAH/AaYB/w8AAfMCsAOCDQAB9AFnAfMKAAGRAQAB/wG0AdwB2wG0AaYB/wQAAf8BrQGz
- AaYB/wcAAaABGgGZAQcB7wH3AQADsAOCDAAB9AGNAYwBZwH0CQABkQIAAf8BtAHcAa0B/wQAAf8BrQHb
- AdUBswGmAf8NAAKwAtgCggsAAfQBjQGwAWcBggFnAfQEAAH0AwABkQMAAfQBtAH/BAAB/wGtAdwC2wHV
- AbMBpgH/BwABoAGZAe8B9wEAAbAE2AGCBAABoAEaAZkB7wH3AQAB8wGNArABZwKCAWcB/wIAAfQBKgH0
- AgABkQIAAf8BggH0BAAB/wG0A9wC2wHVAbMBpgH/CwABsAHeAtgBsAHeAYIB9AgAAY0DsAG2AoIBZwH/
- AQAB9AEqAVkBKgH0AQABkQEAAf8BqgGwAYIB/wQAAf8BtAPcAtsB1QGzAaYB/wgAAaABGgG8AbAB2AGw
- Ad4BsAKCAfQBoAEaAZkBBwHvAfcBAAGCArAD2AGNAWcC/wEqA1kBKgORAbAC2AGwAYIB/wQAAf8BtAPc
- AtsB1QGzAaYB/woAAfQBsAHeArADggcAAY0BsATYAbYBggH/AVIBmgJ6AlkBKgH0AQAB/wGwAtgBsAGC
- Af8EAAH/AbQD3ALbAa0B/wYAAaABGgGZAQcB7wH3AQADsAOCAgABoAGZAe8B9wH/ArYE2AG2AfQBAAH/
- ATEBmgJ6AlkBKgH0AQAB/wGwAdgBsAH/BgAB/wG0A9wBtAH/DgACsALYAoIHAAHzAbYB3gLYAbYB9AMA
- AfQBMQGaAnoCWQEqAfQBAAH/AbAB/wgAAf8BtAHcAbQB/woAAaABmQHvAfcBAAGwBNgBgggAAfQDtgH0
- BQAB9AExAZoCegExAfQDAAH/CgAB/wG0Af8QAAGwAd4C2AGwAfQJAAH0AbYB9AcAAfQBMQGaATEB9BAA
- Af8RAAH/AbAB2AGwAfQLAAH/CQAB9AFSAfQkAAH/AbAB9BIAAUIBTQE+BwABPgMAASgDAAFAAwABIAMA
- AQEBAAEBBgABARYAA/+BAAH/Ae8H/wHHA/8BjwP/AYMB/QH/AcEBBwL/Af4BAQH4Af8B/gEHAf8BxwH+
- AYAB8AF/AQIBBwH/AYMB/gHBAeABPwH+AQcB/wEBAe4B4wHAAR8BwgEHAYIBAAHGAccBgAEPAf4BAQH+
- AQABggGDAcABBwH4AQABAgIAAQEB4AEDAf8BAAH+AgABgAHwAQcB4AFAAcABAQEAAUEB+AEPAf8BwAH+
- AQMBgAEjAfwBHwH4AUAB/wEHAcABdwH+AT8B/wHAAf8BjwHgAv8BfwH/AcEB/wHfAfEE/wHjAv8L
+ AfsB/wEAAaQCoAEAA4ADAAH/AgAB/wMAAv8BAAH/AwAB/wEAAf8BAAL/AgAD/8sAAfQBZwHzPAAB9AGN
+ AYwBZwH0OgAB9AGNAbABZwGCAWcB9DIAAaABGgGZAe8B9wEAAfMBjQKwAWcCggFnAf83AAGNA7ABtgKC
+ AWcB/zAAAaABGgGZAQcB7wH3AQABggKwA9gBjQFnAf83AAGNAbAE2AG2AYIB/zIAAaABmQHvAfcB/wK2
+ BNgBtgH0OAAB8wG2Ad4C2AG2AfQ6AAH0A7YB9DwAAfQBtgH0PgAB/4AAAf8PAAH0LgAB/wGmAf8NAAH0
+ AREB9BwAAfQBggH0DQAB/wGtAbQBpgH/CwAB9AETAewBEQH0CAAB/wsAAaABGgGZAe8B9wEAAfQBsAKC
+ AfQKAAKRAbQB3AHbAbQBpgH/CAACbQHsAQcBkgHsAREB9AYAAf8BpgH/DwAB8wKwA4IKAAGRAQAB/wG0
+ AdwB2wG0AaYB/wcAAW0BAAH0AewBBwGSAewBEQH0BAAB/wGtAbMBpgH/BwABoAEaAZkBBwHvAfcBAAOw
+ A4IKAAGRAgAB/wG0AdwBrQH/CAABbQIAAfQB7AEHAeoB9AQAAf8BrQHbAdUBswGmAf8NAAKwAtgCggYA
+ AfQDAAGRAwAB9AG0Af8FAAH0AwABbQMAAfMB7AH0BAAB/wGtAdwC2wHVAbMBpgH/BwABoAGZAe8B9wEA
+ AbAE2AGCBQAB9AEqAfQCAAGRAgAB/wGCAfQFAAH0AW0B9AIAAW0CAAH0ARQB8wQAAf8BtAPcAtsB1QGz
+ AaYB/wsAAbAB3gLYAbAB3gGCAfQCAAH0ASoBWQEqAfQBAAGRAQAB/wGqAbABggH/AwAB9AFtAe8BbQH0
+ AQABbQEAAfQB6gHsARQB9AQAAf8BtAPcAtsB1QGzAaYB/wgAAaABGgG8AbAB2AGwAd4BsAKCAfQB/wEq
+ A1kBKgORAbAC2AGwAYIB/wEAAfQBbQIHAe8BEgNtAewBBwHvAewBFAH0BAAB/wG0A9wC2wHVAbMBpgH/
+ CgAB9AGwAd4CsAOCAVIBmgJ6AlkBKgH0AQAB/wGwAtgBsAGCAf8B9wHxAfACBwHvARIB9AEAAfQB7AEH
+ Ae8B7AEUAfQEAAH/AbQD3ALbAa0B/wYAAaABGgGZAQcB7wH3AQADsAOCAf8BMQGaAnoCWQEqAfQBAAH/
+ AbAB2AGwAf8BAAH0AfcB8QG8AgcB7wESAfQBAAH0AewBBwHsAfQGAAH/AbQD3AG0Af8OAAKwAtgCggEA
+ AfQBMQGaAnoCWQEqAfQBAAH/AbAB/wMAAfQB9wHxAbwCBwHvARIB9AEAAfQB7AH0CAAB/wG0AdwBtAH/
+ CgABoAGZAe8B9wEAAbAE2AGCAgAB9AExAZoCegExAfQDAAH/BQAB9AH3AfEBvAEHAewB9AMAAfQKAAH/
+ AbQB/xAAAbAB3gLYAbAB9AMAAfQBMQGaATEB9AsAAfQB9wHxAewB9BAAAf8RAAH/AbAB2AGwAfQFAAH0
+ AVIB9A0AAfQB9wH0JAAB/wGwAfQCAAFCAU0BPgcAAT4DAAEoAwABQAMAASADAAEBAQABAQYAAQEWAAP/
+ AQAC/wYAAv8GAAL/BgAB/wHHBgAB/wGDBgAB/wEBBgABggcAAf4HAAECBwAB/gcAAcABAQYAAf4BAwYA
+ Af8BBwYAAf8BjwYAAf8B3wYAAv8GAAH/Ae8B/wHvBf8BxwH/AccD/wGPAf8BgwH/AYMB/QH/AcEBBwH+
+ AQEB/gEBAfgB/wH+AQcB/gGAAf4BgAHwAX8BAgEHAf4BwQH+AcEB4AE/Af4BBwHuAeMB7gHjAcABHwHC
+ AQcBxgHHAcYBxwGAAQ8B/gEBAYIBgwGCAYMBwAEHAfgCAAEBAQABAQHgAQMB/wIAAYABAAGAAfABBwHg
+ AUABAAFBAQABQQH4AQ8B/wHAAYABIwGAASMB/AEfAfgBQAHAAXcBwAF3Af4BPwH/AcAB4AH/AeAC/wF/
+ Af8BwQHxAf8B8QT/AeML
@@ -297,16 +304,30 @@
iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8
- YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAH2SURBVDhPrZM9aBRBFMdHo5K9JPsxm7skkngfxqCnHt7u
- zO2p4MUIKYwWcljYpLhCsRFreysrSWEjljaCIY0IBuwFicYcggFBBMFNI96Zwtl9LzN7k+Jyhgj6gy3m
- /f/7dt7Hkv8CcutM7DvLUHFnkJD9Ovx34HXSB75zC27OYTh/SQCn11RMy11gjRxAZhWk544OdYLAaCPm
- 9AU0ZjFseJE839uZBGvZfnXDcH5GxMx+rMMdwBsegwqtJknqDOHGeYy5swSlkYFEr44bcS2/FNZzQnoe
- YDE9mLy4EyySQ/Lrd8PZrFCJpPkpBHZJJlvQSRfQdyxt/zOyifsgoCcij64kJV05/Lt9udSSTX6ubqJt
- e4O+Ox3W8wKunkbh0c9QNamW9gYDKxdxurrBKWyWbWyVTRS+80nLu6N2AMp2VvhWc6M4Gn07ObQM3GWq
- ud9PmQjcvq1K1PZekKdHoyCz0r6Yw+Zkav3VSN+0moR6YkYfvcsaYrVgMG3vRs05rmaetc4OtN9OGD/f
- HDHqWtI7QM2vU6n1ZqH/5aJDJnoaChV7bjPI4PuCgR/yqcXtHdimU1568vX4wV9rx4xK18qr+csZ3/9y
- fBDXjhofgQ9PdRk0ajt/lMwnwFzeo8tt9GLmPJSNugDn3KHdmpX8D/5YSh//FUK2ALq80b/U1F6dAAAA
- AElFTkSuQmCC
+ YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAH3SURBVDhPrZM/TBRBFMYHUcMesH9muYNLwIUDCZ5y8W5n
+ bk9NPMSEQrQgFwobiis0NMbanorKUNgYSxoTCY0hgcSexKDIxUQSF2M0sTPeSeHuvsfM3VAcB8FEf8kW
+ 8963b9987y35LyA3rkautQF5exIJOaPCfwfOknZwrYfwYBr9udsBcDojYyrdBBbJWWRGSmgeqVAjCIyW
+ I05fQ3kK/XI6FOcnR4tg0emQHfpzk0HEzOcq3AByPUnI00K9SIkh3L+BEbdWIdPbWc8X+rWoOLTql5xA
+ aBYxHe+qv3gUTJPz4uuP/SknkIWEeBk8MyOKLamiS+hahpIfjzCxDTx6KczRLXmlb3eTf2p3MlVh8ivZ
+ iZKdDrr2hGwZ7o1jkKOfoaBTlTod9IzBkNPtPU5hP2tiNatj4FqfVPpk5A5A1nQC16jspfvC75e7N4Db
+ TJr744qOwM15eUUlbwV5vC/0Elu1W4NYGYntrve2T8hJyCdi9Nk7Rwu2UxpT8mbknKNC4mX1Wmft7YD2
+ a/OCVlIptQNU/zoa262kOtZWLDLQYijkzel9L4HvUxp+GIqtHO7AIY3rxUfe9J/7vXNRyzetvJy/mPHC
+ l7Eu3BnWPgLvGW0SKOR2/szoL4DZvCUvtjEXMeupMOomXLe7TzKr/j+4yZg6/iuEHACiB9FWdw651wAA
+ AABJRU5ErkJggg==
+
+
+
+
+ iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8
+ YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAHISURBVDhPtY5dS+NAGIUDgv9L8Kr/RURBYVmhJmD9orHY
+ pikBFYrRGLW3Ll7trvVGiRaR0GiL0fqFxaKT0lbDMM7RCa03XumBhzl533NmIv2YDMtS9bU1AuDF+Gvp
+ phnLra8XcGq82A5DBuBzljXA5yZOEf+srGkOrmxvB5WLi3BlaytIr66S1usrA/DLm5uBhx3PICtqXWXy
+ eavMA82XF3Z5d0cjD9xqNfRvbyk85siKWlfq0tJgLp8PqtfX9LndZsDnF4HoGztkkBW1DyUNQ03qOgGn
+ /LVGq8X+FIudOcMogZ29vQ5mx54XRjl0RF2SpjIZUm82WYRXq9HpbNaJ23a/bdt9s7p+UL66or0ZdERd
+ kuR0mtwTwiI8/qtTi4suyoCHHdf3aW8GHVHnFywsqPFUioAD1w1vnp7Yxu5uR06lHACP2f7JSRjl0BH1
+ D00kk7GEpgVHZ2e01mgwUKpUKIi+sUMGWVHr6tfMTKHIX/AfH9lhuUz/l0rvHvx1nBAzeGSQFbWuxhKJ
+ mKxpzX+8+Ht+PhhXFFKt1xmAxww7ZJAVtc8aUZTYqKIUcA5PTpLzhwcG4Ht3Iv61RmRZHYrHCYAX4++W
+ JL0BLnjU+JfJ36gAAAAASUVORK5CYII=
diff --git a/ScadaComm/OpenKPs/KpModbus/Modbus/UI/FrmTemplateSettings.Designer.cs b/ScadaComm/OpenKPs/KpModbus/Modbus/UI/FrmTemplateSettings.Designer.cs
new file mode 100644
index 000000000..833e03498
--- /dev/null
+++ b/ScadaComm/OpenKPs/KpModbus/Modbus/UI/FrmTemplateSettings.Designer.cs
@@ -0,0 +1,277 @@
+namespace Scada.Comm.Devices.Modbus.UI
+{
+ partial class FrmTemplateSettings
+ {
+ ///
+ /// Required designer variable.
+ ///
+ private System.ComponentModel.IContainer components = null;
+
+ ///
+ /// Clean up any resources being used.
+ ///
+ /// true if managed resources should be disposed; otherwise, false.
+ protected override void Dispose(bool disposing)
+ {
+ if (disposing && (components != null))
+ {
+ components.Dispose();
+ }
+ base.Dispose(disposing);
+ }
+
+ #region Windows Form Designer generated code
+
+ ///
+ /// Required method for Designer support - do not modify
+ /// the contents of this method with the code editor.
+ ///
+ private void InitializeComponent()
+ {
+ this.rbZeroBased = new System.Windows.Forms.RadioButton();
+ this.rbOneBased = new System.Windows.Forms.RadioButton();
+ this.pnlBase = new System.Windows.Forms.Panel();
+ this.pnlNotation = new System.Windows.Forms.Panel();
+ this.rbDec = new System.Windows.Forms.RadioButton();
+ this.rbHex = new System.Windows.Forms.RadioButton();
+ this.lblDefByteOrderExample = new System.Windows.Forms.Label();
+ this.txtDefByteOrder2 = new System.Windows.Forms.TextBox();
+ this.btnCancel = new System.Windows.Forms.Button();
+ this.btnOK = new System.Windows.Forms.Button();
+ this.gbAddressing = new System.Windows.Forms.GroupBox();
+ this.gbDefByteOrder = new System.Windows.Forms.GroupBox();
+ this.lblDefByteOrder8 = new System.Windows.Forms.Label();
+ this.txtDefByteOrder8 = new System.Windows.Forms.TextBox();
+ this.lblDefByteOrder4 = new System.Windows.Forms.Label();
+ this.txtDefByteOrder4 = new System.Windows.Forms.TextBox();
+ this.lblDefByteOrder2 = new System.Windows.Forms.Label();
+ this.pnlBase.SuspendLayout();
+ this.pnlNotation.SuspendLayout();
+ this.gbAddressing.SuspendLayout();
+ this.gbDefByteOrder.SuspendLayout();
+ this.SuspendLayout();
+ //
+ // rbZeroBased
+ //
+ this.rbZeroBased.AutoSize = true;
+ this.rbZeroBased.Location = new System.Drawing.Point(0, 0);
+ this.rbZeroBased.Name = "rbZeroBased";
+ this.rbZeroBased.Size = new System.Drawing.Size(79, 17);
+ this.rbZeroBased.TabIndex = 0;
+ this.rbZeroBased.TabStop = true;
+ this.rbZeroBased.Text = "Zero-based";
+ this.rbZeroBased.UseVisualStyleBackColor = true;
+ this.rbZeroBased.CheckedChanged += new System.EventHandler(this.control_Changed);
+ //
+ // rbOneBased
+ //
+ this.rbOneBased.AutoSize = true;
+ this.rbOneBased.Location = new System.Drawing.Point(120, 0);
+ this.rbOneBased.Name = "rbOneBased";
+ this.rbOneBased.Size = new System.Drawing.Size(77, 17);
+ this.rbOneBased.TabIndex = 1;
+ this.rbOneBased.TabStop = true;
+ this.rbOneBased.Text = "One-based";
+ this.rbOneBased.UseVisualStyleBackColor = true;
+ //
+ // pnlBase
+ //
+ this.pnlBase.Controls.Add(this.rbZeroBased);
+ this.pnlBase.Controls.Add(this.rbOneBased);
+ this.pnlBase.Location = new System.Drawing.Point(13, 19);
+ this.pnlBase.Name = "pnlBase";
+ this.pnlBase.Size = new System.Drawing.Size(230, 17);
+ this.pnlBase.TabIndex = 0;
+ //
+ // pnlNotation
+ //
+ this.pnlNotation.Controls.Add(this.rbDec);
+ this.pnlNotation.Controls.Add(this.rbHex);
+ this.pnlNotation.Location = new System.Drawing.Point(13, 42);
+ this.pnlNotation.Name = "pnlNotation";
+ this.pnlNotation.Size = new System.Drawing.Size(230, 17);
+ this.pnlNotation.TabIndex = 1;
+ //
+ // rbDec
+ //
+ this.rbDec.AutoSize = true;
+ this.rbDec.Location = new System.Drawing.Point(0, 0);
+ this.rbDec.Name = "rbDec";
+ this.rbDec.Size = new System.Drawing.Size(63, 17);
+ this.rbDec.TabIndex = 0;
+ this.rbDec.TabStop = true;
+ this.rbDec.Text = "Decimal";
+ this.rbDec.UseVisualStyleBackColor = true;
+ this.rbDec.CheckedChanged += new System.EventHandler(this.control_Changed);
+ //
+ // rbHex
+ //
+ this.rbHex.AutoSize = true;
+ this.rbHex.Location = new System.Drawing.Point(120, 0);
+ this.rbHex.Name = "rbHex";
+ this.rbHex.Size = new System.Drawing.Size(86, 17);
+ this.rbHex.TabIndex = 1;
+ this.rbHex.TabStop = true;
+ this.rbHex.Text = "Hexadecimal";
+ this.rbHex.UseVisualStyleBackColor = true;
+ //
+ // lblDefByteOrderExample
+ //
+ this.lblDefByteOrderExample.AutoSize = true;
+ this.lblDefByteOrderExample.ForeColor = System.Drawing.SystemColors.GrayText;
+ this.lblDefByteOrderExample.Location = new System.Drawing.Point(10, 133);
+ this.lblDefByteOrderExample.Name = "lblDefByteOrderExample";
+ this.lblDefByteOrderExample.Size = new System.Drawing.Size(118, 13);
+ this.lblDefByteOrderExample.TabIndex = 6;
+ this.lblDefByteOrderExample.Text = "For example, 01234567";
+ //
+ // txtDefByteOrder2
+ //
+ this.txtDefByteOrder2.Location = new System.Drawing.Point(13, 32);
+ this.txtDefByteOrder2.Name = "txtDefByteOrder2";
+ this.txtDefByteOrder2.Size = new System.Drawing.Size(234, 20);
+ this.txtDefByteOrder2.TabIndex = 1;
+ this.txtDefByteOrder2.TextChanged += new System.EventHandler(this.control_Changed);
+ //
+ // btnCancel
+ //
+ this.btnCancel.DialogResult = System.Windows.Forms.DialogResult.Cancel;
+ this.btnCancel.Location = new System.Drawing.Point(197, 252);
+ this.btnCancel.Name = "btnCancel";
+ this.btnCancel.Size = new System.Drawing.Size(75, 23);
+ this.btnCancel.TabIndex = 3;
+ this.btnCancel.Text = "Cancel";
+ this.btnCancel.UseVisualStyleBackColor = true;
+ //
+ // btnOK
+ //
+ this.btnOK.DialogResult = System.Windows.Forms.DialogResult.OK;
+ this.btnOK.Location = new System.Drawing.Point(116, 252);
+ this.btnOK.Name = "btnOK";
+ this.btnOK.Size = new System.Drawing.Size(75, 23);
+ this.btnOK.TabIndex = 2;
+ this.btnOK.Text = "OK";
+ this.btnOK.UseVisualStyleBackColor = true;
+ //
+ // gbAddressing
+ //
+ this.gbAddressing.Controls.Add(this.pnlBase);
+ this.gbAddressing.Controls.Add(this.pnlNotation);
+ this.gbAddressing.Location = new System.Drawing.Point(12, 12);
+ this.gbAddressing.Name = "gbAddressing";
+ this.gbAddressing.Padding = new System.Windows.Forms.Padding(10, 3, 10, 10);
+ this.gbAddressing.Size = new System.Drawing.Size(260, 72);
+ this.gbAddressing.TabIndex = 0;
+ this.gbAddressing.TabStop = false;
+ this.gbAddressing.Text = "Addressing";
+ //
+ // gbDefByteOrder
+ //
+ this.gbDefByteOrder.Controls.Add(this.lblDefByteOrder8);
+ this.gbDefByteOrder.Controls.Add(this.txtDefByteOrder8);
+ this.gbDefByteOrder.Controls.Add(this.lblDefByteOrder4);
+ this.gbDefByteOrder.Controls.Add(this.txtDefByteOrder4);
+ this.gbDefByteOrder.Controls.Add(this.lblDefByteOrder2);
+ this.gbDefByteOrder.Controls.Add(this.txtDefByteOrder2);
+ this.gbDefByteOrder.Controls.Add(this.lblDefByteOrderExample);
+ this.gbDefByteOrder.Location = new System.Drawing.Point(12, 90);
+ this.gbDefByteOrder.Name = "gbDefByteOrder";
+ this.gbDefByteOrder.Padding = new System.Windows.Forms.Padding(10, 3, 10, 10);
+ this.gbDefByteOrder.Size = new System.Drawing.Size(260, 156);
+ this.gbDefByteOrder.TabIndex = 1;
+ this.gbDefByteOrder.TabStop = false;
+ this.gbDefByteOrder.Text = "Default byte order";
+ //
+ // lblDefByteOrder8
+ //
+ this.lblDefByteOrder8.AutoSize = true;
+ this.lblDefByteOrder8.Location = new System.Drawing.Point(10, 94);
+ this.lblDefByteOrder8.Name = "lblDefByteOrder8";
+ this.lblDefByteOrder8.Size = new System.Drawing.Size(41, 13);
+ this.lblDefByteOrder8.TabIndex = 4;
+ this.lblDefByteOrder8.Text = "8 bytes";
+ //
+ // txtDefByteOrder8
+ //
+ this.txtDefByteOrder8.Location = new System.Drawing.Point(13, 110);
+ this.txtDefByteOrder8.Name = "txtDefByteOrder8";
+ this.txtDefByteOrder8.Size = new System.Drawing.Size(234, 20);
+ this.txtDefByteOrder8.TabIndex = 5;
+ this.txtDefByteOrder8.TextChanged += new System.EventHandler(this.control_Changed);
+ //
+ // lblDefByteOrder4
+ //
+ this.lblDefByteOrder4.AutoSize = true;
+ this.lblDefByteOrder4.Location = new System.Drawing.Point(10, 55);
+ this.lblDefByteOrder4.Name = "lblDefByteOrder4";
+ this.lblDefByteOrder4.Size = new System.Drawing.Size(41, 13);
+ this.lblDefByteOrder4.TabIndex = 2;
+ this.lblDefByteOrder4.Text = "4 bytes";
+ //
+ // txtDefByteOrder4
+ //
+ this.txtDefByteOrder4.Location = new System.Drawing.Point(13, 71);
+ this.txtDefByteOrder4.Name = "txtDefByteOrder4";
+ this.txtDefByteOrder4.Size = new System.Drawing.Size(234, 20);
+ this.txtDefByteOrder4.TabIndex = 3;
+ this.txtDefByteOrder4.TextChanged += new System.EventHandler(this.control_Changed);
+ //
+ // lblDefByteOrder2
+ //
+ this.lblDefByteOrder2.AutoSize = true;
+ this.lblDefByteOrder2.Location = new System.Drawing.Point(10, 16);
+ this.lblDefByteOrder2.Name = "lblDefByteOrder2";
+ this.lblDefByteOrder2.Size = new System.Drawing.Size(41, 13);
+ this.lblDefByteOrder2.TabIndex = 0;
+ this.lblDefByteOrder2.Text = "2 bytes";
+ //
+ // FrmTemplateSettings
+ //
+ this.AcceptButton = this.btnOK;
+ this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
+ this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+ this.CancelButton = this.btnCancel;
+ this.ClientSize = new System.Drawing.Size(284, 287);
+ this.Controls.Add(this.gbDefByteOrder);
+ this.Controls.Add(this.gbAddressing);
+ this.Controls.Add(this.btnCancel);
+ this.Controls.Add(this.btnOK);
+ this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedDialog;
+ this.MaximizeBox = false;
+ this.MinimizeBox = false;
+ this.Name = "FrmTemplateSettings";
+ this.ShowInTaskbar = false;
+ this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent;
+ this.Text = "Template Settings";
+ this.Load += new System.EventHandler(this.FrmTemplateSettings_Load);
+ this.pnlBase.ResumeLayout(false);
+ this.pnlBase.PerformLayout();
+ this.pnlNotation.ResumeLayout(false);
+ this.pnlNotation.PerformLayout();
+ this.gbAddressing.ResumeLayout(false);
+ this.gbDefByteOrder.ResumeLayout(false);
+ this.gbDefByteOrder.PerformLayout();
+ this.ResumeLayout(false);
+
+ }
+
+ #endregion
+ private System.Windows.Forms.RadioButton rbZeroBased;
+ private System.Windows.Forms.RadioButton rbOneBased;
+ private System.Windows.Forms.Panel pnlBase;
+ private System.Windows.Forms.Panel pnlNotation;
+ private System.Windows.Forms.RadioButton rbDec;
+ private System.Windows.Forms.RadioButton rbHex;
+ private System.Windows.Forms.Label lblDefByteOrderExample;
+ private System.Windows.Forms.TextBox txtDefByteOrder2;
+ private System.Windows.Forms.Button btnCancel;
+ private System.Windows.Forms.Button btnOK;
+ private System.Windows.Forms.GroupBox gbAddressing;
+ private System.Windows.Forms.GroupBox gbDefByteOrder;
+ private System.Windows.Forms.Label lblDefByteOrder2;
+ private System.Windows.Forms.Label lblDefByteOrder8;
+ private System.Windows.Forms.TextBox txtDefByteOrder8;
+ private System.Windows.Forms.Label lblDefByteOrder4;
+ private System.Windows.Forms.TextBox txtDefByteOrder4;
+ }
+}
\ No newline at end of file
diff --git a/ScadaComm/OpenKPs/KpModbus/Modbus/UI/FrmTemplateSettings.cs b/ScadaComm/OpenKPs/KpModbus/Modbus/UI/FrmTemplateSettings.cs
new file mode 100644
index 000000000..fed500d1f
--- /dev/null
+++ b/ScadaComm/OpenKPs/KpModbus/Modbus/UI/FrmTemplateSettings.cs
@@ -0,0 +1,120 @@
+/*
+ * Copyright 2017 Mikhail Shiryaev
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ *
+ * Product : Rapid SCADA
+ * Module : KpModbus
+ * Summary : Editing template settings form
+ *
+ * Author : Mikhail Shiryaev
+ * Created : 2017
+ * Modified : 2017
+ */
+
+using Scada.Comm.Devices.Modbus.Protocol;
+using Scada.UI;
+using System;
+using System.Windows.Forms;
+
+namespace Scada.Comm.Devices.Modbus.UI
+{
+ ///
+ /// Editing template settings form
+ /// Форма редактирования настроек шаблона
+ ///
+ public partial class FrmTemplateSettings : Form
+ {
+ private bool modified; // настройки изменены
+
+
+ ///
+ /// Конструктор, ограничивающий создание формы без параметров
+ ///
+ private FrmTemplateSettings()
+ {
+ InitializeComponent();
+ }
+
+
+ ///
+ /// Установить значения элементов управления в соответствии с настройками
+ ///
+ private void SettingsToControls(DeviceTemplate.Settings settings)
+ {
+ if (settings.ZeroAddr)
+ rbZeroBased.Checked = true;
+ else
+ rbOneBased.Checked = true;
+
+ if (settings.DecAddr)
+ rbDec.Checked = true;
+ else
+ rbHex.Checked = true;
+
+ txtDefByteOrder2.Text = settings.DefByteOrder2;
+ txtDefByteOrder4.Text = settings.DefByteOrder4;
+ txtDefByteOrder8.Text = settings.DefByteOrder8;
+ modified = false;
+ }
+
+ ///
+ /// Установить конфигурацию в соответствии с элементами управления
+ ///
+ private void ControlsToSettings(DeviceTemplate.Settings settings)
+ {
+ settings.ZeroAddr = rbZeroBased.Checked;
+ settings.DecAddr = rbDec.Checked;
+ settings.DefByteOrder2 = txtDefByteOrder2.Text;
+ settings.DefByteOrder4 = txtDefByteOrder4.Text;
+ settings.DefByteOrder8 = txtDefByteOrder8.Text;
+ }
+
+
+ ///
+ /// Отобразить форму модально
+ ///
+ /// Возвращает true, если настройки были изменены
+ public static bool ShowDialog(DeviceTemplate.Settings settings)
+ {
+ if (settings == null)
+ throw new ArgumentNullException("settings");
+
+ FrmTemplateSettings form = new FrmTemplateSettings();
+ form.SettingsToControls(settings);
+
+ if (form.ShowDialog() == DialogResult.OK && form.modified)
+ {
+ form.ControlsToSettings(settings);
+ return true;
+ }
+ else
+ {
+ return false;
+ }
+ }
+
+
+ private void FrmTemplateSettings_Load(object sender, EventArgs e)
+ {
+ // перевод формы
+ Translator.TranslateForm(this, "Scada.Comm.Devices.Modbus.UI.FrmTemplateSettings");
+ }
+
+ private void control_Changed(object sender, EventArgs e)
+ {
+ modified = true;
+ }
+ }
+}
diff --git a/ScadaComm/OpenKPs/KpModbus/Modbus/UI/FrmTemplateSettings.resx b/ScadaComm/OpenKPs/KpModbus/Modbus/UI/FrmTemplateSettings.resx
new file mode 100644
index 000000000..1af7de150
--- /dev/null
+++ b/ScadaComm/OpenKPs/KpModbus/Modbus/UI/FrmTemplateSettings.resx
@@ -0,0 +1,120 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ text/microsoft-resx
+
+
+ 2.0
+
+
+ System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
\ No newline at end of file
diff --git a/ScadaComm/OpenKPs/KpModbus/KpPhrases.cs b/ScadaComm/OpenKPs/KpModbus/Modbus/UI/KpPhrases.cs
similarity index 67%
rename from ScadaComm/OpenKPs/KpModbus/KpPhrases.cs
rename to ScadaComm/OpenKPs/KpModbus/Modbus/UI/KpPhrases.cs
index 095c4a95c..4ba351665 100644
--- a/ScadaComm/OpenKPs/KpModbus/KpPhrases.cs
+++ b/ScadaComm/OpenKPs/KpModbus/Modbus/UI/KpPhrases.cs
@@ -1,5 +1,5 @@
/*
- * Copyright 2014 Mikhail Shiryaev
+ * Copyright 2017 Mikhail Shiryaev
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -20,10 +20,10 @@
*
* Author : Mikhail Shiryaev
* Created : 2014
- * Modified : 2014
+ * Modified : 2017
*/
-namespace Scada.Comm.Devices.KpModbus
+namespace Scada.Comm.Devices.Modbus.UI
{
///
/// The phrases used in the library
@@ -36,40 +36,41 @@ static KpPhrases()
SetToDefault();
}
- // Словарь Scada.Comm.Devices.KpModbus.FrmDevTemplate
+ // Словарь Scada.Comm.Devices.Modbus.UI.FrmDevTemplate
public static string TemplFormTitle { get; private set; }
public static string GrsNode { get; private set; }
public static string CmdsNode { get; private set; }
public static string DefGrName { get; private set; }
public static string DefElemName { get; private set; }
public static string DefCmdName { get; private set; }
+ public static string AddressHint { get; private set; }
public static string SaveTemplateConfirm { get; private set; }
public static string ElemCntExceeded { get; private set; }
public static string ElemRemoveWarning { get; private set; }
- // Словарь Scada.Comm.Devices.KpModbus.FrmDevProps
+ // Словарь Scada.Comm.Devices.Modbus.UI.FrmDevProps
public static string TemplNotExists { get; private set; }
private static void SetToDefault()
{
- TemplFormTitle = "MODBUS. Редактор шаблонов устройств";
- GrsNode = "Группы элементов";
- CmdsNode = "Команды";
- DefGrName = "<Группа элементов>";
- DefElemName = "<Элемент>";
- DefCmdName = "<Команда>";
- SaveTemplateConfirm = "Шаблон устройства был изменён. Сохранить изменения?";
- ElemCntExceeded = "Таблица данных допускает не более {0} элементов.";
- ElemRemoveWarning = "Таблица данных допускает не более {0} элементов.\r\n" +
- "Лишние элементы будут удалены. Продолжить?";
+ TemplFormTitle = Localization.Dict.GetEmptyPhrase("TemplFormTitle");
+ GrsNode = Localization.Dict.GetEmptyPhrase("GrsNode");
+ CmdsNode = Localization.Dict.GetEmptyPhrase("CmdsNode");
+ DefGrName = Localization.Dict.GetEmptyPhrase("DefGrName");
+ DefElemName = Localization.Dict.GetEmptyPhrase("DefElemName");
+ DefCmdName = Localization.Dict.GetEmptyPhrase("DefCmdName");
+ AddressHint = Localization.Dict.GetEmptyPhrase("AddressHint");
+ SaveTemplateConfirm = Localization.Dict.GetEmptyPhrase("SaveTemplateConfirm");
+ ElemCntExceeded = Localization.Dict.GetEmptyPhrase("ElemCntExceeded");
+ ElemRemoveWarning = Localization.Dict.GetEmptyPhrase("ElemRemoveWarning");
- TemplNotExists = "Файл шаблона устройства не существует.";
+ TemplNotExists = Localization.Dict.GetEmptyPhrase("TemplNotExists");
}
public static void Init()
{
Localization.Dict dict;
- if (Localization.Dictionaries.TryGetValue("Scada.Comm.Devices.KpModbus.FrmDevTemplate", out dict))
+ if (Localization.Dictionaries.TryGetValue("Scada.Comm.Devices.Modbus.UI.FrmDevTemplate", out dict))
{
TemplFormTitle = dict.GetPhrase("this", TemplFormTitle);
GrsNode = dict.GetPhrase("GrsNode", GrsNode);
@@ -77,13 +78,16 @@ public static void Init()
DefGrName = dict.GetPhrase("DefGrName", DefGrName);
DefElemName = dict.GetPhrase("DefElemName", DefElemName);
DefCmdName = dict.GetPhrase("DefCmdName", DefCmdName);
+ AddressHint = dict.GetPhrase("AddressHint", AddressHint);
SaveTemplateConfirm = dict.GetPhrase("SaveTemplateConfirm", SaveTemplateConfirm);
ElemCntExceeded = dict.GetPhrase("ElemCntExceeded", ElemCntExceeded);
ElemRemoveWarning = dict.GetPhrase("ElemRemoveWarning", ElemRemoveWarning);
}
- if (Localization.Dictionaries.TryGetValue("Scada.Comm.Devices.KpModbus.FrmDevProps", out dict))
+ if (Localization.Dictionaries.TryGetValue("Scada.Comm.Devices.Modbus.UI.FrmDevProps", out dict))
+ {
TemplNotExists = dict.GetPhrase("TemplNotExists", TemplNotExists);
+ }
}
}
}
diff --git a/ScadaComm/OpenKPs/KpModbus/Modbus/UI/TreeUpdateTypes.cs b/ScadaComm/OpenKPs/KpModbus/Modbus/UI/TreeUpdateTypes.cs
new file mode 100644
index 000000000..bff957ea1
--- /dev/null
+++ b/ScadaComm/OpenKPs/KpModbus/Modbus/UI/TreeUpdateTypes.cs
@@ -0,0 +1,62 @@
+/*
+ * Copyright 2017 Mikhail Shiryaev
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ *
+ * Product : Rapid SCADA
+ * Module : KpModbus
+ * Summary : Types of updating the Modbus template tree
+ *
+ * Author : Mikhail Shiryaev
+ * Created : 2017
+ * Modified : 2017
+ */
+
+using System;
+
+namespace Scada.Comm.Devices.Modbus.UI
+{
+ ///
+ /// Types of updating the Modbus template tree
+ /// Типы обновления дерева шаблона Modbus
+ ///
+ [Flags]
+ public enum TreeUpdateTypes
+ {
+ ///
+ /// Обновление не требуется
+ ///
+ None = 0,
+
+ ///
+ /// Текущий узел
+ ///
+ CurrentNode = 1,
+
+ ///
+ /// Дочерние узлы
+ ///
+ ChildNodes = 2,
+
+ ///
+ /// Узлы того же уровня, следующие за текущим
+ ///
+ NextSiblings = 4,
+
+ ///
+ /// Обновить сигналы
+ ///
+ UpdateSignals = 8
+ }
+}
diff --git a/ScadaComm/OpenKPs/KpModbus/Res/group_inactive.png b/ScadaComm/OpenKPs/KpModbus/Res/group_inactive.png
new file mode 100644
index 000000000..00aad4e4e
Binary files /dev/null and b/ScadaComm/OpenKPs/KpModbus/Res/group_inactive.png differ
diff --git a/ScadaComm/OpenKPs/KpModbus/Res/settings.png b/ScadaComm/OpenKPs/KpModbus/Res/settings.png
new file mode 100644
index 000000000..7cfd2ec30
Binary files /dev/null and b/ScadaComm/OpenKPs/KpModbus/Res/settings.png differ
diff --git a/ScadaComm/ScadaCommCommon/Channels/CommUdpLogic.cs b/ScadaComm/ScadaCommCommon/Channels/CommUdpLogic.cs
index 68ca3b5c8..b6be586da 100644
--- a/ScadaComm/ScadaCommCommon/Channels/CommUdpLogic.cs
+++ b/ScadaComm/ScadaCommCommon/Channels/CommUdpLogic.cs
@@ -184,20 +184,35 @@ protected void StartUdpReceive()
protected void UdpReceiveCallback(IAsyncResult ar)
{
// приём данных
- IPEndPoint remoteEP = new IPEndPoint(IPAddress.Any, 0);
- byte[] buf = udpConn.UdpClient.EndReceive(ar, ref remoteEP);
- udpConn.RemoteAddress = remoteEP.Address.ToString();
- udpConn.RemotePort = remoteEP.Port;
- WriteToLog("");
- WriteToLog(string.Format(Localization.UseRussian ?
- "{0} Получены данные от {1}:{2}" :
- "{0} Data received from {1}:{2}", CommUtils.GetNowDT(), udpConn.RemoteAddress, udpConn.RemotePort));
+ byte[] buf;
+ try
+ {
+ IPEndPoint remoteEP = new IPEndPoint(IPAddress.Any, 0);
+ buf = udpConn.UdpClient.EndReceive(ar, ref remoteEP);
+ udpConn.RemoteAddress = remoteEP.Address.ToString();
+ udpConn.RemotePort = remoteEP.Port;
+ WriteToLog("");
+ WriteToLog(string.Format(Localization.UseRussian ?
+ "{0} Получены данные от {1}:{2}" :
+ "{0} Data received from {1}:{2}",
+ CommUtils.GetNowDT(), udpConn.RemoteAddress, udpConn.RemotePort));
- if (buf == null)
+ if (buf == null)
+ {
+ WriteToLog(Localization.UseRussian ?
+ "Данные пусты" :
+ "Data is empty");
+ }
+ }
+ catch (Exception ex)
{
- WriteToLog(Localization.UseRussian ? "Данные пусты" : "Data is empty");
+ buf = null;
+ WriteToLog(string.Format(Localization.UseRussian ?
+ "Ошибка при приёме данных: {0}" :
+ "Error receiving data: {0}", ex.Message));
}
- else if (kpListNotEmpty)
+
+ if (buf != null && kpListNotEmpty)
{
if (settings.DevSelMode == DeviceSelectionModes.ByIPAddress)
{
diff --git a/ScadaComm/ScadaCommCommon/CommUtils.cs b/ScadaComm/ScadaCommCommon/CommUtils.cs
index 1579fdb1e..7c95425bb 100644
--- a/ScadaComm/ScadaCommCommon/CommUtils.cs
+++ b/ScadaComm/ScadaCommCommon/CommUtils.cs
@@ -58,7 +58,7 @@ public enum ProtocolLogFormats
///
/// Версия Коммуникатора
///
- public const string AppVersion = "5.1.0.0";
+ public const string AppVersion = "5.1.0.1";
///
/// Формат даты и времени для вывода в журнал линии связи
diff --git a/ScadaComm/ScadaCommCtrl/FrmMain.cs b/ScadaComm/ScadaCommCtrl/FrmMain.cs
index fbdd716e2..426b93863 100644
--- a/ScadaComm/ScadaCommCtrl/FrmMain.cs
+++ b/ScadaComm/ScadaCommCtrl/FrmMain.cs
@@ -1009,9 +1009,8 @@ private void GetKpDllInfo()
private void Application_ThreadException(object sender, ThreadExceptionEventArgs e)
{
- string errMsg = CommonPhrases.UnhandledException + ":\r\n" + e.Exception.Message;
- errLog.WriteAction(errMsg, Log.ActTypes.Exception);
- ScadaUiUtils.ShowError(errMsg);
+ errLog.WriteException(e.Exception, CommonPhrases.UnhandledException);
+ ScadaUiUtils.ShowError(CommonPhrases.UnhandledException + ":\r\n" + e.Exception.Message);
}
private void FrmMain_Load(object sender, EventArgs e)
diff --git a/ScadaData/ScadaData/ScadaData.csproj b/ScadaData/ScadaData/ScadaData.csproj
index 2f4addd2f..91a5194f9 100644
--- a/ScadaData/ScadaData/ScadaData.csproj
+++ b/ScadaData/ScadaData/ScadaData.csproj
@@ -86,6 +86,8 @@
+
+
diff --git a/ScadaData/ScadaData/ScadaUtils.Xml.cs b/ScadaData/ScadaData/ScadaUtils.Xml.cs
index 8f7dd9596..d0f3d0ff4 100644
--- a/ScadaData/ScadaData/ScadaUtils.Xml.cs
+++ b/ScadaData/ScadaData/ScadaUtils.Xml.cs
@@ -104,7 +104,7 @@ public static TimeSpan XmlParseTimeSpan(string s)
///
public static T XmlParseEnum(string s) where T : struct
{
- return (T)Enum.Parse(typeof(T), s);
+ return (T)Enum.Parse(typeof(T), s, true);
}
@@ -229,12 +229,12 @@ public static double GetChildAsDouble(this XmlNode parentXmlNode, string childNo
///
/// Получить значение даты и времени дочернего XML-узла
///
- public static DateTime GetChildAsDateTime(this XmlNode parentXmlNode, string childNodeName)
+ public static DateTime GetChildAsDateTime(this XmlNode parentXmlNode, string childNodeName, DateTime defaultVal)
{
try
{
XmlNode node = parentXmlNode.SelectSingleNode(childNodeName);
- return node == null ? DateTime.MinValue : XmlParseDateTime(node.InnerText);
+ return node == null ? defaultVal : XmlParseDateTime(node.InnerText);
}
catch (FormatException)
{
@@ -242,15 +242,23 @@ public static DateTime GetChildAsDateTime(this XmlNode parentXmlNode, string chi
}
}
+ ///
+ /// Получить значение даты и времени дочернего XML-узла
+ ///
+ public static DateTime GetChildAsDateTime(this XmlNode parentXmlNode, string childNodeName)
+ {
+ return parentXmlNode.GetChildAsDateTime(childNodeName, DateTime.MinValue);
+ }
+
///
/// Получить значение интервала времени дочернего XML-узла
///
- public static TimeSpan GetChildAsTimeSpan(this XmlNode parentXmlNode, string childNodeName)
+ public static TimeSpan GetChildAsTimeSpan(this XmlNode parentXmlNode, string childNodeName, TimeSpan defaultVal)
{
try
{
XmlNode node = parentXmlNode.SelectSingleNode(childNodeName);
- return node == null ? TimeSpan.Zero : XmlParseTimeSpan(node.InnerText);
+ return node == null ? defaultVal : XmlParseTimeSpan(node.InnerText);
}
catch (FormatException)
{
@@ -258,15 +266,24 @@ public static TimeSpan GetChildAsTimeSpan(this XmlNode parentXmlNode, string chi
}
}
+ ///
+ /// Получить значение интервала времени дочернего XML-узла
+ ///
+ public static TimeSpan GetChildAsTimeSpan(this XmlNode parentXmlNode, string childNodeName)
+ {
+ return parentXmlNode.GetChildAsTimeSpan(childNodeName, TimeSpan.Zero);
+ }
+
///
/// Получить перечислимое значение дочернего XML-узла
///
- public static T GetChildAsEnum(this XmlNode parentXmlNode, string childNodeName) where T : struct
+ public static T GetChildAsEnum(this XmlNode parentXmlNode, string childNodeName,
+ T defaultVal = default(T)) where T : struct
{
try
{
XmlNode node = parentXmlNode.SelectSingleNode(childNodeName);
- return node == null ? default(T) : XmlParseEnum(node.InnerText);
+ return node == null ? defaultVal : XmlParseEnum(node.InnerText);
}
catch (FormatException)
{
@@ -359,12 +376,12 @@ public static double GetAttrAsDouble(this XmlElement xmlElem, string attrName, d
///
/// Получить значение даты и времени атрибута XML-элемента
///
- public static DateTime GetAttrAsDateTime(this XmlElement xmlElem, string attrName)
+ public static DateTime GetAttrAsDateTime(this XmlElement xmlElem, string attrName, DateTime defaultVal)
{
try
{
- return xmlElem.HasAttribute(attrName) ?
- XmlParseDateTime(xmlElem.GetAttribute(attrName)) : DateTime.MinValue;
+ return xmlElem.HasAttribute(attrName) ?
+ XmlParseDateTime(xmlElem.GetAttribute(attrName)) : defaultVal;
}
catch (FormatException)
{
@@ -372,15 +389,23 @@ public static DateTime GetAttrAsDateTime(this XmlElement xmlElem, string attrNam
}
}
+ ///
+ /// Получить значение даты и времени атрибута XML-элемента
+ ///
+ public static DateTime GetAttrAsDateTime(this XmlElement xmlElem, string attrName)
+ {
+ return xmlElem.GetAttrAsDateTime(attrName, DateTime.MinValue);
+ }
+
///
/// Получить значение интервала времени атрибута XML-элемента
///
- public static TimeSpan GetAttrAsTimeSpan(this XmlElement xmlElem, string attrName)
+ public static TimeSpan GetAttrAsTimeSpan(this XmlElement xmlElem, string attrName, TimeSpan defaultVal)
{
try
{
- return xmlElem.HasAttribute(attrName) ?
- XmlParseTimeSpan(xmlElem.GetAttribute(attrName)) : TimeSpan.Zero;
+ return xmlElem.HasAttribute(attrName) ?
+ XmlParseTimeSpan(xmlElem.GetAttribute(attrName)) : defaultVal;
}
catch (FormatException)
{
@@ -388,15 +413,24 @@ public static TimeSpan GetAttrAsTimeSpan(this XmlElement xmlElem, string attrNam
}
}
+ ///
+ /// Получить значение интервала времени атрибута XML-элемента
+ ///
+ public static TimeSpan GetAttrAsTimeSpan(this XmlElement xmlElem, string attrName)
+ {
+ return xmlElem.GetAttrAsTimeSpan(attrName, TimeSpan.Zero);
+ }
+
///
/// Получить перечислимое значение атрибута XML-элемента
///
- public static T GetAttrAsEnum(this XmlElement xmlElem, string attrName) where T : struct
+ public static T GetAttrAsEnum(this XmlElement xmlElem, string attrName,
+ T defaultVal = default(T)) where T : struct
{
try
{
- return xmlElem.HasAttribute(attrName) ?
- XmlParseEnum(xmlElem.GetAttribute(attrName)) : default(T);
+ return xmlElem.HasAttribute(attrName) ?
+ XmlParseEnum(xmlElem.GetAttribute(attrName)) : defaultVal;
}
catch (FormatException)
{
diff --git a/ScadaData/ScadaData/UI/ObjectChangedEventArgs.cs b/ScadaData/ScadaData/UI/ObjectChangedEventArgs.cs
new file mode 100644
index 000000000..2955111c4
--- /dev/null
+++ b/ScadaData/ScadaData/UI/ObjectChangedEventArgs.cs
@@ -0,0 +1,52 @@
+/*
+ * Copyright 2017 Mikhail Shiryaev
+ * All rights reserved
+ *
+ * Product : Rapid SCADA
+ * Module : ScadaData
+ * Summary : Provides data for events caused by an object change
+ *
+ * Author : Mikhail Shiryaev
+ * Created : 2014
+ * Modified : 2017
+ */
+
+using System;
+
+namespace Scada.UI
+{
+ ///
+ /// Provides data for events caused by an object change
+ /// Предоставляет данные для событий, вызванных изменением объекта
+ ///
+ public class ObjectChangedEventArgs : EventArgs
+ {
+ ///
+ /// Конструктор
+ ///
+ public ObjectChangedEventArgs(object changedObject)
+ : this(changedObject, null)
+ {
+ }
+
+ ///
+ /// Конструктор
+ ///
+ public ObjectChangedEventArgs(object changedObject, object changeArgument)
+ {
+ ChangedObject = changedObject;
+ ChangeArgument = changeArgument;
+ }
+
+
+ ///
+ /// Получить изменённый объект
+ ///
+ public object ChangedObject { get; protected set; }
+
+ ///
+ /// Получить аргумент, описывающий изменения
+ ///
+ public object ChangeArgument { get; protected set; }
+ }
+}
diff --git a/ScadaData/ScadaData/UI/ObjectChangedEventHandler.cs b/ScadaData/ScadaData/UI/ObjectChangedEventHandler.cs
new file mode 100644
index 000000000..8f843a754
--- /dev/null
+++ b/ScadaData/ScadaData/UI/ObjectChangedEventHandler.cs
@@ -0,0 +1,23 @@
+/*
+ * Copyright 2017 Mikhail Shiryaev
+ * All rights reserved
+ *
+ * Product : Rapid SCADA
+ * Module : ScadaData
+ * Summary : Represents a method that will handle an event raised when an object property is changed
+ *
+ * Author : Mikhail Shiryaev
+ * Created : 2014
+ * Modified : 2017
+ */
+
+namespace Scada.UI
+{
+ ///
+ /// Represents a method that will handle an event raised when an object property is changed
+ /// Представляет метод для обработки события, возникающего при изменении свойств объекта
+ ///
+ public delegate void ObjectChangedEventHandler(
+ object sender,
+ ObjectChangedEventArgs e);
+}
diff --git a/ScadaDoc/ScadaDoc/ScadaDoc.csproj b/ScadaDoc/ScadaDoc/ScadaDoc.csproj
index e278e9904..adcc7784e 100644
--- a/ScadaDoc/ScadaDoc/ScadaDoc.csproj
+++ b/ScadaDoc/ScadaDoc/ScadaDoc.csproj
@@ -74,6 +74,7 @@
+
@@ -112,6 +113,7 @@
+
@@ -247,6 +249,7 @@
+
diff --git a/ScadaDoc/ScadaDoc/content/common-images/settings.png b/ScadaDoc/ScadaDoc/content/common-images/settings.png
new file mode 100644
index 000000000..7cfd2ec30
Binary files /dev/null and b/ScadaDoc/ScadaDoc/content/common-images/settings.png differ
diff --git a/ScadaDoc/ScadaDoc/content/en/use-cases/modbus-protocol-files/modbus_template_en.png b/ScadaDoc/ScadaDoc/content/en/use-cases/modbus-protocol-files/modbus_template_en.png
index 1ae3abb98..79ff3b3e5 100644
Binary files a/ScadaDoc/ScadaDoc/content/en/use-cases/modbus-protocol-files/modbus_template_en.png and b/ScadaDoc/ScadaDoc/content/en/use-cases/modbus-protocol-files/modbus_template_en.png differ
diff --git a/ScadaDoc/ScadaDoc/content/en/use-cases/modbus-protocol-files/modbus_template_settings_en.png b/ScadaDoc/ScadaDoc/content/en/use-cases/modbus-protocol-files/modbus_template_settings_en.png
new file mode 100644
index 000000000..12985cb12
Binary files /dev/null and b/ScadaDoc/ScadaDoc/content/en/use-cases/modbus-protocol-files/modbus_template_settings_en.png differ
diff --git a/ScadaDoc/ScadaDoc/content/en/use-cases/modbus-protocol.html b/ScadaDoc/ScadaDoc/content/en/use-cases/modbus-protocol.html
index 1119a6352..2127c0b9b 100644
--- a/ScadaDoc/ScadaDoc/content/en/use-cases/modbus-protocol.html
+++ b/ScadaDoc/ScadaDoc/content/en/use-cases/modbus-protocol.html
@@ -12,7 +12,7 @@ Connecting Devices Using Modbus Protocol
Written by Rapid SCADA on January 5, 2015
- Updated on January 25, 2017
+ Updated on October 16, 2017
This article describes how to configure communication with devices using Modbus protocol. Simple and robust, Modbus has since become a de facto standard communication protocol, and it is now a commonly available means of connecting industrial electronic devices (see Wikipedia). Rapid SCADA supports Modbus RTU, ASCII and TCP modes.
@@ -140,15 +140,20 @@ Configuring Communication with Devices
Device template reflects the structure of Modbus packages. Requested data are combined into groups of elements. Each group has its name, data table, start address and element count. Each element is a tag of a device. Rapid SCADA identifies a tag by its signal number. A command is described by its name, data table and address. A command number identifies the command within Rapid SCADA.
- Names of groups, elements and commands are arbitrary. What data tables and element addresses are available usually described in device manual. As written in Modbus standard, element addresses start with 1, but device manufacturers often numerate the first element as 0. In this case just add 1 to an address before entering it to device template.
+ Names of groups, elements and commands are arbitrary. The available data tables and element addresses are usually described in device manual. Depending on the manufacturer, addressing of elements can be zero-based or one-based, specified as decimal or hexadecimal numbers. By default, addresses start with 1 and represented as decimals. To switch template addressing, click the
button. Template settings dialog is opened (see Figure 10).
+
+
+ 
+ Figure 10. Template settings
+
To save Communicator settings click the
button. Now it is recommended to start the Communicator service with the
button and check communication with the device.
- Click Device 101 "Test device" tree node to check the device state and the availability of data (see Figure 10). The data is not available immediately after start, retrieved values are shown when the first polling complete.
+ Click Device 101 "Test device" tree node to check the device state and the availability of data (see Figure 11). The data is not available immediately after start, retrieved values are shown when the first polling complete.

- Figure 10. Device data
+ Figure 11. Device data
In case of losing communication with the device, use a communication line log to analyze the problem cause. To open the log, click the Communication Line Stats tree node and go to the Communication Line Log page. Data packages can be decoded by Online Modbus Parser.
@@ -159,11 +164,11 @@ Final Database Configuration
The automatic channel creation service helps to save a time. Click Service > Create Channels in the main menu of the application.
- On the form, which is shown in Figure 11, choose "Test line" in the drop down list, then tick the "Test device" row and choose "Test object" in the cell of the Object column. Set the channel numbering parameters to create channels having convenient numbers. Firstly press the Calculate channel numbers button, then press Create.
+ On the form, which is shown in Figure 12, choose "Test line" in the drop down list, then tick the "Test device" row and choose "Test object" in the cell of the Object column. Set the channel numbering parameters to create channels having convenient numbers. Firstly press the Calculate channel numbers button, then press Create.

- Figure 11. Creation of channels
+ Figure 12. Creation of channels
The channels are created automatically based on the device template that has been created and assigned to the device in the previous section of this article. To view created channels, click the Input channels > Test device tree node and the Output channels > Test device node. It is recommended to manually fill in the Quantity and Unit fields of the input channels and the Command values field of the output channels. However, in the case of the first experiment it is unnecessary.
@@ -172,11 +177,11 @@ Final Database Configuration
After editing the configuration database is complete, press the
button to pass the changes to Server, and then restart Server and Communicator by
and
buttons.
- Open the Device Data page in Communicator and make sure that the input channels are bound to the device tags – the Channel column must contain numbers of the created input channels (see Figure 12).
+ Open the Device Data page in Communicator and make sure that the input channels are bound to the device tags – the Channel column must contain numbers of the created input channels (see Figure 13).

- Figure 12. Device data bound to channels
+ Figure 13. Device data bound to channels
As a result of described actions, data should be collected from the device and stored in the archive. It remains to customize user interface for an operator.
@@ -185,34 +190,34 @@ Customizing User Interface for Operator
Consider creating a table view for the Webstation application. To do this, the Table Editor application is needed. If displaying data in a graphical view is required, use Scheme Editor instead of Table editor.
- Open Table Editor and fill in the table view as shown in Figure 13. Add a channel in the table (from the left side of the window to the right) by clicking the
button, double-clicking the channel row or by pressing Enter.
+ Open Table Editor and fill in the table view as shown in Figure 14. Add a channel in the table (from the left side of the window to the right) by clicking the
button, double-clicking the channel row or by pressing Enter.
Save created table view in the TestTable.tbl file in the C:\SCADA\Interface\Test folder. Please note that folder names and file names of views must contain only Latin characters.

- Figure 13. Table editor
+ Figure 14. Table editor
- To display a table view in Webstation, define it in the Interface table of the configuration database by the Administrator application as shown in Figure 14.
+ To display a table view in Webstation, define it in the Interface table of the configuration database by the Administrator application as shown in Figure 15.

- Figure 14. Adding a view in the Interface table
+ Figure 15. Adding a view in the Interface table
To apply the changes, send the database to Server by the
button and restart the Server service by the
button.
- Now start your browser and enter the address http://localhost/scada/. On the login form use admin / 12345 (see Figure 15). If the configuration carried out correctly, after logging in, you will see a table with the data obtained from the device, similar to Figure 16.
+ Now start your browser and enter the address http://localhost/scada/. On the login form use admin / 12345 (see Figure 16). If the configuration carried out correctly, after logging in, you will see a table with the data obtained from the device, similar to Figure 17.

- Figure 15. Login form
+ Figure 16. Login form

- Figure 16. The Webstation application
+ Figure 17. The Webstation application
Modbus Tags Conversion
diff --git a/ScadaDoc/ScadaDoc/content/ru/use-cases/modbus-protocol-files/modbus_template_ru.png b/ScadaDoc/ScadaDoc/content/ru/use-cases/modbus-protocol-files/modbus_template_ru.png
index c8e7e7850..5ee4c6000 100644
Binary files a/ScadaDoc/ScadaDoc/content/ru/use-cases/modbus-protocol-files/modbus_template_ru.png and b/ScadaDoc/ScadaDoc/content/ru/use-cases/modbus-protocol-files/modbus_template_ru.png differ
diff --git a/ScadaDoc/ScadaDoc/content/ru/use-cases/modbus-protocol-files/modbus_template_settings_ru.png b/ScadaDoc/ScadaDoc/content/ru/use-cases/modbus-protocol-files/modbus_template_settings_ru.png
new file mode 100644
index 000000000..929cc00d5
Binary files /dev/null and b/ScadaDoc/ScadaDoc/content/ru/use-cases/modbus-protocol-files/modbus_template_settings_ru.png differ
diff --git a/ScadaDoc/ScadaDoc/content/ru/use-cases/modbus-protocol.html b/ScadaDoc/ScadaDoc/content/ru/use-cases/modbus-protocol.html
index 5ae06d6d4..bd4819400 100644
--- a/ScadaDoc/ScadaDoc/content/ru/use-cases/modbus-protocol.html
+++ b/ScadaDoc/ScadaDoc/content/ru/use-cases/modbus-protocol.html
@@ -12,7 +12,7 @@ Подключение устройств по протоколу Modbus
Автор Rapid SCADA, 10 мая 2012
- Обновление 25 января 2017
+ Обновление 16 октября 2017
На рынке представлено огромное количество устройств, работающих в самых разных областях автоматизации, которые поддерживают обмен данными по протоколу Modbus. Modbus - это открытый коммуникационный протокол, использующий клиент-серверную модель, основанную на транзакциях, состоящих из запроса и ответа. Реализация поддержки протокола Modbus комплексом Rapid SCADA на порядок расширяет перечень устройств, с которыми может работать комплекс. Поддерживаются следующие режимы передачи данных: RTU, ASCII, TCP.
@@ -140,15 +140,20 @@ Настройка обмена данными с устройствами
Шаблон устройства отражает структуру пакетов данных протокола Modbus. Данные, запрашиваемые от устройства, объединены в группы элементов (тегов). Группа элементов описывается наименованием, таблицей данных, адресом и количеством элементов. Для команд, если они поддерживаются устройством, необходимо задать наименование, таблицу данных, адрес и номер команды КП (от 1 и далее по порядку).
- Наименования элементов и команд могут быть произвольными. Таблицы данных и адреса элементов должны содержаться в документации на подключаемое устройство. По стандарту протокола Modbus адресация элементов начинается с 1, однако многие производители в своей документации начинают адресацию с 0-го адреса. В этом случае при создании шаблона необходимо добавлять 1 к каждому адресу, указанному производителем.
+ Наименования элементов и команд могут быть произвольными. Таблицы данных и адреса элементов должны содержаться в документации на подключаемое устройство. В зависимости от производителя адресация элементов может начинаться с 0 или с 1, указываться в 10-чной или 16-ричной системе. По умолчанию в шаблоне выбрана адресация с 1 в 10-чной системе. Чтобы переключить адресацию шаблона, нажмите на кнопку
. Откроется диалоговое окно настроек шаблона (рис. 10).
+
+
+ 
+ Рис. 10. Настройки шаблона
+
Для сохранения настроек Коммуникатора нажмите кнопку
. Теперь можно запустить службу Коммуникатора с помощью кнопки
и проверить связь с устройством.
- Щёлкните элемент дерева КП 101 "Тестовый КП", чтобы проконтролировать состояние КП и наличие данных (рис. 10). Данные появятся не сразу после запуска, а после завершения первого опроса КП.
+ Щёлкните элемент дерева КП 101 "Тестовый КП", чтобы проконтролировать состояние КП и наличие данных (рис. 11). Данные появятся не сразу после запуска, а после завершения первого опроса КП.

- Рис. 10. Данные КП
+ Рис. 11. Данные КП
При отсутствии связи с устройством используйте журнал линии связи для анализа причины проблемы. Чтобы открыть журнал, щёлкните по элементу дерева Статистика линии связи и перейдите на страницу Журнал линии связи. С помощью онлайн инструмента Online Modbus Parser можно получить расшифровку пакетов данных, скопировав их на веб-форму из журнала линии связи.
@@ -159,11 +164,11 @@ Завершение настройки базы конфигурацииСервис автоматического создания каналов поможет сэкономить время. Выберите в главном меню программы Сервис > Создание каналов.
-
На открывшейся форме (рис. 11) выберите в выпадающем списке "Тестовая линия", затем поставьте галочку напротив "Тестового КП", а также установите "Тестовый объект" в столбце Объект. Задайте параметры нумерации каналов, если хотите, чтобы создаваемые каналы имели удобные для работы номера. Нажмите сначала кнопку Рассчитать номера каналов, затем кнопку Создать.
+ На открывшейся форме (рис. 12) выберите в выпадающем списке "Тестовая линия", затем поставьте галочку напротив "Тестового КП", а также установите "Тестовый объект" в столбце Объект. Задайте параметры нумерации каналов, если хотите, чтобы создаваемые каналы имели удобные для работы номера. Нажмите сначала кнопку Рассчитать номера каналов, затем кнопку Создать.

- Рис. 11. Создание каналов
+ Рис. 12. Создание каналов
Каналы создаются автоматически на основе шаблона устройства, который был создан и назначен КП в предыдущем разделе статьи. Посмотреть созданные каналы можно, щёлкнув в Администраторе по элементу дерева Входные каналы > Тестовый КП или Каналы управления > Тестовый КП. Рекомендуется вручную заполнить поля Величина и Размерность для входных каналов и поле Значения команды для каналов управления. Однако в случае первого опыта это делать необязательно.
@@ -172,11 +177,11 @@ Завершение настройки базы конфигурацииПосле того, как редактирование базы конфигурации завершено, следует нажать кнопку
для передачи изменений Серверу, перезапустить Сервер и Коммуникатор с помощью кнопок
и
.
-
Откройте страницу Данные КП в Коммуникаторе и убедитесь, что созданные входные каналы связаны с тегами КП – столбец Канал должен содержать номера созданных входных каналов (рис. 12).
+ Откройте страницу Данные КП в Коммуникаторе и убедитесь, что созданные входные каналы связаны с тегами КП – столбец Канал должен содержать номера созданных входных каналов (рис. 13).

- Рис. 12. Данные КП с привязкой каналов
+ Рис. 13. Данные КП с привязкой каналов
В результате проделанных действий данные должны собираться с устройства и сохраняться в архив. Осталось настроить пользовательский интерфейс оператора.
@@ -185,34 +190,34 @@ Настройка интерфейса оператора
Рассмотрим создание табличного представления для приложения Вебстанция. Для этого нам понадобится программа Редактор таблиц (если необходимо отобразить данные на мнемосхеме, то вместо редактора таблиц используйте Редактор схем).
- Откройте Редактор таблиц и заполните табличное представление, как показано на рис. 13. Добавить канал в таблицу (из левой части окна в правую) можно по кнопке
, двойному щелчку на строке канала или по клавише Enter.
+ Откройте Редактор таблиц и заполните табличное представление, как показано на рис. 14. Добавить канал в таблицу (из левой части окна в правую) можно по кнопке
, двойному щелчку на строке канала или по клавише Enter.
Сохраните созданное табличное представление в файл с именем TestTable.tbl в папку C:\SCADA\Interface\Test. Обратите внимание, что имена папок и файлов представлений должны содержать только латинские символы.

- Рис. 13. Редактор таблиц
+ Рис. 14. Редактор таблиц
- Далее, чтобы табличное представление появилось в веб-приложении, его необходимо прописать в базе конфигурации в таблице Интерфейс с помощью программы Администратор, как показано на рис. 14.
+ Далее, чтобы табличное представление появилось в веб-приложении, его необходимо прописать в базе конфигурации в таблице Интерфейс с помощью программы Администратор, как показано на рис. 15.

- Рис. 14. Добавление представления в таблицу Интерфейс
+ Рис. 15. Добавление представления в таблицу Интерфейс
Чтобы сделанные изменения вступили в силу, необходимо передать базу Серверу с помощью кнопки
и перезапустить службу Сервера кнопкой
.
- Теперь запустите браузер и введите адрес http://localhost/scada/. На форме входа в систему используйте логин admin и пароль 12345 (рис. 15). Если настройка выполнена правильно, то после входа в систему Вам будет доступна таблица с получаемыми от устройства данными (рис. 16).
+ Теперь запустите браузер и введите адрес http://localhost/scada/. На форме входа в систему используйте логин admin и пароль 12345 (рис. 16). Если настройка выполнена правильно, то после входа в систему Вам будет доступна таблица с получаемыми от устройства данными (рис. 17).

- Рис. 15. Вход в систему
+ Рис. 16. Вход в систему

- Рис. 16. Приложение Вебстанция
+ Рис. 17. Приложение Вебстанция
Преобразование значений тегов Modbus
diff --git a/ScadaDoc/ScadaDoc/content/ru/version-history/communicator-drivers-history.html b/ScadaDoc/ScadaDoc/content/ru/version-history/communicator-drivers-history.html
index 0a4b89d3d..db0578d55 100644
--- a/ScadaDoc/ScadaDoc/content/ru/version-history/communicator-drivers-history.html
+++ b/ScadaDoc/ScadaDoc/content/ru/version-history/communicator-drivers-history.html
@@ -17,7 +17,14 @@ Email
Modbus
- KpModbus 5.0.0.2 (25.09.2017)
+ KpModbus 5.1.0.0 (18.10.2017)
+- Выбор адресации в шаблоне с 0 или 1, Hex или Dec
+- Настройка порядка байт по умолчанию
+- Тип данных и порядок байт в команде
+- Вывод кода функции для информации
+- Возможность растянуть форму
+
+KpModbus 5.0.0.2 (25.09.2017)
- При установке недостоверности тегов сбрасывается не только статус, но и значение
KpModbus 5.0.0.1 (17.08.2017)
diff --git a/ScadaDoc/ScadaDoc/content/ru/version-history/communicator-history.html b/ScadaDoc/ScadaDoc/content/ru/version-history/communicator-history.html
index b98d757e2..cd42a3ba0 100644
--- a/ScadaDoc/ScadaDoc/content/ru/version-history/communicator-history.html
+++ b/ScadaDoc/ScadaDoc/content/ru/version-history/communicator-history.html
@@ -10,7 +10,11 @@
История приложения Коммуникатор
- 5.1.0.0 (25.09.2017)
+ 5.1.0.1 (18.10.2017)
+- Вывод подробной информации об исключении в оболочке Коммуникатора
+- Исправлена ошибка прекращения работы Коммуникатора при использовании UDP
+
+5.1.0.0 (25.09.2017)
- Возможность внеочередного опроса КП после команды ТУ
- Для канала связи TCP-клиент добавлен интервал повторного подключения
- Для канала связи TCP-клиент добавлен параметр сохранения соединения
diff --git a/ScadaDoc/ScadaDoc/content/ru/version-history/scada-history.html b/ScadaDoc/ScadaDoc/content/ru/version-history/scada-history.html
index 033913b0c..f95ab766e 100644
--- a/ScadaDoc/ScadaDoc/content/ru/version-history/scada-history.html
+++ b/ScadaDoc/ScadaDoc/content/ru/version-history/scada-history.html
@@ -10,7 +10,12 @@
История Rapid SCADA
- Rapid SCADA 5.4.0 (25.09.2017)
+ Rapid SCADA 5.4.1 (18.10.2017)
+ Коммуникатор 5.1.0.1
+ KpModbus 5.1.0.0
+ Остальные как в 5.4.0
+
+Rapid SCADA 5.4.0 (25.09.2017)
Сервер 5.1.0.1
Коммуникатор 5.1.0.0
Вебстанция 5.0.3.0
diff --git a/ScadaDoc/ScadaDoc/content/ru/version-history/server-modules-history.html b/ScadaDoc/ScadaDoc/content/ru/version-history/server-modules-history.html
index 97bb1b989..8d1516580 100644
--- a/ScadaDoc/ScadaDoc/content/ru/version-history/server-modules-history.html
+++ b/ScadaDoc/ScadaDoc/content/ru/version-history/server-modules-history.html
@@ -11,7 +11,10 @@
История модулей Сервера
Модуль автоматического управления
- ModAutoControl 5.2.1.0 (25.09.2017)
+ ModAutoControl 5.2.1.1 (18.10.2017)
+- Исправлена ошибка загрузки пустого триггера на данные
+
+ModAutoControl 5.2.1.0 (25.09.2017)
- Новый триггер на изменение данных входного канала
- Возможность отправки в команде значения, на изменение которого сработал триггер
- Возможность указывать множество входных каналов и статусов в триггере на данные