From 86a294341ec48b4c7758828d8ac2b830d503da42 Mon Sep 17 00:00:00 2001 From: bvtv <57758767+bvtvusn@users.noreply.github.com> Date: Tue, 31 Oct 2023 21:20:39 +0100 Subject: [PATCH 1/3] Added error counter --- BV_Modbus_Client/BusinessLayer/FcWrapperBase.cs | 2 ++ BV_Modbus_Client/BusinessLayer/MultipleCoils.cs | 6 ++++-- .../BusinessLayer/MultipleHoldingRegisters.cs | 6 ++++-- BV_Modbus_Client/BusinessLayer/ReadDiscreteInputs.cs | 3 ++- BV_Modbus_Client/BusinessLayer/ReadInputRegisters.cs | 3 ++- .../BusinessLayer/SingleHoldingRegister.cs | 6 ++++-- BV_Modbus_Client/Form1.Designer.cs | 12 ++++++++++++ BV_Modbus_Client/Form1.cs | 3 +++ BV_Modbus_Client/Form1.resx | 3 --- 9 files changed, 33 insertions(+), 11 deletions(-) diff --git a/BV_Modbus_Client/BusinessLayer/FcWrapperBase.cs b/BV_Modbus_Client/BusinessLayer/FcWrapperBase.cs index 1d12051..4e58e32 100644 --- a/BV_Modbus_Client/BusinessLayer/FcWrapperBase.cs +++ b/BV_Modbus_Client/BusinessLayer/FcWrapperBase.cs @@ -90,6 +90,8 @@ public virtual ushort NumberOfRegisters [Browsable(false)] public int WriteCount { get; set; } [Browsable(false)] + public int ErrorCount { get; set; } + [Browsable(false)] public double ResponseTimeMs { get; set; } [Browsable(false)] diff --git a/BV_Modbus_Client/BusinessLayer/MultipleCoils.cs b/BV_Modbus_Client/BusinessLayer/MultipleCoils.cs index 4d49704..27e063b 100644 --- a/BV_Modbus_Client/BusinessLayer/MultipleCoils.cs +++ b/BV_Modbus_Client/BusinessLayer/MultipleCoils.cs @@ -83,14 +83,15 @@ internal override async Task ExecuteReadAsync() rawdata[i] = (Convert.ToUInt16(coil)); } SetDatabuffer(rawdata); - base.ForceFcActivatedEvent(); base.ForceDataRefresh(""); } catch (Exception e) { + ErrorCount++; base.ForceDataRefresh(e.Message); } + base.ForceFcActivatedEvent(); } internal override async Task ExecuteWriteAsync() { @@ -111,14 +112,15 @@ internal override async Task ExecuteWriteAsync() ResponseTimeMs = stopwatch.Elapsed.TotalMilliseconds; WriteCount++; - base.ForceFcActivatedEvent(); base.ForceDataRefresh(""); } catch (Exception e) { + ErrorCount++; base.ForceDataRefresh(e.Message); } + base.ForceFcActivatedEvent(); } diff --git a/BV_Modbus_Client/BusinessLayer/MultipleHoldingRegisters.cs b/BV_Modbus_Client/BusinessLayer/MultipleHoldingRegisters.cs index 5aec082..c67a8b6 100644 --- a/BV_Modbus_Client/BusinessLayer/MultipleHoldingRegisters.cs +++ b/BV_Modbus_Client/BusinessLayer/MultipleHoldingRegisters.cs @@ -102,14 +102,15 @@ internal override async Task ExecuteReadAsync() //} SetDatabuffer(rawData); - base.ForceFcActivatedEvent(); base.ForceDataRefresh(""); } catch (Exception e) { + ErrorCount++; base.ForceDataRefresh(e.Message); } + base.ForceFcActivatedEvent(); } internal override async Task ExecuteWriteAsync() { @@ -127,14 +128,15 @@ internal override async Task ExecuteWriteAsync() WriteCount++; - base.ForceFcActivatedEvent(); base.ForceDataRefresh(""); } catch (Exception e) { + ErrorCount++; base.ForceDataRefresh(e.Message); } + base.ForceFcActivatedEvent(); } //internal override void ExecuteWrite() //{ diff --git a/BV_Modbus_Client/BusinessLayer/ReadDiscreteInputs.cs b/BV_Modbus_Client/BusinessLayer/ReadDiscreteInputs.cs index 635ba8d..7af410e 100644 --- a/BV_Modbus_Client/BusinessLayer/ReadDiscreteInputs.cs +++ b/BV_Modbus_Client/BusinessLayer/ReadDiscreteInputs.cs @@ -60,14 +60,15 @@ internal override async Task ExecuteReadAsync() rawData[i] = (Convert.ToUInt16(coil)); } SetDatabuffer(rawData); - base.ForceFcActivatedEvent(); base.ForceDataRefresh(""); } catch (Exception e) { + ErrorCount++; base.ForceDataRefresh(e.Message); } + base.ForceFcActivatedEvent(); } internal override async Task ExecuteWriteAsync() { diff --git a/BV_Modbus_Client/BusinessLayer/ReadInputRegisters.cs b/BV_Modbus_Client/BusinessLayer/ReadInputRegisters.cs index da41bd1..6db9035 100644 --- a/BV_Modbus_Client/BusinessLayer/ReadInputRegisters.cs +++ b/BV_Modbus_Client/BusinessLayer/ReadInputRegisters.cs @@ -61,13 +61,14 @@ internal override async Task ExecuteReadAsync() //} SetDatabuffer(rawData); - base.ForceFcActivatedEvent(); base.ForceDataRefresh(""); } catch (Exception e) { + ErrorCount++; base.ForceDataRefresh(e.Message); } + base.ForceFcActivatedEvent(); } internal override async Task ExecuteWriteAsync() { diff --git a/BV_Modbus_Client/BusinessLayer/SingleHoldingRegister.cs b/BV_Modbus_Client/BusinessLayer/SingleHoldingRegister.cs index 55d95c2..27073d1 100644 --- a/BV_Modbus_Client/BusinessLayer/SingleHoldingRegister.cs +++ b/BV_Modbus_Client/BusinessLayer/SingleHoldingRegister.cs @@ -61,14 +61,15 @@ internal override async Task ExecuteReadAsync() //} SetDatabuffer(rawData); - base.ForceFcActivatedEvent(); base.ForceDataRefresh(""); } catch (Exception e) { + ErrorCount++; base.ForceDataRefresh(e.Message); } + base.ForceFcActivatedEvent(); } //internal override void ExecuteWrite() @@ -92,14 +93,15 @@ internal override async Task ExecuteWriteAsync() WriteCount++; - base.ForceFcActivatedEvent(); base.ForceDataRefresh(""); } catch (Exception e) { + ErrorCount++; base.ForceDataRefresh(e.Message); } + base.ForceFcActivatedEvent(); } } } diff --git a/BV_Modbus_Client/Form1.Designer.cs b/BV_Modbus_Client/Form1.Designer.cs index cc7b407..30dd1b0 100644 --- a/BV_Modbus_Client/Form1.Designer.cs +++ b/BV_Modbus_Client/Form1.Designer.cs @@ -90,6 +90,7 @@ private void InitializeComponent() this.multipleCoilsToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); this.readInputRegistersToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); this.readToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.lblErrorCount = new System.Windows.Forms.Label(); this.menuStrip1.SuspendLayout(); this.dgvContext.SuspendLayout(); this.TopContainer.SuspendLayout(); @@ -477,6 +478,7 @@ private void InitializeComponent() // this.panel2.BackColor = System.Drawing.Color.White; this.panel2.Controls.Add(this.richTextBox1); + this.panel2.Controls.Add(this.lblErrorCount); this.panel2.Controls.Add(this.lblResponseTime); this.panel2.Controls.Add(this.lblWriteCounter); this.panel2.Controls.Add(this.lblReadCounter); @@ -749,6 +751,15 @@ private void InitializeComponent() this.readToolStripMenuItem.Text = "Read Discrete Inputs"; this.readToolStripMenuItem.Click += new System.EventHandler(this.readToolStripMenuItem_Click); // + // lblErrorCount + // + this.lblErrorCount.AutoSize = true; + this.lblErrorCount.Location = new System.Drawing.Point(119, 128); + this.lblErrorCount.Name = "lblErrorCount"; + this.lblErrorCount.Size = new System.Drawing.Size(13, 15); + this.lblErrorCount.TabIndex = 2; + this.lblErrorCount.Text = "0"; + // // Form1 // this.AutoScaleDimensions = new System.Drawing.SizeF(7F, 15F); @@ -856,5 +867,6 @@ private void InitializeComponent() private ValueFormatPanel valueFormatPanel1; private TrendlineControl trendlineControl1; private ToolStripMenuItem aboutToolStripMenuItem; + private Label lblErrorCount; } } \ No newline at end of file diff --git a/BV_Modbus_Client/Form1.cs b/BV_Modbus_Client/Form1.cs index a0d4669..7a5fc01 100644 --- a/BV_Modbus_Client/Form1.cs +++ b/BV_Modbus_Client/Form1.cs @@ -162,6 +162,9 @@ private void DisplayAllFCInfo() lblReadCounter.Invoke(delegate { lblReadCounter.Text = bll.SelectedFcRequest.ReadCount.ToString(); }); + lblErrorCount.Invoke(delegate { + lblErrorCount.Text = bll.SelectedFcRequest.ErrorCount.ToString(); + }); lblResponseTime.Invoke(delegate { lblResponseTime.Text = bll.SelectedFcRequest.ResponseTimeMs.ToString("0.0") +" ms"; }); diff --git a/BV_Modbus_Client/Form1.resx b/BV_Modbus_Client/Form1.resx index db9d845..4efad3e 100644 --- a/BV_Modbus_Client/Form1.resx +++ b/BV_Modbus_Client/Form1.resx @@ -66,9 +66,6 @@ True - - True - 132, 17 From b07cd182de08f549a00826d4a7887315c502d57f Mon Sep 17 00:00:00 2001 From: bvtv <57758767+bvtvusn@users.noreply.github.com> Date: Tue, 31 Oct 2023 22:44:46 +0100 Subject: [PATCH 2/3] Added dropdown for changing floating point format --- .../BusinessLayer/FcWrapperBase.cs | 5 +- .../BusinessLayer/FormatContainer.cs | 3 +- .../BusinessLayer/FormatConverter.cs | 11 +- .../BusinessLayer/MultipleCoils.cs | 1 + .../BusinessLayer/MultipleHoldingRegisters.cs | 2 +- .../BusinessLayer/ReadDiscreteInputs.cs | 1 + .../BusinessLayer/ReadInputRegisters.cs | 3 +- .../BusinessLayer/SingleHoldingRegister.cs | 1 + BV_Modbus_Client/BusinessLayer/ValueFormat.cs | 4 +- BV_Modbus_Client/Form1.Designer.cs | 36 +++---- BV_Modbus_Client/ProjectSettings.Designer.cs | 12 +++ BV_Modbus_Client/ProjectSettings.cs | 2 + .../Properties/Resources.Designer.cs | 10 ++ BV_Modbus_Client/Properties/Resources.resx | 3 + .../Resources/RefreshIconTransparent.png | Bin 0 -> 32641 bytes BV_Modbus_Client/ValueFormatPanel.Designer.cs | 98 ++++++++++++++---- BV_Modbus_Client/ValueFormatPanel.cs | 23 ++++ 17 files changed, 165 insertions(+), 50 deletions(-) create mode 100644 BV_Modbus_Client/Resources/RefreshIconTransparent.png diff --git a/BV_Modbus_Client/BusinessLayer/FcWrapperBase.cs b/BV_Modbus_Client/BusinessLayer/FcWrapperBase.cs index 4e58e32..1ad8213 100644 --- a/BV_Modbus_Client/BusinessLayer/FcWrapperBase.cs +++ b/BV_Modbus_Client/BusinessLayer/FcWrapperBase.cs @@ -76,6 +76,7 @@ public virtual ushort NumberOfRegisters [Browsable(false)] [DataMember] public string[] FcAddressDescription { get => fcAddressDescription; set { fcAddressDescription = value; FcSettingsChangedEvent?.Invoke(); } } + public string FcType { get; internal set; } //[Browsable(false)] //[DataMember] //public Dictionary AddressDescription { get; set; } // Databuffer contains the address read, the value and a description. @@ -98,6 +99,7 @@ public virtual ushort NumberOfRegisters [DataMember] public int SavedPollOrder { get; set; } = -1; // -1 means not polled. Only used for saving and restoring applionstate. Not kept up to date during program execution. [DataMember] + [Browsable(false)] public FormatContainer formatContainer { get; set; } //public string Type //{ @@ -111,6 +113,7 @@ public FcWrapperBase() //refreshDataEventBatcher.BatchedEvent += RefreshDataEventBatcher_BatchedEvent; InitializeObject(); + } private void RefreshDataEventBatcher_BatchedEvent(object? sender, EventArgs e) @@ -237,7 +240,7 @@ public string[] GetRegDescriptions(bool useDefaultName = false) string[] strData = new string[NumberOfRegisters]; for (int i = 0; i < NumberOfRegisters; i++) { - ushort address = (ushort)(i + startAddress); + ushort address = (ushort)(i + StartAddress); //ushort datavalue; //string dataDescription; diff --git a/BV_Modbus_Client/BusinessLayer/FormatContainer.cs b/BV_Modbus_Client/BusinessLayer/FormatContainer.cs index b45b4b3..1bb1adc 100644 --- a/BV_Modbus_Client/BusinessLayer/FormatContainer.cs +++ b/BV_Modbus_Client/BusinessLayer/FormatContainer.cs @@ -31,6 +31,7 @@ public FormatContainer(FcWrapperBase fcWrapperBase) public FormatConverter.FormatName DefaultFormat { get; internal set; } public bool SwapRegisters { get => swapRegisters; set => swapRegisters = value; } public bool SwapBytes { get => swapBytes; set => swapBytes = value; } + public string FloatFormatting { get; set; } = "0.0"; internal int SetFormat(int register, FormatConverter.FormatName type, int customLength) { @@ -73,7 +74,7 @@ internal string[] BinaryToString(ushort[] rawData, bool onlyOnestringPerValue = { singlevalueData = FormatConverter.SwapBytesInArray(singlevalueData); } - stringValues[item.Register] = item.BinaryToString(singlevalueData, logValue); + stringValues[item.Register] = item.BinaryToString(singlevalueData, logValue,FloatFormatting); } } diff --git a/BV_Modbus_Client/BusinessLayer/FormatConverter.cs b/BV_Modbus_Client/BusinessLayer/FormatConverter.cs index 5610f24..8dc0515 100644 --- a/BV_Modbus_Client/BusinessLayer/FormatConverter.cs +++ b/BV_Modbus_Client/BusinessLayer/FormatConverter.cs @@ -150,7 +150,7 @@ public enum FormatName //} - internal static string GetStringRepresentation(ushort[] rawdata, FormatName format, bool swapBytes = false, bool swapRegisters = false) + internal static string GetStringRepresentation(ushort[] rawdata, FormatName format,string floatFormat, bool swapBytes = false, bool swapRegisters = false) { if (swapRegisters) { @@ -177,7 +177,10 @@ internal static string GetStringRepresentation(ushort[] rawdata, FormatName form } else if (format == FormatName.Half) { - return FormatConverter.HalfToFloat(rawdata[0]).ToString(); + float half = FormatConverter.HalfToFloat(rawdata[0]); + + return half.ToString(floatFormat); + //return rawdata.Select(x => FormatConverter.HalfToFloat(x).ToString()).ToArray(); } else if (format == FormatName.Hex) @@ -207,7 +210,7 @@ internal static string GetStringRepresentation(ushort[] rawdata, FormatName form uint temp = ((uint)rawdata[0] << 16) | (uint)rawdata[1]; byte[] bytes = BitConverter.GetBytes(temp); float dval = BitConverter.ToSingle(bytes, 0); - return dval.ToString(); + return dval.ToString(floatFormat); } else if (format == FormatName.Double) @@ -215,7 +218,7 @@ internal static string GetStringRepresentation(ushort[] rawdata, FormatName form ulong temp = ((ulong)rawdata[0] << 48) | ((ulong)rawdata[1] << 32) | ((ulong)rawdata[2] << 16) | (ulong)rawdata[3]; byte[] bytes = BitConverter.GetBytes(temp); double dval = BitConverter.ToDouble(bytes, 0); - return dval.ToString(); + return dval.ToString(floatFormat); } else if (format == FormatName.Ascii) diff --git a/BV_Modbus_Client/BusinessLayer/MultipleCoils.cs b/BV_Modbus_Client/BusinessLayer/MultipleCoils.cs index 27e063b..afbad40 100644 --- a/BV_Modbus_Client/BusinessLayer/MultipleCoils.cs +++ b/BV_Modbus_Client/BusinessLayer/MultipleCoils.cs @@ -21,6 +21,7 @@ public MultipleCoils(MbConnection mbCon) : base() // Read multiple coils base.mbCon = mbCon; Description = "Multiple Coils"; + FcType = Description; //base.DisplayType = FormatConverter.FormatName.Boolean; formatContainer.DefaultFormat = FormatConverter.FormatName.Boolean; diff --git a/BV_Modbus_Client/BusinessLayer/MultipleHoldingRegisters.cs b/BV_Modbus_Client/BusinessLayer/MultipleHoldingRegisters.cs index c67a8b6..828e039 100644 --- a/BV_Modbus_Client/BusinessLayer/MultipleHoldingRegisters.cs +++ b/BV_Modbus_Client/BusinessLayer/MultipleHoldingRegisters.cs @@ -22,7 +22,7 @@ public MultipleHoldingRegisters(MbConnection mbCon) :base() // Read multiple coi base.mbCon = mbCon; Description = "Multiple Holding Registers"; - + FcType = Description; //Testing //startAddress = 0; //base.SlaveAddress = 1; diff --git a/BV_Modbus_Client/BusinessLayer/ReadDiscreteInputs.cs b/BV_Modbus_Client/BusinessLayer/ReadDiscreteInputs.cs index 7af410e..876a16f 100644 --- a/BV_Modbus_Client/BusinessLayer/ReadDiscreteInputs.cs +++ b/BV_Modbus_Client/BusinessLayer/ReadDiscreteInputs.cs @@ -19,6 +19,7 @@ public ReadDiscreteInputs(MbConnection mbCon) : base()// Read multiple coils base.mbCon = mbCon; Description = "Read Discrete Inputs"; + FcType = Description; formatContainer.DefaultFormat = FormatConverter.FormatName.Boolean; NumberOfRegisters = 4; diff --git a/BV_Modbus_Client/BusinessLayer/ReadInputRegisters.cs b/BV_Modbus_Client/BusinessLayer/ReadInputRegisters.cs index 6db9035..452a1f7 100644 --- a/BV_Modbus_Client/BusinessLayer/ReadInputRegisters.cs +++ b/BV_Modbus_Client/BusinessLayer/ReadInputRegisters.cs @@ -21,9 +21,10 @@ public ReadInputRegisters(MbConnection mbCon) : base() // Read multiple coils base.mbCon = mbCon; Description = "Read Input Registers"; + FcType = Description; //base.DisplayType = FormatConverter.FormatName.Boolean; - + NumberOfRegisters = 4; DataBuffer = new Dictionary(); diff --git a/BV_Modbus_Client/BusinessLayer/SingleHoldingRegister.cs b/BV_Modbus_Client/BusinessLayer/SingleHoldingRegister.cs index 27073d1..54cdce7 100644 --- a/BV_Modbus_Client/BusinessLayer/SingleHoldingRegister.cs +++ b/BV_Modbus_Client/BusinessLayer/SingleHoldingRegister.cs @@ -17,6 +17,7 @@ public SingleHoldingRegister(MbConnection mbCon) // Read multiple coils { base.mbCon = mbCon; Description = "Single Holding Register"; + FcType = Description; NumberOfRegisters = 1; DataBuffer = new Dictionary(); } diff --git a/BV_Modbus_Client/BusinessLayer/ValueFormat.cs b/BV_Modbus_Client/BusinessLayer/ValueFormat.cs index b0e7aba..7cff0c5 100644 --- a/BV_Modbus_Client/BusinessLayer/ValueFormat.cs +++ b/BV_Modbus_Client/BusinessLayer/ValueFormat.cs @@ -53,9 +53,9 @@ public ValueFormat(FormatContainer formatContainer, int register, FormatConverte isVisibleInPlot = true; } - internal string BinaryToString(ushort[] singlevalueData, bool logValue = false) + internal string BinaryToString(ushort[] singlevalueData, bool logValue = false, string floatFormat = "") { - string value = FormatConverter.GetStringRepresentation(singlevalueData, FormatType); + string value = FormatConverter.GetStringRepresentation(singlevalueData, FormatType, floatFormat); if (logValue) { diff --git a/BV_Modbus_Client/Form1.Designer.cs b/BV_Modbus_Client/Form1.Designer.cs index 30dd1b0..cac9cc4 100644 --- a/BV_Modbus_Client/Form1.Designer.cs +++ b/BV_Modbus_Client/Form1.Designer.cs @@ -65,6 +65,7 @@ private void InitializeComponent() this.StatisticsPanel = new System.Windows.Forms.Panel(); this.panel2 = new System.Windows.Forms.Panel(); this.richTextBox1 = new System.Windows.Forms.RichTextBox(); + this.lblErrorCount = new System.Windows.Forms.Label(); this.lblResponseTime = new System.Windows.Forms.Label(); this.lblWriteCounter = new System.Windows.Forms.Label(); this.lblReadCounter = new System.Windows.Forms.Label(); @@ -90,7 +91,6 @@ private void InitializeComponent() this.multipleCoilsToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); this.readInputRegistersToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); this.readToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.lblErrorCount = new System.Windows.Forms.Label(); this.menuStrip1.SuspendLayout(); this.dgvContext.SuspendLayout(); this.TopContainer.SuspendLayout(); @@ -219,7 +219,7 @@ private void InitializeComponent() this.TopContainer.Dock = System.Windows.Forms.DockStyle.Fill; this.TopContainer.Location = new System.Drawing.Point(357, 0); this.TopContainer.Name = "TopContainer"; - this.TopContainer.Size = new System.Drawing.Size(620, 607); + this.TopContainer.Size = new System.Drawing.Size(620, 645); this.TopContainer.TabIndex = 12; // // mainBottomPanel @@ -230,7 +230,7 @@ private void InitializeComponent() this.mainBottomPanel.Location = new System.Drawing.Point(0, 241); this.mainBottomPanel.Name = "mainBottomPanel"; this.mainBottomPanel.Padding = new System.Windows.Forms.Padding(30, 0, 30, 30); - this.mainBottomPanel.Size = new System.Drawing.Size(620, 366); + this.mainBottomPanel.Size = new System.Drawing.Size(620, 404); this.mainBottomPanel.TabIndex = 19; // // tabControl1 @@ -243,7 +243,7 @@ private void InitializeComponent() this.tabControl1.Margin = new System.Windows.Forms.Padding(0); this.tabControl1.Name = "tabControl1"; this.tabControl1.SelectedIndex = 0; - this.tabControl1.Size = new System.Drawing.Size(560, 336); + this.tabControl1.Size = new System.Drawing.Size(560, 374); this.tabControl1.TabIndex = 17; // // tabPage1 @@ -254,7 +254,7 @@ private void InitializeComponent() this.tabPage1.Location = new System.Drawing.Point(4, 24); this.tabPage1.Margin = new System.Windows.Forms.Padding(0); this.tabPage1.Name = "tabPage1"; - this.tabPage1.Size = new System.Drawing.Size(552, 308); + this.tabPage1.Size = new System.Drawing.Size(552, 346); this.tabPage1.TabIndex = 0; this.tabPage1.Text = "View Request Data"; // @@ -264,7 +264,7 @@ private void InitializeComponent() this.valueFormatPanel1.Location = new System.Drawing.Point(0, 0); this.valueFormatPanel1.Margin = new System.Windows.Forms.Padding(3, 4, 3, 4); this.valueFormatPanel1.Name = "valueFormatPanel1"; - this.valueFormatPanel1.Size = new System.Drawing.Size(552, 308); + this.valueFormatPanel1.Size = new System.Drawing.Size(552, 346); this.valueFormatPanel1.TabIndex = 0; // // tabPage2 @@ -506,6 +506,15 @@ private void InitializeComponent() this.richTextBox1.TabIndex = 3; this.richTextBox1.Text = "Statistics:\t\t\t"; // + // lblErrorCount + // + this.lblErrorCount.AutoSize = true; + this.lblErrorCount.Location = new System.Drawing.Point(119, 128); + this.lblErrorCount.Name = "lblErrorCount"; + this.lblErrorCount.Size = new System.Drawing.Size(13, 15); + this.lblErrorCount.TabIndex = 2; + this.lblErrorCount.Text = "0"; + // // lblResponseTime // this.lblResponseTime.AutoSize = true; @@ -653,7 +662,7 @@ private void InitializeComponent() this.leftPanel.Dock = System.Windows.Forms.DockStyle.Left; this.leftPanel.Location = new System.Drawing.Point(0, 0); this.leftPanel.Name = "leftPanel"; - this.leftPanel.Size = new System.Drawing.Size(357, 607); + this.leftPanel.Size = new System.Drawing.Size(357, 645); this.leftPanel.TabIndex = 13; // // scrollPanel @@ -664,7 +673,7 @@ private void InitializeComponent() this.scrollPanel.Dock = System.Windows.Forms.DockStyle.Fill; this.scrollPanel.Location = new System.Drawing.Point(0, 59); this.scrollPanel.Name = "scrollPanel"; - this.scrollPanel.Size = new System.Drawing.Size(357, 548); + this.scrollPanel.Size = new System.Drawing.Size(357, 586); this.scrollPanel.TabIndex = 10; // // FCHeader @@ -751,21 +760,12 @@ private void InitializeComponent() this.readToolStripMenuItem.Text = "Read Discrete Inputs"; this.readToolStripMenuItem.Click += new System.EventHandler(this.readToolStripMenuItem_Click); // - // lblErrorCount - // - this.lblErrorCount.AutoSize = true; - this.lblErrorCount.Location = new System.Drawing.Point(119, 128); - this.lblErrorCount.Name = "lblErrorCount"; - this.lblErrorCount.Size = new System.Drawing.Size(13, 15); - this.lblErrorCount.TabIndex = 2; - this.lblErrorCount.Text = "0"; - // // Form1 // this.AutoScaleDimensions = new System.Drawing.SizeF(7F, 15F); this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; this.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(80)))), ((int)(((byte)(148)))), ((int)(((byte)(153))))); - this.ClientSize = new System.Drawing.Size(977, 607); + this.ClientSize = new System.Drawing.Size(977, 645); this.Controls.Add(this.TopContainer); this.Controls.Add(this.leftPanel); this.MainMenuStrip = this.menuStrip1; diff --git a/BV_Modbus_Client/ProjectSettings.Designer.cs b/BV_Modbus_Client/ProjectSettings.Designer.cs index 3e5a5d7..b7f4ccf 100644 --- a/BV_Modbus_Client/ProjectSettings.Designer.cs +++ b/BV_Modbus_Client/ProjectSettings.Designer.cs @@ -31,6 +31,7 @@ private void InitializeComponent() this.groupBox1 = new System.Windows.Forms.GroupBox(); this.rdoAddressingZeroBased = new System.Windows.Forms.RadioButton(); this.rdoAddressingOneBased = new System.Windows.Forms.RadioButton(); + this.cboFloatFormat = new System.Windows.Forms.ComboBox(); this.groupBox1.SuspendLayout(); this.SuspendLayout(); // @@ -69,11 +70,21 @@ private void InitializeComponent() this.rdoAddressingOneBased.UseVisualStyleBackColor = true; this.rdoAddressingOneBased.Click += new System.EventHandler(this.rdoAddressingZeroBased_CheckedChanged); // + // cboFloatFormat + // + this.cboFloatFormat.FormattingEnabled = true; + this.cboFloatFormat.Location = new System.Drawing.Point(161, 39); + this.cboFloatFormat.Name = "cboFloatFormat"; + this.cboFloatFormat.Size = new System.Drawing.Size(121, 23); + this.cboFloatFormat.TabIndex = 1; + this.cboFloatFormat.Text = "0.0"; + // // ProjectSettings // this.AutoScaleDimensions = new System.Drawing.SizeF(7F, 15F); this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; this.ClientSize = new System.Drawing.Size(454, 113); + this.Controls.Add(this.cboFloatFormat); this.Controls.Add(this.groupBox1); this.Name = "ProjectSettings"; this.Text = "ProjectSettings"; @@ -88,5 +99,6 @@ private void InitializeComponent() private GroupBox groupBox1; private RadioButton rdoAddressingZeroBased; private RadioButton rdoAddressingOneBased; + private ComboBox cboFloatFormat; } } \ No newline at end of file diff --git a/BV_Modbus_Client/ProjectSettings.cs b/BV_Modbus_Client/ProjectSettings.cs index 677f29a..6427a9f 100644 --- a/BV_Modbus_Client/ProjectSettings.cs +++ b/BV_Modbus_Client/ProjectSettings.cs @@ -27,6 +27,8 @@ public ProjectSettings(BLL bll) rdoAddressingOneBased.Checked = !bll.UserConfig.GlobFcData.ZeroBasedAdresses; rdoAddressingZeroBased.Checked = bll.UserConfig.GlobFcData.ZeroBasedAdresses; + + //cboFloatFormat.Text = bll.UserConfig. } private void rdoAddressingZeroBased_CheckedChanged(object sender, EventArgs e) diff --git a/BV_Modbus_Client/Properties/Resources.Designer.cs b/BV_Modbus_Client/Properties/Resources.Designer.cs index 4dc3edd..15467ec 100644 --- a/BV_Modbus_Client/Properties/Resources.Designer.cs +++ b/BV_Modbus_Client/Properties/Resources.Designer.cs @@ -180,6 +180,16 @@ internal static System.Drawing.Bitmap receive_gray { } } + /// + /// Looks up a localized resource of type System.Drawing.Bitmap. + /// + internal static System.Drawing.Bitmap RefreshIconTransparent { + get { + object obj = ResourceManager.GetObject("RefreshIconTransparent", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + /// /// Looks up a localized resource of type System.Drawing.Bitmap. /// diff --git a/BV_Modbus_Client/Properties/Resources.resx b/BV_Modbus_Client/Properties/Resources.resx index 06e7cbc..ccdac55 100644 --- a/BV_Modbus_Client/Properties/Resources.resx +++ b/BV_Modbus_Client/Properties/Resources.resx @@ -154,6 +154,9 @@ ..\Resources\receive_gray.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + ..\Resources\RefreshIconTransparent.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + ..\Resources\SendData.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a diff --git a/BV_Modbus_Client/Resources/RefreshIconTransparent.png b/BV_Modbus_Client/Resources/RefreshIconTransparent.png new file mode 100644 index 0000000000000000000000000000000000000000..1ace4c0013cdbcf283847131c5268f5312355cd5 GIT binary patch literal 32641 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 Date: Tue, 31 Oct 2023 22:49:01 +0100 Subject: [PATCH 3/3] versionnumber --- BV_Modbus_Client/AboutWindow.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/BV_Modbus_Client/AboutWindow.cs b/BV_Modbus_Client/AboutWindow.cs index 67fb0a0..361ea79 100644 --- a/BV_Modbus_Client/AboutWindow.cs +++ b/BV_Modbus_Client/AboutWindow.cs @@ -18,7 +18,7 @@ public AboutWindow() InitializeComponent(); //Assembly ass = Assembly.GetExecutingAssembly(); Version version = Assembly.GetExecutingAssembly().GetName().Version; - string softwareVersion = version.ToString(); + string softwareVersion = "v.1.2.2"; //version.ToString(); lblVersion.Text = $"{softwareVersion}"; //lblVersion.Text = ass.GetName().Version.ToString(); lblAuthor.Text = "Bjørn Vegard Tveraaen";