Browse Source

1、增加版本信息查询和更新;
2、增加模板修改、删除功能;
3、解决格式错误等问题。

Dail 1 year ago
parent
commit
4d87a0de4d
22 changed files with 1894 additions and 323 deletions
  1. BIN
      .vs/Welling_Motor_Debug_Tool/v17/.suo
  2. 202 74
      Welling_Motor_Debug_Tool/GenerateParams.Designer.cs
  3. 276 4
      Welling_Motor_Debug_Tool/GenerateParams.cs
  4. 6 0
      Welling_Motor_Debug_Tool/GenerateParams.resx
  5. 130 0
      Welling_Motor_Debug_Tool/Version.Designer.cs
  6. 127 0
      Welling_Motor_Debug_Tool/Version.cs
  7. 946 0
      Welling_Motor_Debug_Tool/Version.resx
  8. 9 1
      Welling_Motor_Debug_Tool/Welling_Motor_Debug_Tool.csproj
  9. BIN
      Welling_Motor_Debug_Tool/bin/Debug/Welling_Motor_Debug_Tool.exe
  10. BIN
      Welling_Motor_Debug_Tool/bin/Debug/Welling_Motor_Debug_Tool_202405131800.exe
  11. 119 132
      Welling_Motor_Debug_Tool/mainForm.Designer.cs
  12. 76 98
      Welling_Motor_Debug_Tool/mainForm.cs
  13. 1 1
      Welling_Motor_Debug_Tool/mainForm.resx
  14. BIN
      Welling_Motor_Debug_Tool/obj/Debug/DesignTimeResolveAssemblyReferences.cache
  15. BIN
      Welling_Motor_Debug_Tool/obj/Debug/DesignTimeResolveAssemblyReferencesInput.cache
  16. BIN
      Welling_Motor_Debug_Tool/obj/Debug/Welling_Motor_Debug_Tool.csproj.AssemblyReference.cache
  17. 1 1
      Welling_Motor_Debug_Tool/obj/Debug/Welling_Motor_Debug_Tool.csproj.CoreCompileInputs.cache
  18. 1 0
      Welling_Motor_Debug_Tool/obj/Debug/Welling_Motor_Debug_Tool.csproj.FileListAbsolute.txt
  19. BIN
      Welling_Motor_Debug_Tool/obj/Debug/Welling_Motor_Debug_Tool.csproj.GenerateResource.cache
  20. BIN
      Welling_Motor_Debug_Tool/obj/Debug/Welling_Motor_Debug_Tool.exe
  21. BIN
      Welling_Motor_Debug_Tool/obj/Debug/Welling_Motor_Debug_Tool.pdb
  22. 0 12
      Welling_Motor_Debug_Tool/verInfo.cs

BIN
.vs/Welling_Motor_Debug_Tool/v17/.suo


+ 202 - 74
Welling_Motor_Debug_Tool/GenerateParams.Designer.cs

@@ -79,6 +79,10 @@
             this.textBox_BikeWheel = new System.Windows.Forms.TextBox();
             this.tabPage_Advance = new System.Windows.Forms.TabPage();
             this.richTextBox_AdvanceParams = new System.Windows.Forms.RichTextBox();
+            this.tabPage_Note = new System.Windows.Forms.TabPage();
+            this.button_NoteRead = new System.Windows.Forms.Button();
+            this.button_NoteWrite = new System.Windows.Forms.Button();
+            this.richTextBox_Note = new System.Windows.Forms.RichTextBox();
             this.groupBox1 = new System.Windows.Forms.GroupBox();
             this.textBox_OtherInfo = new System.Windows.Forms.TextBox();
             this.textBox_SoftwareVer = new System.Windows.Forms.TextBox();
@@ -116,10 +120,15 @@
             this.button_ModeRefresh = new System.Windows.Forms.Button();
             this.radioButton_MIGIC = new System.Windows.Forms.RadioButton();
             this.radioButton_HUB = new System.Windows.Forms.RadioButton();
-            this.tabPage_Note = new System.Windows.Forms.TabPage();
-            this.richTextBox_Note = new System.Windows.Forms.RichTextBox();
-            this.button_NoteWrite = new System.Windows.Forms.Button();
-            this.button_NoteRead = new System.Windows.Forms.Button();
+            this.label_BT = new System.Windows.Forms.Label();
+            this.label_Ver = new System.Windows.Forms.Label();
+            this.statusStrip1 = new System.Windows.Forms.StatusStrip();
+            this.toolStripStatusLabel1 = new System.Windows.Forms.ToolStripStatusLabel();
+            this.label45 = new System.Windows.Forms.Label();
+            this.label40 = new System.Windows.Forms.Label();
+            this.label41 = new System.Windows.Forms.Label();
+            this.button_ChangeModelFile = new System.Windows.Forms.Button();
+            this.button_DeletModelFile = new System.Windows.Forms.Button();
             this.tabControl1.SuspendLayout();
             this.tabPage_Simple.SuspendLayout();
             this.groupBox5.SuspendLayout();
@@ -127,9 +136,10 @@
             this.groupBox3.SuspendLayout();
             this.groupBox2.SuspendLayout();
             this.tabPage_Advance.SuspendLayout();
+            this.tabPage_Note.SuspendLayout();
             this.groupBox1.SuspendLayout();
             ((System.ComponentModel.ISupportInitialize)(this.pictureBox2)).BeginInit();
-            this.tabPage_Note.SuspendLayout();
+            this.statusStrip1.SuspendLayout();
             this.SuspendLayout();
             // 
             // button_ExportParams
@@ -138,9 +148,9 @@
             this.button_ExportParams.Enabled = false;
             this.button_ExportParams.Font = new System.Drawing.Font("微软雅黑", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134)));
             this.button_ExportParams.ForeColor = System.Drawing.Color.White;
-            this.button_ExportParams.Location = new System.Drawing.Point(855, 175);
+            this.button_ExportParams.Location = new System.Drawing.Point(868, 596);
             this.button_ExportParams.Name = "button_ExportParams";
-            this.button_ExportParams.Size = new System.Drawing.Size(165, 75);
+            this.button_ExportParams.Size = new System.Drawing.Size(149, 73);
             this.button_ExportParams.TabIndex = 0;
             this.button_ExportParams.Text = "导出配置";
             this.button_ExportParams.UseVisualStyleBackColor = false;
@@ -164,7 +174,7 @@
             this.tabControl1.Location = new System.Drawing.Point(26, 73);
             this.tabControl1.Name = "tabControl1";
             this.tabControl1.SelectedIndex = 0;
-            this.tabControl1.Size = new System.Drawing.Size(492, 676);
+            this.tabControl1.Size = new System.Drawing.Size(492, 646);
             this.tabControl1.TabIndex = 3;
             this.tabControl1.SelectedIndexChanged += new System.EventHandler(this.tabControl1_SelectedIndexChanged);
             // 
@@ -179,7 +189,7 @@
             this.tabPage_Simple.Location = new System.Drawing.Point(4, 30);
             this.tabPage_Simple.Name = "tabPage_Simple";
             this.tabPage_Simple.Padding = new System.Windows.Forms.Padding(3);
-            this.tabPage_Simple.Size = new System.Drawing.Size(484, 642);
+            this.tabPage_Simple.Size = new System.Drawing.Size(484, 612);
             this.tabPage_Simple.TabIndex = 0;
             this.tabPage_Simple.Text = "简易参数";
             // 
@@ -221,12 +231,13 @@
             this.comboBox_SysRunMode.ForeColor = System.Drawing.Color.FromArgb(((int)(((byte)(48)))), ((int)(((byte)(113)))), ((int)(((byte)(185)))));
             this.comboBox_SysRunMode.FormattingEnabled = true;
             this.comboBox_SysRunMode.Items.AddRange(new object[] {
-            "踏频",
-            "力矩"});
+            "4",
+            "5"});
             this.comboBox_SysRunMode.Location = new System.Drawing.Point(86, 30);
             this.comboBox_SysRunMode.Name = "comboBox_SysRunMode";
             this.comboBox_SysRunMode.Size = new System.Drawing.Size(65, 29);
             this.comboBox_SysRunMode.TabIndex = 8;
+            this.comboBox_SysRunMode.Click += new System.EventHandler(this.comboBox_SysRunMode_Click);
             // 
             // label25
             // 
@@ -668,7 +679,7 @@
             this.tabPage_Advance.Location = new System.Drawing.Point(4, 30);
             this.tabPage_Advance.Name = "tabPage_Advance";
             this.tabPage_Advance.Padding = new System.Windows.Forms.Padding(3);
-            this.tabPage_Advance.Size = new System.Drawing.Size(484, 642);
+            this.tabPage_Advance.Size = new System.Drawing.Size(484, 612);
             this.tabPage_Advance.TabIndex = 1;
             this.tabPage_Advance.Text = "高级参数";
             // 
@@ -681,6 +692,55 @@
             this.richTextBox_AdvanceParams.TabIndex = 0;
             this.richTextBox_AdvanceParams.Text = "";
             // 
+            // tabPage_Note
+            // 
+            this.tabPage_Note.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(192)))), ((int)(((byte)(255)))), ((int)(((byte)(192)))));
+            this.tabPage_Note.Controls.Add(this.button_NoteRead);
+            this.tabPage_Note.Controls.Add(this.button_NoteWrite);
+            this.tabPage_Note.Controls.Add(this.richTextBox_Note);
+            this.tabPage_Note.ForeColor = System.Drawing.Color.FromArgb(((int)(((byte)(48)))), ((int)(((byte)(113)))), ((int)(((byte)(185)))));
+            this.tabPage_Note.Location = new System.Drawing.Point(4, 30);
+            this.tabPage_Note.Name = "tabPage_Note";
+            this.tabPage_Note.Size = new System.Drawing.Size(484, 612);
+            this.tabPage_Note.TabIndex = 2;
+            this.tabPage_Note.Text = "备忘录";
+            // 
+            // button_NoteRead
+            // 
+            this.button_NoteRead.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(64)))), ((int)(((byte)(64)))), ((int)(((byte)(64)))));
+            this.button_NoteRead.Font = new System.Drawing.Font("微软雅黑", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134)));
+            this.button_NoteRead.ForeColor = System.Drawing.Color.White;
+            this.button_NoteRead.Location = new System.Drawing.Point(292, 590);
+            this.button_NoteRead.Name = "button_NoteRead";
+            this.button_NoteRead.Size = new System.Drawing.Size(90, 45);
+            this.button_NoteRead.TabIndex = 2;
+            this.button_NoteRead.Text = "读取";
+            this.button_NoteRead.UseVisualStyleBackColor = false;
+            this.button_NoteRead.Click += new System.EventHandler(this.button_NoteRead_Click);
+            // 
+            // button_NoteWrite
+            // 
+            this.button_NoteWrite.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(128)))), ((int)(((byte)(64)))), ((int)(((byte)(0)))));
+            this.button_NoteWrite.Font = new System.Drawing.Font("微软雅黑", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134)));
+            this.button_NoteWrite.ForeColor = System.Drawing.Color.White;
+            this.button_NoteWrite.Location = new System.Drawing.Point(388, 590);
+            this.button_NoteWrite.Name = "button_NoteWrite";
+            this.button_NoteWrite.Size = new System.Drawing.Size(90, 45);
+            this.button_NoteWrite.TabIndex = 2;
+            this.button_NoteWrite.Text = "保存";
+            this.button_NoteWrite.UseVisualStyleBackColor = false;
+            this.button_NoteWrite.Click += new System.EventHandler(this.button_NoteWrite_Click);
+            // 
+            // richTextBox_Note
+            // 
+            this.richTextBox_Note.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(255)))), ((int)(((byte)(255)))), ((int)(((byte)(192)))));
+            this.richTextBox_Note.Font = new System.Drawing.Font("微软雅黑", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134)));
+            this.richTextBox_Note.Location = new System.Drawing.Point(6, 6);
+            this.richTextBox_Note.Name = "richTextBox_Note";
+            this.richTextBox_Note.Size = new System.Drawing.Size(472, 578);
+            this.richTextBox_Note.TabIndex = 1;
+            this.richTextBox_Note.Text = "";
+            // 
             // groupBox1
             // 
             this.groupBox1.Controls.Add(this.textBox_OtherInfo);
