diff --git a/Viewer/AlarmViewer/Dialog/Frm_Alamlist.Designer.cs b/Viewer/AlarmViewer/Dialog/Frm_Alamlist.Designer.cs index 384e209..6a48ad9 100644 --- a/Viewer/AlarmViewer/Dialog/Frm_Alamlist.Designer.cs +++ b/Viewer/AlarmViewer/Dialog/Frm_Alamlist.Designer.cs @@ -180,7 +180,6 @@ namespace vmsnet // this.BindingNavigatorPositionItem.AccessibleName = "위치"; this.BindingNavigatorPositionItem.AutoSize = false; - this.BindingNavigatorPositionItem.Font = new System.Drawing.Font("맑은 고딕", 9F); this.BindingNavigatorPositionItem.Name = "BindingNavigatorPositionItem"; this.BindingNavigatorPositionItem.Size = new System.Drawing.Size(50, 23); this.BindingNavigatorPositionItem.Text = "0"; @@ -223,7 +222,6 @@ namespace vmsnet // this.tb_search.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(255)))), ((int)(((byte)(255)))), ((int)(((byte)(192))))); this.tb_search.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle; - this.tb_search.Font = new System.Drawing.Font("맑은 고딕", 9F); this.tb_search.Name = "tb_search"; this.tb_search.Size = new System.Drawing.Size(100, 38); this.tb_search.KeyUp += new System.Windows.Forms.KeyEventHandler(this.ToolStripTextBox1_KeyUp); diff --git a/Viewer/AlarmViewer/Dialog/Frm_Alamlist.cs b/Viewer/AlarmViewer/Dialog/Frm_Alamlist.cs index d6784bc..bd853e9 100644 --- a/Viewer/AlarmViewer/Dialog/Frm_Alamlist.cs +++ b/Viewer/AlarmViewer/Dialog/Frm_Alamlist.cs @@ -191,7 +191,9 @@ namespace vmsnet lv.SubItems.Add(item.MAXVOLT.ToString()); lv.SubItems.Add(item.MINVOLT.ToString()); lv.SubItems.Add(item.ATYPESTR); - lv.SubItems.Add(item.REMARK); + var remark = item.REMARK; + if (remark.isEmpty()) remark = item.AM2; + lv.SubItems.Add(remark); switch (item.RTYPESTR.ToUpper()) { diff --git a/cVMS.NET_CS/Device/DigitalIndicator.cs b/cVMS.NET_CS/Device/DigitalIndicator.cs index eb8202f..03fa233 100644 --- a/cVMS.NET_CS/Device/DigitalIndicator.cs +++ b/cVMS.NET_CS/Device/DigitalIndicator.cs @@ -13,13 +13,13 @@ namespace vmsnet /// public byte SlaveID { get; set; } = 1; // Slave No - public DigitalIndicator(byte slaveID = 0) : base("", new RtuConfigure { BaudRate = 9600, DataBits = 8, StopBits = System.IO.Ports.StopBits.One, Parity = System.IO.Ports.Parity.None }) + public DigitalIndicator(byte slaveID = 1) : base("", new RtuConfigure { BaudRate = 9600, DataBits = 8, StopBits = System.IO.Ports.StopBits.One, Parity = System.IO.Ports.Parity.None }) { SlaveID = slaveID; } - public DigitalIndicator(string comPort, RtuConfigure configure, byte slaveId = 0) : base(comPort, configure) + public DigitalIndicator(string comPort, RtuConfigure configure, byte slaveId = 1) : base(comPort, configure) { SlaveID = slaveId; } @@ -45,13 +45,6 @@ namespace vmsnet //return WriteValue(buffer); } - UInt16[] splitI32(Int32 value) - { - var hValue = (UInt16)(value >> 16); // 상위 16 Bit - var lValue = (UInt16)(value & 0xFFFF); // 하위 16 Bit - return new ushort[] { hValue, lValue }; - } - public bool WriteValue(UInt16[] values) { if (IsOpen == false) @@ -77,5 +70,11 @@ namespace vmsnet } } + UInt16[] splitI32(Int32 value) + { + var hValue = (UInt16)(value >> 16); // 상위 16 Bit + var lValue = (UInt16)(value & 0xFFFF); // 하위 16 Bit + return new ushort[] { hValue, lValue }; + } } } diff --git a/cVMS.NET_CS/FMain.cs b/cVMS.NET_CS/FMain.cs index 031fded..a74531c 100644 --- a/cVMS.NET_CS/FMain.cs +++ b/cVMS.NET_CS/FMain.cs @@ -1589,12 +1589,12 @@ namespace vmsnet } } - private void DispCtrl1_OnAlamChangeL(int ch, COMM.EALAMRAISETYPE ison, COMM.EALAMTYPE atype, string AM, float value, float maxvalue, float minvalue) + private void DispCtrl1_OnAlamChangeL(int ch, COMM.EALAMRAISETYPE ison, COMM.EALAMTYPE atype, string AM, float value, float maxvalue, float minvalue, string remark) { TimeSpan ts = DateTime.Now - PUB.StartupTime; if (ts.TotalSeconds < PUB.CONFIG.Startup_DelayTime_Alam) return; - bool rlt = PUB.Alarm.InsertData(DateTime.Now, ch, ison, value, atype, maxvalue, minvalue, AM, ""); + bool rlt = PUB.Alarm.InsertData(DateTime.Now, ch, ison, value, atype, maxvalue, minvalue, AM, remark); PUB.log.Add(AR.Log.ETYPE.NORMAL, "알람이 발생되었습니다(ch=" + ch.ToString() + ",type=" + ison.ToString() + ", value=" + value.ToString() + ", min=:" + minvalue.ToString() + ",max=" + maxvalue.ToString() + ",atype=" + atype.ToString() + " ,am=" + AM); } diff --git a/cVMS.NET_CS/Frm_Sub.Designer.cs b/cVMS.NET_CS/Frm_Sub.Designer.cs index 0e5a4f0..936aa89 100644 --- a/cVMS.NET_CS/Frm_Sub.Designer.cs +++ b/cVMS.NET_CS/Frm_Sub.Designer.cs @@ -72,9 +72,9 @@ namespace vmsnet this.lb_status, this.lb_lasttime, this.lb_alarm}); - this.StatusStrip1.Location = new System.Drawing.Point(0, 750); + this.StatusStrip1.Location = new System.Drawing.Point(0, 744); this.StatusStrip1.Name = "StatusStrip1"; - this.StatusStrip1.Size = new System.Drawing.Size(929, 26); + this.StatusStrip1.Size = new System.Drawing.Size(929, 32); this.StatusStrip1.TabIndex = 1; this.StatusStrip1.Text = "StatusStrip1"; // @@ -83,7 +83,7 @@ namespace vmsnet this.lb_status.Font = new System.Drawing.Font("맑은 고딕", 9F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(129))); this.lb_status.ForeColor = System.Drawing.Color.FromArgb(((int)(((byte)(192)))), ((int)(((byte)(64)))), ((int)(((byte)(0))))); this.lb_status.Name = "lb_status"; - this.lb_status.Size = new System.Drawing.Size(130, 20); + this.lb_status.Size = new System.Drawing.Size(155, 25); this.lb_status.Text = ""; // // lb_lasttime @@ -91,14 +91,14 @@ namespace vmsnet this.lb_lasttime.Font = new System.Drawing.Font("맑은 고딕", 9F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(129))); this.lb_lasttime.ForeColor = System.Drawing.Color.Gray; this.lb_lasttime.Name = "lb_lasttime"; - this.lb_lasttime.Size = new System.Drawing.Size(103, 20); + this.lb_lasttime.Size = new System.Drawing.Size(123, 25); this.lb_lasttime.Text = ""; // // lb_alarm // this.lb_alarm.ForeColor = System.Drawing.Color.Silver; this.lb_alarm.Name = "lb_alarm"; - this.lb_alarm.Size = new System.Drawing.Size(24, 20); + this.lb_alarm.Size = new System.Drawing.Size(30, 25); this.lb_alarm.Text = "●"; // // Timer1 @@ -151,7 +151,7 @@ namespace vmsnet this.TableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 35F)); this.TableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 50F)); this.TableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 50F)); - this.TableLayoutPanel1.Size = new System.Drawing.Size(929, 706); + this.TableLayoutPanel1.Size = new System.Drawing.Size(929, 700); this.TableLayoutPanel1.TabIndex = 6; // // panel1 @@ -172,7 +172,7 @@ namespace vmsnet this.cmb_tanks.FormattingEnabled = true; this.cmb_tanks.Location = new System.Drawing.Point(0, 0); this.cmb_tanks.Name = "cmb_tanks"; - this.cmb_tanks.Size = new System.Drawing.Size(341, 38); + this.cmb_tanks.Size = new System.Drawing.Size(341, 45); this.cmb_tanks.TabIndex = 5; this.cmb_tanks.SelectedIndexChanged += new System.EventHandler(this.cmb_group_SelectedIndexChanged); // @@ -229,7 +229,7 @@ namespace vmsnet this.bt_fullscreen.Image = ((System.Drawing.Image)(resources.GetObject("bt_fullscreen.Image"))); this.bt_fullscreen.ImageTransparentColor = System.Drawing.Color.Magenta; this.bt_fullscreen.Name = "bt_fullscreen"; - this.bt_fullscreen.Size = new System.Drawing.Size(97, 41); + this.bt_fullscreen.Size = new System.Drawing.Size(112, 39); this.bt_fullscreen.Text = "개별보기"; this.bt_fullscreen.Click += new System.EventHandler(this.bt_fullscreen_Click); // @@ -239,7 +239,7 @@ namespace vmsnet this.bt_tviewr.Image = ((System.Drawing.Image)(resources.GetObject("bt_tviewr.Image"))); this.bt_tviewr.ImageTransparentColor = System.Drawing.Color.Magenta; this.bt_tviewr.Name = "bt_tviewr"; - this.bt_tviewr.Size = new System.Drawing.Size(152, 41); + this.bt_tviewr.Size = new System.Drawing.Size(177, 39); this.bt_tviewr.Text = "실시간트렌드(F1)"; this.bt_tviewr.Click += new System.EventHandler(this.bt_tviewr_Click); // @@ -249,7 +249,7 @@ namespace vmsnet this.bt_save.Image = ((System.Drawing.Image)(resources.GetObject("bt_save.Image"))); this.bt_save.ImageTransparentColor = System.Drawing.Color.Magenta; this.bt_save.Name = "bt_save"; - this.bt_save.Size = new System.Drawing.Size(92, 41); + this.bt_save.Size = new System.Drawing.Size(105, 39); this.bt_save.Text = "저장(F5)"; this.bt_save.Click += new System.EventHandler(this.bt_save_Click); // @@ -263,7 +263,7 @@ namespace vmsnet this.ToolStripButton2.Image = ((System.Drawing.Image)(resources.GetObject("ToolStripButton2.Image"))); this.ToolStripButton2.ImageTransparentColor = System.Drawing.Color.Magenta; this.ToolStripButton2.Name = "ToolStripButton2"; - this.ToolStripButton2.Size = new System.Drawing.Size(122, 41); + this.ToolStripButton2.Size = new System.Drawing.Size(141, 39); this.ToolStripButton2.Text = "소리끄기(F2)"; this.ToolStripButton2.Click += new System.EventHandler(this.ToolStripButton2_Click); // @@ -279,7 +279,7 @@ namespace vmsnet // // Frm_Sub // - this.AutoScaleDimensions = new System.Drawing.SizeF(9F, 18F); + this.AutoScaleDimensions = new System.Drawing.SizeF(10F, 22F); this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; this.ClientSize = new System.Drawing.Size(929, 776); this.Controls.Add(this.TableLayoutPanel1); diff --git a/cVMS.NET_CS/Frm_Sub.cs b/cVMS.NET_CS/Frm_Sub.cs index 7d3e753..12b1545 100644 --- a/cVMS.NET_CS/Frm_Sub.cs +++ b/cVMS.NET_CS/Frm_Sub.cs @@ -844,13 +844,13 @@ namespace vmsnet //Me.bt_window.Text = Me.DispCtrl1.WINDOW.이름 & "(윈도우속성)" } - private void DispCtrl1_OnAlamChangeL(int ch, COMM.EALAMRAISETYPE raisetype, COMM.EALAMTYPE atype, string AM, float value, float maxvalue, float minvalue) + private void DispCtrl1_OnAlamChangeL(int ch, COMM.EALAMRAISETYPE raisetype, COMM.EALAMTYPE atype, string AM, float value, float maxvalue, float minvalue, string remark) { TimeSpan ts = DateTime.Now - PUB.StartupTime; - if (ts.TotalSeconds < 7) return; + if (ts.TotalSeconds < PUB.CONFIG.Startup_DelayTime_Alam) return; - bool rlt = PUB.Alarm.InsertData(DateTime.Now, ch, raisetype, value, atype, maxvalue, minvalue, AM, ""); - PUB.log.Add(AR.Log.ETYPE.NORMAL, "알람이 발생되었습니다(ch=" + ch.ToString() + ",type=" + raisetype.ToString() + ", value=" + value.ToString() + ", min=:" + minvalue.ToString() + ",max=" + maxvalue.ToString() + ",atype=" + atype.ToString() + " ,am=" + AM); + bool rlt = PUB.Alarm.InsertData(DateTime.Now, ch, raisetype, value, atype, maxvalue, minvalue, AM, remark); + PUB.log.Add(AR.Log.ETYPE.NORMAL, "알람이 발생되었습니다(ch=" + ch.ToString() + ",type=" + raisetype.ToString() + ", value=" + value.ToString() + ", min=:" + minvalue.ToString() + ",max=" + maxvalue.ToString() + ",atype=" + atype.ToString() + " ,am=" + AM + " ,remark=" + remark); } public void DispCtrl1_OnSetNullbalance(HMI.CGROUP grp, float value) diff --git a/cVMS.NET_CS/Frm_Sub.resx b/cVMS.NET_CS/Frm_Sub.resx index 39b2a2b..a1c4051 100644 --- a/cVMS.NET_CS/Frm_Sub.resx +++ b/cVMS.NET_CS/Frm_Sub.resx @@ -488,190 +488,191 @@ iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8 - YQUAAAAJcEhZcwAAEnQAABJ0Ad5mH3gAAANqSURBVFhHxVdLT5NREG1iXBP/gXFpIgtWLvxJLjVxZbGl - gLUFBEFITNhYikVQgVYLFFT6AAqlILTQYlwopS+Ul+tx5r4hVVK15SYnM3PmzJ3zfV8XYPGH5+EiYXnm - HYKLOrSbGVj7vAO33Yt1Be3UBnay4J4oQe/sCfSFELM/eZQ58ap3wnUMQmdqGEe1OcdzmutFvmOyDEnc - qQwkdzLgGi/BkxkUzByrKHNem5H3GEIEznM98ahhnJznnIR7Ag1kDQOr2Qw8elOEnqlj6JkmHGEuQDXj - qRZ9iohuo9ctOD5v5JI37nPh217NZLSBxPY2OF8XoevdITyWCMr8iCNI0eCoz3CEc7J/ViN6WPPIcyc+ - bCKzpQ0sb6ehfawAnYFDgQMVO4zc5E/HQ9TxqGuaPR2lnh52eSutDcTTKWgbzYN78geDa/IAvxPmEoKn - 3MX6mnfJvtSyGufP6oy6DR82njYMLKU2wTGSB+f4d/wtEPbhEeZOzCVULTSMO9vDOdaXIE702J1C0/qy - AIu4UxmIbW5Aiy8P7a/KAvsGRD12uvdQxTN6ppM1n+EaHR0jBVjAncpAdGMdbC9y6KyMn6KMsQStowiK - KkeeIuvLXPJGLftsTuSSFzq7bw93ftIGIutrYPPm0FkRHL4itGBs8ZUYHASqJYhXtewJjs3wnuLFHZor - gm04D2HcqQzMJ5NgHdrFt1DAZgHsFFWOA5hLzm72GehCM4q8gpbusg8Xodm7x3YqAx9XE2B9vgsPvAVE - njmUuQbVEgZPWlykctlnHC4W0P08NHv24APuVAbmEitwHw00D2GzDrB6cvA+sawNzK7E0UCuorgWsOIb - mFsxDITii/gJ6msgFF/SBqaX0AC+lkriWoAMzOBOZWBqcQHu9Kfgbn+6Tkjhzpg2EIxFIfv1G8OX3G5d - EIwZBgKRMMNbgUBUxEgEowbxTBelnNdshkWsmU5quI5p1R1aT5wy4BdDAfwrNRAhhAXH80BYwOj5JYfQ - 81rDdKLnl3OyL+aUgYuEpZpzz26D8yCktTnkuH/I81tU/UTVHlpQ6b8biZoaoAXlg4NzQTox8n/PeU8v - UZO3QJdWc0jf5/Fc8fl8l8QV/3bsXZ1QLZ4ODl4dGBi4LK74u9PQ0HDtRlPTTUyrxvXGxls0j/kfjsXy - C5OMes1Y4DvuAAAAAElFTkSuQmCC + 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 - RU5ErkJggg== + YQUAAAAJcEhZcwAAFiUAABYlAUlSJPAAAAabSURBVFhHxZZ7TJPnHsebtGR/9X1fL2e4oUXdzbk5F8yS + ZX9syXL+ODnJsmRZsi05Wc7x7MwYLwg6pyCCWIsoskIvMCdoubQUaAuVuakIKrch4AUt9ykXQQdt3xZ2 + Ocv++C6/533bQhnbjFv2JJ98f8/z/B5+n0BKqlAoFArjlcUFZo/mW/Ot1d+aPQtz/Hqcl/r/8GVq1+CH + H79D/495CzL6fwvrMV/RIPr9Qy/TVxq0BTbj9D3hV6Ee6o1+/9DL2KZBa+CDeQOjaQ18CEPbij9eIL9F + gxbx33DfExg0zD0h1SxlWsWNyG/9EwTymleg2f8v1I4LqB3n4R6Xh87K2gkBzeL7oN7o9w+99E0aNPnf + QY0sICGg5i7tIzT534O+6U8QyL2swSXfW6gZ49lQlwzVNWOR/WXf26BeepNe8f27KRXBMV3NNHQuYkbO + adCZ1hF8OXrOgiunMR6N3jfgGhPgHOPhpKGjApyjPFxjBJ0LuOh9EzmNkkBSwRD7WJ4f+WEedE730XMW + XEcb4nFh6h9wjPBwjgpwjPIyApzsTKobpv6Jo43x7AfvMA+hqGUG2XUBHCFOB8J1UesMkswPIJBdvxLn + v3kd1SM8k6geDiGgekSQzkZ41E/+Hdn1EYHjTdPIpsGnRRypE1nSns7pPnrOgivr3Eqcvf8qKod5VN3h + UXlHzmEBVexMYGfn7r8G6qU3SeZBFF6aRrabBAI4zFJk+8KLJDD4+wV0X67EmYmXUXmbh/02j8rbAqsl + IvUXE69Ad3aV/BsYhKkhyAYedtNgkSVB5w8koD2zCnV3E1DxNS8xJKU9VMt8Pv4StF9IAommARjqg8iq + FWUkEcJwPohE0wMIZNathnt0HWyDPKxDPKyDPKsZQ5F0j60H9dIbEtB/GUBWTUgggv5sADtMA79fIMP9 + JFzDa1A+wME6wKF8gEf5IM/SSrV85hpeiwz3E7JAP459LkoCLhG6Gj90VNeIyDkjItEYEZg89ChmM2c4 + rfTaJ1H99RMo6+dQ1s+jVM6yPo7VpX1U83DceRrptRGBo6cD0NFwl59xyCUy6CNJ96HhP7W9P4d5Emmu + p2AfjEdpLw3jUNLLR+iL1PahVUhzPsUebzf24XCtH4ecfmidIrROqSYO14rYbpQEBnauwoxROYfBXdKf + MbxSHc/A2h+H4m4eFg8HSw8Hi4eHpYfHqR5KDkU3BNj6lyPV8bQs0I9DLj+0Dh8brnVE0Dn92G6QBHqT + 5wv075Q+yuGVUrUGpb2x+OyqgJO3eAkPh5MeqjnG8U4Bpb3LkFL1jCRg6IO22oeDDsLP0FZLSdA99d3a + sRIzBiWCnygxbZSyJylKYG/lszjlWYrCDgFFNzkUM3g5ORR3cyhoF2Dx/A17q9ZIAvm9yKz24YB9CgdJ + pIrw44Ddy3KbLNCdGI+ZfCWCx1RS5qhwM1H6bxpeeyrWoqhbgKltEYpucDjB4OWax4luDqaWRSi+uQh7 + 7GvZ420kUOlDRsUkMiv9yKzyscyw0d4Huqe+a9tWYDpfCTFbhZk8JQJHVLixLepr3ce25/DZdQ6G5kUs + 56NG/mW647HH9pwkkNeLA5U+7C+/zzJEaL81TxLo2rIc03olxCwVS3+WCle3RH2n2G1bh+PXOORdWoxP + r3EM2oegvf7iYlbvtj0vC/Qgw+5DWuk9ZNi9YWh/wE4CPayvY3Mc+7v7DqpY+rUqdG5ZHiVQvg6FXWro + G5ag8Co3CzU+letPLixBYReH3dZ17DENyKjwYV/JODIqvEiX2VcywTIk0LYpDsFcJXyZMeFs3xw3V+Cj + shdQ0MUh98ISFHRyMHeqUdClRkGnGuZOjp3l1tOdGh+Vv8Aeb8nrYYNST91Fus0bJrQPCbRuehzBHCW8 + 6THhbNv0+FyBXWXrYe5QI/f8UpbmDg6mTjVMHTKdHI6dWwpTB4ddpeslAX0P0q1epJ4cw36rF/ttErSn + 8615HtbX/L9lCBxRYiotJpwtHz42V2BnyYswXlGzIZTGKxxLE6spJQGqd5a+KAt42OCUk6OSgNWLNHlP + uVUvCVz6bywC2UpMpcawnNwXg8sfLJsrkFySAEO7JPBrGNo5JJfMFphCSvHIPEiG7qmvcWMspvbFYCLx + Ecbk3hiQ1FwBSwKKr6/Biaurw9D+l6DekEBm3U8LEhJo2BgLv44+hkr4dSqWjVECmmTLBiSdSkAoGZYE + JIfPNiDJsoENpwwJ/BbUd+E/j4JoCBPL9rMFEhQKxVt/ATRX8TO8ZzhJn31RwgAAAABJRU5ErkJggg== iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8 - YQUAAAAJcEhZcwAAEnQAABJ0Ad5mH3gAAARcSURBVFhH7ZVJU2NVFMepcu9HcNGSOSEDgRBCRgIxgNA0 - YUiA7nbt8BncuVE/gOzc6Lq7yi9gpx1K7TA0YFpdWW0SZodVqDqe/333vPfSL9V2UY1uvFW/OsO993/+ - vCSPgf+XrNrmW1uFyWnKM4jVjbs0XZpV+RcPHlyJX//4k+LxhKmJWKms1kqlNwN6rLVw4MOPPqa333lP - IQaQ/9XtXplKZcXUhL6Y0GOtlS9MUXX9rhpc0xEGaht36OeLC/rl4lxHO+c9eSgcMZE706UZ1rujNGus - CSOYpcdaK5cv0tr6barWbtMaIwZQN8/P6Mfzc0XzDPFM9Zpn0ufIOQYXim8oUDd5b2q6rHQF6GGWHmut - bH6SVqobtLrGcBQDK9VNenx6+kLYDUhvcqrMeptalyNrZ3OTTgOZbIGWV9c1NdMA6sbxMXNC2ycn1GC2 - uVY5+rpunBz3GECNfqFYsukyKzXCLD3WWulsnpaW10zEAPLvjo7oewaxh2Mjyp7dgJzB5720XO3RTmdz - TgOpdI4Wl1YUNxkxgPrrTkfxTZvptM3a3ke0GzD6bfW4RVe0U5k+BsZTGZq/WaH5xQotMGIAPGy3qN5q - U50FhYcqcl/gfbsB7IN0psCaSz3aqYmM00ByPE1z84s0t8DM3zLfBeDTe/foy1brSqTSWUPXRjKVdhpI - JCdoZm6BZmYXqIyoQZ7kp4MnNM4XAWqISA+5cca+b90pz84bWqw9wzlm6bHWGh1LUak894LM/kP+/P3R - sXGngZFEkoqlsuKTz+/T4dHlS2Xrs/tU5JcSGEmMOQ0MjyT4y8P/MPh3e3DUpYNO17x8oHm2tvft+4ed - Z3JdQx9glh5rrVh8lLL8isQb8clunX4CexqdP9G5inbkvNyRyJhaDLQxIxYfcRqIxuI0kckrDtjxvgZP - wsoNpO7FOmfVgnFP6fMLLzocdxoIR2KU5N8nvrX77Ut6DPgS4n7bEJIaUZ1BRM+GGo47OK8i+si7NA59 - JhwddhoIhaP880gpmjv1Xvjx9cR+PG9PI/qYpcdaK8hvsZHRMcUeO99rdWmXXSPfbUmNyLXqGXt7OIM9 - fV766qza02c54pcW519AaCjiNBAIDfGXY1SBgTv6InLEHVsu+0bPvif7Vl9ALfqYpcdayx8IUZi/iJHY - MB1u1+kANDQ6P9S1ityTc/aIPYmqJ+eZSJT1GX8w5DTg9QfVZzPEbP/WpYbi0gQ9o2/lcs6eW7VxTs6j - D/1QJEreQLCfAT8FhsKKxlMtxvGRxKcwYvSlB/FHiGpf9np71v2uevTA6ws4Dbi9PvLxx+Bjd+qiwhDr - V//Q0++PcebSPAttXzBImKXHWsvl8ZLH5ycPP4nT91+5Frz+gJqBWXqstQbdHnKxM5fX2/fyy8CtBw+6 - +xh43eVmZx6Ckd8/ePVacOGPZDBLj7XWjcHBLWyAb98duBZE/4bL/ZUeq9ZrTIzJMbf+JTDLw2D2f7kG - Bv4GtT2Ldl7X4kgAAAAASUVORK5CYII= + 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 + KOQU/Q+Qx3HtqiuXvQAAAABJRU5ErkJggg== diff --git a/cVMS.NET_CS/HMI/MainDisplay/DispCtrl.cs b/cVMS.NET_CS/HMI/MainDisplay/DispCtrl.cs index 57bfa4c..a9ad399 100644 --- a/cVMS.NET_CS/HMI/MainDisplay/DispCtrl.cs +++ b/cVMS.NET_CS/HMI/MainDisplay/DispCtrl.cs @@ -197,7 +197,7 @@ namespace vmsnet.HMI public delegate void OnSetNBHandler(CGROUP grp, Single value); public event OnAlamChangeHHandler OnAlamChange; //알람이 변경되었을경우(활성/비활성) - public delegate void OnAlamChangeHHandler(int ch, COMM.EALAMRAISETYPE raisetype, COMM.EALAMTYPE atype, String AM, Single value, Single maxvalue, Single minvalue); + public delegate void OnAlamChangeHHandler(int ch, COMM.EALAMRAISETYPE raisetype, COMM.EALAMTYPE atype, String AM, Single value, Single maxvalue, Single minvalue, string remark); public event OnRaiseAlamChangeHHandler RaiseAlarm; //알람이 변경되었을경우(활성/비활성) public delegate void OnRaiseAlamChangeHHandler(Boolean On); @@ -615,7 +615,7 @@ namespace vmsnet.HMI Item.alaml = grp.LOW; Item.aalamh = grp.UP; Item.aalaml = grp.UP; - Item.alamv = -999; /* 작성자: 이재웅, 작성일: 2025-06-11, 작성내용: 알람발생 원인으로 의심 -> 'Item.alamv = -999' 주석해제 */ + //Item.alamv = -999; /* 작성자: 이재웅, 작성일: 2025-06-11, 작성내용: 알람발생 원인으로 의심 -> 'Item.alamv = -999' 주석해제 했다가 다시 원복 */ break; case COMM.EALAMTYPE.사용안함: Item.alamh = -999; @@ -669,6 +669,7 @@ namespace vmsnet.HMI //값의 저장소가 아에없다면? //Boolean OverDATA = false; + var alarmRemark = string.Empty; if (this.Values == null) { Item.value2 = 0; @@ -728,7 +729,7 @@ namespace vmsnet.HMI if (TimeStr != "" && TimeStr != "Not USE" && Item._p_onalamover == false) { String alamtimes = DateTime.Parse(TimeStr).ToString("yy-MM-dd HH:mm:ss"); - OnAlamChange(Item.idx, COMM.EALAMRAISETYPE.OVER_ON, Item.알람형태, "--", Item.CurValue, Item.alamh, Item.alaml); + OnAlamChange(Item.idx, COMM.EALAMRAISETYPE.OVER_ON, Item.알람형태, "--", Item.CurValue, Item.alamh, Item.alaml, "over 32000"); Item._p_onalamover = true; } Item.CurValue = 0f; @@ -744,7 +745,7 @@ namespace vmsnet.HMI if (TimeStr != "" && TimeStr != "Not USE" && Item._p_onalamover == true) { String alamtimes = DateTime.Parse(TimeStr).ToString("yy-MM-dd HH:mm:ss"); - OnAlamChange(Item.idx, COMM.EALAMRAISETYPE.OVER_OFF, Item.알람형태, "--", Item.CurValue, Item.alamh, Item.alaml); + OnAlamChange(Item.idx, COMM.EALAMRAISETYPE.OVER_OFF, Item.알람형태, "--", Item.CurValue, Item.alamh, Item.alaml, ""); Item._p_onalamover = false; } } @@ -785,8 +786,9 @@ namespace vmsnet.HMI case COMM.EALAMTYPE.그룹설정을따름: if (grp.AlarmType == "AUTO") { - /* 작성자: 이재웅, 작성일: 2025-06-11, 작성내용: 알람발생 원인으로 의심 -> '알람타입:그룹설정을따름' 일때 'Item.alamv == -999' 주석해제 */ - if (Item.alamv == -999) Item.alamv = Item.CurValue; + //if (Item.alamv == -999) Item.alamv = Item.CurValue; + /* 작성자: 이재웅, 작성일: 2025-06-17, 작성내용: 'Item.alamv == 0' OR조건 추가 */ + if (Item.alamv == -999 || Item.alamv == 0) Item.alamv = Item.CurValue; Item.적용형태 = "AUTO"; if (Item.CurValue > Item.alamv) //큰값이 있을경우 상한선을 확인한다. @@ -797,6 +799,7 @@ namespace vmsnet.HMI Item.onalamh = true; Item.onalaml = false; BackColor = Color.Orange; //BackColor0 = Color.LightPink; + alarmRemark = $"ref({Item.alamv})"; } } else if (Item.CurValue < Item.alamv) @@ -807,6 +810,7 @@ namespace vmsnet.HMI Item.onalamh = false; Item.onalaml = true; BackColor = Color.SkyBlue; //BackColor0 = Color.LightBlue; + alarmRemark = $"ref({Item.alamv})"; } } @@ -819,12 +823,14 @@ namespace vmsnet.HMI Item.onalamh = true; Item.onalaml = false; BackColor = Color.Orange;// BackColor0 = Color.LightPink; + alarmRemark = $"ref({Item.alamh})"; } else if (Item.CurValue < Item.alaml) { Item.onalamh = false; Item.onalaml = true; BackColor = Color.SkyBlue; //BackColor0 = Color.LightBlue; + alarmRemark = $"ref({Item.alaml})"; } } else @@ -841,18 +847,22 @@ namespace vmsnet.HMI Item.onalamh = true; Item.onalaml = false; BackColor = Color.Orange; //BackColor0 = Color.LightPink; + alarmRemark = $"ref({Item.alamh})"; } else if (Item.CurValue < Item.alaml) { Item.onalamh = false; Item.onalaml = true; BackColor = Color.SkyBlue;// BackColor0 = Color.LightBlue; + alarmRemark = $"ref({Item.alaml})"; } break; case COMM.EALAMTYPE.개별알람자동: Item.적용형태 = "AUTO"; - if (Item.alamv == -999) Item.alamv = Item.CurValue; + //if (Item.alamv == -999) Item.alamv = Item.CurValue; // 이전 코드 + /* 작성자: 이재웅, 작성일: 2025-06-17, 작성내용: 'Item.alamv == 0' OR조건 추가 */ + if (Item.alamv == -999 || Item.alamv == 0) Item.alamv = Item.CurValue; if (Item.CurValue > Item.alamv) //큰값이 있을경우 상한선을 확인한다. { @@ -862,6 +872,7 @@ namespace vmsnet.HMI Item.onalamh = true; Item.onalaml = false; BackColor = Color.Orange; //BackColor0 = Color.LightPink; + alarmRemark = $"ref({Item.alamv})"; } } else if (Item.CurValue < Item.alamv) @@ -872,6 +883,7 @@ namespace vmsnet.HMI Item.onalamh = false; Item.onalaml = true; BackColor = Color.SkyBlue; //BackColor0 = Color.LightBlue; + alarmRemark = $"ref({Item.alamv})"; } } break; @@ -883,9 +895,10 @@ namespace vmsnet.HMI if (Item.활성화 && init == true && (Item.onalaml != Item._p_onalaml || Item._p_onalamh != Item.onalamh)) //이전과 알람상태가 변경된경우다. { - String alamtimes; + String alamtimes = ""; - if (TimeStr != "" && TimeStr != "Not USE") alamtimes = DateTime.Parse(TimeStr).ToString("yy-MM-dd HH:mm:ss"); + if (TimeStr != "" && TimeStr != "Not USE") + alamtimes = DateTime.Parse(TimeStr).ToString("yy-MM-dd HH:mm:ss"); else alamtimes = ""; Single AH, AL; @@ -901,23 +914,22 @@ namespace vmsnet.HMI } if (Item.onalamh && !Item._p_onalamh) { - - OnAlamChange(Item.idx, COMM.EALAMRAISETYPE.HIGH_ON, Item.알람형태, Item.적용형태, Item.CurValue, AH, AL); + OnAlamChange(Item.idx, COMM.EALAMRAISETYPE.HIGH_ON, Item.알람형태, Item.적용형태, Item.CurValue, AH, AL, alarmRemark); Item._p_onalamh = true; } else if (Item.onalaml && !Item._p_onalaml) { - OnAlamChange(Item.idx, COMM.EALAMRAISETYPE.LOW_ON, Item.알람형태, Item.적용형태, Item.CurValue, AH, AL); + OnAlamChange(Item.idx, COMM.EALAMRAISETYPE.LOW_ON, Item.알람형태, Item.적용형태, Item.CurValue, AH, AL, alarmRemark); Item._p_onalaml = true; } else if (!Item.onalamh && Item._p_onalamh) { - OnAlamChange(Item.idx, COMM.EALAMRAISETYPE.HIGH_OFF, Item.알람형태, Item.적용형태, Item.CurValue, AH, AL); + OnAlamChange(Item.idx, COMM.EALAMRAISETYPE.HIGH_OFF, Item.알람형태, Item.적용형태, Item.CurValue, AH, AL, ""); Item._p_onalamh = false; } else if (!Item.onalaml && Item._p_onalaml) { - OnAlamChange(Item.idx, COMM.EALAMRAISETYPE.LOW_OFF, Item.알람형태, Item.적용형태, Item.CurValue, AH, AL); + OnAlamChange(Item.idx, COMM.EALAMRAISETYPE.LOW_OFF, Item.알람형태, Item.적용형태, Item.CurValue, AH, AL, ""); Item._p_onalamh = false; } } @@ -1338,12 +1350,15 @@ namespace vmsnet.HMI Single imgheight = 30; if (!(grp.nbh == 0 && grp.nbl == 0)) { - if (Math.Abs(nullvalue) > grp.nbl) + //if (Math.Abs(nullvalue) > grp.nbl) // a2영역보다 크다면 + /* 작성자: 이재웅, 작성일: 2025-06-17, 작성내용: 'a2영역 절대값보다 클 경우'로 변경 */ + if (Math.Abs(nullvalue) > Math.Abs(grp.nbl)) // a2영역 절대값보다 크다면 { grp._nbalam_l = true; //a2 on if (!grp._pre_nbalam_l) { - if (grp.AlarmType != "STOP") OnAlamChange(grp.IDX, COMM.EALAMRAISETYPE.A2_ON, COMM.EALAMTYPE.사용안함, "NB", (Single)nullvalue, (Single)grp.nbl, (Single)grp.nbl); + if (grp.AlarmType != "STOP") OnAlamChange(grp.IDX, COMM.EALAMRAISETYPE.A2_ON, COMM.EALAMTYPE.사용안함, "NB", + (Single)nullvalue, (Single)grp.nbl, (Single)grp.nbl, $"> {grp.nbl}"); grp._pre_nbalam_l = true; A2 = false; blink2 = 0; @@ -1376,18 +1391,21 @@ namespace vmsnet.HMI if (grp._pre_nbalam_l) //이전에 a2알람이 켜져잇엇다면 알람을 끈다. { - OnAlamChange(grp.IDX, COMM.EALAMRAISETYPE.A2_OFF, COMM.EALAMTYPE.사용안함, "NB", (Single)nullvalue, (Single)grp.nbl, (Single)grp.nbl); + OnAlamChange(grp.IDX, COMM.EALAMRAISETYPE.A2_OFF, COMM.EALAMTYPE.사용안함, "NB", (Single)nullvalue, (Single)grp.nbl, (Single)grp.nbl, ""); grp._pre_nbalam_l = false; blink1 = 0; } - if (Math.Abs(nullvalue) > grp.nbh) //a1영역보다 크다면 + //if (Math.Abs(nullvalue) > grp.nbh) // a1영역보다 크다면 + /* 작성자: 이재웅, 작성일: 2025-06-17, 작성내용: 'a1영역 절대값보다 클 경우'로 변경 */ + if (Math.Abs(nullvalue) > Math.Abs(grp.nbh)) // a1영역 절대값보다 크다면 { grp._nbalam_h = true; if (!grp._pre_nbalam_h) //이전에 발생안햇다면 { - if (grp.AlarmType != "STOP") OnAlamChange(grp.IDX, COMM.EALAMRAISETYPE.A1_ON, COMM.EALAMTYPE.사용안함, "NB", (Single)nullvalue, (Single)grp.nbh, (Single)grp.nbh); + if (grp.AlarmType != "STOP") OnAlamChange(grp.IDX, COMM.EALAMRAISETYPE.A1_ON, COMM.EALAMTYPE.사용안함, "NB", + (Single)nullvalue, (Single)grp.nbh, (Single)grp.nbh, $"> {grp.nbh}"); grp._pre_nbalam_h = true; blink1 = 0; } @@ -1418,7 +1436,7 @@ namespace vmsnet.HMI grp._nbalam_h = false; //a1 off if (grp._pre_nbalam_h) //이전에 a1알람이 켜져잇엇다면 알람을 끈다. { - OnAlamChange(grp.IDX, COMM.EALAMRAISETYPE.A1_OFF, COMM.EALAMTYPE.사용안함, "NB", (Single)nullvalue, (Single)grp.nbl, (Single)grp.nbl); + OnAlamChange(grp.IDX, COMM.EALAMRAISETYPE.A1_OFF, COMM.EALAMTYPE.사용안함, "NB", (Single)nullvalue, (Single)grp.nbl, (Single)grp.nbl, ""); grp._pre_nbalam_h = false; } blink1 = 0; diff --git a/★ VMS 설정파일경로.txt b/★ VMS 설정파일경로.txt index 91b20c0..8e88cd6 100644 --- a/★ VMS 설정파일경로.txt +++ b/★ VMS 설정파일경로.txt @@ -1,3 +1,7 @@ +..\ +1) DesignSetting.xml +2) Setting.xml + ..\Database\Config 위 경로에 아래 설정파일들이 존재한다.