From dc18021539bdf4ee176ec9d9b88eb7d9ad581600 Mon Sep 17 00:00:00 2001
From: C3204 <zhengyabo@lanpucloud.cn>
Date: 星期五, 17 四月 2026 17:00:35 +0800
Subject: [PATCH] 新增心跳等常规信号配置&&修改相机轴读取配置等

---
 LB_SmartVision/Forms/Pages/MotionControlPage/MotionControlFormRead.cs |  415 ++++++++++++++++++++++-------------------------------------
 1 files changed, 156 insertions(+), 259 deletions(-)

diff --git a/LB_SmartVision/Forms/Pages/MotionControlPage/MotionControlFormRead.cs b/LB_SmartVision/Forms/Pages/MotionControlPage/MotionControlFormRead.cs
index 505e9f1..2246dc2 100644
--- a/LB_SmartVision/Forms/Pages/MotionControlPage/MotionControlFormRead.cs
+++ b/LB_SmartVision/Forms/Pages/MotionControlPage/MotionControlFormRead.cs
@@ -1,6 +1,9 @@
 锘縰sing LB_SmartVisionCommon;
 using LB_VisionControls;
 using LB_VisionProcesses.Cameras;
+using LB_VisionProcesses.Communicators;
+using LB_VisionProcesses.Communicators.SiemensS7;
+using OpenVinoSharp.Extensions.model;
 using System;
 using System.Collections.Concurrent;
 using System.Collections.Generic;
@@ -31,6 +34,13 @@
         private BindingSource _bindingSource;
 
 
+        private PlcConfig config;
+        private DataTable signalTable;
+        private BindingSource bindingSource;
+        private string Name;
+
+
+
         UserPictureBox onlinePictureBox { get; set; }
         string communicatorsName { get; set; }
         public MotionControlFormRead()
@@ -39,187 +49,23 @@
         }
         string cameraSN = string.Empty;
 
-        public MotionControlFormRead(List<string> strCameraSN)
+        public MotionControlFormRead(string strCameraSN)
         {
             InitializeComponent();
 
-            if (strCameraSN == null || strCameraSN.Count == 0)
+            if (string.IsNullOrEmpty(strCameraSN))
             {
                 return;
             }
-
-            //this.camera = camera;
-            //this.Text = camera.SN;
             this.cmbSN.Items.Clear();
-            foreach (string strSN in strCameraSN)
-            {
-                this.cmbSN.Items.Add(strSN);
-            }
-            //cameraSN = camera.SN;
+            this.cmbSN.Items.Add(strCameraSN);
             onlinePictureBox = new UserPictureBox(uiGroupBoxImage);
             this.uiGroupBoxImage.Controls.Clear();
             this.uiGroupBoxImage.Controls.Add(onlinePictureBox);
             onlinePictureBox.Dock = DockStyle.Fill;
-            dataGridView1.Columns["SN"].HeaderText = "搴忓垪鍙�";
-            dataGridView1.Columns["SN"].ReadOnly = true;
-            dataGridView1.Columns["ReadAddress"].HeaderText = "璇诲彇PLC鍦板潃";
-            //dataGridView1.Columns["ReadAddress"].ReadOnly = true;
-            dataGridView1.Columns["WriteAddress"].HeaderText = "鍐欏叆PLC鍦板潃";
-            //dataGridView1.Columns["WriteAddress"].ReadOnly = true;
-            dataGridView1.Columns["Value"].HeaderText = "鏁板��";
-            dataGridView1.Columns["Description"].HeaderText = "鎻忚堪";
-            dataGridView1.Columns["Value"].DefaultCellStyle.Format = "F2"; // 淇濈暀涓や綅灏忔暟
-
-
+            LoadConfigAndSetupGrid();
         }