@@ -714,7 +774,7 @@
             this.groupBox1.ForeColor = System.Drawing.Color.FromArgb(((int)(((byte)(48)))), ((int)(((byte)(113)))), ((int)(((byte)(185)))));
             this.groupBox1.Location = new System.Drawing.Point(524, 73);
             this.groupBox1.Name = "groupBox1";
-            this.groupBox1.Size = new System.Drawing.Size(316, 676);
+            this.groupBox1.Size = new System.Drawing.Size(316, 646);
             this.groupBox1.TabIndex = 4;
             this.groupBox1.TabStop = false;
             this.groupBox1.Text = "订单信息";
@@ -986,7 +1046,7 @@
             // label_ServerStatus
             // 
             this.label_ServerStatus.BackColor = System.Drawing.Color.Red;
-            this.label_ServerStatus.Location = new System.Drawing.Point(987, 693);
+            this.label_ServerStatus.Location = new System.Drawing.Point(982, 740);
             this.label_ServerStatus.Name = "label_ServerStatus";
             this.label_ServerStatus.Size = new System.Drawing.Size(35, 20);
             this.label_ServerStatus.TabIndex = 21;
@@ -994,10 +1054,10 @@
             // label_Server_ComStatus
             // 
             this.label_Server_ComStatus.AutoSize = true;
-            this.label_Server_ComStatus.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(192)))), ((int)(((byte)(255)))), ((int)(((byte)(192)))));
+            this.label_Server_ComStatus.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(48)))), ((int)(((byte)(113)))), ((int)(((byte)(185)))));
             this.label_Server_ComStatus.Font = new System.Drawing.Font("Microsoft YaHei UI", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134)));
-            this.label_Server_ComStatus.ForeColor = System.Drawing.Color.FromArgb(((int)(((byte)(48)))), ((int)(((byte)(113)))), ((int)(((byte)(185)))));
-            this.label_Server_ComStatus.Location = new System.Drawing.Point(842, 693);
+            this.label_Server_ComStatus.ForeColor = System.Drawing.Color.White;
+            this.label_Server_ComStatus.Location = new System.Drawing.Point(841, 738);
             this.label_Server_ComStatus.Name = "label_Server_ComStatus";
             this.label_Server_ComStatus.Size = new System.Drawing.Size(106, 21);
             this.label_Server_ComStatus.TabIndex = 20;
@@ -1007,7 +1067,7 @@
             // 
             this.pictureBox2.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(192)))), ((int)(((byte)(255)))), ((int)(((byte)(192)))));
             this.pictureBox2.Image = global::Welling_Motor_Debug_Tool.Properties.Resources.about;
-            this.pictureBox2.Location = new System.Drawing.Point(846, 726);
+            this.pictureBox2.Location = new System.Drawing.Point(853, 696);
             this.pictureBox2.Name = "pictureBox2";
             this.pictureBox2.Size = new System.Drawing.Size(167, 23);
             this.pictureBox2.SizeMode = System.Windows.Forms.PictureBoxSizeMode.StretchImage;
@@ -1032,9 +1092,9 @@
             this.button_GenerateModelFile.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(255)))), ((int)(((byte)(128)))), ((int)(((byte)(128)))));
             this.button_GenerateModelFile.Font = new System.Drawing.Font("微软雅黑", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134)));
             this.button_GenerateModelFile.ForeColor = System.Drawing.Color.White;
-            this.button_GenerateModelFile.Location = new System.Drawing.Point(855, 13);
+            this.button_GenerateModelFile.Location = new System.Drawing.Point(868, 13);
             this.button_GenerateModelFile.Name = "button_GenerateModelFile";
-            this.button_GenerateModelFile.Size = new System.Drawing.Size(165, 75);
+            this.button_GenerateModelFile.Size = new System.Drawing.Size(149, 45);
             this.button_GenerateModelFile.TabIndex = 0;
             this.button_GenerateModelFile.Text = "生成模板";
             this.button_GenerateModelFile.UseVisualStyleBackColor = false;
@@ -1057,72 +1117,121 @@
             // 
             this.radioButton_MIGIC.AutoSize = true;
             this.radioButton_MIGIC.ForeColor = System.Drawing.Color.FromArgb(((int)(((byte)(48)))), ((int)(((byte)(113)))), ((int)(((byte)(185)))));
-            this.radioButton_MIGIC.Location = new System.Drawing.Point(855, 119);
+            this.radioButton_MIGIC.Location = new System.Drawing.Point(868, 565);
             this.radioButton_MIGIC.Name = "radioButton_MIGIC";
             this.radioButton_MIGIC.Size = new System.Drawing.Size(77, 25);
             this.radioButton_MIGIC.TabIndex = 24;
             this.radioButton_MIGIC.Text = "MIGIC";
             this.radioButton_MIGIC.UseVisualStyleBackColor = true;
+            this.radioButton_MIGIC.Click += new System.EventHandler(this.radioButton_MIGIC_Click);
             // 
             // radioButton_HUB
             // 
             this.radioButton_HUB.AutoSize = true;
             this.radioButton_HUB.ForeColor = System.Drawing.Color.FromArgb(((int)(((byte)(48)))), ((int)(((byte)(113)))), ((int)(((byte)(185)))));
-            this.radioButton_HUB.Location = new System.Drawing.Point(955, 119);
+            this.radioButton_HUB.Location = new System.Drawing.Point(955, 565);
             this.radioButton_HUB.Name = "radioButton_HUB";
             this.radioButton_HUB.Size = new System.Drawing.Size(62, 25);
             this.radioButton_HUB.TabIndex = 24;
             this.radioButton_HUB.Text = "HUB";
             this.radioButton_HUB.UseVisualStyleBackColor = true;
-            // 
-            // tabPage_Note
-            // 
-            this.tabPage_Note.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(192)))), ((int)(((byte)(255)))), ((int)(((byte)(192)))));
-            this.tabPage_Note.Controls.Add(this.button_NoteRead);
-            this.tabPage_Note.Controls.Add(this.button_NoteWrite);
-            this.tabPage_Note.Controls.Add(this.richTextBox_Note);
-            this.tabPage_Note.ForeColor = System.Drawing.Color.FromArgb(((int)(((byte)(48)))), ((int)(((byte)(113)))), ((int)(((byte)(185)))));
-            this.tabPage_Note.Location = new System.Drawing.Point(4, 30);
-            this.tabPage_Note.Name = "tabPage_Note";
-            this.tabPage_Note.Size = new System.Drawing.Size(484, 642);
-            this.tabPage_Note.TabIndex = 2;
-            this.tabPage_Note.Text = "备忘录";
-            // 
-            // richTextBox_Note
-            // 
-            this.richTextBox_Note.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(255)))), ((int)(((byte)(255)))), ((int)(((byte)(192)))));
-            this.richTextBox_Note.Font = new System.Drawing.Font("微软雅黑", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134)));
-            this.richTextBox_Note.Location = new System.Drawing.Point(6, 6);
-            this.richTextBox_Note.Name = "richTextBox_Note";
-            this.richTextBox_Note.Size = new System.Drawing.Size(472, 578);
-            this.richTextBox_Note.TabIndex = 1;
-            this.richTextBox_Note.Text = "";
-            // 
-            // button_NoteWrite
-            // 
-            this.button_NoteWrite.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(128)))), ((int)(((byte)(64)))), ((int)(((byte)(0)))));
-            this.button_NoteWrite.Font = new System.Drawing.Font("微软雅黑", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134)));
-            this.button_NoteWrite.ForeColor = System.Drawing.Color.White;
-            this.button_NoteWrite.Location = new System.Drawing.Point(388, 590);
-            this.button_NoteWrite.Name = "button_NoteWrite";
-            this.button_NoteWrite.Size = new System.Drawing.Size(90, 45);
-            this.button_NoteWrite.TabIndex = 2;
-            this.button_NoteWrite.Text = "保存";
-            this.button_NoteWrite.UseVisualStyleBackColor = false;
-            this.button_NoteWrite.Click += new System.EventHandler(this.button_NoteWrite_Click);
-            // 
-            // button_NoteRead
-            // 
-            this.button_NoteRead.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(64)))), ((int)(((byte)(64)))), ((int)(((byte)(64)))));
-            this.button_NoteRead.Font = new System.Drawing.Font("微软雅黑", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134)));
-            this.button_NoteRead.ForeColor = System.Drawing.Color.White;
-            this.button_NoteRead.Location = new System.Drawing.Point(292, 590);
-            this.button_NoteRead.Name = "button_NoteRead";
-            this.button_NoteRead.Size = new System.Drawing.Size(90, 45);
-            this.button_NoteRead.TabIndex = 2;
-            this.button_NoteRead.Text = "读取";
-            this.button_NoteRead.UseVisualStyleBackColor = false;
-            this.button_NoteRead.Click += new System.EventHandler(this.button_NoteRead_Click);
+            this.radioButton_HUB.Click += new System.EventHandler(this.radioButton_HUB_Click);
+            // 
+            // label_BT
+            // 
+            this.label_BT.AutoSize = true;
+            this.label_BT.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(48)))), ((int)(((byte)(113)))), ((int)(((byte)(185)))));
+            this.label_BT.Font = new System.Drawing.Font("Microsoft YaHei UI", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134)));
+            this.label_BT.ForeColor = System.Drawing.Color.White;
+            this.label_BT.Location = new System.Drawing.Point(431, 738);
+            this.label_BT.Name = "label_BT";
+            this.label_BT.Size = new System.Drawing.Size(207, 21);
+            this.label_BT.TabIndex = 20;
+            this.label_BT.Text = "编译时间:20220202 14:00";
+            // 
+            // label_Ver
+            // 
+            this.label_Ver.AutoSize = true;
+            this.label_Ver.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(48)))), ((int)(((byte)(113)))), ((int)(((byte)(185)))));
+            this.label_Ver.Font = new System.Drawing.Font("Microsoft YaHei UI", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134)));
+            this.label_Ver.ForeColor = System.Drawing.Color.White;
+            this.label_Ver.Location = new System.Drawing.Point(298, 738);
+            this.label_Ver.Name = "label_Ver";
+            this.label_Ver.Size = new System.Drawing.Size(104, 21);
+            this.label_Ver.TabIndex = 20;
+            this.label_Ver.Text = "版本:V0.0.0";
+            // 
+            // statusStrip1
+            // 
+            this.statusStrip1.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(48)))), ((int)(((byte)(113)))), ((int)(((byte)(185)))));
+            this.statusStrip1.Items.AddRange(new System.Windows.Forms.ToolStripItem[] {
+            this.toolStripStatusLabel1});
+            this.statusStrip1.Location = new System.Drawing.Point(0, 735);
+            this.statusStrip1.Name = "statusStrip1";
+            this.statusStrip1.Size = new System.Drawing.Size(1034, 26);
+            this.statusStrip1.TabIndex = 25;
+            this.statusStrip1.Text = "statusStrip1";
+            // 
+            // toolStripStatusLabel1
+            // 
+            this.toolStripStatusLabel1.Font = new System.Drawing.Font("Microsoft YaHei UI", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134)));
+            this.toolStripStatusLabel1.ForeColor = System.Drawing.Color.White;
+            this.toolStripStatusLabel1.Name = "toolStripStatusLabel1";
+            this.toolStripStatusLabel1.Size = new System.Drawing.Size(282, 21);
+            this.toolStripStatusLabel1.Text = "版权所有:武汉天腾动力科技有限公司";
+            // 
+            // label45
+            // 
+            this.label45.BackColor = System.Drawing.Color.Silver;
+            this.label45.ForeColor = System.Drawing.Color.White;
+            this.label45.Location = new System.Drawing.Point(288, 739);
+            this.label45.Name = "label45";
+            this.label45.Size = new System.Drawing.Size(1, 18);
+            this.label45.TabIndex = 26;
+            // 
+            // label40
+            // 
+            this.label40.BackColor = System.Drawing.Color.Silver;
+            this.label40.ForeColor = System.Drawing.Color.White;
+            this.label40.Location = new System.Drawing.Point(415, 739);
+            this.label40.Name = "label40";
+            this.label40.Size = new System.Drawing.Size(1, 18);
+            this.label40.TabIndex = 26;
+            // 
+            // label41
+            // 
+            this.label41.BackColor = System.Drawing.Color.Silver;
+            this.label41.ForeColor = System.Drawing.Color.White;
+            this.label41.Location = new System.Drawing.Point(695, 739);
+            this.label41.Name = "label41";
+            this.label41.Size = new System.Drawing.Size(1, 18);
+            this.label41.TabIndex = 26;
+            // 
+            // button_ChangeModelFile
+            // 
+            this.button_ChangeModelFile.BackColor = System.Drawing.Color.Olive;
+            this.button_ChangeModelFile.Font = new System.Drawing.Font("微软雅黑", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134)));
+            this.button_ChangeModelFile.ForeColor = System.Drawing.Color.White;
+            this.button_ChangeModelFile.Location = new System.Drawing.Point(868, 82);
+            this.button_ChangeModelFile.Name = "button_ChangeModelFile";
+            this.button_ChangeModelFile.Size = new System.Drawing.Size(149, 45);
+            this.button_ChangeModelFile.TabIndex = 0;
+            this.button_ChangeModelFile.Text = "修改模板";
+            this.button_ChangeModelFile.UseVisualStyleBackColor = false;
+            this.button_ChangeModelFile.Click += new System.EventHandler(this.button_ChangeModelFile_Click);
+            // 
+            // button_DeletModelFile
+            // 
+            this.button_DeletModelFile.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(255)))), ((int)(((byte)(128)))), ((int)(((byte)(0)))));
+            this.button_DeletModelFile.Font = new System.Drawing.Font("微软雅黑", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134)));
+            this.button_DeletModelFile.ForeColor = System.Drawing.Color.White;
+            this.button_DeletModelFile.Location = new System.Drawing.Point(868, 151);
+            this.button_DeletModelFile.Name = "button_DeletModelFile";
+            this.button_DeletModelFile.Size = new System.Drawing.Size(149, 45);
+            this.button_DeletModelFile.TabIndex = 27;
+            this.button_DeletModelFile.Text = "删除模板";
+            this.button_DeletModelFile.UseVisualStyleBackColor = false;
+            this.button_DeletModelFile.Click += new System.EventHandler(this.button_DeletModelFile_Click);
             // 
             // GenerateParams
             // 
