using LB_VisionProcesses.Communicators; using LB_VisionProcesses.Communicators.SiemensS7; using LB_VisionProcesses.Communicators.Tcom; using ReaLTaiizor.Forms; using RJCP.IO.Ports; using S7.Net; using System.Diagnostics; using System.Linq; namespace LB_SmartVision.Forms.Pages.CommunicatorPage { public delegate void CommunicatorChange(BaseCommunicator communicator); public partial class CommunicatorForm : Form { BaseCommunicator communicator { get; set; } public event CommunicatorChange CommunicatorChanged; private void communicatorChanged(BaseCommunicator communicator) { if (CommunicatorChanged != null) { CommunicatorChanged(communicator); } } public CommunicatorForm() { InitializeComponent(); cmbType.Items.Clear(); if (communicator != null && !string.IsNullOrEmpty(communicator.CommunicatorConnections["型号"]?.ToString())) { cmbType.Items.Add(communicator.CommunicatorConnections["型号"]?.ToString()); } } public CommunicatorForm(BaseCommunicator communicator, string name) { InitializeComponent(); if (communicator == null) { return; } cmbIP.Enabled = false; txtIP.Enabled = false; txtPort.Enabled = false; cmbDataType.Enabled = false; lblType.Visible = false; lblAddress.Visible = false; cmbType.Visible = false; txtAddress.Visible = false; lblDataType.Visible = false; cmbDataType.Visible = false; this.Text = name; if (communicator is UARTPort) { //统计可用端口 SerialPortStream temp = new SerialPortStream(); string[] ArryPort = temp.GetPortNames(); for (int i = 0; i < ArryPort.Length; i++) { cmbIP.Items.Add(ArryPort[i]); } cmbIP.Text = communicator.CommunicatorConnections["地址"]?.ToString(); txtPort.Text = communicator.CommunicatorConnections["端口"]?.ToString(); txtIP.Visible = false; cmbIP.Visible = true; this.btnRuleSend.Visible = true; lblType.Visible = false; lblAddress.Visible = false; cmbType.Visible = false; txtAddress.Visible = false; lblDataType.Visible = false; cmbDataType.Visible = false; lblIP.Text = "COM口"; lblPort.Text = "波特率"; } else if (communicator is TCPClient || communicator is TCPServer) { txtIP.Text = communicator.CommunicatorConnections["地址"]?.ToString(); txtPort.Text = communicator.CommunicatorConnections["端口"]?.ToString(); txtIP.Visible = true; cmbIP.Visible = false; this.btnRuleSend.Visible = false; lblType.Visible = false; lblAddress.Visible = false; cmbType.Visible = false; txtAddress.Visible = false; lblDataType.Visible = false; cmbDataType.Visible = false; lblIP.Text = "地址"; lblPort.Text = "端口"; } else if (communicator is SiemensLBS7) { txtIP.Text = communicator.CommunicatorConnections["地址"]?.ToString(); txtPort.Text = communicator.CommunicatorConnections["端口"]?.ToString(); cmbType.Items.Clear(); if (!string.IsNullOrEmpty(communicator.CommunicatorConnections["型号"]?.ToString())) { cmbType.Items.Add(communicator.CommunicatorConnections["型号"]?.ToString()); cmbType.Text = communicator.CommunicatorConnections["型号"]?.ToString(); } if (!string.IsNullOrEmpty(communicator.CommunicatorConnections["变量地址"]?.ToString())) { txtAddress.Text = communicator.CommunicatorConnections["变量地址"]?.ToString(); } // 初始化数据类型 cmbDataType.Items.Clear(); cmbDataType.Items.AddRange(new string[] { "String", "Bool", "Byte", "Int", "DInt", "Real", "Double", "Word", "DWord" }); if (communicator.CommunicatorConnections.Contains("数据类型")) { cmbDataType.Text = communicator.CommunicatorConnections["数据类型"].ToString(); } else { cmbDataType.Text = "String"; } txtIP.Visible = true; cmbIP.Visible = false; this.btnRuleSend.Visible = false; lblType.Visible = true; lblAddress.Visible = true; cmbType.Visible = true; txtAddress.Visible = true; lblDataType.Visible = true; cmbDataType.Visible = true; cmbDataType.Enabled = true; // 启用数据类型选择 lblIP.Text = "IP"; lblPort.Text = "槽"; } this.communicator = communicator; //加载回调函数 Subscribe(); } private void cmbDataType_SelectedIndexChanged(object sender, EventArgs e) { if (communicator != null) { communicator.CommunicatorConnections.Add("数据类型", cmbDataType.Text); communicatorChanged(communicator); } } private void CommunicatorForm_FormClosing(object sender, FormClosingEventArgs e) => Unsubscribe(); public void Unsubscribe() { try { if (communicator == null) { return; } //取消回调函数 communicator.MessageReceived -= ShowReceiveMsg; if (communicator != null) { communicatorChanged(communicator); if (GlobalVar.dicCommunicators != null && GlobalVar.dicCommunicators.Keys.Count > 0 && GlobalVar.dicCommunicators.Keys.Contains(communicator.CommunicatorName)) { GlobalVar.dicCommunicators[communicator.CommunicatorName] = communicator; } } } catch (Exception ex) { // 记录错误信息 Debug.WriteLine($"错误: {ex.Message}"); } } public void Subscribe() { try { if (communicator == null) { return; } //取消回调函数 communicator.MessageReceived -= ShowReceiveMsg; //加载回调函数 communicator.MessageReceived += ShowReceiveMsg; } catch (Exception ex) { // 记录错误信息 Debug.WriteLine($"错误: {ex.Message}"); } } /// /// 通讯回调运行 /// /// /// private void ShowReceiveMsg(string strReceiveMsg) { // 如果当前不是 UI 线程,则通过 Invoke 将操作调度到 UI 线程 if (this.InvokeRequired) { this.Invoke(new Action((msg) => { // 更新 UI 控件,比如显示接收到的消息 this.txtReceiveMsg.AppendText(("[接收]" + DateTime.Now.ToString() + ":" + msg)); this.txtReceiveMsg.AppendText("\r\n"); this.txtReceiveMsg.SelectionStart = this.txtReceiveMsg.Text.Length; this.txtReceiveMsg.ScrollToCaret(); }), strReceiveMsg); } else { // 如果已经在 UI 线程上,直接更新 UI this.txtReceiveMsg.AppendText(("[接收]" + DateTime.Now.ToString() + ":" + strReceiveMsg)); this.txtReceiveMsg.AppendText("\r\n"); this.txtReceiveMsg.SelectionStart = this.txtReceiveMsg.Text.Length; this.txtReceiveMsg.ScrollToCaret(); } } private void ShowSendMsg(string strSendMsg) { // 如果当前不是 UI 线程,则通过 Invoke 将操作调度到 UI 线程 if (this.InvokeRequired) { this.Invoke(new Action((msg) => { // 更新 UI 控件,比如显示接收到的消息 this.txtReceiveMsg.AppendText(("[发送]" + DateTime.Now.ToString() + ":" + msg)); this.txtReceiveMsg.AppendText("\r\n"); this.txtReceiveMsg.SelectionStart = this.txtReceiveMsg.Text.Length; this.txtReceiveMsg.ScrollToCaret(); }), strSendMsg); } else { // 如果已经在 UI 线程上,直接更新 UI this.txtReceiveMsg.AppendText(("[发送]" + DateTime.Now.ToString() + ":" + strSendMsg)); this.txtReceiveMsg.AppendText("\r\n"); this.txtReceiveMsg.SelectionStart = this.txtReceiveMsg.Text.Length; this.txtReceiveMsg.ScrollToCaret(); } } private void ShowLogMsg(string msg) { // 如果当前不是 UI 线程,则通过 Invoke 将操作调度到 UI 线程 if (this.InvokeRequired) { this.Invoke(new Action((message) => { this.txtReceiveMsg.AppendText("[" + DateTime.Now.ToString("HH:mm:ss.fff") + "] " + message + "\r\n"); this.txtReceiveMsg.ScrollToCaret(); }), msg); } else { this.txtReceiveMsg.AppendText("[" + DateTime.Now.ToString("HH:mm:ss.fff") + "] " + msg + "\r\n"); this.txtReceiveMsg.ScrollToCaret(); } } private void btnSend_Click(object sender, EventArgs e) { if (communicator == null) { return; } if (communicator.SendMessage(txtSendMsg.Text)) { ShowSendMsg(txtSendMsg.Text); } else { ShowLogMsg(communicator.Msg); } } private void btnRuleSend_Click(object sender, EventArgs e) { if (communicator == null) { return; } string SendMsg = txtSendMsg.Text; //byte[] HexByte = BaseCommunicator.strToHexByte(SendMsg); byte[] HexByte = SendMsg.Split(' ', StringSplitOptions.RemoveEmptyEntries) .Select(hex => Convert.ToByte(hex, 16)) .ToArray(); ushort crcHexByte = BaseCommunicator.CRC16Calculate(HexByte, HexByte.Length); string crcString = crcHexByte.ToString("X4"); crcString = crcString.Insert(2, " "); HexByte = BaseCommunicator.strToHexByte(SendMsg + " " + crcString); if (communicator.SendMessage(HexByte)) { ShowSendMsg(SendMsg + " " + crcString); } else { ShowLogMsg(communicator.Msg); } } private void txtAddress_TextChanged(object sender, EventArgs e) { if (communicator != null) { communicator.CommunicatorConnections.Add("变量地址", txtAddress.Text); communicatorChanged(communicator); } } } }