using LB_VisionControl; using LB_VisionProcesses.Communicators; using VisionControl.Forms; namespace LB_SmartVision.Forms.Pages.CommunicatorPage { public partial class CommunicatorsEditPage : UserControl { public Action LogInfo; public CommunicatorsEditPage() { InitializeComponent(); Name = "CommunicatorsPage"; Text = "通讯设置"; //this.Font = new Font("Microsoft YaHei UI", 16F, FontStyle.Regular, GraphicsUnit.Point, 0); } private void CommunicatorsEditPage_Paint(object sender, PaintEventArgs e) { uiFlowLayoutPanel1.Controls.Clear(); if (GlobalVar.dicCommunicators.Count <= 0) return; foreach (var item in GlobalVar.dicCommunicators) { string ClassName = item.Value.GetType().Name;// "TCP" string IP = item.Value.CommunicatorConnections["地址"].ToString();//"127.0.0.1" string PORT = item.Value.CommunicatorConnections["端口"].ToString();//"1111" if (string.IsNullOrEmpty(ClassName) || string.IsNullOrEmpty(IP) || string.IsNullOrEmpty(PORT)) return; string DataType = item.Value.CommunicatorConnections.Contains("数据类型") ? item.Value.CommunicatorConnections["数据类型"].ToString() : "String"; string CommunicatorConnectionString = $"({ClassName}){IP}:{PORT} [{DataType}]"; UserItem flow = new UserItem(new string[] { "测试", "刷新", "移除", "重命名" }); //flow.SetDPIScale(); flow.Name = item.Key; flow.Text = CommunicatorConnectionString; if (item.Value.bConnected) flow.state = State.Pass; else flow.state = State.Error; LoadFlowEvent(flow); uiFlowLayoutPanel1.Controls.Add(flow); } } private void uiButton1_Click(object sender, System.EventArgs e) { CreateCommunicatorForm createCommunicatorForm = new CreateCommunicatorForm(); createCommunicatorForm.ShowDialog(); if (createCommunicatorForm.bCreate) { BaseCommunicator communicator = createCommunicatorForm.communicator; string Name = "通讯口" + GlobalVar.dicCommunicators.Count; if (GlobalVar.dicCommunicators.ContainsKey(Name)) Name += "副本"; string ClassName = communicator.GetType().Name;// "TCP" string IP = communicator.CommunicatorConnections["地址"].ToString();//"127.0.0.1" string PORT = communicator.CommunicatorConnections["端口"].ToString();//"1111" if (string.IsNullOrEmpty(ClassName) || string.IsNullOrEmpty(IP) || string.IsNullOrEmpty(PORT)) return; string DataType = communicator.CommunicatorConnections.Contains("数据类型") ? communicator.CommunicatorConnections["数据类型"].ToString() : "String"; string CommunicatorConnectionString = $"({ClassName}){IP}:{PORT} [{DataType}]"; GlobalVar.dicCommunicators.TryAdd(Name, communicator); communicator.CommunicatorName = Name; LogInfo?.Invoke(string.Format("添加通讯口[{0}]成功", Name), LogInfoType.PASS); } this.Invalidate(); } private void uiButton2_Click(object sender, System.EventArgs e) { //清除用Clear方法 uiFlowLayoutPanel1.Controls.Clear(); foreach (var communicator in GlobalVar.dicCommunicators.Values) { communicator.Disconnect(); } GlobalVar.dicCommunicators.Clear(); this.Refresh(); } private void LoadFlowEvent(UserItem flow) { //按键1为测试 flow.MenuItem1ClickedEvent += TestEvent; //按键2为刷新 flow.MenuItem2ClickedEvent += ReconnectEvent; //按键3为移除 flow.MenuItem3ClickedEvent += DeleteEvent; //按键4为重命名 flow.MenuItem4ClickedEvent += RenameEvent; } private void RemoveFlowEvent(UserItem flow) { //按键1为测试 flow.MenuItem1ClickedEvent -= TestEvent; //按键2为刷新 flow.MenuItem2ClickedEvent -= ReconnectEvent; //按键3为移除 flow.MenuItem3ClickedEvent -= DeleteEvent; //按键4为重命名 flow.MenuItem4ClickedEvent -= RenameEvent; } // 测试通讯口 private void TestEvent(string Name, string Text) { for (int i = 0; i < uiFlowLayoutPanel1.Controls.Count; i++) { UserItem flow = (UserItem)uiFlowLayoutPanel1.Controls[i]; string name = flow.Name; if (name != Name) continue; if (GlobalVar.dicCommunicators.ContainsKey(name)) { CommunicatorForm communicatorFForm = new CommunicatorForm(GlobalVar.dicCommunicators[name], name); communicatorFForm.CommunicatorChanged += CommunicatorFForm_CommunicatorChanged; communicatorFForm.Show(); } } } private void CommunicatorFForm_CommunicatorChanged(BaseCommunicator communicator) { if (this.InvokeRequired) { this.Invoke(new Action(CommunicatorFForm_CommunicatorChanged), communicator); return; } for (int i = 0; i < uiFlowLayoutPanel1.Controls.Count; i++) { if (uiFlowLayoutPanel1.Controls[i] is UserItem flow && flow.Name == communicator.CommunicatorName) { string ClassName = communicator.GetType().Name; string IP = communicator.CommunicatorConnections["地址"].ToString(); string PORT = communicator.CommunicatorConnections["端口"].ToString(); string DataType = communicator.CommunicatorConnections.Contains("数据类型") ? communicator.CommunicatorConnections["数据类型"].ToString() : "String"; flow.Text = $"({ClassName}){IP}:{PORT} [{DataType}]"; flow.Refresh(); break; } } } // 移除通讯口 private void DeleteEvent(string Name, string Text) { for (int i = 0; i < uiFlowLayoutPanel1.Controls.Count; i++) { UserItem flow = (UserItem)uiFlowLayoutPanel1.Controls[i]; string name = flow.Name; if (name != Name) continue; RemoveFlowEvent(flow); uiFlowLayoutPanel1.Controls.Remove(uiFlowLayoutPanel1.Controls[i]); GlobalVar.dicCommunicators.TryRemove(name, out BaseCommunicator BaseCommunicator); if (BaseCommunicator != null) LogInfo?.Invoke(string.Format("移除通讯口[{0}]", name), LogInfoType.INFO); } } private void RenameEvent(string Name, string Text) { RenameForm renameForm = new RenameForm(Name); // 订阅事件 renameForm.ShowDialog(); if (!renameForm.bRename) return; if (GlobalVar.dicCommunicators.ContainsKey(renameForm.strNewName)) { MessageBox.Show("命名重复!", "异常"); return; } for (int i = 0; i < uiFlowLayoutPanel1.Controls.Count; i++) { UserItem flow = (UserItem)uiFlowLayoutPanel1.Controls[i]; string name = flow.Name; if (name != Name) continue; flow.Name = renameForm.strNewName; string oldName = name; string newName = renameForm.strNewName; if (GlobalVar.dicCommunicators.ContainsKey(oldName)) GlobalVar.dicCommunicators.TryRename(oldName, newName); foreach (var item in GlobalVar.dicMotionControlData.Keys) { foreach (var item1 in GlobalVar.dicMotionControlData[item].Keys) { if (GlobalVar.dicMotionControlData[item][item1].CommunicatorsName.Contains(oldName)) { GlobalVar.dicMotionControlData[item][item1].CommunicatorsName = newName; } } } flow.Refresh(); } } // 重连流程 private void ReconnectEvent(string Name, string Text) { for (int i = 0; i < uiFlowLayoutPanel1.Controls.Count; i++) { UserItem flow = (UserItem)uiFlowLayoutPanel1.Controls[i]; string name = flow.Name; if (name != Name) continue; GlobalVar.dicCommunicators[name].Disconnect(); Thread.Sleep(50); GlobalVar.dicCommunicators[name].Connect(); if (GlobalVar.dicCommunicators[name].bConnected) { flow.state = State.Pass; LogInfo?.Invoke(string.Format("重连通讯口[{0}]成功", name), LogInfoType.PASS); } else { flow.state = State.Error; LogInfo?.Invoke(string.Format("重连通讯口[{0}]失败", name), LogInfoType.ERROR); } flow.Refresh(); } } } }