@@ -1130,16 +1239,24 @@
             this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
             this.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(192)))), ((int)(((byte)(255)))), ((int)(((byte)(192)))));
             this.ClientSize = new System.Drawing.Size(1034, 761);
+            this.Controls.Add(this.button_DeletModelFile);
+            this.Controls.Add(this.label41);
+            this.Controls.Add(this.label40);
+            this.Controls.Add(this.label45);
+            this.Controls.Add(this.label_ServerStatus);
+            this.Controls.Add(this.label_Server_ComStatus);
+            this.Controls.Add(this.label_BT);
+            this.Controls.Add(this.label_Ver);
+            this.Controls.Add(this.statusStrip1);
             this.Controls.Add(this.radioButton_HUB);
             this.Controls.Add(this.radioButton_MIGIC);
             this.Controls.Add(this.comboBox_ModelFile);
-            this.Controls.Add(this.label_ServerStatus);
-            this.Controls.Add(this.label_Server_ComStatus);
             this.Controls.Add(this.pictureBox2);
             this.Controls.Add(this.groupBox1);
             this.Controls.Add(this.tabControl1);
             this.Controls.Add(this.label1);
             this.Controls.Add(this.button_ModeRefresh);
+            this.Controls.Add(this.button_ChangeModelFile);
             this.Controls.Add(this.button_GenerateModelFile);
             this.Controls.Add(this.button_ExportParams);
             this.Font = new System.Drawing.Font("微软雅黑", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134)));
@@ -1163,10 +1280,12 @@
             this.groupBox2.ResumeLayout(false);
             this.groupBox2.PerformLayout();
             this.tabPage_Advance.ResumeLayout(false);
+            this.tabPage_Note.ResumeLayout(false);
             this.groupBox1.ResumeLayout(false);
             this.groupBox1.PerformLayout();
             ((System.ComponentModel.ISupportInitialize)(this.pictureBox2)).EndInit();
-            this.tabPage_Note.ResumeLayout(false);
+            this.statusStrip1.ResumeLayout(false);
+            this.statusStrip1.PerformLayout();
             this.ResumeLayout(false);
             this.PerformLayout();
 
@@ -1264,5 +1383,14 @@
         private System.Windows.Forms.Button button_NoteWrite;
         private System.Windows.Forms.RichTextBox richTextBox_Note;
         private System.Windows.Forms.Button button_NoteRead;
+        private System.Windows.Forms.Label label_BT;
+        private System.Windows.Forms.Label label_Ver;
+        private System.Windows.Forms.StatusStrip statusStrip1;
+        private System.Windows.Forms.ToolStripStatusLabel toolStripStatusLabel1;
+        private System.Windows.Forms.Label label45;
+        private System.Windows.Forms.Label label40;
+        private System.Windows.Forms.Label label41;
+        private System.Windows.Forms.Button button_ChangeModelFile;
+        private System.Windows.Forms.Button button_DeletModelFile;
     }
 }

+ 276 - 4
Welling_Motor_Debug_Tool/GenerateParams.cs

@@ -109,8 +109,269 @@ namespace Welling_Motor_Debug_Tool
             }
         }
 
