diff --git a/Datasheet.Designer.cs b/Datasheet.Designer.cs index f28d8ea..1a204c8 100644 --- a/Datasheet.Designer.cs +++ b/Datasheet.Designer.cs @@ -30,6 +30,9 @@ { System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(Datasheet)); this.groupBox1 = new System.Windows.Forms.GroupBox(); + this.cBoxSpeed = new System.Windows.Forms.ComboBox(); + this.buttonSetSpeed = new System.Windows.Forms.Button(); + this.label8 = new System.Windows.Forms.Label(); this.labelBattery = new System.Windows.Forms.Label(); this.label6 = new System.Windows.Forms.Label(); this.buttonPoll = new System.Windows.Forms.Button(); @@ -52,9 +55,6 @@ this.label4 = new System.Windows.Forms.Label(); this.sensorPanel = new System.Windows.Forms.FlowLayoutPanel(); this.label9 = new System.Windows.Forms.Label(); - this.button1 = new System.Windows.Forms.Button(); - this.label8 = new System.Windows.Forms.Label(); - this.cBoxSpeed = new System.Windows.Forms.ComboBox(); this.groupBox1.SuspendLayout(); ((System.ComponentModel.ISupportInitialize)(this.nudModbusID)).BeginInit(); this.groupBox2.SuspendLayout(); @@ -63,7 +63,7 @@ // groupBox1 // this.groupBox1.Controls.Add(this.cBoxSpeed); - this.groupBox1.Controls.Add(this.button1); + this.groupBox1.Controls.Add(this.buttonSetSpeed); this.groupBox1.Controls.Add(this.label8); this.groupBox1.Controls.Add(this.labelBattery); this.groupBox1.Controls.Add(this.label6); @@ -82,6 +82,34 @@ this.groupBox1.TabStop = false; this.groupBox1.Text = "Инфо"; // + // cBoxSpeed + // + this.cBoxSpeed.FormattingEnabled = true; + this.cBoxSpeed.Location = new System.Drawing.Point(74, 97); + this.cBoxSpeed.Name = "cBoxSpeed"; + this.cBoxSpeed.Size = new System.Drawing.Size(73, 21); + this.cBoxSpeed.TabIndex = 13; + this.cBoxSpeed.Text = "9600"; + // + // buttonSetSpeed + // + this.buttonSetSpeed.Location = new System.Drawing.Point(153, 94); + this.buttonSetSpeed.Name = "buttonSetSpeed"; + this.buttonSetSpeed.Size = new System.Drawing.Size(75, 23); + this.buttonSetSpeed.TabIndex = 12; + this.buttonSetSpeed.Text = "Изменить"; + this.buttonSetSpeed.UseVisualStyleBackColor = true; + this.buttonSetSpeed.Click += new System.EventHandler(this.buttonSetSpeed_Click); + // + // label8 + // + this.label8.AutoSize = true; + this.label8.Location = new System.Drawing.Point(6, 99); + this.label8.Name = "label8"; + this.label8.Size = new System.Drawing.Size(58, 13); + this.label8.TabIndex = 10; + this.label8.Text = "Скорость:"; + // // labelBattery // this.labelBattery.AutoSize = true; @@ -297,33 +325,6 @@ this.label9.TabIndex = 5; this.label9.Text = "Датчики"; // - // button1 - // - this.button1.Location = new System.Drawing.Point(153, 94); - this.button1.Name = "button1"; - this.button1.Size = new System.Drawing.Size(75, 23); - this.button1.TabIndex = 12; - this.button1.Text = "Изменить"; - this.button1.UseVisualStyleBackColor = true; - // - // label8 - // - this.label8.AutoSize = true; - this.label8.Location = new System.Drawing.Point(6, 99); - this.label8.Name = "label8"; - this.label8.Size = new System.Drawing.Size(58, 13); - this.label8.TabIndex = 10; - this.label8.Text = "Скорость:"; - // - // cBoxSpeed - // - this.cBoxSpeed.FormattingEnabled = true; - this.cBoxSpeed.Location = new System.Drawing.Point(74, 97); - this.cBoxSpeed.Name = "cBoxSpeed"; - this.cBoxSpeed.Size = new System.Drawing.Size(73, 21); - this.cBoxSpeed.TabIndex = 13; - this.cBoxSpeed.Text = "9600"; - // // Datasheet // this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); @@ -373,7 +374,7 @@ private System.Windows.Forms.Label label9; private System.Windows.Forms.Label label6; private System.Windows.Forms.Label labelBattery; - private System.Windows.Forms.Button button1; + private System.Windows.Forms.Button buttonSetSpeed; private System.Windows.Forms.Label label8; private System.Windows.Forms.ComboBox cBoxSpeed; } diff --git a/Datasheet.cs b/Datasheet.cs index 83654e6..f5e372a 100644 --- a/Datasheet.cs +++ b/Datasheet.cs @@ -346,6 +346,38 @@ namespace Gidrolock_Modbus_Scanner buttonCleaning.Text = cleaningStatus ? "Выключить" : "Включить"; } } + + private async void buttonSetSpeed_Click(object sender, EventArgs e) + { + try + { + string str = cBoxSpeed.Items[cBoxSpeed.SelectedIndex].ToString(); + str = str.Substring(0, str.Length - 2); //clip off two zeroes at the end + ushort newSpeed = (ushort)Int16.Parse(str); + //Console.WriteLine("Baudrate: " + newSpeed); + + // send speed value to device + // await for response + Modbus.WriteSingleAsync(FunctionCode.WriteRegister, modbusID, device.baudRate.address, newSpeed); + await Task.Delay(2000).ContinueWith(_ => + { + if (isAwaitingResponse) + { + MessageBox.Show("Превышено время ожидания ответа от устройства."); + isAwaitingResponse = false; + } + return false; + }); + while (isAwaitingResponse) { continue; } + if (latestMessage.Status != ModbusStatus.Error) + { + port.Close(); + port.BaudRate = newSpeed; + port.Open(); + } + } + catch (Exception ex) { MessageBox.Show(ex.Message); } + } } public class Sensor : FlowLayoutPanel { diff --git a/Main.Designer.cs b/Main.Designer.cs index 4db9d5e..4addcff 100644 --- a/Main.Designer.cs +++ b/Main.Designer.cs @@ -30,17 +30,14 @@ { System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(App)); this.TextBox_Log = new System.Windows.Forms.TextBox(); - this.UpDown_ModbusID = new System.Windows.Forms.NumericUpDown(); + this.upDownModbusID = new System.Windows.Forms.NumericUpDown(); this.label2 = new System.Windows.Forms.Label(); this.cBoxPorts = new System.Windows.Forms.ComboBox(); this.label1 = new System.Windows.Forms.Label(); this.button1 = new System.Windows.Forms.Button(); - this.cBoxDevice = new System.Windows.Forms.ComboBox(); - this.label3 = new System.Windows.Forms.Label(); - this.checkboxID = new System.Windows.Forms.CheckBox(); this.cBoxSpeed = new System.Windows.Forms.ComboBox(); this.label4 = new System.Windows.Forms.Label(); - ((System.ComponentModel.ISupportInitialize)(this.UpDown_ModbusID)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.upDownModbusID)).BeginInit(); this.SuspendLayout(); // // TextBox_Log @@ -53,17 +50,22 @@ this.TextBox_Log.Size = new System.Drawing.Size(498, 160); this.TextBox_Log.TabIndex = 1; // - // UpDown_ModbusID + // upDownModbusID // - this.UpDown_ModbusID.Location = new System.Drawing.Point(334, 26); - this.UpDown_ModbusID.Name = "UpDown_ModbusID"; - this.UpDown_ModbusID.Size = new System.Drawing.Size(66, 20); - this.UpDown_ModbusID.TabIndex = 1; + this.upDownModbusID.Location = new System.Drawing.Point(164, 27); + this.upDownModbusID.Name = "upDownModbusID"; + this.upDownModbusID.Size = new System.Drawing.Size(66, 20); + this.upDownModbusID.TabIndex = 1; + this.upDownModbusID.Value = new decimal(new int[] { + 30, + 0, + 0, + 0}); // // label2 // this.label2.AutoSize = true; - this.label2.Location = new System.Drawing.Point(331, 9); + this.label2.Location = new System.Drawing.Point(161, 9); this.label2.Name = "label2"; this.label2.Size = new System.Drawing.Size(59, 13); this.label2.TabIndex = 0; @@ -72,7 +74,7 @@ // cBoxPorts // this.cBoxPorts.FormattingEnabled = true; - this.cBoxPorts.Location = new System.Drawing.Point(139, 24); + this.cBoxPorts.Location = new System.Drawing.Point(12, 26); this.cBoxPorts.Name = "cBoxPorts"; this.cBoxPorts.Size = new System.Drawing.Size(65, 21); this.cBoxPorts.TabIndex = 1; @@ -81,7 +83,7 @@ // label1 // this.label1.AutoSize = true; - this.label1.Location = new System.Drawing.Point(136, 7); + this.label1.Location = new System.Drawing.Point(9, 9); this.label1.Name = "label1"; this.label1.Size = new System.Drawing.Size(32, 13); this.label1.TabIndex = 0; @@ -97,38 +99,10 @@ this.button1.UseVisualStyleBackColor = true; this.button1.Click += new System.EventHandler(this.ButtonConnect_Click); // - // cBoxDevice - // - this.cBoxDevice.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; - this.cBoxDevice.Location = new System.Drawing.Point(12, 24); - this.cBoxDevice.Name = "cBoxDevice"; - this.cBoxDevice.Size = new System.Drawing.Size(121, 21); - this.cBoxDevice.TabIndex = 3; - this.cBoxDevice.SelectedIndexChanged += new System.EventHandler(this.cBoxDevice_SelectedIndexChanged); - // - // label3 - // - this.label3.AutoSize = true; - this.label3.Location = new System.Drawing.Point(9, 8); - this.label3.Name = "label3"; - this.label3.Size = new System.Drawing.Size(67, 13); - this.label3.TabIndex = 4; - this.label3.Text = "Устройство"; - // - // checkboxID - // - this.checkboxID.AutoSize = true; - this.checkboxID.Location = new System.Drawing.Point(313, 29); - this.checkboxID.Name = "checkboxID"; - this.checkboxID.Size = new System.Drawing.Size(15, 14); - this.checkboxID.TabIndex = 5; - this.checkboxID.UseVisualStyleBackColor = true; - this.checkboxID.CheckedChanged += new System.EventHandler(this.checkboxID_CheckedChanged); - // // cBoxSpeed // this.cBoxSpeed.FormattingEnabled = true; - this.cBoxSpeed.Location = new System.Drawing.Point(210, 24); + this.cBoxSpeed.Location = new System.Drawing.Point(83, 26); this.cBoxSpeed.Name = "cBoxSpeed"; this.cBoxSpeed.Size = new System.Drawing.Size(78, 21); this.cBoxSpeed.TabIndex = 7; @@ -137,7 +111,7 @@ // label4 // this.label4.AutoSize = true; - this.label4.Location = new System.Drawing.Point(207, 7); + this.label4.Location = new System.Drawing.Point(80, 9); this.label4.Name = "label4"; this.label4.Size = new System.Drawing.Size(55, 13); this.label4.TabIndex = 6; @@ -150,13 +124,10 @@ this.ClientSize = new System.Drawing.Size(518, 226); this.Controls.Add(this.cBoxSpeed); this.Controls.Add(this.label4); - this.Controls.Add(this.checkboxID); - this.Controls.Add(this.label3); - this.Controls.Add(this.cBoxDevice); this.Controls.Add(this.button1); this.Controls.Add(this.cBoxPorts); this.Controls.Add(this.label1); - this.Controls.Add(this.UpDown_ModbusID); + this.Controls.Add(this.upDownModbusID); this.Controls.Add(this.TextBox_Log); this.Controls.Add(this.label2); this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedSingle; @@ -167,7 +138,7 @@ this.Text = "Gidrolock Modbus Scanner"; this.FormClosed += new System.Windows.Forms.FormClosedEventHandler(this.App_FormClosed); this.Load += new System.EventHandler(this.Form1_Load); - ((System.ComponentModel.ISupportInitialize)(this.UpDown_ModbusID)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.upDownModbusID)).EndInit(); this.ResumeLayout(false); this.PerformLayout(); @@ -175,14 +146,11 @@ #endregion private System.Windows.Forms.TextBox TextBox_Log; - private System.Windows.Forms.NumericUpDown UpDown_ModbusID; + private System.Windows.Forms.NumericUpDown upDownModbusID; private System.Windows.Forms.Label label2; private System.Windows.Forms.ComboBox cBoxPorts; private System.Windows.Forms.Label label1; private System.Windows.Forms.Button button1; - private System.Windows.Forms.Label label3; - private System.Windows.Forms.CheckBox checkboxID; - private System.Windows.Forms.ComboBox cBoxDevice; private System.Windows.Forms.ComboBox cBoxSpeed; private System.Windows.Forms.Label label4; } diff --git a/Main.cs b/Main.cs index cc42e96..c1a3502 100644 --- a/Main.cs +++ b/Main.cs @@ -27,7 +27,7 @@ namespace Gidrolock_Modbus_Scanner Modbus.Init(); Modbus.ResponseReceived += OnResponseReceived; - this.UpDown_ModbusID.Value = 0; + this.upDownModbusID.Value = 0; TextBox_Log.Text = "Приложение готово к работе."; cBoxSpeed.Items.Add("1200"); @@ -41,17 +41,9 @@ namespace Gidrolock_Modbus_Scanner cBoxSpeed.Items.Add("115200"); cBoxSpeed.SelectedIndex = 3; - cBoxDevice.Items.Add("Standard"); - cBoxDevice.Items.Add("Premium Plus"); - //cBoxDevice.Items.Add("Inteli"); - //cBoxDevice.Items.Add("Premium"); - cBoxDevice.SelectedIndex = 0; - - checkboxID.Checked = false; - UpDown_ModbusID.Enabled = false; - UpDown_ModbusID.Value = 30; - UpDown_ModbusID.Minimum = 1; - UpDown_ModbusID.Maximum = 247; + upDownModbusID.Value = 30; + upDownModbusID.Minimum = 1; + upDownModbusID.Maximum = 247; models.Add("Standard", "STW485"); models.Add("Premium Plus", "PRPLS1"); @@ -92,7 +84,7 @@ namespace Gidrolock_Modbus_Scanner if (res == DialogResult.Cancel) return; } - if (UpDown_ModbusID.Value == 0) + if (upDownModbusID.Value == 0) { DialogResult res = MessageBox.Show("Указан Modbus ID 0 — глобальное вещание. Устройства не смогут отвечать на сообщения. Продолжить?", "Внимание", MessageBoxButtons.OKCancel); if (res == DialogResult.Cancel) @@ -124,15 +116,12 @@ namespace Gidrolock_Modbus_Scanner // if matching model is found, instantiate device window - string selectedModel = models[cBoxDevice.SelectedItem.ToString()]; - int selectedIndex = cBoxDevice.SelectedIndex; - AddLog("Проверка модели устройства."); await Task.Run(async () => { // send message latestMessage = null; isAwaitingResponse = true; - var send = Modbus.ReadRegAsync((byte)UpDown_ModbusID.Value, FunctionCode.ReadInput, 200, 6); + var send = Modbus.ReadRegAsync((byte)upDownModbusID.Value, FunctionCode.ReadInput, 200, 6); await Task.Delay(2000).ContinueWith(_ => { if (isAwaitingResponse) @@ -145,62 +134,36 @@ namespace Gidrolock_Modbus_Scanner while (isAwaitingResponse) { continue; } - if (latestMessage is null) - { - Console.WriteLine("latestMessage is still null"); - return; - } - if (latestMessage.Status == ModbusStatus.Error) return; // confirm the model string response = ByteArrayToUnicode(latestMessage.Data); - Console.WriteLine("device model response: " + response); - Console.WriteLine("expected response: " + selectedModel); - if (response != selectedModel) + int index = 0; + string match = ""; + string model = ""; + foreach (string key in models.Keys) { - // response doesn't match expected model - AddLog("Ответ устройства не соответствует выбранной модели. Поиск подходящей модели."); - // check whether it matches anything else, offer to open that model if it does - string match = ""; - string model = ""; - int index = 0; - foreach (string key in models.Keys) + if (models[key] == response) { - if (models[key] == response) - { - match = models[key]; - model = key; - break; - } - index++; - } - - - if (match == "") // if no matches found - MessageBox.Show("Подключенное устройство не соответствует ни одной из поддерживаемых моделей."); - - else // match found, offer to switch to that model instead - { - DialogResult result = MessageBox.Show(("Подключенное устройство соответствует модели " + model + ". Нажмите ОК, чтобы открыть настройки для модели " + model), "Внимание", MessageBoxButtons.OKCancel); - if (result == DialogResult.OK) - { - // instantiate panel - AddLog("Открываю панель конфигурации."); - - Device device = GetDevice((DeviceType)index); - StartDatasheet(device); - } + match = models[key]; + model = key; + break; } + index++; } - else + + if (match == "") // if no matches found + MessageBox.Show("Подключенное устройство не соответствует ни одной из поддерживаемых моделей."); + + else // match found { - // model is correct, instantiate config panel - AddLog("Устройство соответстует модели, открываю панель конфигурации."); - Device device = GetDevice((DeviceType)selectedIndex); - StartDatasheet(device); + // instantiate panel + AddLog("Открываю панель конфигурации."); + + Device device = GetDevice((DeviceType)index); + StartDatasheet(device); } }); } @@ -212,7 +175,7 @@ namespace Gidrolock_Modbus_Scanner void StartDatasheet(Device device) { - datasheet = new Datasheet((byte)UpDown_ModbusID.Value, device); + datasheet = new Datasheet((byte)upDownModbusID.Value, device); Application.Run(datasheet); } @@ -319,33 +282,6 @@ namespace Gidrolock_Modbus_Scanner return new string(result.ToArray()); } - private void checkboxID_CheckedChanged(object sender, EventArgs e) - { - UpDown_ModbusID.Enabled = checkboxID.Checked ? true : false; - } - - private void cBoxDevice_SelectedIndexChanged(object sender, EventArgs e) - { - switch (cBoxDevice.SelectedItem) - { - case "Standard": - UpDown_ModbusID.Value = 30; - break; - case "Premium Plus": - UpDown_ModbusID.Value = 30; - break; - case "Inteli": - UpDown_ModbusID.Value = 26; - break; - case "Premium": - UpDown_ModbusID.Value = 26; - break; - default: - Console.WriteLine("Invalid change"); - break; - } - } - public Device GetDevice(DeviceType dt) { Device d = new Device(); @@ -355,6 +291,7 @@ namespace Gidrolock_Modbus_Scanner d.name = "Standard Wi-Fi RS485"; d.id = 30; d.modelName = "STW485"; + d.baudRate = new Entry(RegisterType.Holding, 110); d.valveStatus = new Entry(RegisterType.Coil, 1202); d.alarmStatus = new Entry(RegisterType.Coil, 1201); @@ -378,6 +315,7 @@ namespace Gidrolock_Modbus_Scanner d.name = "Premium Plus Wi-Fi"; d.id = 30; d.modelName = "PRPLS1"; + d.baudRate = new Entry(RegisterType.Holding, 110); d.valveStatus = new Entry(RegisterType.Coil, 1202); d.alarmStatus = new Entry(RegisterType.Coil, 1201); @@ -395,6 +333,9 @@ namespace Gidrolock_Modbus_Scanner break; case DeviceType.Premium: d.modelName = "Premium"; + d.id = 26; + d.modelName = "BUP485"; + d.baudRate = new Entry(RegisterType.Holding, 110); break; default: break; diff --git a/Model.cs b/Model.cs index 03890ce..90c03fe 100644 --- a/Model.cs +++ b/Model.cs @@ -8,6 +8,7 @@ namespace Gidrolock_Modbus_Scanner public string name; public byte id; public string modelName; + public Entry baudRate; public Entry valveStatus; public Entry alarmStatus;