-        Dictionary<string, RecordMotionControlData> concurrentDictionary = new Dictionary<string, RecordMotionControlData>();
-        private void CameraForm_FormClosing(object sender, FormClosingEventArgs e)
-        {
-            if (GlobalVar.dicCameras[this.cmbSN.Text] == null)
-            {
-                return;
-            }
-
-            GlobalVar.dicCameras[this.cmbSN.Text].StopGrabbing();
-
-            GlobalVar.dicCameras[this.cmbSN.Text].StartGrabbing();
-            if (GlobalVar.dicMotionControlData.Keys.Contains(GlobalVar.strProductName))
-            {
-                concurrentDictionary = GlobalVar.dicMotionControlData[GlobalVar.strProductName];
-                double xAxisDetectLocationValue, xAxisOriginalLocationValue, yAxisDetectLocationValue, yAxisOriginalLocationValue, zAxisDetectLocationValue, zAxisOriginalLocationValue, wAxisDetectLocationValue, wAxisOriginalLocationValue, pulseMotionSpeedValue, angularVelocityValue;
-                //xAxisDetectLocationValue = double.Parse(this.textBoxXDetectLocation.Text);
-                //xAxisOriginalLocationValue = double.Parse(this.textBoxXOriginalLocation.Text);
-                //yAxisDetectLocationValue = double.Parse(this.textBoxYDetectLocation.Text);
-                //yAxisOriginalLocationValue = double.Parse(this.textBoxYOriginalLocation.Text);
-                //zAxisDetectLocationValue = double.Parse(this.textBoxZDetectLocation.Text);
-                //zAxisOriginalLocationValue = double.Parse(this.textBoxZOriginalLocation.Text);
-                //wAxisDetectLocationValue = double.Parse(this.textBoxWDetectLocation.Text);
-                //wAxisOriginalLocationValue = double.Parse(this.textBoxWOriginalLocation.Text);
-                //pulseMotionSpeedValue = double.Parse(this.textBoxPointSpeed.Text);
-                //angularVelocityValue = double.Parse(this.textBoxPointSpeed.Text);
-                if (concurrentDictionary.Keys.Contains(cameraSN))
-                {
-                    //RecordMotionControlData recordMotionControlData = new RecordMotionControlData
-                    //{
-                    //    ProductName = GlobalVar.strProductName,
-                    //    CommunicatorsName = communicatorsName,
-                    //    CameraSN = cameraSN,
-                    //    //XAxisAddress = this.textBoxXVarAddress.Text,
-                    //    //XAxisDetectLocationValue = xAxisDetectLocationValue,
-                    //    //XAxisOriginalLocationValue = xAxisOriginalLocationValue,
-                    //    //YAxisAddress = this.textBoxYVarAddress.Text,
-                    //    //YAxisDetectLocationValue = yAxisDetectLocationValue,
-                    //    //YAxisOriginalLocationValue = yAxisOriginalLocationValue,
-                    //    //ZAxisAddress = this.textBoxZVarAddress.Text,
-                    //    //ZAxisDetectLocationValue = zAxisDetectLocationValue,
-                    //    //ZAxisOriginalLocationValue = zAxisOriginalLocationValue,
-                    //    //WAxisAddress = this.textBoxWVarAddress.Text,
-                    //    //WAxisDetectLocationValue = wAxisDetectLocationValue,
-                    //    //WAxisOriginalLocationValue = wAxisOriginalLocationValue,
-                    //    //PulseMotionSpeedAddress = this.textBoxPulseMotionSpeedAddress.Text,
-                    //    //PulseMotionSpeedValue = pulseMotionSpeedValue,
-                    //    //AngularVelocityAddress = this.textBoxAngularVelocityAddress.Text,
-                    //    //AngularVelocityValue = angularVelocityValue
-                    //};
-                    //concurrentDictionary.TryAdd(cameraSN, recordMotionControlData);
-                }
-                else
-                {
-                    //RecordMotionControlData recordMotionControlData = new RecordMotionControlData
-                    //{
-                    //    ProductName = GlobalVar.strProductName,
-                    //    CommunicatorsName = communicatorsName,
-                    //    CameraSN = cameraSN,
-                    //    //XAxisAddress = this.textBoxXVarAddress.Text,
-                    //    //XAxisDetectLocationValue = xAxisDetectLocationValue,
-                    //    //XAxisOriginalLocationValue = xAxisOriginalLocationValue,
-                    //    //YAxisAddress = this.textBoxYVarAddress.Text,
-                    //    //YAxisDetectLocationValue = yAxisDetectLocationValue,
-                    //    //YAxisOriginalLocationValue = yAxisOriginalLocationValue,
-                    //    //ZAxisAddress = this.textBoxZVarAddress.Text,
-                    //    //ZAxisDetectLocationValue = zAxisDetectLocationValue,
-                    //    //ZAxisOriginalLocationValue = zAxisOriginalLocationValue,
-                    //    //WAxisAddress = this.textBoxWVarAddress.Text,
-                    //    //WAxisDetectLocationValue = wAxisDetectLocationValue,
-                    //    //WAxisOriginalLocationValue = wAxisOriginalLocationValue,
-                    //    //PulseMotionSpeedAddress = this.textBoxPulseMotionSpeedAddress.Text,
-                    //    //PulseMotionSpeedValue = pulseMotionSpeedValue,
-                    //    //AngularVelocityAddress = this.textBoxAngularVelocityAddress.Text,
-                    //    //AngularVelocityValue = angularVelocityValue
-                    //};
-                    //concurrentDictionary.TryAdd(cameraSN, recordMotionControlData);
-                }
-            }
-            else
-            {
-                double xAxisDetectLocationValue, xAxisOriginalLocationValue, yAxisDetectLocationValue, yAxisOriginalLocationValue, zAxisDetectLocationValue, zAxisOriginalLocationValue, wAxisDetectLocationValue, wAxisOriginalLocationValue, pulseMotionSpeedValue, angularVelocityValue;
-                //xAxisDetectLocationValue = double.Parse(this.textBoxXDetectLocation.Text);
-                //xAxisOriginalLocationValue = double.Parse(this.textBoxXOriginalLocation.Text);
-                //yAxisDetectLocationValue = double.Parse(this.textBoxYDetectLocation.Text);
-                //yAxisOriginalLocationValue = double.Parse(this.textBoxYOriginalLocation.Text);
-                //zAxisDetectLocationValue = double.Parse(this.textBoxZDetectLocation.Text);
-                //zAxisOriginalLocationValue = double.Parse(this.textBoxZOriginalLocation.Text);
-                //wAxisDetectLocationValue = double.Parse(this.textBoxWDetectLocation.Text);
-                //wAxisOriginalLocationValue = double.Parse(this.textBoxWOriginalLocation.Text);
-                //pulseMotionSpeedValue = double.Parse(this.textBoxPointSpeed.Text);
-                //angularVelocityValue = double.Parse(this.textBoxPointSpeed.Text);
-                if (concurrentDictionary.Keys.Contains(cameraSN))
-                {
-                    //RecordMotionControlData recordMotionControlData = new RecordMotionControlData
-                    //{
-                    //    ProductName = GlobalVar.strProductName,
-                    //    CommunicatorsName = communicatorsName,
-                    //    CameraSN = cameraSN,
-                    //    //XAxisAddress = this.textBoxXVarAddress.Text,
-                    //    //XAxisDetectLocationValue = xAxisDetectLocationValue,
-                    //    //XAxisOriginalLocationValue = xAxisOriginalLocationValue,
-                    //    //YAxisAddress = this.textBoxYVarAddress.Text,
-                    //    //YAxisDetectLocationValue = yAxisDetectLocationValue,
-                    //    //YAxisOriginalLocationValue = yAxisOriginalLocationValue,
-                    //    //ZAxisAddress = this.textBoxZVarAddress.Text,
-                    //    //ZAxisDetectLocationValue = zAxisDetectLocationValue,
-                    //    //ZAxisOriginalLocationValue = zAxisOriginalLocationValue,
-                    //    //WAxisAddress = this.textBoxWVarAddress.Text,
-                    //    //WAxisDetectLocationValue = wAxisDetectLocationValue,
-                    //    //WAxisOriginalLocationValue = wAxisOriginalLocationValue,
-                    //    //PulseMotionSpeedAddress = this.textBoxPulseMotionSpeedAddress.Text,
-                    //    //PulseMotionSpeedValue = pulseMotionSpeedValue,
-                    //    //AngularVelocityAddress = this.textBoxAngularVelocityAddress.Text,
-                    //    //AngularVelocityValue = angularVelocityValue
-                    //};
-                    //concurrentDictionary.TryAdd(cameraSN, recordMotionControlData);
-                }
-                else
-                {
-                    //RecordMotionControlData recordMotionControlData = new RecordMotionControlData
-                    //{
-                    //    ProductName = GlobalVar.strProductName,
-                    //    CommunicatorsName = communicatorsName,
-                    //    CameraSN = cameraSN,
-                    //    //XAxisAddress = this.textBoxXVarAddress.Text,
-                    //    //XAxisDetectLocationValue = xAxisDetectLocationValue,
-                    //    //XAxisOriginalLocationValue = xAxisOriginalLocationValue,
-                    //    //YAxisAddress = this.textBoxYVarAddress.Text,
-                    //    //YAxisDetectLocationValue = yAxisDetectLocationValue,
-                    //    //YAxisOriginalLocationValue = yAxisOriginalLocationValue,
-                    //    //ZAxisAddress = this.textBoxZVarAddress.Text,
-                    //    //ZAxisDetectLocationValue = zAxisDetectLocationValue,
-                    //    //ZAxisOriginalLocationValue = zAxisOriginalLocationValue,
-                    //    //WAxisAddress = this.textBoxWVarAddress.Text,
-                    //    //WAxisDetectLocationValue = wAxisDetectLocationValue,
-                    //    //WAxisOriginalLocationValue = wAxisOriginalLocationValue,
-                    //    //PulseMotionSpeedAddress = this.textBoxPulseMotionSpeedAddress.Text,
-                    //    //PulseMotionSpeedValue = pulseMotionSpeedValue,
-                    //    //AngularVelocityAddress = this.textBoxAngularVelocityAddress.Text,
-                    //    //AngularVelocityValue = angularVelocityValue
-                    //};
-                    //concurrentDictionary.TryAdd(cameraSN, recordMotionControlData);
-                }
-            }
-            GlobalVar.dicMotionControlData.TryAdd(GlobalVar.strProductName, concurrentDictionary);
-            ConfigManager<Dictionary<string, Dictionary<string, RecordMotionControlData>>>.SaveConfig<Dictionary<string, Dictionary<string, RecordMotionControlData>>>(GlobalVar.dicMotionControlData, GlobalVar.allMotionControlDataPath);
-            Unsubscribe();
-        }
+        Dictionary<string, PlcConfig> concurrentDictionary = new Dictionary<string, PlcConfig>();
 
         public void Unsubscribe()
         {
@@ -344,123 +190,174 @@
 
         private void btnAdd_Click(object sender, EventArgs e)
         {
-            // 鍒涘缓鏂板鏁版嵁鐨勫璇濇锛堣繖閲岀畝鍖栦负鐩存帴鍒涘缓榛樿鏁版嵁锛�
-            PlcDataItem newData = new PlcDataItem
-            {
-                SN = (GlobalVar.dicMPlcData.Count()).ToString(),
-                ReadAddress = "DB1003.DBD1",
-                WriteAddress = "DB1003.DBD51",
-                Value = 0.0F,
-                Description = "璇蜂慨鏀瑰搴旀弿杩�"
-            };
 
-            // 娣诲姞鍒板祵濂楀瓧鍏�
-            if (!GlobalVar.dicMPlcData.ContainsKey(newData.ReadAddress))
+            using (var configForm = new ConfigForm(config, GlobalVar.allPlcSettingPath + "\\" + this.Name + ".json"))
             {
-                GlobalVar.dicMPlcData.TryAdd(newData.ReadAddress, new Dictionary<string, PlcDataItem> { [newData.ReadAddress] = newData });
-            }
-            else
-            {
-                newData.ReadAddress = newData.ReadAddress + GlobalVar.dicMPlcData.Count;
-                GlobalVar.dicMPlcData.TryAdd(newData.ReadAddress, new Dictionary<string, PlcDataItem> { [newData.ReadAddress] = newData });
-            }
-
-            // 鏇存柊DataGridView鏁版嵁婧�
-            UpdateDataSource();
-
-            // 閫変腑鏂板鐨勮
-            dataGridView1.ClearSelection();
-            var newRow = dataGridView1.Rows[dataGridView1.Rows.Count - 1];
-            newRow.Selected = true;
-            dataGridView1.FirstDisplayedScrollingRowIndex = newRow.Index;
-        }
-
-        /// <summary>
-        /// 灏嗗祵濂楀瓧鍏歌浆鎹负瑙嗗浘妯″瀷骞舵洿鏂版暟鎹簮
-        /// </summary>
-        private void UpdateDataSource()
-        {
-            // 杞崲宓屽瀛楀吀涓烘墎骞崇殑瑙嗗浘妯″瀷鍒楄〃
-            List<PlcDataItem> viewModelList = new List<PlcDataItem>();
-            foreach (var group in GlobalVar.dicMPlcData)
-            {
-                foreach (var device in group.Value)
+                if (configForm.ShowDialog() == DialogResult.OK)
                 {
-                    var data = device.Value;
-                    viewModelList.Add(new PlcDataItem
-                    {
-                        SN = (GlobalVar.dicMPlcData.Count()).ToString(),
-                        ReadAddress = data.ReadAddress,
-                        WriteAddress = data.WriteAddress,
-                        Value = data.Value,
-                        Description = data.Description
-                    });
+                    config = S7ConfigService.LoadConfig(GlobalVar.allPlcSettingPath);
+                    LoadConfigAndSetupGrid();
+                    UpdateConnectionStatus();
                 }
             }
-            _bindingSource.DataSource = viewModelList;
         }
 
-
-        private void dataGridView1_CellContentClick(object sender, DataGridViewCellEventArgs e)
+        // 鏁版嵁绫诲瀷杞崲杈呭姪鏂规硶
+        private object ConvertValue(string dataType, string valueStr)
         {
-            if (e.RowIndex < 0 || e.ColumnIndex < 0)
+            switch (dataType)
             {
-                return;
+                case "Bool":
+                    {
+                        if (bool.TryParse(valueStr, out bool b)) return b;
+                        if (valueStr == "1") return true;
+                        if (valueStr == "0") return false;
+                        throw new Exception("鏃犳晥鐨勫竷灏斿��");
+                    }
+                case "Byte":
+                    {
+                        return byte.Parse(valueStr);
+                    }
+                case "Int":
+                    {
+                        return short.Parse(valueStr);
+                    }
+                case "DInt":
+                    {
+                        return int.Parse(valueStr);
+                    }
+                case "Real":
+                    {
+                        return float.Parse(valueStr);
+                    }
+                case "String":
+                    {
+                        return valueStr;
+                    }
+                default:
+                    {
+                        throw new NotSupportedException($"涓嶆敮鎸佺殑绫诲瀷: {dataType}");
+                    }
             }
-
-            // 鑾峰彇淇敼鍚庣殑瑙嗗浘妯″瀷
-            var modifiedModel = (PlcDataItem)_bindingSource.List[e.RowIndex];
-
-            // 鏇存柊鍘熷瀛楀吀鏁版嵁
-            if (GlobalVar.dicMPlcData.ContainsKey(modifiedModel.SN))
-            {
-                var originalData = GlobalVar.dicMPlcData[modifiedModel.SN][GlobalVar.dicMPlcData[modifiedModel.SN].Keys.ToList()[0]];
-
-                // 鍚屾淇敼鍚庣殑鍊�
-                originalData.SN = modifiedModel.SN;
-                originalData.ReadAddress = modifiedModel.ReadAddress;
-                originalData.WriteAddress = modifiedModel.WriteAddress;
-                originalData.Value = modifiedModel.Value;
-                originalData.Description = modifiedModel.Description;
-                GlobalVar.dicMPlcData[modifiedModel.SN] = new Dictionary<string, PlcDataItem> { [originalData.SN] = originalData };
-            }
-
         }
-
-        private void btnRemove_Click(object sender, EventArgs e)
+        private void LoadConfigAndSetupGrid()
         {
-            if (dataGridView1.SelectedRows.Count == 0)
+            config = S7ConfigService.LoadConfig(GlobalVar.allPlcSettingPath + "\\" + this.Name + ".json");
+
+            if (GlobalVar.allPlcSettings.Keys.Contains(Name))
             {
-                System.Windows.Forms.MessageBox.Show("璇峰厛閫変腑瑕佸垹闄ょ殑琛岋紒");
-                return;
-            }
-
-            // 鑾峰彇閫変腑琛岀殑瑙嗗浘妯″瀷
-            var selectedModel = (PlcDataItem)dataGridView1.SelectedRows[0].DataBoundItem;
-
-            // 浠庡祵濂楀瓧鍏镐腑鍒犻櫎瀵瑰簲鏁版嵁
-            if (GlobalVar.dicMPlcData.ContainsKey(selectedModel.SN))
-            {
-                GlobalVar.dicMPlcData.Remove(selectedModel.SN);
-
-                // 鏇存柊DataGridView鏁版嵁婧�
-                UpdateDataSource();
-                System.Windows.Forms.MessageBox.Show("鍒犻櫎鎴愬姛锛�");
+                GlobalVar.allPlcSettings[Name] = config;
             }
             else
             {
-                System.Windows.MessageBox.Show("鏈壘鍒板搴旀暟鎹紝鍒犻櫎澶辫触锛�");
+                GlobalVar.allPlcSettings.TryAdd(Name, config);
+            }
+            ConfigManager<Dictionary<string, Dictionary<string, PlcConfig>>>.SaveConfig<Dictionary<string, Dictionary<string, PlcConfig>>>(GlobalVar.dicMPlcData, GlobalVar.allMPlcDataPath);
+            // 鏋勫缓 DataTable 鐢ㄤ簬灞曠ず淇″彿锛堟敮鎸佺紪杈戝�煎垪锛�
+            signalTable = new DataTable();
+            signalTable.Columns.Add("SignalName", typeof(string));
+            signalTable.Columns.Add("Address", typeof(string));
+            signalTable.Columns.Add("Value", typeof(string));
+
+            foreach (var signal in config.Signals)
+            {
+                string address = $"{signal.Area}";
+                if (signal.Area == "DB")
+                    address += $"{signal.DbNumber}.DB";
+                address += $"{signal.ByteOffset}.{signal.BitOffset}";
+
+                signalTable.Rows.Add(signal.SignalName, address, "");
+            }
+
+            bindingSource = new BindingSource();
+            bindingSource.DataSource = signalTable;
+            dgvSignals.DataSource = bindingSource;
+
+            dgvSignals.Columns["SignalName"].HeaderText = "淇″彿鍚嶇О";
+            dgvSignals.Columns["SignalName"].ReadOnly = true;
+            dgvSignals.Columns["Address"].HeaderText = "PLC 鍦板潃";
+            dgvSignals.Columns["Address"].ReadOnly = true;
+            dgvSignals.Columns["Value"].HeaderText = "褰撳墠鍊�";
+            dgvSignals.Columns["Value"].ReadOnly = true;  // 鍏佽鐢ㄦ埛缂栬緫
+
+            UpdateConnectionStatus();
+            dgvSignals.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.Fill;
+            dgvSignals.ForeColor = Color.Black;
+        }
+
+        private void UpdateConnectionStatus()
+        {
+            if (((SiemensLBS7)GlobalVar.dicCommunicators[GlobalVar.currentCommunicators]) != null && ((SiemensLBS7)GlobalVar.dicCommunicators[GlobalVar.currentCommunicators]).bConnected)
+            {
+                lblStatus.Text = $"宸茶繛鎺�: {config.PlcIpAddress}";
+                lblStatus.ForeColor = Color.Green;
+            }
+            else
+            {
+                lblStatus.Text = "鏈繛鎺�";
+                lblStatus.ForeColor = Color.Red;
             }
         }
 
         private void btnOneClickRead_Click(object sender, EventArgs e)
         {
+            if (((SiemensLBS7)GlobalVar.dicCommunicators[GlobalVar.currentCommunicators]) == null || !((SiemensLBS7)GlobalVar.dicCommunicators[GlobalVar.currentCommunicators]).bConnected)
+            {
+                System.Windows.Forms.MessageBox.Show("璇峰厛杩炴帴 PLC", "鎻愮ず", MessageBoxButtons.OK, MessageBoxIcon.Warning);
+                return;
+            }
 
+            try
+            {
+                for (int i = 0; i < config.Signals.Count; i++)
+                {
+                    var signal = config.Signals[i];
+                    object value = ((SiemensLBS7)GlobalVar.dicCommunicators[GlobalVar.currentCommunicators]).ReadSignal(signal);
+                    config.Signals[i].Value = value?.ToString() ?? "";
+                    signalTable.Rows[i]["Value"] = config.Signals[i].Value;
+                    //ShowLogMsg(signalTable.Rows[i]["Value"] + "锛�" + value?.ToString() ?? "");
+                }
+            }
+            catch (Exception ex)
+            {
+                System.Windows.Forms.MessageBox.Show($"鎵归噺璇诲彇澶辫触: {ex.Message}", "閿欒", MessageBoxButtons.OK, MessageBoxIcon.Error);
+            }
         }
 
         private void btnOneClickSetting_Click(object sender, EventArgs e)
         {
+            if (((SiemensLBS7)GlobalVar.dicCommunicators[GlobalVar.currentCommunicators]) == null || !((SiemensLBS7)GlobalVar.dicCommunicators[GlobalVar.currentCommunicators]).bConnected)
+            {
+                System.Windows.Forms.MessageBox.Show("璇峰厛杩炴帴 PLC", "鎻愮ず", MessageBoxButtons.OK, MessageBoxIcon.Warning);
+                return;
+            }
 
+            try
+            {
+                int successCount = 0;
+                for (int i = 0; i < config.Signals.Count; i++)
+                {
+                    var signal = config.Signals[i];
+                    string newValueStr = signalTable.Rows[i]["Value"]?.ToString();
+                    if (!string.IsNullOrEmpty(newValueStr))
+                    {
+                        object convertedValue = ConvertValue(signal.DataType, newValueStr);
+                        ((SiemensLBS7)GlobalVar.dicCommunicators[GlobalVar.currentCommunicators]).WriteSignal(signal, convertedValue);
+                        successCount++;
+                    }
+                    //ShowSendMsg(signalTable.Rows[i]["Value"] + "锛�" + newValueStr?.ToString() ?? "");
+                }
+                System.Windows.Forms.MessageBox.Show($"鎵归噺鍐欏叆瀹屾垚锛屾垚鍔熷啓鍏� {successCount} 涓俊鍙枫��", "鍐欏叆缁撴灉", MessageBoxButtons.OK, MessageBoxIcon.Information);
+            }
+            catch (Exception ex)
+            {
+                System.Windows.Forms.MessageBox.Show($"鎵归噺鍐欏叆澶辫触: {ex.Message}", "閿欒", MessageBoxButtons.OK, MessageBoxIcon.Error);
+            }
+        }
+
+        private void btnSave_Click(object sender, EventArgs e)
+        {
+            LoadConfigAndSetupGrid();
         }
     }
 }

--
Gitblit v1.9.3