+        private void radioButton_MIGIC_Click(object sender, EventArgs e)
+        {
+            textBox_ProductTag.Text = "MM_MC1";
+            comboBox_SysRunMode.Items.Clear();
+            comboBox_SysRunMode.Items.Add("CITY");
+            comboBox_SysRunMode.Items.Add("MTB");
+        }
+
+        private void radioButton_HUB_Click(object sender, EventArgs e)
+        {
+            textBox_ProductTag.Text = "GF_250_1";
+            comboBox_SysRunMode.Items.Clear();
+            comboBox_SysRunMode.Items.Add("踏频");
+            comboBox_SysRunMode.Items.Add("力矩");
+        }
+
+        private void comboBox_SysRunMode_Click(object sender, EventArgs e)
+        {
+            if ((radioButton_MIGIC.Checked | radioButton_HUB.Checked) == false)
+            {
+                MessageBox.Show("请选择产品类型", "提示", MessageBoxButtons.OK, MessageBoxIcon.Error);
+            }
+        }
+
+        private void button_ChangeModelFile_Click(object sender, EventArgs e)
+        {
+            string DataFileName = "";
+            string FileInfo = "";
+
+            if (comboBox_ModelFile.SelectedIndex == -1)
+            {
+                MessageBox.Show("未选择模板!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Warning);
+                return;
+            }
+
+            if (MessageBox.Show("确认修改模板?", "确认", MessageBoxButtons.YesNo, MessageBoxIcon.Question) == DialogResult.No)
+            {
+                return;
+            }
+
+            //填写文件名            
+            DataFileName = comboBox_ModelFile.Text;
+
+            //分割参数更新参数内容
+            string[] lines = richTextBox_AdvanceParams.Text.Split(new string[] { "\n" }, StringSplitOptions.None);
+            try
+            {
+                //更新信息
+                do
+                {
+                    //建立字典,存放并获取每个命令的行号
+                    Dictionary<string, int> DicRowNum = new Dictionary<string, int>();
+                    DicRowNum.Add("[整车参数]", 0);
+                    DicRowNum.Add("[控制参数]", 0);
+                    DicRowNum.Add("[助力参数]", 0);
+                    DicRowNum.Add("[调试参数]", 0);
+                    DicRowNum.Add("[生产信息]", 0);
+                    Dictionary<string, int> __dict = new Dictionary<string, int>(DicRowNum);
+                    foreach (KeyValuePair<string, int> item in __dict)
+                    {
+                        for (int i = 0; i < lines.Length; i++)
+                        {
+                            if (lines[i].Contains(item.Key))
+                            {
+                                DicRowNum[item.Key] = i;
+                                break;
+                            }
+                        }
+                    }
+                    //遍历更新
+                    foreach (string index in DicRowNum.Keys)
+                    {
+                        int rowNum = DicRowNum[index]; //行号
+                        switch (index)
+                        {
+                            case "[整车参数]":
+                                {
+                                    //轮胎周长
+                                    lines[rowNum + 2] = "轮胎周长," + textBox_BikeWheel.Text;
+                                    //转把限速
+                                    lines[rowNum + 4] = "转把限速," + textBox_BikeThroSpeed.Text;
+                                    //推行限速
+                                    lines[rowNum + 5] = "推行限速," + textBox_BikeWalkSpeed.Text;
+                                    //前牙盘
+                                    lines[rowNum + 6] = "前牙盘," + textBox_BikeFrontT.Text;
+                                    //后牙盘
+                                    lines[rowNum + 7] = "后牙盘," + textBox_BikeRealB.Text;
+                                    //前后灯参数
+                                    int LightParams = 0x0000;
+                                    if (comboBox_BikeVolF.SelectedIndex == 0)
+                                        LightParams |= 0x0006;
+                                    else if (comboBox_BikeVolF.SelectedIndex == 1)
+                                        LightParams |= 0x000C;
+                                    else
+                                    {
+                                        MessageBox.Show("请选择前灯电压!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Error);
+                                        return;
+                                    }
+                                    if (comboBox_BikeVolB.SelectedIndex == 0)
+                                        LightParams |= 0x0600;
+                                    else if (comboBox_BikeVolB.SelectedIndex == 1)
+                                        LightParams |= 0x0C00;
+                                    else
+                                    {
+                                        MessageBox.Show("请选择后灯电压!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Error);
+                                        return;
+                                    }
+                                    if (comboBox_BikeModeB.SelectedIndex >= 0)
+                                        LightParams |= ((comboBox_BikeModeB.SelectedIndex + 1) << 12);
+                                    else
+                                    {
+                                        MessageBox.Show("请选择后灯模式!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Error);
+                                        return;
+                                    }
+                                    lines[rowNum + 10] = "前后灯参数," + ((ushort)LightParams).ToString();
+                                    //启动模式
+                                    lines[rowNum + 12] = "启动模式," + (comboBox_BikeStartMode.SelectedIndex + 1).ToString();
+                                    //开机延迟
+                                    int PowerTime = 0;
+                                    PowerTime |= Convert.ToUInt16(textBox_BikeAutoOffTime.Text);
+                                    PowerTime |= (Convert.ToUInt16(textBox_BikePowerOffTime.Text) << 8);
+                                    PowerTime |= (Convert.ToUInt16(textBox_BikePowerOnTime.Text) << 12);
+                                    lines[rowNum + 13] = "开关机参数," + ((ushort)PowerTime).ToString();
+                                    break;
+                                }
+                            case "[控制参数]":
+                                {
+                                    //峰值电流
+                                    lines[rowNum + 4] = "峰值电流," + textBox_MotorMaxCurr.Text;
+                                    //过压保护
+                                    lines[rowNum + 6] = "最高档位过压保护阈值," + textBox_MotorOV.Text;
+                                    //欠压保护
+                                    lines[rowNum + 7] = "最高档位欠压保护阈值," + textBox_MotorUV.Text;
+                                    break;
+                                }
+                            case "[助力参数]":
+                                {
+                                    //限速起始
+                                    lines[rowNum + 92] = "车速限幅启动阈值," + textBox_AssistSpeedBegin.Text;
+                                    //限速结束
+                                    lines[rowNum + 93] = "车速限幅停止阈值," + textBox_AssistSpeedEnd.Text;
+                                    break;
+                                }
+                            case "[调试参数]":
+                                {
+                                    //运行模式
+                                    lines[rowNum + 2] = "整体运行模式," + (comboBox_SysRunMode.SelectedIndex + 4).ToString();
+                                    //旋转方向
+                                    lines[rowNum + 5] = "旋转方向," + comboBox_SysDir.SelectedIndex.ToString();
+                                    //功率限幅
+                                    lines[rowNum + 23] = "功率限幅值," + textBox_SysPowerLimit.Text;
+                                    break;
+                                }
+                            case "[生产信息]":
+                                {
+                                    //生产商
+                                    lines[rowNum + 1] = "生产商," + textBox_ProductMac.Text;
+                                    //生产地
+                                    lines[rowNum + 2] = "生产地," + textBox_ProductAddr.Text;
+                                    //生产日期
+                                    lines[rowNum + 3] = "生产日期," + textBox_ProductDate.Text;
+                                    //产品标识
+                                    lines[rowNum + 4] = "产品标识," + textBox_ProductTag.Text;
+                                    break;
+                                }
+                            default: break;
+
+                        }
+                    }
+
+                } while (false);
+                //参数更新
+                richTextBox_AdvanceParams.Clear();
+                for (int i = 0; i < lines.Length; i++)
+                {
+                    richTextBox_AdvanceParams.AppendText(lines[i] + "\r\n");
+                }
+                richTextBox_AdvanceParams.Text = richTextBox_AdvanceParams.Text.Remove(richTextBox_AdvanceParams.Text.Length - 1);
+            }
+            catch (System.Exception)
+            {
+                MessageBox.Show("参数格式错误,更新失败", "提示", MessageBoxButtons.OK);
+                return;
+            }
+
+            //获取模板文本信息写入文件
+            FileInfo = richTextBox_AdvanceParams.Text;
+            if (FileInfo == string.Empty)
+            {
+                MessageBox.Show("无效参数", "提示", MessageBoxButtons.OK, MessageBoxIcon.Warning);
+                return;
+            }
+            System.IO.File.WriteAllText(DataFileName, FileInfo);
+
+            //模板文件上传服务器
+            if (myFtp.CheckFtp() == true)
+            {
+                //删除远程文件
+                myFtp.DeleteFile("/ParamsMode/" + DataFileName);
+                //上传文件
+                bool result1 = myFtp.UploadFile(Directory.GetCurrentDirectory() + "\\" + DataFileName, "ParamsMode");
+                if (result1 == true)
+                {
+                    MessageBox.Show("数据已上传!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
+                }
+                else
+                {
+                    MessageBox.Show("数据上传失败!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Warning);
+                }
+
+            }
+            else
+            {
+                MessageBox.Show("服务器断开!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Warning);
+            }
+            System.IO.File.Delete(Directory.GetCurrentDirectory() + "\\" + DataFileName);
+        }
+
+        private void button_DeletModelFile_Click(object sender, EventArgs e)
+        {
+            if (comboBox_ModelFile.SelectedIndex == -1)
+            {
+                MessageBox.Show("未选择模板!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Warning);
+            }
+            else
+            {
+                Login loginForm = new Login();
+                loginForm.ShowDialog();
+                if (loginForm.textBox_Passwd.Text == loginForm.UserAccount[loginForm.comboBox_User.Text])//检验模式所有用户支持
+                {
+                    if (!loginForm.comboBox_User.Text.Contains("工程参数配置"))
+                    {
+                        MessageBox.Show("权限不支持!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Warning);
+                        return;
+                    }                    
+                }
+                else
+                {
+                    MessageBox.Show("密码错误!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Warning);
+                    return;
+                }
+
+                if (myFtp.CheckFtp() == true)
+                {
+                    //删除远程文件
+                    myFtp.DeleteFile("/ParamsMode/" + comboBox_ModelFile.Text);
+                    comboBox_ModelFile.Items.Clear();
+                    richTextBox_AdvanceParams.Clear();
+                    MessageBox.Show("模板已删除,请刷新!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Warning);
+                }
+                else
+                {
+                    MessageBox.Show("服务器断开!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Warning);
+                }
+            }
+        }
+
         private void GenerateParams_Load(object sender, EventArgs e)
         {
+            //更新版本信息
+            label_Ver.Text = "版本: V" + mainForm.Version;
+            label_BT.Text = "编译时间:" + System.IO.File.GetLastWriteTime(this.GetType().Assembly.Location).ToString("yyyy-MM-dd HH:mm:ss");
+
             //导入网络配置
             if (System.IO.File.Exists(localInfo.LocalPath + localInfo.ConfigFileName)) //存在配置文件,导入配置信息
             {
@@ -411,6 +672,14 @@ namespace Welling_Motor_Debug_Tool
                         MessageBox.Show("信息填写不完整", "提示", MessageBoxButtons.OK, MessageBoxIcon.Error);
                         return;
                     }
+                    if (c.Text.Contains('_'))
+                    {
+                        if ((c.Name != "textBox_ProductTag")&& (c.Name != "textBox_SoftwareVer"))
+                        {
+                            MessageBox.Show("\"" + c.Text + "\"" + "包含字符'_'", "提示", MessageBoxButtons.OK, MessageBoxIcon.Error);
+                            return;
+                        }                        
+                    }
                 }
             }
 
@@ -552,7 +821,7 @@ namespace Welling_Motor_Debug_Tool
             }
             catch (System.Exception)
             {
-                MessageBox.Show("参数更新失败", "提示", MessageBoxButtons.OK);
+                MessageBox.Show("参数格式错误,更新失败", "提示", MessageBoxButtons.OK);
                 return;
             }
 
@@ -598,8 +867,11 @@ namespace Welling_Motor_Debug_Tool
             }
             else
             {
-                if (!System.IO.File.Exists(localInfo.ToolsPath + "\\" + "GenerateParamsFile" + "\\" + "ConsoleApp2.exe"))
-                    myFtp.DownloadFile("Tools/GenerateParamsFile/ConsoleApp2.exe", localInfo.ToolsPath + "\\" + "GenerateParamsFile");
+                //程序使用最新版本
+                if (System.IO.File.Exists(localInfo.ToolsPath + "\\" + "GenerateParamsFile" + "\\" + "ConsoleApp2.exe"))
+                    System.IO.File.Delete(localInfo.ToolsPath + "\\" + "GenerateParamsFile" + "\\" + "ConsoleApp2.exe");
+                myFtp.DownloadFile("Tools/GenerateParamsFile/ConsoleApp2.exe", localInfo.ToolsPath + "\\" + "GenerateParamsFile");
+                //库文件不更新
                 if (!System.IO.File.Exists(localInfo.ToolsPath + "\\" + "GenerateParamsFile" + "\\" + "Newtonsoft.Json.xml"))
                     myFtp.DownloadFile("Tools/GenerateParamsFile/Newtonsoft.Json.xml", localInfo.ToolsPath + "\\" + "GenerateParamsFile");
                 if (!System.IO.File.Exists(localInfo.ToolsPath + "\\" + "GenerateParamsFile" + "\\" + "Newtonsoft.Json.dll"))
@@ -609,7 +881,7 @@ namespace Welling_Motor_Debug_Tool
             //转换.ttcfg文件
             ProcessStartInfo startInfo = new ProcessStartInfo();
             startInfo.FileName = localInfo.ToolsPath + "\\" + "GenerateParamsFile" + "\\" + "ConsoleApp2.exe";
-            startInfo.Arguments = LocalPath + "\\" + fileName + ".src";
+            startInfo.Arguments = "\"" + LocalPath + "\\" + fileName + ".src" + "\"";
             System.Diagnostics.Process.Start(startInfo);
             Thread.Sleep(1000);
 

+ 6 - 0
Welling_Motor_Debug_Tool/GenerateParams.resx

@@ -117,6 +117,12 @@
   <resheader name="writer">
     <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
   </resheader>
+  <metadata name="statusStrip1.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
+    <value>17, 17</value>
+  </metadata>
+  <metadata name="$this.TrayHeight" type="System.Int32, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>28</value>
+  </metadata>
   <assembly alias="System.Drawing" name="System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
   <data name="$this.Icon" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
     <value>

+ 130 - 0
Welling_Motor_Debug_Tool/Version.Designer.cs

@@ -0,0 +1,130 @@
+namespace Welling_Motor_Debug_Tool
+{
+    partial class Version
+    {
+        /// <summary>
+        /// Required designer variable.
+        /// </summary>
+        private System.ComponentModel.IContainer components = null;
+
+        /// <summary>
+        /// Clean up any resources being used.
+        /// </summary>
+        /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
+        protected override void Dispose(bool disposing)
+        {
+            if (disposing && (components != null))
+            {
+                components.Dispose();
+            }
+            base.Dispose(disposing);
+        }
+
+        #region Windows Form Designer generated code
+
+        /// <summary>
+        /// Required method for Designer support - do not modify
+        /// the contents of this method with the code editor.
+        /// </summary>
+        private void InitializeComponent()
+        {
+            System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(Version));
+            this.label1 = new System.Windows.Forms.Label();
+            this.label_Ver = new System.Windows.Forms.Label();
+            this.label_BT = new System.Windows.Forms.Label();
+            this.pictureBox2 = new System.Windows.Forms.PictureBox();
+            this.button_CheckVersion = new System.Windows.Forms.Button();
+            ((System.ComponentModel.ISupportInitialize)(this.pictureBox2)).BeginInit();
+            this.SuspendLayout();
+            // 
+            // label1
+            // 
+            this.label1.AutoSize = true;
+            this.label1.ForeColor = System.Drawing.Color.FromArgb(((int)(((byte)(48)))), ((int)(((byte)(113)))), ((int)(((byte)(185)))));
+            this.label1.Location = new System.Drawing.Point(49, 164);
+            this.label1.Margin = new System.Windows.Forms.Padding(5, 0, 5, 0);
+            this.label1.Name = "label1";
+            this.label1.Size = new System.Drawing.Size(282, 21);
+            this.label1.TabIndex = 0;
+            this.label1.Text = "版权所有:武汉天腾动力科技有限公司";
+            // 
+            // label_Ver
+            // 
+            this.label_Ver.AutoSize = true;
+            this.label_Ver.ForeColor = System.Drawing.Color.FromArgb(((int)(((byte)(48)))), ((int)(((byte)(113)))), ((int)(((byte)(185)))));
+            this.label_Ver.Location = new System.Drawing.Point(49, 102);
+            this.label_Ver.Margin = new System.Windows.Forms.Padding(5, 0, 5, 0);
+            this.label_Ver.Name = "label_Ver";
+            this.label_Ver.Size = new System.Drawing.Size(104, 21);
+            this.label_Ver.TabIndex = 0;
+            this.label_Ver.Text = "版本:V2.1.2";
+            // 
+            // label_BT
+            // 
+            this.label_BT.AutoSize = true;
+            this.label_BT.ForeColor = System.Drawing.Color.FromArgb(((int)(((byte)(48)))), ((int)(((byte)(113)))), ((int)(((byte)(185)))));
+            this.label_BT.Location = new System.Drawing.Point(49, 133);
+            this.label_BT.Margin = new System.Windows.Forms.Padding(5, 0, 5, 0);
+            this.label_BT.Name = "label_BT";
+            this.label_BT.Size = new System.Drawing.Size(243, 21);
+            this.label_BT.TabIndex = 0;
+            this.label_BT.Text = "编译时间:2022-05-22 14:00:00";
+            // 
+            // pictureBox2
+            // 
+            this.pictureBox2.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(192)))), ((int)(((byte)(255)))), ((int)(((byte)(192)))));
+            this.pictureBox2.Image = global::Welling_Motor_Debug_Tool.Properties.Resources.about;
+            this.pictureBox2.Location = new System.Drawing.Point(111, 46);
+            this.pictureBox2.Name = "pictureBox2";
+            this.pictureBox2.Size = new System.Drawing.Size(167, 23);
+            this.pictureBox2.SizeMode = System.Windows.Forms.PictureBoxSizeMode.StretchImage;
+            this.pictureBox2.TabIndex = 18;
+            this.pictureBox2.TabStop = false;
+            // 
+            // button_CheckVersion
+            // 
+            this.button_CheckVersion.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(48)))), ((int)(((byte)(113)))), ((int)(((byte)(185)))));
+            this.button_CheckVersion.ForeColor = System.Drawing.Color.White;
+            this.button_CheckVersion.Location = new System.Drawing.Point(278, 209);
+            this.button_CheckVersion.Name = "button_CheckVersion";
+            this.button_CheckVersion.Size = new System.Drawing.Size(94, 40);
+            this.button_CheckVersion.TabIndex = 19;
+            this.button_CheckVersion.Text = "检查版本";
+            this.button_CheckVersion.UseVisualStyleBackColor = false;
+            this.button_CheckVersion.Click += new System.EventHandler(this.button_CheckVersion_Click);
+            // 
+            // Version
+            // 
+            this.AutoScaleDimensions = new System.Drawing.SizeF(10F, 21F);
+            this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+            this.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(192)))), ((int)(((byte)(255)))), ((int)(((byte)(192)))));
+            this.ClientSize = new System.Drawing.Size(384, 261);
+            this.Controls.Add(this.button_CheckVersion);
+            this.Controls.Add(this.pictureBox2);
+            this.Controls.Add(this.label_BT);
+            this.Controls.Add(this.label_Ver);
+            this.Controls.Add(this.label1);
+            this.Font = new System.Drawing.Font("微软雅黑", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134)));
+            this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedSingle;
+            this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon")));
+            this.Margin = new System.Windows.Forms.Padding(5, 5, 5, 5);
+            this.MaximizeBox = false;
+            this.Name = "Version";
+            this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent;
+            this.Text = "Version";
+            this.Load += new System.EventHandler(this.Version_Load);
+            ((System.ComponentModel.ISupportInitialize)(this.pictureBox2)).EndInit();
+            this.ResumeLayout(false);
+            this.PerformLayout();
+
+        }
+
+        #endregion
+
+        private System.Windows.Forms.Label label1;
+        private System.Windows.Forms.Label label_Ver;
+        private System.Windows.Forms.Label label_BT;
+        private System.Windows.Forms.PictureBox pictureBox2;
+        private System.Windows.Forms.Button button_CheckVersion;
+    }
+}

+ 127 - 0
Welling_Motor_Debug_Tool/Version.cs

@@ -0,0 +1,127 @@
+using System;
+using System.Collections;
+using System.Collections.Generic;
+using System.ComponentModel;
+using System.Data;
+using System.Drawing;
+using System.IO;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using System.Windows.Forms;
+
+namespace Welling_Motor_Debug_Tool
+{
+    public partial class Version : Form
+    {
+        //存储路径文件
+        LocalInfo localInfo = new LocalInfo();
+        //服务器配置
+        string IP, Port, User, PassWD;
+        //FTP
+        ftp myFtp = new ftp();
+
+        public Version()
+        {
+            InitializeComponent();
+        }
+
+        private void Version_Load(object sender, EventArgs e)
+        {
+            //更新版本信息
+            label_Ver.Text = "版本: V" + mainForm.Version;
+            label_BT.Text = "编译时间:" + System.IO.File.GetLastWriteTime(this.GetType().Assembly.Location).ToString("yyyy-MM-dd HH:mm:ss");
+
+            //导入网络配置
+            if (System.IO.File.Exists(localInfo.LocalPath + localInfo.ConfigFileName)) //存在配置文件,导入配置信息
+            {
+                //打开文件
+                StreamReader objReader = new StreamReader(localInfo.LocalPath + localInfo.ConfigFileName);
+                string sLine = "";
+                ArrayList array_CfgInfo = new ArrayList();
+                array_CfgInfo.Clear();
+                while (sLine != null)
+                {
+                    sLine = objReader.ReadLine();
+                    array_CfgInfo.Add(sLine);
+                }
+                objReader.Close();
+                //解析配置文件
+                try
+                {
+                    //Server Set IP, Port, User, PassWS, ModelPath;
+                    IP = array_CfgInfo[12].ToString().Split(':')[1];
+                    Port = array_CfgInfo[13].ToString().Split(':')[1];
+                    User = array_CfgInfo[14].ToString().Split(':')[1];
+                    PassWD = array_CfgInfo[15].ToString().Split(':')[1];
+                    myFtp.FtpOption(IP, Port, User, PassWD);
+                }
+                catch (System.Exception)
+                {
+                    MessageBox.Show("参数格式错误,写入默认值!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Warning);
+                }
+            }
+            else
+            {
+                MessageBox.Show("参数文件丢失!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Warning);
+                this.Close();
+            }
+
+        }
+
+        private void button_CheckVersion_Click(object sender, EventArgs e)
+        {
+            //检查网络状态
+            if (myFtp.CheckFtp() == false)
+            {
+                MessageBox.Show("网络断开", "提示", MessageBoxButtons.OK, MessageBoxIcon.Warning);
+                return;
+            }
+            else
+            {
+                //检查本地文件删除            
+                if (System.IO.File.Exists(localInfo.LocalPath + "\\Version"))
+                    System.IO.File.Delete(localInfo.LocalPath + "\\Version");
+                //读取最新版本号
+                myFtp.DownloadFile("/Tools/Welling_Motor_Debug_Tool/Version", localInfo.LocalPath);
+                StreamReader objReader = new StreamReader(localInfo.LocalPath + "\\Version");
+                string sLine = "";
+                ArrayList arrText = new ArrayList();//创建一个动态数组
+                while (sLine != null)
+                {
+                    sLine = objReader.ReadLine();
+                    arrText.Add(sLine);
+                }
+                objReader.Close();
+                System.IO.File.Delete(localInfo.LocalPath + "\\Version");
+                //检查是否有最新版本
+                string[] VerOld = mainForm.Version.Trim().Split('.');
+                string[] VerNew = arrText[0].ToString().Trim().Split('.');
+                if (Convert.ToInt16(VerNew[0]) <= Convert.ToInt16(VerOld[0]))
+                {
+                    if (Convert.ToInt16(VerNew[1]) <= Convert.ToInt16(VerOld[1]))
+                    {
+                        if (Convert.ToInt16(VerNew[2]) <= Convert.ToInt16(VerOld[2]))
+                        {
+                            MessageBox.Show("版本已是最新", "提示", MessageBoxButtons.OK, MessageBoxIcon.Warning);
+                            return;
+                        }
+                    }
+                }
+                //下载最新版本
+                string SavePath = Directory.GetCurrentDirectory();
+                string[] FileList = myFtp.GetFileNameList("/Tools/Welling_Motor_Debug_Tool");
+                foreach (string file in FileList)
+                {
+                    if (file.Contains(".exe"))
+                    {
+                        myFtp.DownloadFile("/Tools/Welling_Motor_Debug_Tool/" + file, SavePath);
+                        MessageBox.Show("最新版本下载完成,请手动删除旧版本\r\n最新版本:" + file, "提示", MessageBoxButtons.OK, MessageBoxIcon.Warning);
+                        return;
+                    }                    
+                }
+            }
+
+        }
+    }
+}

+ 946 - 0
Welling_Motor_Debug_Tool/Version.resx

@@ -0,0 +1,946 @@
+<?xml version="1.0" encoding="utf-8"?>
+<root>
+  <!-- 
+    Microsoft ResX Schema 
+    
+    Version 2.0
+    
+    The primary goals of this format is to allow a simple XML format 
+    that is mostly human readable. The generation and parsing of the 
+    various data types are done through the TypeConverter classes 
+    associated with the data types.
+    
+    Example:
+    
+    ... ado.net/XML headers & schema ...
+    <resheader name="resmimetype">text/microsoft-resx</resheader>
+    <resheader name="version">2.0</resheader>
+    <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
+    <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
+    <data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
+    <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
+    <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
+        <value>[base64 mime encoded serialized .NET Framework object]</value>
+    </data>
+    <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
+        <comment>This is a comment</comment>
+    </data>
+                
+    There are any number of "resheader" rows that contain simple 
+    name/value pairs.
+    
+    Each data row contains a name, and value. The row also contains a 
+    type or mimetype. Type corresponds to a .NET class that support 
+    text/value conversion through the TypeConverter architecture. 
+    Classes that don't support this are serialized and stored with the 
+    mimetype set.
+    
+    The mimetype is used for serialized objects, and tells the 
+    ResXResourceReader how to depersist the object. This is currently not 
+    extensible. For a given mimetype the value must be set accordingly:
+    
+    Note - application/x-microsoft.net.object.binary.base64 is the format 
+    that the ResXResourceWriter will generate, however the reader can 
+    read any of the formats listed below.
+    
+    mimetype: application/x-microsoft.net.object.binary.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
+            : and then encoded with base64 encoding.
+    
+    mimetype: application/x-microsoft.net.object.soap.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter
+            : and then encoded with base64 encoding.
+
+    mimetype: application/x-microsoft.net.object.bytearray.base64
+    value   : The object must be serialized into a byte array 
+            : using a System.ComponentModel.TypeConverter
+            : and then encoded with base64 encoding.
+    -->
+  <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
+    <xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
+    <xsd:element name="root" msdata:IsDataSet="true">
+      <xsd:complexType>
+        <xsd:choice maxOccurs="unbounded">
+          <xsd:element name="metadata">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" />
+              </xsd:sequence>
+              <xsd:attribute name="name" use="required" type="xsd:string" />
+              <xsd:attribute name="type" type="xsd:string" />
+              <xsd:attribute name="mimetype" type="xsd:string" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="assembly">
+            <xsd:complexType>
+              <xsd:attribute name="alias" type="xsd:string" />
+              <xsd:attribute name="name" type="xsd:string" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="data">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+                <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
+              <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
+              <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="resheader">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" />
+            </xsd:complexType>
+          </xsd:element>
+        </xsd:choice>
+      </xsd:complexType>
+    </xsd:element>
+  </xsd:schema>
+  <resheader name="resmimetype">
+    <value>text/microsoft-resx</value>
+  </resheader>
+  <resheader name="version">
+    <value>2.0</value>
+  </resheader>
+  <resheader name="reader">
+    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <resheader name="writer">
+    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <assembly alias="System.Drawing" name="System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
+  <data name="$this.Icon" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+    <value>
+        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
+        /z//4/+///v///////////////////f/P//z/w//+f8D//h/AP/8DgB//AAAf/4AAH//AAD//8AB///w
+        Af///8P////n////5////+//KAAAABgAAAAwAAAAAQAEAAAAAAAgAQAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAIAAAIAAAACAgACAAAAAgACAAICAAACAgIAAwMDAAAAA/wAA/wAAAP//AP8AAAD/AP8A//8AAP//
+        /wAAAAAAAAAAAAAAAAAAAAAAMAAAAAAAAAAAAAAHoAAAAAAAAAAAAAB3hwdwAAAAAAAAAACquoqKNwAA
+        AAAAAAc4qKiop6AAAAAAAHp6eot6inMAAAAAAHp6incAd6egAAAAAAB6i2AAAAegAAAAAAAAenAAAACG
+        AAAAAAAAAHAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHAAAAB6cAAA
+        AAAAAHcAAAADo3AAAAAAAAp3AAAKiqNgAAAAAAiop6d3p6enAAAAAAB7eHuop6egAAAAAAAHp3h4uKgA
+        AAAAAAAACKeoqIMAAAAAAAAAAAAAioAAAAAAAAAAAAAACAAAAAAAAAAAAAAABwAAAAD///8A/3//AP5/
+        /wD8J/8A/AD/APgAfwDwAD8A8AwfAPwfnwD/H88A/9//AP///wD///8A////APfx/wDz+H8A+PgfAPgA
+        DwD8AB8A/gA/AP+APwD//H8A//7/AP/+/wAoAAAAEAAAACAAAAABAAQAAAAAAIAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAgAAAgAAAAICAAIAAAACAAIAAgIAAAICAgADAwMAAAAD/AAD/AAAA//8A/wAAAP8A
+        /wD//wAA////AAAABwAAAAAAAAAKAAAAAAAAAHg2NwAAAAADqoqKMAAAAAd6inqKAAAACnqDAHNgAAAA
+        B6cAADAAAAAAAAAAAAAAAAAAAAAAAABwAAA2AAAAAAcwAHo3AAAAB6d6enqgAAAAeoiop3AAAAAHp7eK
+        AAAAAAAACoAAAAAAAAAAcAAA+/8AAPv/AADwPwAA4B8AAOAPAADgxwAA+PcAAP//AAD//wAA3z8AAOcP
+        AADgBwAA8AcAAPgPAAD/nwAA/98AACgAAAAwAAAAYAAAAAEACAAAAAAAAAkAAAAAAAAAAAAAAAEAAAAB
+        AAAAAAAAM39IADl8SwBEcU8ATmhTAFFhVABValoAVW5bAFdrXABba18ARHtSAEl+VgBOeVkAU3VcAF1t
+        YABecmMAZG1mAGhpZwBjcGYAZnFpAGlyawBrcWwAcHVwAHN7dAB1eXUAenp6AHx9fAANuz4AOIRPADuF
+        UAA9ilMAO4tUAC+YUAA+lVYAC75BADKjUQA3plUAOKRUADSpUwA7pVsAPKRcAC+zUgAqt1IAJrpUAC+7
+        UwAovFIAL71ZADSyVgA9slwAMb1bADS9WQA6vF4APb5gADy9ZABFhVYASIRXAE2AWgBCjVgASohZAEGW
+        VgBLkl0ARJtbAEKkXABRjGAAWI5mAFCXYABcnGwAaYtxAHiIfABml3QAaZZ0AGGYcABmm3UAbZx4AEmo
+        ZQBbom8ARLNhAEizZgBHumYASb5nAEy9bABYsm8AW6xwAFS8dABavHUAW754AG+jfABmqXgAYbF4AGi9
+        fwALwUMADsJDAAvDRAAOwkcADsRIAAvKSAAPyUoAEcJDABXFSQASyksAFMtLABLLTgAVyEwAEc1OABrL
+        SgAYyU4AHs5PABnNUQAczFMAEtBQABXRUQAU1lQAGtFRABzRUQAa0VQAHNNXABjXVwAW2FYAHNVYABjY
+        WAAd2FoAGd1ZABreXQAe3V0AK8VTACvCVQAtwFUAJMlVACDNVQAtyF4AMcBXADTGXAA1yV4ANMxcACLY
+        VwAm1F4AK9ReACLaWwAm3VwANtBeABnhXgAb5V4AHORfAB/dYAA3w2MAOsRjADbJYAAxzmAANs1hADfO
+        ZAA7y2QAJdthACjYYQAt3GYAMdFjADDTZAA30WUAN9RlADjUZgA60WgAPNJpADrVaAA81WkAP9NsADzV
+        bAA23WsAO9hrADvZbAA82W0APd1uAD7ZcAA+3nEAG+NgABvlYgAd5WAAHOhjAB3oZAAb7GQAHu1lAB7u
+        aQAe8mkAH/JtACHgYQAl4GIAIuVmACXkZQAh6WUAI+9nACXnaAAr4msALOFoACnmagAk6moAIO5oACbt
+        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
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////////AAD//3////8AAP/+f////wAA//4/////
+        AAD//D////8AAP/4P////wAA//g/////AAD/8AAf//8AAP/gAAP//wAA/+AAAP//AAD/wAAAf/8AAP+A
+        AAA//wAA/4AAAB//AAD/AAAAD/8AAP8AAAAH/wAA/wAH/Af/AAD/wAf/A/8AAP/wA//D/wAA//wD//H/
+        AAD//wP/+f8AAP//4//9/wAA///7////AAD///////8AAP///////wAA////////AAD///////8AAP//
+        /z///wAA/v//D///AAD+P/8D//8AAP8f/wD//wAA/w//gD//AAD/A/+AD/8AAP+Af4AD/wAA/8AAAAP/
+        AAD/wAAAA/8AAP/gAAAH/wAA//AAAAf/AAD/+AAAD/8AAP/+AAAf/wAA//8AAB//AAD//+AAP/8AAP//
+        //B//wAA////8H//AAD////w//8AAP////H//wAA////+f//AAD////7//8AAP///////wAAKAAAACAA
+        AABAAAAAAQAIAAAAAAAABAAAAAAAAAAAAAAAAQAAAAEAAAAAAAAduCgAH70vACKrMwAtpD0AKK46ACOw
+        NAAqtDwAJL85ACfJPwA4pkUANKpCADesRAA5qkQAPqJKADymSQA9rUoANLRGADmxRgA5tUcAMLxDADey
+        TAA8tUoAP7JMADe/TAA6uUgARJ9LAEGqTgBAs04ARaRQAEauUwBMq1UAV6dfAEq1VgBFvFQATbJaAFG0
+        XgBfo2YAXa9kAFW0YQBYsmQAVbtiAFK+YQBauGYAZKdrAGO9agAvzEQAMcBFADTESQAyx00AOsFMADnI
+        TQAy1kcAMdxNADzDUAA/xlUAPMpRADbQUAA601QAPdZXADvdUgA+2loAR8FYAEjBWABNwl0AQ8pZAEfN
+        XABA0FYARNNaAEjQXgBI1l4AR9ldAELcXABE3l8ASs9gAFXGYQBXw2YAWcFjAEzSYgBL22IATt1lAFDV
+        ZgBb1G0AU91pAFfabABd2HEAbcd0AGDcdABG5GEAS+JlAEnpZQBN5mgAUuNqAFXmbgBY4W0AV+5pAFLo
+        bABU628AWelxAFrudABd7XYAWfNzAGLjdQBk4XkAaeZ+AGLpeABj7X0AaOp9AGDweQBg+nsAbeuDAG/u
+        hgBr94QAcvGKAHj9kAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP///wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAiAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARj0AAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAACltXwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARmxtJAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD5fXWNZSFpbPS4NJAAAAAAAAAAAAAAAAAAAAAAAAAAnPD1Z
+        YWxsY2NTUUQ5CCMAAAAAAAAAAAAAAAAAAAAAAENEOTtZX2NjY2NTT0E2CRoAAAAAAAAAAAAAAAAAAAAf
+        QUVKQztYX2NsbGxTWUU2MAQAAAAAAAAAAAAAAAAAK0M2NkVOTk9JWU9RTlNJWU82MRoAAAAAAAAAAAAA
+        AAAAPxg4NkFOUVMsAAAAAAAAVjpEMCcAAAAAAAAAAAAAAAAAAD82QUFOXiUAAAAAAAAAAC09EQAAAAAA
+        AAAAAAAAAAAAAABAOEZTIAAAAAAAAAAAAAA1KAAAAAAAAAAAAAAAAAAAAAAAKTg4AAAAAAAAAAAAAAAX
+        AAAAAAAAAAAAAAAAAAAAAAAAAEwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAHQAAAAAAAAAAAAAABQ4AAAAAAAAAAAAAAAAAAAAAAABMDgAAAAAAAAAA
+        AAA0CQ0OAAAAAAAAAAAAAAAAAAAAAABTDQAAAAAAAAAAADYzLwgEDgAAAAAAAAAAAAAAAAAAAExsIQ4A
+        AAAAAAAAED0wFAcCBA4AAAAAAAAAAAAAAAAAAFRnUyELDgAAABsLSUMzFAcGAQMAAAAAAAAAAAAAAAAA
+        EFNVZ2NlZWVlZWFPR0MzLwcGBgAAAAAAAAAAAAAAAAAAEFNVV2drbGNjY19QSEMzLwkeAAAAAAAAAAAA
+        AAAAAAAAG1FVV2dub3FsZ2NUU05PJgAAAAAAAAAAAAAAAAAAAAAAAC1RZm5ucXJycW5oaFIAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAeEhcYFxdocW5wHgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABxychEAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHIyAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAbB4A
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeAAAAAAAAAAAAAAAA///////f////n////x////8P
+        ///+AB///AAH//wAA//4AAH/8AAA//gD8H/+A/x//4P/P//j/7//+///////////////////9/8///P/
+        D//5/wP/+H8A//wOAH/8AAB//gAAf/8AAP//wAH///AB////w////+f////n////7/8oAAAAGAAAADAA
+        AAABAAgAAAAAAEACAAAAAAAAAAAAAAABAAAAAQAAAAAAAByxMAAjtTcAIL00ACe0OQAovDsAPJlJAC6o
+        QAA2rkcAOaJIADaxRwAxv0QAOLVJAD24UABHmlMARJxRAFGaXABGr1MATrZbAEm7WQBfmWcAbJtyAGqc
+        cABWpWEAW6JmAF2lZwBXu2MAW75nAF29agBjo2sAZKNtAGWxbwBjt24AeaF+AGuzdQBwtnsAdbR+AHW+
+        fwAsxUEAMcdFADXGSQA1y0sAN9hPADvKUQA8y1EAPMxRAD7PVAA601EAO9ZWAD7UVgA/1lkAPOFXAEDM
+        VgBLwFwATcFfAEHKWABGy1oAS8peAEjMXgBA1lYARdFaAEXRXABF1lwASNBfAEjVXgBKzWAAVsRnAFfJ
+        ZgBN0mQATtplAEzfZABS0mYAUdtnAFHdaABU3WsAW91xAFzdcABjxHEAYdVzAGzUfABn2XkAYt54AGnd
+        ewBH4WIAS+JjAErjZQBO4WYATehnAE7maQBX4GsAUuZrAFXlbgBV6G4AX+V1AFbtcQBY7XMAX+p2AFrs
+        dABc73YAV/ByAFjzcgBa9XUAXvF4AF36eQBg5HYAYeF4AGfpfgBk9X4AfqKDAHyxgwB/tYUAbuSBAGzo
+        ggBp7oAAdO+JAGfzgABy8IkAcfWIAHT1jAB0/YsAf/+XAIO1igCDuYsAh7uPAIe8jQAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAADQAAAAAAAAAAAAAAAAAAAAAAAAAAAABIVwAAAAAAAAAAAAAAAAAAAAAAAAAAAB9nZR4AIWwA
+        AAAAAAAAAAAAAAAAAAAAADNYX2VlXlQvCBUAAAAAAAAAAAAAAAAAEy8yVF5fX1tFPCkJAAAAAAAAAAAA
+        AAAePEE8MlNlZ2dlWzwtBwAAAAAAAAAAAAARLTc6REkTegAAJUIvPA8AAAAAAAAAAAAAABI0REkXAAAA
+        AAAAHCoAAAAAAAAAAAAAAAAAGjw6AAAAAAAAAHoKAAAAAAAAAAAAAAAAAAAbAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAUAAAAAAAAACMmEAAAAAAAAAAAAAAAAABDGAAAAAAAAAAvJwIPAAAAAAAAAAAA
+        AAAAXzYVAAAAAAAtLQsFAQYAAAAAAAAAAAAAImhoSDxBQURUPC0LBAMYAAAAAAAAAAAAAB9MaWpza2Ve
+        VDwtKAwAAAAAAAAAAAAAAABtR2lwdHR0c2lMWwAAAAAAAAAAAAAAAAAAAHpNTlJPb3R1IwAAAAAAAAAA
+        AAAAAAAAAAAAAAAAe3hSAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHcAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AG0AAAAAAAAAAP///wD/f/8A/n//APwn/wD8AP8A+AB/APAAPwDwDB8A/B+fAP8fzwD/3/8A////AP//
+        /wD///8A9/H/APP4fwD4+B8A+AAPAPwAHwD+AD8A/4A/AP/8fwD//v8A//7/ACgAAAAQAAAAIAAAAAEA
+        CAAAAAAAAAEAAAAAAAAAAAAAAAEAAAABAAAAAAAAV3VcAC+UOwAXoycAIqszACq0PAAkvzkAPI5FAD+y
+        TAA1vEgARYxOAESfSwBKi1MAT45WAFOKWgBGmVEAV5VdAFOlXABXp18AV6hfAEq1VgBSulsAXI1jAFuV
+        YwBvj3EAWapiADnITQA8w1AAPMtRADrTVAA91lcAPtpaAETTWgBI1l4AR9ldAETeXwBE4VwASs9gAFXA
+        aABcz2kAS9tiAE7dZQBQ1WYAZtJvAGDcdABL4mUAWelxAFjtcQBd6nUAYPp7AGv3hABy8YoAeP2QAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///8AAAAAAAAmAAAAAAAAAAAAAAAAAAAAHwAAAAAAAAAA
+        AAAAAAAACDEHDAoOAAAAAAAAAAAADCQtMTEvHgIAAAAAAAAAABwlIC0pISEjBQAAAAAAAAAMCSopFgAA
+        FwkCAAAAAAAAAAAQGwEAAAAABwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAYAAAA
+        AAACBwAAAAAAAAAAABQRAAAADB4EBwAAAAAAAAAQLxQHCw8iGgYDAAAAAAAAABAvMjQxLykgDAAAAAAA
+        AAAAGREnKywzFQAAAAAAAAAAAAAAAAAZMgAAAAAAAAAAAAAAAAAAABMAAAAAAPv/AAD7/wAA8D8AAOAf
+        AADgDwAA4McAAPj3AAD//wAA//8AAN8/AADnDwAA4AcAAPAHAAD4DwAA/58AAP/fAACJUE5HDQoaCgAA
+        AA1JSERSAAABAAAAAQAIBgAAAFxyqGYAACAASURBVHic7L13nCTlfef/rtBpuifP7ITNYXaXBTYQFQAZ
+        lJMl2QonzrYk29g/pJV9BAmdg4zR3f3wrXTiJOyzZNnYCCuskIRsQCCEQBgdSCQhEOzCsiybJ4fOXen+
+        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
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAgAAADAJJQ+LAAAARQAAABkAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAABAAAAESGCPbw0uln3AAAAaAAAACIAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAECC4QcC3va/8l1F39AAkAigAAAC0AAAAOAAAAAQAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAsJbZS5B/ybf8m8Gn/BisQrgAAAEEA
+        AAAVAAAABAAAAAIAAAADAAAAAwAAAAMAAAACAAAAAQAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        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
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAABAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAABAAAAAgAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAQAAAAUAAAAKAAAACQAAAAQAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAHAAAADQAAAAoAAAADAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAB0AAAArAAAAIQAAABQAAAAKAAAABAAAAAEA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAArAAAANAAAAB4AAAANAAAAAwAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADy8WNi1wPa8BBACDAAAAWwAAADkA
+        AAAiAAAAFQAAAAsAAAAEAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        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
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAABy4PFhdTJVAdajKNMJlOwjy3X+lCxmn0RMxt90bOcPVHx2/tP61fyEGzZc9L84b/SfGF/0nwhP9I
+        74P/SfSG/0m3aeUAAAA4AAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARUEAQESAw4KKxAeAREDKAERAyEAAAASAwcECC2CSH5Q
+        8of9SfSG/0nwhP9I9IX/UeuE/gwjEXQAAAAPAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAwcEAiNpOkxGzHLsSvSK/0jyhv9S9Y7/LXBAuQAAABkAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAwcEASFbMyFBvGjRSvSI/0v0jP9CtWXmAAAAPwAAAAkAAAABAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAI2nleRTfOE/k3kf/0JIg52AAAADwAAAAIA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAuiktRStt5+SRwObEA
+        AAAUAAAABQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEt
+        fkcnKXY8jAIIACoAAAAEAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP/+D////wAA//wP////AAD/+A////8AAP/4B///
+        /wAA//AAD///AAD/8AAB//8AAP/gAAB//wAA/8AAAD//AAD/wAAAD/8AAP+AAAAH/wAA/wAAAAP/AAD/
+        AAAAA/8AAP4AAAAB/wAA/gAAAAD/AAD+AAAAAP8AAP4AAAAAfwAA/4AA/gB/AAD/4AB/gH8AAP/4AH/A
+        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
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEUsTRCWLL6w4wUv/QcxY/0XMXP9Lz2H/VOBr/x5dJp8A
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAU0KMRyaLas/3Vf/JK048AAHADAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwvDT4mjjCiOsFM9kfUXf9Q
+        22f/MJM92AAAABwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA5rG3Iy3Er/CUcSiwAAAAEA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAL
+        MQwuI3ornT7DUfJBy1T/Bh0HUQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAApiFWER
+        oiTQAAMADAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAADD4OKCSGLZkMMQ9NAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAEyBzEABAEEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAhMEIQADAC0A
+        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
+        HwAAwwMAAOADAADgBwAA+AcAAP4PAAD/nwAA
+</value>
+  </data>
+</root>

+ 9 - 1
Welling_Motor_Debug_Tool/Welling_Motor_Debug_Tool.csproj

@@ -78,7 +78,6 @@
     <Compile Include="TorqueParams.Designer.cs">
       <DependentUpon>TorqueParams.cs</DependentUpon>
     </Compile>
-    <Compile Include="verInfo.cs" />
     <Compile Include="LocalInfo.cs" />
     <Compile Include="Login.cs">
       <SubType>Form</SubType>
@@ -103,6 +102,12 @@
       <DependentUpon>Scan.cs</DependentUpon>
     </Compile>
     <Compile Include="Serial_Process.cs" />
+    <Compile Include="Version.cs">
+      <SubType>Form</SubType>
+    </Compile>
+    <Compile Include="Version.Designer.cs">
+      <DependentUpon>Version.cs</DependentUpon>
+    </Compile>
     <EmbeddedResource Include="GenerateParams.resx">
       <DependentUpon>GenerateParams.cs</DependentUpon>
     </EmbeddedResource>
@@ -128,6 +133,9 @@
     <EmbeddedResource Include="TorqueParams.resx">
       <DependentUpon>TorqueParams.cs</DependentUpon>
     </EmbeddedResource>
+    <EmbeddedResource Include="Version.resx">
+      <DependentUpon>Version.cs</DependentUpon>
+    </EmbeddedResource>
     <None Include="Properties\Settings.settings">
       <Generator>SettingsSingleFileGenerator</Generator>
       <LastGenOutput>Settings.Designer.cs</LastGenOutput>

BIN
Welling_Motor_Debug_Tool/bin/Debug/Welling_Motor_Debug_Tool.exe


BIN
Welling_Motor_Debug_Tool/bin/Debug/Welling_Motor_Debug_Tool_202405131800.exe


File diff suppressed because it is too large
+ 119 - 132
Welling_Motor_Debug_Tool/mainForm.Designer.cs


+ 76 - 98
Welling_Motor_Debug_Tool/mainForm.cs

@@ -22,6 +22,8 @@ namespace Welling_Motor_Debug_Tool
     public partial class mainForm : Form
     {
         #region 变量定义
+        //版本号
+        public static string Version = "2.1.2";
         //串口实例
         Serial_Process mySerialProcess = new Serial_Process();
         string PortNumSave = "";
@@ -68,6 +70,8 @@ namespace Welling_Motor_Debug_Tool
         public static TorqueParams TorqueParamsForm = new TorqueParams();
         //参数生成窗口
         public static GenerateParams GenerateParamsForm = new GenerateParams();
+        //版本信息窗口
+        public static Version VersionForm = new Version();
         #endregion
 
         #region 故障日志结构体定义
@@ -141,7 +145,7 @@ namespace Welling_Motor_Debug_Tool
             if (!System.IO.File.Exists(localInfo.LocalPath + localInfo.NoteFileName))
             {
                 System.IO.File.WriteAllText(localInfo.LocalPath + localInfo.NoteFileName, "");
-            }
+            }            
 
             //检查文件夹                        
             if (!Directory.Exists(localInfo.LocalPath))
@@ -558,6 +562,7 @@ namespace Welling_Motor_Debug_Tool
             //页面初始化
             label_BuildTime.Text = "编译时间:" + System.IO.File.GetLastWriteTime(this.GetType().Assembly.Location).ToString("yyyy-MM-dd HH:mm:ss");
             label_Computername.Text = "用户名:" + System.Environment.UserName;
+            this.Text += Version;
 
             //下拉控件初始值设定
             comboBox_WorkMode.SelectedIndex = 0;
@@ -1176,56 +1181,7 @@ namespace Welling_Motor_Debug_Tool
                                     richTextBox_DebugParam.Clear();
                                     for (int i = 0; i < myParams.DebugParam.Count; i++)
                                     {
-                                        richTextBox_DebugParam.AppendText(myParams.DebugParam[i] + "=" + Convert.ToString((short)(Data[2 * i + 1] * 256 + Data[2 * i])) + ", ");
-                                        //模式
-                                        if ((short)(Data[1] * 256 + Data[0]) == 3)
-                                        {
-                                            radioButton_Ctl3.Checked = true;
-                                            radioButton_Ctl4.Checked = false;
-                                            radioButton_Ctl5.Checked = false;
-                                        }
-                                        else if ((short)(Data[1] * 256 + Data[0]) == 4)
-                                        {
-                                            radioButton_Ctl3.Checked = false;
-                                            radioButton_Ctl4.Checked = true;
-                                            radioButton_Ctl5.Checked = false;
-                                        }                                            
-                                        else if ((short)(Data[1] * 256 + Data[0]) == 5)
-                                        {
-                                            radioButton_Ctl3.Checked = false;
-                                            radioButton_Ctl4.Checked = false;
-                                            radioButton_Ctl5.Checked = true;
-                                        }
-                                        //位置
-                                        if ((short)(Data[3] * 256 + Data[2]) == 0)
-                                        {
-                                            radioButton_Hall0.Checked = true;
-                                            radioButton_Hall1.Checked = false;
-                                            radioButton_Hall2.Checked = false;
-                                        }
-                                        else if ((short)(Data[3] * 256 + Data[2]) == 1)
-                                        {
-                                            radioButton_Hall0.Checked = false;
-                                            radioButton_Hall1.Checked = true;
-                                            radioButton_Hall2.Checked = false;
-                                        }
-                                        else if ((short)(Data[3] * 256 + Data[2]) == 2)
-                                        {
-                                            radioButton_Hall0.Checked = false;
-                                            radioButton_Hall1.Checked = false;
-                                            radioButton_Hall2.Checked = true;
-                                        }
-                                        //方向
-                                        if ((short)(Data[7] * 256 + Data[6]) == 0)
-                                        {
-                                            radioButton_Dir0.Checked = true;
-                                            radioButton_Dir1.Checked = false;
-                                        }
-                                        else if ((short)(Data[7] * 256 + Data[6]) == 1)
-                                        {
-                                            radioButton_Dir0.Checked = false;
-                                            radioButton_Dir1.Checked = true;
-                                        }                                        
+                                        richTextBox_DebugParam.AppendText(myParams.DebugParam[i] + "=" + Convert.ToString((short)(Data[2 * i + 1] * 256 + Data[2 * i])) + ", ");                                                                            
                                     }
                                     richTextBox_DebugParam.Text = richTextBox_DebugParam.Text.Substring(0, richTextBox_DebugParam.Text.Length - 2);
                                 }));
@@ -2452,26 +2408,6 @@ namespace Welling_Motor_Debug_Tool
             ushort uwDataTemp = 0;
             string[] strDataTemp = richTextBox_DebugParam.Text.Split(new string[] { ", " }, StringSplitOptions.None);
 
-            //模式            
-            if (radioButton_Ctl3.Checked == true)
-                strDataTemp[0] = "整体运行模式=3";
-            else if (radioButton_Ctl4.Checked == true)
-                strDataTemp[0] = "整体运行模式=4";
-            else if (radioButton_Ctl5.Checked == true)
-                strDataTemp[0] = "整体运行模式=5";
-            //位置
-            if (radioButton_Hall0.Checked == true)
-                strDataTemp[1] = "位置获取模式=0";
-            else if (radioButton_Hall1.Checked == true)
-                strDataTemp[1] = "位置获取模式=1";
-            else if (radioButton_Hall2.Checked == true)
-                strDataTemp[1] = "位置获取模式=2";
-            //方向
-            if (radioButton_Dir0.Checked == true)
-                strDataTemp[3] = "旋转方向=0";
-            else if (radioButton_Dir1.Checked == true)
-                strDataTemp[3] = "旋转方向=1";
-
             try
             {
                 for (int i = 0; i < strDataTemp.Length; i++)
@@ -5015,22 +4951,30 @@ namespace Welling_Motor_Debug_Tool
                     timer_1s.Enabled = true;
                     break;
                 }
-                string ScanInfo = scan_form.textBox_Scan.Text;
+                string ScanInfo = scan_form.textBox_Scan.Text.Replace(" ", "");
                 string regexInfo = "";
                 string[] InfoList = { "" };
-                if (中置电机ToolStripMenuItem.Checked == true)
+                try
                 {
-                    regexInfo = @"[0-9][0-9][V][0-9][0-9][0-9][W]";
-                    InfoList = Regex.Split(ScanInfo, regexInfo, RegexOptions.IgnoreCase);
+                    if (中置电机ToolStripMenuItem.Checked == true)
+                    {
+                        regexInfo = @"[0-9][0-9][V][0-9][0-9][0-9][W]";
+                        InfoList = Regex.Split(ScanInfo, regexInfo, RegexOptions.IgnoreCase);
+                    }
+                    else if (轮毂电机ToolStripMenuItem.Checked == true)
+                    {
+                        InfoList = ScanInfo.Split(new string[] { "  " }, StringSplitOptions.None);
+                        string Model = InfoList[0];
+                        string Spec = InfoList[1];
+                        string Sn = InfoList[2];
+                        InfoList[0] = Model.Replace("-", "").Substring(2, 12) + Spec.Substring(Spec.Length - 4);
+                        InfoList[1] = Sn;
+                    }
                 }
-                else if (轮毂电机ToolStripMenuItem.Checked == true)
+                catch (Exception)
                 {
-                    InfoList = ScanInfo.Split(new string[] { "  " }, StringSplitOptions.None);
-                    string Model = InfoList[0];
-                    string Spec = InfoList[1];
-                    string Sn = InfoList[2];
-                    InfoList[0] = Model.Replace("-", "").Substring(2, 12) + Spec.Substring(Spec.Length - 4);
-                    InfoList[1] = Sn;
+                    MessageBox.Show("格式错误", "提示", MessageBoxButtons.OK, MessageBoxIcon.Error);
+                    return;
                 }
                 if (InfoList.Length >= 2)
                 {
@@ -5489,14 +5433,28 @@ namespace Welling_Motor_Debug_Tool
             }
             try
             {
-                if (!textBox_FacModeScan.Text.Contains("  "))
+                if (中置电机ToolStripMenuItem.Checked == true)
                 {
-                    label_FacModeStatus.Text = "存在故障!";
-                    label_FacModeResult.BackColor = Color.Red;
-                    label_FacModeResult.Text = "标签格式错误";
-                    button__FacMode_Start.Enabled = true;                    
-                    return;
-                }                
+                    if (textBox_FacModeScan.Text.Split(' ').Length != 7)
+                    {
+                        label_FacModeStatus.Text = "存在故障!";
+                        label_FacModeResult.BackColor = Color.Red;
+                        label_FacModeResult.Text = "标签格式错误";
+                        button__FacMode_Start.Enabled = true;
+                        return;
+                    }
+                }
+                else if (轮毂电机ToolStripMenuItem.Checked == true) 
+                {
+                    if (textBox_FacModeScan.Text.Split(new string[] { "  " }, StringSplitOptions.None).Length != 3)
+                    {
+                        label_FacModeStatus.Text = "存在故障!";
+                        label_FacModeResult.BackColor = Color.Red;
+                        label_FacModeResult.Text = "标签格式错误";
+                        button__FacMode_Start.Enabled = true;
+                        return;
+                    }
+                }             
             }
             catch (System.Exception)
             {
@@ -5669,7 +5627,7 @@ namespace Welling_Motor_Debug_Tool
                         if (中置电机ToolStripMenuItem.Checked == true)
                         {
                             regexInfo = @"[0-9][0-9][V][0-9][0-9][0-9][W]";
-                            InfoList = Regex.Split(ScanInfo, regexInfo, RegexOptions.IgnoreCase);
+                            InfoList = Regex.Split(ScanInfo.Replace(" ", ""), regexInfo, RegexOptions.IgnoreCase);
                         }
                         else if (轮毂电机ToolStripMenuItem.Checked == true)
                         {
@@ -5687,6 +5645,9 @@ namespace Welling_Motor_Debug_Tool
                         label_FacModeStatus.Text = "存在故障!";
                         label_FacModeResult.BackColor = Color.Red;
                         label_FacModeResult.Text = "标签格式错误";
+                        Delay_ms(500);
+                        //存储异常并上传
+                        FacMode_Stop(false);
                         return;
                     }
                     
@@ -6799,13 +6760,27 @@ namespace Welling_Motor_Debug_Tool
             }
             try
             {
-                if (!textBox_CheckModeScan.Text.Contains("  "))
+                if (中置电机ToolStripMenuItem.Checked == true)
                 {
-                    label_CheckModeStatus.Text = "存在故障!";
-                    label_CheckModeResult.BackColor = Color.Red;
-                    label_CheckModeResult.Text = "标签格式错误";
-                    button_CheckModeStart.Enabled = true;
-                    return;
+                    if (textBox_CheckModeScan.Text.Split(' ').Length != 7)
+                    {
+                        label_CheckModeStatus.Text = "存在故障!";
+                        label_CheckModeResult.BackColor = Color.Red;
+                        label_CheckModeResult.Text = "标签格式错误";
+                        button_CheckModeStart.Enabled = true;
+                        return;
+                    }
+                }
+                else if (轮毂电机ToolStripMenuItem.Checked == true)
+                {
+                    if (textBox_CheckModeScan.Text.Split(new string[] { "  " }, StringSplitOptions.None).Length != 3)
+                    {
+                        label_CheckModeStatus.Text = "存在故障!";
+                        label_CheckModeResult.BackColor = Color.Red;
+                        label_CheckModeResult.Text = "标签格式错误";
+                        button_CheckModeStart.Enabled = true;
+                        return;
+                    }
                 }
             }
             catch (System.Exception)
@@ -6974,7 +6949,7 @@ namespace Welling_Motor_Debug_Tool
                     if (中置电机ToolStripMenuItem.Checked == true)
                     {
                         regexInfo = @"[0-9][0-9][V][0-9][0-9][0-9][W]";
-                        InfoList = Regex.Split(ScanInfo, regexInfo, RegexOptions.IgnoreCase);
+                        InfoList = Regex.Split(ScanInfo.Replace(" ", ""), regexInfo, RegexOptions.IgnoreCase);
                     }
                     else if (轮毂电机ToolStripMenuItem.Checked == true)
                     {
@@ -7517,6 +7492,9 @@ namespace Welling_Motor_Debug_Tool
             checkBox_OffLineCheckMode.Checked = checkBox_OffLineFacMode.Checked;
         }
 
-
+        private void 版本ToolStripMenuItem_Click(object sender, EventArgs e)
+        {
+            VersionForm.ShowDialog();
+        }
     }
 }

+ 1 - 1
Welling_Motor_Debug_Tool/mainForm.resx

@@ -127,7 +127,7 @@
     <value>275, 17</value>
   </metadata>
   <metadata name="$this.TrayHeight" type="System.Int32, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>50</value>
+    <value>57</value>
   </metadata>
   <assembly alias="System.Drawing" name="System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
   <data name="$this.Icon" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">

BIN
Welling_Motor_Debug_Tool/obj/Debug/DesignTimeResolveAssemblyReferences.cache


BIN
Welling_Motor_Debug_Tool/obj/Debug/DesignTimeResolveAssemblyReferencesInput.cache


BIN
Welling_Motor_Debug_Tool/obj/Debug/Welling_Motor_Debug_Tool.csproj.AssemblyReference.cache


+ 1 - 1
Welling_Motor_Debug_Tool/obj/Debug/Welling_Motor_Debug_Tool.csproj.CoreCompileInputs.cache

@@ -1 +1 @@
-25837bbd6484d8d53d54f3300c7b39e84b3565dd
+fab47e48233bb4900cc596418576f8daac14a179

+ 1 - 0
Welling_Motor_Debug_Tool/obj/Debug/Welling_Motor_Debug_Tool.csproj.FileListAbsolute.txt

@@ -83,3 +83,4 @@ C:\Users\hero\Documents\Work\SoftDesign\Welling-MidMotor\Welling_Motor_Debug_Too
 C:\Users\hero\Documents\Work\SoftDesign\Welling-MidMotor\Welling_Motor_Debug_Tool\obj\Debug\Welling_Motor_Debug_Tool.csproj.CoreCompileInputs.cache
 C:\Users\hero\Documents\Work\SoftDesign\Welling-MidMotor\Welling_Motor_Debug_Tool\obj\Debug\Welling_Motor_Debug_Tool.exe
 C:\Users\hero\Documents\Work\SoftDesign\Welling-MidMotor\Welling_Motor_Debug_Tool\obj\Debug\Welling_Motor_Debug_Tool.pdb
+D:\笔记本20221223\zhouxiong9\Documents\Tools\motor-debug\Welling_Motor_Debug_Tool\obj\Debug\Welling_Motor_Debug_Tool.Version.resources

BIN
Welling_Motor_Debug_Tool/obj/Debug/Welling_Motor_Debug_Tool.csproj.GenerateResource.cache


BIN
Welling_Motor_Debug_Tool/obj/Debug/Welling_Motor_Debug_Tool.exe


BIN
Welling_Motor_Debug_Tool/obj/Debug/Welling_Motor_Debug_Tool.pdb


+ 0 - 12
Welling_Motor_Debug_Tool/verInfo.cs

@@ -1,12 +0,0 @@
-using System;
-using System.Collections.Generic;
-using System.Linq;
-using System.Text;
-using System.Threading.Tasks;
-
-namespace Welling_Motor_Debug_Tool
-{
-    class verInfo
-    {
-    }
-}

Some files were not shown because too many files changed in this diff