| | |
| | | lblType = new Label(); |
| | | lblAddress = new Label(); |
| | | lblIP = new Label(); |
| | | cmbDataType = new ComboBox(); |
| | | lblDataType = new Label(); |
| | | tableLayoutPanel2 = new TableLayoutPanel(); |
| | | btnRuleSend = new Button(); |
| | | btnSend = new Button(); |
| | |
| | | label3.AutoSize = true; |
| | | label3.Dock = DockStyle.Fill; |
| | | label3.ForeColor = Color.CornflowerBlue; |
| | | label3.Location = new Point(3, 100); |
| | | label3.Location = new Point(4, 125); |
| | | label3.Margin = new Padding(4, 0, 4, 0); |
| | | label3.Name = "label3"; |
| | | label3.Size = new Size(655, 20); |
| | | label3.Size = new Size(819, 25); |
| | | label3.TabIndex = 18; |
| | | label3.Text = "发送信息"; |
| | | label3.TextAlign = ContentAlignment.BottomLeft; |
| | |
| | | tableLayoutPanel1.Controls.Add(label3, 0, 1); |
| | | tableLayoutPanel1.Dock = DockStyle.Fill; |
| | | tableLayoutPanel1.Location = new Point(0, 0); |
| | | tableLayoutPanel1.Margin = new Padding(4, 4, 4, 4); |
| | | tableLayoutPanel1.Name = "tableLayoutPanel1"; |
| | | tableLayoutPanel1.RowCount = 5; |
| | | tableLayoutPanel1.RowStyles.Add(new RowStyle(SizeType.Absolute, 100F)); |
| | | tableLayoutPanel1.RowStyles.Add(new RowStyle(SizeType.Absolute, 20F)); |
| | | tableLayoutPanel1.RowStyles.Add(new RowStyle(SizeType.Absolute, 30F)); |
| | | tableLayoutPanel1.RowStyles.Add(new RowStyle(SizeType.Absolute, 40F)); |
| | | tableLayoutPanel1.RowStyles.Add(new RowStyle(SizeType.Absolute, 125F)); |
| | | tableLayoutPanel1.RowStyles.Add(new RowStyle(SizeType.Absolute, 25F)); |
| | | tableLayoutPanel1.RowStyles.Add(new RowStyle(SizeType.Absolute, 38F)); |
| | | tableLayoutPanel1.RowStyles.Add(new RowStyle(SizeType.Absolute, 50F)); |
| | | tableLayoutPanel1.RowStyles.Add(new RowStyle(SizeType.Percent, 100F)); |
| | | tableLayoutPanel1.Size = new Size(661, 322); |
| | | tableLayoutPanel1.Size = new Size(827, 402); |
| | | tableLayoutPanel1.TabIndex = 26; |
| | | // |
| | | // grpReceive |
| | |
| | | grpReceive.Controls.Add(txtReceiveMsg); |
| | | grpReceive.Dock = DockStyle.Fill; |
| | | grpReceive.ForeColor = Color.CornflowerBlue; |
| | | grpReceive.Location = new Point(3, 193); |
| | | grpReceive.Location = new Point(4, 242); |
| | | grpReceive.Margin = new Padding(4, 4, 4, 4); |
| | | grpReceive.Name = "grpReceive"; |
| | | grpReceive.Size = new Size(655, 126); |
| | | grpReceive.Padding = new Padding(4, 4, 4, 4); |
| | | grpReceive.Size = new Size(819, 156); |
| | | grpReceive.TabIndex = 30; |
| | | grpReceive.TabStop = false; |
| | | grpReceive.Text = "通讯记录"; |
| | |
| | | // txtReceiveMsg |
| | | // |
| | | txtReceiveMsg.Dock = DockStyle.Fill; |
| | | txtReceiveMsg.Location = new Point(3, 17); |
| | | txtReceiveMsg.Location = new Point(4, 21); |
| | | txtReceiveMsg.Margin = new Padding(4, 4, 4, 4); |
| | | txtReceiveMsg.Multiline = true; |
| | | txtReceiveMsg.Name = "txtReceiveMsg"; |
| | | txtReceiveMsg.ReadOnly = true; |
| | | txtReceiveMsg.ScrollBars = ScrollBars.Both; |
| | | txtReceiveMsg.Size = new Size(649, 106); |
| | | txtReceiveMsg.Size = new Size(811, 131); |
| | | txtReceiveMsg.TabIndex = 0; |
| | | // |
| | | // txtSendMsg |
| | | // |
| | | txtSendMsg.Dock = DockStyle.Fill; |
| | | txtSendMsg.Location = new Point(3, 123); |
| | | txtSendMsg.Location = new Point(4, 154); |
| | | txtSendMsg.Margin = new Padding(4, 4, 4, 4); |
| | | txtSendMsg.Name = "txtSendMsg"; |
| | | txtSendMsg.Size = new Size(655, 21); |
| | | txtSendMsg.Size = new Size(819, 24); |
| | | txtSendMsg.TabIndex = 29; |
| | | // |
| | | // grpSetting |
| | |
| | | grpSetting.Controls.Add(lblType); |
| | | grpSetting.Controls.Add(lblAddress); |
| | | grpSetting.Controls.Add(lblIP); |
| | | grpSetting.Controls.Add(cmbDataType); |
| | | grpSetting.Controls.Add(lblDataType); |
| | | grpSetting.Dock = DockStyle.Fill; |
| | | grpSetting.ForeColor = Color.CornflowerBlue; |
| | | grpSetting.Location = new Point(3, 3); |
| | | grpSetting.MinimumSize = new Size(261, 61); |
| | | grpSetting.Location = new Point(4, 4); |
| | | grpSetting.Margin = new Padding(4, 4, 4, 4); |
| | | grpSetting.MinimumSize = new Size(326, 76); |
| | | grpSetting.Name = "grpSetting"; |
| | | grpSetting.Size = new Size(655, 94); |
| | | grpSetting.Padding = new Padding(4, 4, 4, 4); |
| | | grpSetting.Size = new Size(819, 117); |
| | | grpSetting.TabIndex = 28; |
| | | grpSetting.TabStop = false; |
| | | grpSetting.Text = "通讯配置"; |
| | | // |
| | | // txtAddress |
| | | // |
| | | txtAddress.Location = new Point(251, 60); |
| | | txtAddress.Location = new Point(314, 75); |
| | | txtAddress.Margin = new Padding(4, 4, 4, 4); |
| | | txtAddress.Name = "txtAddress"; |
| | | txtAddress.Size = new Size(100, 21); |
| | | txtAddress.Size = new Size(124, 24); |
| | | txtAddress.TabIndex = 9; |
| | | txtAddress.TextChanged += txtAddress_TextChanged; |
| | | // |
| | |
| | | // |
| | | cmbType.DropDownStyle = ComboBoxStyle.DropDownList; |
| | | cmbType.FormattingEnabled = true; |
| | | cmbType.Location = new Point(251, 23); |
| | | cmbType.Location = new Point(314, 29); |
| | | cmbType.Margin = new Padding(4, 4, 4, 4); |
| | | cmbType.Name = "cmbType"; |
| | | cmbType.Size = new Size(100, 23); |
| | | cmbType.Size = new Size(124, 26); |
| | | cmbType.TabIndex = 8; |
| | | // |
| | | // txtIP |
| | | // |
| | | txtIP.Location = new Point(79, 22); |
| | | txtIP.Location = new Point(99, 28); |
| | | txtIP.Margin = new Padding(4, 4, 4, 4); |
| | | txtIP.Name = "txtIP"; |
| | | txtIP.Size = new Size(100, 21); |
| | | txtIP.Size = new Size(124, 24); |
| | | txtIP.TabIndex = 7; |
| | | // |
| | | // txtPort |
| | | // |
| | | txtPort.Location = new Point(79, 60); |
| | | txtPort.Location = new Point(99, 75); |
| | | txtPort.Margin = new Padding(4, 4, 4, 4); |
| | | txtPort.Name = "txtPort"; |
| | | txtPort.Size = new Size(100, 21); |
| | | txtPort.Size = new Size(124, 24); |
| | | txtPort.TabIndex = 6; |
| | | // |
| | | // lblPort |
| | | // |
| | | lblPort.AutoSize = true; |
| | | lblPort.Location = new Point(13, 63); |
| | | lblPort.Location = new Point(16, 79); |
| | | lblPort.Margin = new Padding(4, 0, 4, 0); |
| | | lblPort.Name = "lblPort"; |
| | | lblPort.Size = new Size(31, 15); |
| | | lblPort.Size = new Size(38, 18); |
| | | lblPort.TabIndex = 4; |
| | | lblPort.Text = "端口"; |
| | | // |
| | | // cmbIP |
| | | // |
| | | cmbIP.FormattingEnabled = true; |
| | | cmbIP.Location = new Point(79, 21); |
| | | cmbIP.Location = new Point(99, 26); |
| | | cmbIP.Margin = new Padding(4, 4, 4, 4); |
| | | cmbIP.Name = "cmbIP"; |
| | | cmbIP.Size = new Size(100, 23); |
| | | cmbIP.Size = new Size(124, 26); |
| | | cmbIP.TabIndex = 1; |
| | | // |
| | | // lblType |
| | | // |
| | | lblType.AutoSize = true; |
| | | lblType.Location = new Point(205, 26); |
| | | lblType.Location = new Point(256, 32); |
| | | lblType.Margin = new Padding(4, 0, 4, 0); |
| | | lblType.Name = "lblType"; |
| | | lblType.Size = new Size(31, 15); |
| | | lblType.Size = new Size(38, 18); |
| | | lblType.TabIndex = 0; |
| | | lblType.Text = "型号"; |
| | | // |
| | | // lblAddress |
| | | // |
| | | lblAddress.AutoSize = true; |
| | | lblAddress.Location = new Point(205, 63); |
| | | lblAddress.Location = new Point(256, 79); |
| | | lblAddress.Margin = new Padding(4, 0, 4, 0); |
| | | lblAddress.Name = "lblAddress"; |
| | | lblAddress.Size = new Size(31, 15); |
| | | lblAddress.Size = new Size(38, 18); |
| | | lblAddress.TabIndex = 0; |
| | | lblAddress.Text = "地址"; |
| | | // |
| | | // lblIP |
| | | // |
| | | lblIP.AutoSize = true; |
| | | lblIP.Location = new Point(13, 26); |
| | | lblIP.Location = new Point(16, 32); |
| | | lblIP.Margin = new Padding(4, 0, 4, 0); |
| | | lblIP.Name = "lblIP"; |
| | | lblIP.Size = new Size(31, 15); |
| | | lblIP.Size = new Size(38, 18); |
| | | lblIP.TabIndex = 0; |
| | | lblIP.Text = "地址"; |
| | | // |
| | | // cmbDataType |
| | | // |
| | | cmbDataType.DropDownStyle = ComboBoxStyle.DropDownList; |
| | | cmbDataType.FormattingEnabled = true; |
| | | cmbDataType.Location = new Point(525, 75); |
| | | cmbDataType.Margin = new Padding(4, 4, 4, 4); |
| | | cmbDataType.Name = "cmbDataType"; |
| | | cmbDataType.Size = new Size(124, 26); |
| | | cmbDataType.TabIndex = 11; |
| | | cmbDataType.SelectedIndexChanged += cmbDataType_SelectedIndexChanged; |
| | | // |
| | | // lblDataType |
| | | // |
| | | lblDataType.AutoSize = true; |
| | | lblDataType.Location = new Point(462, 79); |
| | | lblDataType.Margin = new Padding(4, 0, 4, 0); |
| | | lblDataType.Name = "lblDataType"; |
| | | lblDataType.Size = new Size(38, 18); |
| | | lblDataType.TabIndex = 10; |
| | | lblDataType.Text = "类型"; |
| | | // |
| | | // tableLayoutPanel2 |
| | | // |
| | | tableLayoutPanel2.ColumnCount = 3; |
| | | tableLayoutPanel2.ColumnStyles.Add(new ColumnStyle(SizeType.Absolute, 80F)); |
| | | tableLayoutPanel2.ColumnStyles.Add(new ColumnStyle(SizeType.Absolute, 80F)); |
| | | tableLayoutPanel2.ColumnStyles.Add(new ColumnStyle(SizeType.Absolute, 100F)); |
| | | tableLayoutPanel2.ColumnStyles.Add(new ColumnStyle(SizeType.Absolute, 100F)); |
| | | tableLayoutPanel2.ColumnStyles.Add(new ColumnStyle(SizeType.Percent, 100F)); |
| | | tableLayoutPanel2.Controls.Add(btnRuleSend, 1, 0); |
| | | tableLayoutPanel2.Controls.Add(btnSend, 0, 0); |
| | | tableLayoutPanel2.Dock = DockStyle.Fill; |
| | | tableLayoutPanel2.Location = new Point(3, 153); |
| | | tableLayoutPanel2.Location = new Point(4, 192); |
| | | tableLayoutPanel2.Margin = new Padding(4, 4, 4, 4); |
| | | tableLayoutPanel2.Name = "tableLayoutPanel2"; |
| | | tableLayoutPanel2.RowCount = 1; |
| | | tableLayoutPanel2.RowStyles.Add(new RowStyle(SizeType.Percent, 100F)); |
| | | tableLayoutPanel2.Size = new Size(655, 34); |
| | | tableLayoutPanel2.Size = new Size(819, 42); |
| | | tableLayoutPanel2.TabIndex = 27; |
| | | // |
| | | // btnRuleSend |
| | | // |
| | | btnRuleSend.Dock = DockStyle.Fill; |
| | | btnRuleSend.ForeColor = Color.CornflowerBlue; |
| | | btnRuleSend.Location = new Point(83, 3); |
| | | btnRuleSend.Location = new Point(104, 4); |
| | | btnRuleSend.Margin = new Padding(4, 4, 4, 4); |
| | | btnRuleSend.Name = "btnRuleSend"; |
| | | btnRuleSend.Size = new Size(74, 28); |
| | | btnRuleSend.Size = new Size(92, 34); |
| | | btnRuleSend.TabIndex = 14; |
| | | btnRuleSend.Text = "校验发送"; |
| | | btnRuleSend.UseVisualStyleBackColor = true; |
| | |
| | | // |
| | | btnSend.Dock = DockStyle.Fill; |
| | | btnSend.ForeColor = Color.CornflowerBlue; |
| | | btnSend.Location = new Point(3, 3); |
| | | btnSend.Location = new Point(4, 4); |
| | | btnSend.Margin = new Padding(4, 4, 4, 4); |
| | | btnSend.Name = "btnSend"; |
| | | btnSend.Size = new Size(74, 28); |
| | | btnSend.Size = new Size(92, 34); |
| | | btnSend.TabIndex = 12; |
| | | btnSend.Text = "发送"; |
| | | btnSend.UseVisualStyleBackColor = true; |
| | |
| | | themeForm_Communicator.Font = new Font("Microsoft Sans Serif", 9F); |
| | | themeForm_Communicator.Image = (Image)resources.GetObject("themeForm_Communicator.Image"); |
| | | themeForm_Communicator.Location = new Point(0, 0); |
| | | themeForm_Communicator.Margin = new Padding(4, 4, 4, 4); |
| | | themeForm_Communicator.Name = "themeForm_Communicator"; |
| | | themeForm_Communicator.Padding = new Padding(10, 70, 10, 9); |
| | | themeForm_Communicator.Padding = new Padding(12, 88, 12, 11); |
| | | themeForm_Communicator.RoundCorners = true; |
| | | themeForm_Communicator.Sizable = true; |
| | | themeForm_Communicator.Size = new Size(681, 401); |
| | | themeForm_Communicator.Size = new Size(851, 501); |
| | | themeForm_Communicator.SmartBounds = true; |
| | | themeForm_Communicator.StartPosition = FormStartPosition.WindowsDefaultLocation; |
| | | themeForm_Communicator.TabIndex = 27; |
| | |
| | | controlBox1.EnableMaximizeButton = true; |
| | | controlBox1.EnableMinimizeButton = true; |
| | | controlBox1.ForeColor = Color.FromArgb(155, 155, 155); |
| | | controlBox1.Location = new Point(581, 18); |
| | | controlBox1.Location = new Point(726, 22); |
| | | controlBox1.Margin = new Padding(4, 4, 4, 4); |
| | | controlBox1.MaximizeHoverColor = Color.FromArgb(74, 74, 74); |
| | | controlBox1.MinimizeHoverColor = Color.FromArgb(63, 63, 65); |
| | | controlBox1.Name = "controlBox1"; |
| | |
| | | // |
| | | panel_CommunicatorForm.Controls.Add(tableLayoutPanel1); |
| | | panel_CommunicatorForm.Dock = DockStyle.Fill; |
| | | panel_CommunicatorForm.Location = new Point(10, 70); |
| | | panel_CommunicatorForm.Location = new Point(12, 88); |
| | | panel_CommunicatorForm.Margin = new Padding(4, 4, 4, 4); |
| | | panel_CommunicatorForm.Name = "panel_CommunicatorForm"; |
| | | panel_CommunicatorForm.Size = new Size(661, 322); |
| | | panel_CommunicatorForm.Size = new Size(827, 402); |
| | | panel_CommunicatorForm.TabIndex = 27; |
| | | // |
| | | // CommunicatorForm |
| | | // |
| | | AutoScaleDimensions = new SizeF(96F, 96F); |
| | | AutoScaleDimensions = new SizeF(120F, 120F); |
| | | AutoScaleMode = AutoScaleMode.Dpi; |
| | | ClientSize = new Size(681, 401); |
| | | ClientSize = new Size(851, 501); |
| | | Controls.Add(themeForm_Communicator); |
| | | FormBorderStyle = FormBorderStyle.None; |
| | | MinimumSize = new Size(261, 61); |
| | | Margin = new Padding(4, 4, 4, 4); |
| | | MinimumSize = new Size(326, 76); |
| | | Name = "CommunicatorForm"; |
| | | Text = "通讯设置"; |
| | | TransparencyKey = Color.Fuchsia; |
| | |
| | | private ComboBox cmbType; |
| | | private Label lblAddress; |
| | | private TextBox txtAddress; |
| | | private Label lblDataType; |
| | | private ComboBox cmbDataType; |
| | | } |
| | | } |
| | |
| | | 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; |
| | |
| | | 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.SelectedText = communicator.CommunicatorConnections["端口"]?.ToString(); |
| | | txtPort.Text = communicator.CommunicatorConnections["端口"]?.ToString(); |
| | | txtIP.Visible = true; |
| | | cmbIP.Visible = false; |
| | | |
| | |
| | | lblAddress.Visible = false; |
| | | cmbType.Visible = false; |
| | | txtAddress.Visible = false; |
| | | lblDataType.Visible = false; |
| | | cmbDataType.Visible = false; |
| | | |
| | | lblIP.Text = "地址"; |
| | | lblPort.Text = "端口"; |
| | |
| | | { |
| | | 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; |
| | |
| | | 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(); |
| | |
| | | } |
| | | } |
| | | |
| | | private void ShowLogMsg(string msg) |
| | | { |
| | | // 如果当前不是 UI 线程,则通过 Invoke 将操作调度到 UI 线程 |
| | | if (this.InvokeRequired) |
| | | { |
| | | this.Invoke(new Action<string>((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) |
| | |
| | | |
| | | if (communicator.SendMessage(txtSendMsg.Text)) |
| | | ShowSendMsg(txtSendMsg.Text); |
| | | else |
| | | ShowLogMsg(communicator.Msg); |
| | | } |
| | | |
| | | private void btnRuleSend_Click(object sender, EventArgs e) |
| | |
| | | |
| | | if (communicator.SendMessage(SendMsg)) |
| | | ShowSendMsg(SendMsg); |
| | | else |
| | | ShowLogMsg(communicator.Msg); |
| | | } |
| | | |
| | | private void txtAddress_TextChanged(object sender, EventArgs e) |
| | | { |
| | | if (communicator != null && !communicator.CommunicatorConnections.Contains("变量地址")) |
| | | if (communicator != null) |
| | | { |
| | | communicator.CommunicatorConnections.Add("变量地址", txtAddress.Text); |
| | | } |
| | | else if (communicator != null) |
| | | { |
| | | communicator.CommunicatorConnections["变量地址"] = txtAddress.Text; |
| | | communicatorChanged(communicator); |
| | | } |
| | | } |
| | |
| | | if (string.IsNullOrEmpty(ClassName) || string.IsNullOrEmpty(IP) || string.IsNullOrEmpty(PORT)) |
| | | return; |
| | | |
| | | string CommunicatorConnectionString = $"({ClassName}){IP}:{PORT}"; |
| | | 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(); |
| | |
| | | if (string.IsNullOrEmpty(ClassName) || string.IsNullOrEmpty(IP) || string.IsNullOrEmpty(PORT)) |
| | | return; |
| | | |
| | | string CommunicatorConnectionString = $"({ClassName}){IP}:{PORT}"; |
| | | string DataType = communicator.CommunicatorConnections.Contains("数据类型") ? |
| | | communicator.CommunicatorConnections["数据类型"].ToString() : "String"; |
| | | string CommunicatorConnectionString = $"({ClassName}){IP}:{PORT} [{DataType}]"; |
| | | |
| | | GlobalVar.dicCommunicators.TryAdd(Name, communicator); |
| | | communicator.CommunicatorName = Name; |
| | |
| | | |
| | | private void CommunicatorFForm_CommunicatorChanged(BaseCommunicator communicator) |
| | | { |
| | | if (this.InvokeRequired) |
| | | { |
| | | this.Invoke(new Action<BaseCommunicator>(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; |
| | | } |
| | | } |
| | | } |
| | | |
| | | // 移除通讯口 |
| | |
| | | if (!string.IsNullOrEmpty(CommunicatorAddress) && CommunicatorAddress.Contains("SiemensLBS7")) |
| | | { |
| | | // 定义正则表达式以提取协议、IP 地址和端口 |
| | | //1. \((.*?)\):\(和 \) 是用于匹配括号的转义字符。 |
| | | // (.*?) 是一个非贪婪的匹配,用来匹配类名(MyProcesses.Communicators.TCPServer 或 MyProcesses.Communicators.UARTPort)。 |
| | | //2. ([^:] +):匹配冒号之前的部分,即地址(127.0.0.1 或 COM5)。这里使用了[^:] 来匹配除了冒号之外的任意字符。 |
| | | //3. (\d +) :匹配端口号,确保它匹配一个或多个数字。 |
| | | |
| | | string pattern = @"^\((?<ClassName>[^)]+)\)\[(?<IP>[^]]+)\]\[(?<Slot>[^]]+)\]\[(?<CpuType>[^]]+)\]\[(?<PlcAddress>[^]]+)\]$"; |
| | | // 更新正则以支持可选的数据类型字段 |
| | | string pattern = @"^\((?<ClassName>[^)]+)\)\[(?<IP>[^]]+)\]\[(?<Slot>[^]]+)\]\[(?<CpuType>[^]]+)\]\[(?<PlcAddress>[^]]+)\](?:\[(?<DataType>[^]]+)\])?$"; |
| | | Match match = Regex.Match(CommunicatorAddress, pattern); |
| | | |
| | | if (match.Success) |
| | |
| | | string Slot = match.Groups["Slot"].Value; // "1111" |
| | | string CpuType= match.Groups["CpuType"].Value; |
| | | string PlcAddress = match.Groups["PlcAddress"].Value; |
| | | string DataType = match.Groups["DataType"].Success ? match.Groups["DataType"].Value : "String"; |
| | | |
| | | if (string.IsNullOrEmpty(ClassName) || string.IsNullOrEmpty(IP) || string.IsNullOrEmpty(Slot) || string.IsNullOrEmpty(CpuType) || string.IsNullOrEmpty(PlcAddress)) |
| | | break; |
| | | |
| | |
| | | Communicator.CommunicatorConnections.Add("端口", Slot); |
| | | Communicator.CommunicatorConnections.Add("型号", CpuType); |
| | | Communicator.CommunicatorConnections.Add("变量地址", PlcAddress); |
| | | Communicator.CommunicatorConnections.Add("数据类型", DataType); |
| | | Communicator.CommunicatorName = CommunicatorName; |
| | | if (!Communicator.Connect()) |
| | | { |
| | |
| | | { |
| | | string CpuType = item.Value.CommunicatorConnections["型号"].ToString(); |
| | | string PlcAddress = item.Value.CommunicatorConnections["变量地址"].ToString(); |
| | | string DataType = item.Value.CommunicatorConnections.Contains("数据类型") ? |
| | | item.Value.CommunicatorConnections["数据类型"].ToString() : "String"; |
| | | |
| | | if (string.IsNullOrEmpty(ClassName) || string.IsNullOrEmpty(IP) || string.IsNullOrEmpty(PORT) || string.IsNullOrEmpty(CpuType) || string.IsNullOrEmpty(PlcAddress)) |
| | | { |
| | | break; |
| | | } |
| | | string CommunicatorConnectionString = $"({ClassName})[{IP}][{PORT}][{CpuType}][{PlcAddress}]"; |
| | | string CommunicatorConnectionString = $"({ClassName})[{IP}][{PORT}][{CpuType}][{PlcAddress}][{DataType}]"; |
| | | GlobalVar.allCommunicatorsConnectionString.TryAdd(item.Key, CommunicatorConnectionString); |
| | | } |
| | | else |
| | |
| | | btnConnect = new Button(); |
| | | cmbIP = new ComboBox(); |
| | | lblIP = new Label(); |
| | | lblDataType = new Label(); |
| | | cmbDataType = new ComboBox(); |
| | | grpReceive = new GroupBox(); |
| | | txtReceiveMsg = new TextBox(); |
| | | txtSendMsg = new TextBox(); |
| | | btnSend = new Button(); |
| | | grpTest = new GroupBox(); |
| | | lblCom = new Label(); |
| | | txtAddress = new TextBox(); |
| | | ckbRuleCheck = new CheckBox(); |
| | | cmbCom = new ComboBox(); |
| | | cmbType = new ComboBox(); |
| | | lblType = new Label(); |
| | | btnRun = new Button(); |
| | | lblAddress = new Label(); |
| | | lblMsg = new Label(); |
| | | txtMsg = new TextBox(); |
| | | btnRuleSend = new Button(); |
| | | label6 = new Label(); |
| | | themeForm1 = new ReaLTaiizor.Forms.ThemeForm(); |
| | | controlBox1 = new ReaLTaiizor.Controls.ControlBox(); |
| | | lblAddress = new Label(); |
| | | txtAddress = new TextBox(); |
| | | grpSetting.SuspendLayout(); |
| | | grpReceive.SuspendLayout(); |
| | | grpTest.SuspendLayout(); |
| | |
| | | grpSetting.Controls.Add(cmbIP); |
| | | grpSetting.Controls.Add(lblIP); |
| | | grpSetting.ForeColor = SystemColors.Control; |
| | | grpSetting.Location = new Point(18, 74); |
| | | grpSetting.Location = new Point(22, 92); |
| | | grpSetting.Margin = new Padding(4); |
| | | grpSetting.Name = "grpSetting"; |
| | | grpSetting.Size = new Size(200, 146); |
| | | grpSetting.Padding = new Padding(4); |
| | | grpSetting.Size = new Size(250, 262); |
| | | grpSetting.TabIndex = 0; |
| | | grpSetting.TabStop = false; |
| | | grpSetting.Text = "通讯配置"; |
| | | // |
| | | // txtIP |
| | | // |
| | | txtIP.Location = new Point(83, 32); |
| | | txtIP.Location = new Point(104, 40); |
| | | txtIP.Margin = new Padding(4); |
| | | txtIP.Name = "txtIP"; |
| | | txtIP.Size = new Size(100, 23); |
| | | txtIP.Size = new Size(124, 27); |
| | | txtIP.TabIndex = 7; |
| | | // |
| | | // txtPort |
| | | // |
| | | txtPort.Location = new Point(83, 70); |
| | | txtPort.Location = new Point(104, 88); |
| | | txtPort.Margin = new Padding(4); |
| | | txtPort.Name = "txtPort"; |
| | | txtPort.Size = new Size(100, 23); |
| | | txtPort.Size = new Size(124, 27); |
| | | txtPort.TabIndex = 6; |
| | | // |
| | | // lblPort |
| | | // |
| | | lblPort.AutoSize = true; |
| | | lblPort.Location = new Point(17, 73); |
| | | lblPort.Location = new Point(21, 91); |
| | | lblPort.Margin = new Padding(4, 0, 4, 0); |
| | | lblPort.Name = "lblPort"; |
| | | lblPort.Size = new Size(32, 17); |
| | | lblPort.Size = new Size(39, 20); |
| | | lblPort.TabIndex = 4; |
| | | lblPort.Text = "端口"; |
| | | // |
| | | // btnDisconnect |
| | | // |
| | | btnDisconnect.ForeColor = SystemColors.Control; |
| | | btnDisconnect.Location = new Point(118, 109); |
| | | btnDisconnect.Location = new Point(148, 136); |
| | | btnDisconnect.Margin = new Padding(4); |
| | | btnDisconnect.Name = "btnDisconnect"; |
| | | btnDisconnect.Size = new Size(75, 23); |
| | | btnDisconnect.Size = new Size(94, 29); |
| | | btnDisconnect.TabIndex = 3; |
| | | btnDisconnect.Text = "断开"; |
| | | btnDisconnect.UseVisualStyleBackColor = true; |
| | |
| | | // btnConnect |
| | | // |
| | | btnConnect.ForeColor = SystemColors.Control; |
| | | btnConnect.Location = new Point(14, 109); |
| | | btnConnect.Location = new Point(18, 136); |
| | | btnConnect.Margin = new Padding(4); |
| | | btnConnect.Name = "btnConnect"; |
| | | btnConnect.Size = new Size(75, 23); |
| | | btnConnect.Size = new Size(94, 29); |
| | | btnConnect.TabIndex = 2; |
| | | btnConnect.Text = "连接"; |
| | | btnConnect.UseVisualStyleBackColor = true; |
| | |
| | | // cmbIP |
| | | // |
| | | cmbIP.FormattingEnabled = true; |
| | | cmbIP.Location = new Point(83, 31); |
| | | cmbIP.Location = new Point(104, 39); |
| | | cmbIP.Margin = new Padding(4); |
| | | cmbIP.Name = "cmbIP"; |
| | | cmbIP.Size = new Size(100, 25); |
| | | cmbIP.Size = new Size(124, 28); |
| | | cmbIP.TabIndex = 1; |
| | | cmbIP.Click += cmbIP_Click; |
| | | cmbIP.MouseClick += cmbIP_MouseClick; |
| | |
| | | // lblIP |
| | | // |
| | | lblIP.AutoSize = true; |
| | | lblIP.Location = new Point(17, 36); |
| | | lblIP.Location = new Point(21, 45); |
| | | lblIP.Margin = new Padding(4, 0, 4, 0); |
| | | lblIP.Name = "lblIP"; |
| | | lblIP.Size = new Size(32, 17); |
| | | lblIP.Size = new Size(39, 20); |
| | | lblIP.TabIndex = 0; |
| | | lblIP.Text = "地址"; |
| | | // |
| | | // lblDataType |
| | | // |
| | | lblDataType.AutoSize = true; |
| | | lblDataType.Location = new Point(206, 145); |
| | | lblDataType.Margin = new Padding(4, 0, 4, 0); |
| | | lblDataType.Name = "lblDataType"; |
| | | lblDataType.Size = new Size(39, 20); |
| | | lblDataType.TabIndex = 8; |
| | | lblDataType.Text = "类型"; |
| | | // |
| | | // cmbDataType |
| | | // |
| | | cmbDataType.FormattingEnabled = true; |
| | | cmbDataType.Location = new Point(255, 140); |
| | | cmbDataType.Margin = new Padding(4); |
| | | cmbDataType.Name = "cmbDataType"; |
| | | cmbDataType.Size = new Size(94, 28); |
| | | cmbDataType.TabIndex = 9; |
| | | // |
| | | // grpReceive |
| | | // |
| | | grpReceive.Controls.Add(txtReceiveMsg); |
| | | grpReceive.ForeColor = SystemColors.Control; |
| | | grpReceive.Location = new Point(18, 311); |
| | | grpReceive.Location = new Point(22, 389); |
| | | grpReceive.Margin = new Padding(4); |
| | | grpReceive.Name = "grpReceive"; |
| | | grpReceive.Size = new Size(543, 174); |
| | | grpReceive.Padding = new Padding(4); |
| | | grpReceive.Size = new Size(679, 218); |
| | | grpReceive.TabIndex = 5; |
| | | grpReceive.TabStop = false; |
| | | grpReceive.Text = "通讯记录"; |
| | |
| | | // txtReceiveMsg |
| | | // |
| | | txtReceiveMsg.Dock = DockStyle.Fill; |
| | | txtReceiveMsg.Location = new Point(3, 19); |
| | | txtReceiveMsg.Location = new Point(4, 24); |
| | | txtReceiveMsg.Margin = new Padding(4); |
| | | txtReceiveMsg.Multiline = true; |
| | | txtReceiveMsg.Name = "txtReceiveMsg"; |
| | | txtReceiveMsg.ReadOnly = true; |
| | | txtReceiveMsg.ScrollBars = ScrollBars.Both; |
| | | txtReceiveMsg.Size = new Size(537, 152); |
| | | txtReceiveMsg.Size = new Size(671, 190); |
| | | txtReceiveMsg.TabIndex = 0; |
| | | // |
| | | // txtSendMsg |
| | | // |
| | | txtSendMsg.ForeColor = SystemColors.WindowText; |
| | | txtSendMsg.Location = new Point(18, 249); |
| | | txtSendMsg.Location = new Point(26, 311); |
| | | txtSendMsg.Margin = new Padding(4); |
| | | txtSendMsg.Name = "txtSendMsg"; |
| | | txtSendMsg.Size = new Size(543, 23); |
| | | txtSendMsg.Size = new Size(238, 27); |
| | | txtSendMsg.TabIndex = 10; |
| | | // |
| | | // btnSend |
| | | // |
| | | btnSend.ForeColor = SystemColors.WindowText; |
| | | btnSend.Location = new Point(18, 282); |
| | | btnSend.Location = new Point(22, 352); |
| | | btnSend.Margin = new Padding(4); |
| | | btnSend.Name = "btnSend"; |
| | | btnSend.Size = new Size(75, 23); |
| | | btnSend.Size = new Size(94, 29); |
| | | btnSend.TabIndex = 11; |
| | | btnSend.Text = "发送"; |
| | | btnSend.UseVisualStyleBackColor = true; |
| | |
| | | grpTest.Controls.Add(lblAddress); |
| | | grpTest.Controls.Add(lblMsg); |
| | | grpTest.Controls.Add(txtMsg); |
| | | grpTest.Controls.Add(lblDataType); |
| | | grpTest.Controls.Add(cmbDataType); |
| | | grpTest.ForeColor = SystemColors.Control; |
| | | grpTest.Location = new Point(241, 74); |
| | | grpTest.Location = new Point(301, 92); |
| | | grpTest.Margin = new Padding(4); |
| | | grpTest.Name = "grpTest"; |
| | | grpTest.Size = new Size(320, 146); |
| | | grpTest.Padding = new Padding(4); |
| | | grpTest.Size = new Size(400, 262); |
| | | grpTest.TabIndex = 12; |
| | | grpTest.TabStop = false; |
| | | grpTest.Text = "通讯测试"; |
| | |
| | | // lblCom |
| | | // |
| | | lblCom.AutoSize = true; |
| | | lblCom.Location = new Point(165, 40); |
| | | lblCom.Location = new Point(206, 50); |
| | | lblCom.Margin = new Padding(4, 0, 4, 0); |
| | | lblCom.Name = "lblCom"; |
| | | lblCom.Size = new Size(32, 17); |
| | | lblCom.Size = new Size(39, 20); |
| | | lblCom.TabIndex = 9; |
| | | lblCom.Text = "通讯"; |
| | | // |
| | | // txtAddress |
| | | // |
| | | txtAddress.Location = new Point(74, 140); |
| | | txtAddress.Margin = new Padding(4); |
| | | txtAddress.Name = "txtAddress"; |
| | | txtAddress.ReadOnly = true; |
| | | txtAddress.Size = new Size(116, 27); |
| | | txtAddress.TabIndex = 6; |
| | | // |
| | | // ckbRuleCheck |
| | | // |
| | | ckbRuleCheck.AutoSize = true; |
| | | ckbRuleCheck.Location = new Point(55, 173); |
| | | ckbRuleCheck.Location = new Point(69, 216); |
| | | ckbRuleCheck.Margin = new Padding(4); |
| | | ckbRuleCheck.Name = "ckbRuleCheck"; |
| | | ckbRuleCheck.Size = new Size(99, 21); |
| | | ckbRuleCheck.Size = new Size(121, 24); |
| | | ckbRuleCheck.TabIndex = 6; |
| | | ckbRuleCheck.Text = "是否规则校验"; |
| | | ckbRuleCheck.UseVisualStyleBackColor = true; |
| | |
| | | // cmbCom |
| | | // |
| | | cmbCom.FormattingEnabled = true; |
| | | cmbCom.Location = new Point(204, 35); |
| | | cmbCom.Location = new Point(255, 44); |
| | | cmbCom.Margin = new Padding(4); |
| | | cmbCom.Name = "cmbCom"; |
| | | cmbCom.Size = new Size(100, 25); |
| | | cmbCom.Size = new Size(124, 28); |
| | | cmbCom.TabIndex = 8; |
| | | cmbCom.SelectedIndexChanged += cmbCom_SelectedIndexChanged; |
| | | // |
| | | // cmbType |
| | | // |
| | | cmbType.FormattingEnabled = true; |
| | | cmbType.Location = new Point(59, 36); |
| | | cmbType.Location = new Point(74, 45); |
| | | cmbType.Margin = new Padding(4); |
| | | cmbType.Name = "cmbType"; |
| | | cmbType.Size = new Size(94, 25); |
| | | cmbType.Size = new Size(116, 28); |
| | | cmbType.TabIndex = 5; |
| | | // |
| | | // lblType |
| | | // |
| | | lblType.AutoSize = true; |
| | | lblType.Location = new Point(21, 39); |
| | | lblType.Location = new Point(26, 49); |
| | | lblType.Margin = new Padding(4, 0, 4, 0); |
| | | lblType.Name = "lblType"; |
| | | lblType.Size = new Size(32, 17); |
| | | lblType.Size = new Size(39, 20); |
| | | lblType.TabIndex = 4; |
| | | lblType.Text = "类型"; |
| | | // |
| | | // btnRun |
| | | // |
| | | btnRun.ForeColor = SystemColors.WindowText; |
| | | btnRun.Location = new Point(215, 109); |
| | | btnRun.Location = new Point(269, 210); |
| | | btnRun.Margin = new Padding(4); |
| | | btnRun.Name = "btnRun"; |
| | | btnRun.Size = new Size(75, 23); |
| | | btnRun.Size = new Size(94, 29); |
| | | btnRun.TabIndex = 3; |
| | | btnRun.Text = "运行测试"; |
| | | btnRun.UseVisualStyleBackColor = true; |
| | | btnRun.Click += btnRun_Click; |
| | | // |
| | | // lblAddress |
| | | // |
| | | lblAddress.AutoSize = true; |
| | | lblAddress.Location = new Point(25, 144); |
| | | lblAddress.Margin = new Padding(4, 0, 4, 0); |
| | | lblAddress.Name = "lblAddress"; |
| | | lblAddress.Size = new Size(39, 20); |
| | | lblAddress.TabIndex = 0; |
| | | lblAddress.Text = "地址"; |
| | | // |
| | | // lblMsg |
| | | // |
| | | lblMsg.AutoSize = true; |
| | | lblMsg.Location = new Point(20, 78); |
| | | lblMsg.Location = new Point(25, 98); |
| | | lblMsg.Margin = new Padding(4, 0, 4, 0); |
| | | lblMsg.Name = "lblMsg"; |
| | | lblMsg.Size = new Size(32, 17); |
| | | lblMsg.Size = new Size(39, 20); |
| | | lblMsg.TabIndex = 1; |
| | | lblMsg.Text = "消息"; |
| | | // |
| | | // txtMsg |
| | | // |
| | | txtMsg.Location = new Point(59, 76); |
| | | txtMsg.Location = new Point(74, 95); |
| | | txtMsg.Margin = new Padding(4); |
| | | txtMsg.Name = "txtMsg"; |
| | | txtMsg.ReadOnly = true; |
| | | txtMsg.Size = new Size(245, 23); |
| | | txtMsg.Size = new Size(305, 27); |
| | | txtMsg.TabIndex = 0; |
| | | // |
| | | // btnRuleSend |
| | | // |
| | | btnRuleSend.ForeColor = SystemColors.WindowText; |
| | | btnRuleSend.Location = new Point(118, 282); |
| | | btnRuleSend.Location = new Point(148, 352); |
| | | btnRuleSend.Margin = new Padding(4); |
| | | btnRuleSend.Name = "btnRuleSend"; |
| | | btnRuleSend.Size = new Size(75, 23); |
| | | btnRuleSend.Size = new Size(94, 29); |
| | | btnRuleSend.TabIndex = 13; |
| | | btnRuleSend.Text = "校验发送"; |
| | | btnRuleSend.UseVisualStyleBackColor = true; |
| | |
| | | // |
| | | label6.AutoSize = true; |
| | | label6.ForeColor = SystemColors.Control; |
| | | label6.Location = new Point(18, 223); |
| | | label6.Location = new Point(22, 279); |
| | | label6.Margin = new Padding(4, 0, 4, 0); |
| | | label6.Name = "label6"; |
| | | label6.Size = new Size(56, 17); |
| | | label6.Size = new Size(69, 20); |
| | | label6.TabIndex = 9; |
| | | label6.Text = "发送信息"; |
| | | // |
| | |
| | | themeForm1.Font = new Font("Microsoft Sans Serif", 9F); |
| | | themeForm1.Image = (Image)resources.GetObject("themeForm1.Image"); |
| | | themeForm1.Location = new Point(0, 0); |
| | | themeForm1.Margin = new Padding(4); |
| | | themeForm1.Name = "themeForm1"; |
| | | themeForm1.Padding = new Padding(10, 70, 10, 9); |
| | | themeForm1.Padding = new Padding(12, 88, 12, 11); |
| | | themeForm1.RoundCorners = true; |
| | | themeForm1.Sizable = true; |
| | | themeForm1.Size = new Size(581, 496); |
| | | themeForm1.Size = new Size(726, 620); |
| | | themeForm1.SmartBounds = true; |
| | | themeForm1.StartPosition = FormStartPosition.WindowsDefaultLocation; |
| | | themeForm1.TabIndex = 14; |
| | |
| | | controlBox1.EnableMaximizeButton = false; |
| | | controlBox1.EnableMinimizeButton = false; |
| | | controlBox1.ForeColor = Color.FromArgb(155, 155, 155); |
| | | controlBox1.Location = new Point(481, 18); |
| | | controlBox1.Location = new Point(601, 18); |
| | | controlBox1.Margin = new Padding(4); |
| | | controlBox1.MaximizeHoverColor = Color.FromArgb(74, 74, 74); |
| | | controlBox1.MinimizeHoverColor = Color.FromArgb(63, 63, 65); |
| | | controlBox1.Name = "controlBox1"; |
| | |
| | | controlBox1.TabIndex = 0; |
| | | controlBox1.Text = "controlBox1"; |
| | | // |
| | | // lblAddress |
| | | // |
| | | lblAddress.AutoSize = true; |
| | | lblAddress.Location = new Point(20, 115); |
| | | lblAddress.Name = "lblAddress"; |
| | | lblAddress.Size = new Size(32, 17); |
| | | lblAddress.TabIndex = 0; |
| | | lblAddress.Text = "地址"; |
| | | // |
| | | // txtAddress |
| | | // |
| | | txtAddress.Location = new Point(59, 112); |
| | | txtAddress.Name = "txtAddress"; |
| | | txtAddress.ReadOnly = true; |
| | | txtAddress.Size = new Size(94, 23); |
| | | txtAddress.TabIndex = 6; |
| | | // |
| | | // CommunicatorForm |
| | | // |
| | | AutoScaleDimensions = new SizeF(96F, 96F); |
| | | AutoScaleDimensions = new SizeF(120F, 120F); |
| | | AutoScaleMode = AutoScaleMode.Dpi; |
| | | ClientSize = new Size(581, 496); |
| | | ClientSize = new Size(726, 620); |
| | | Controls.Add(btnRuleSend); |
| | | Controls.Add(grpTest); |
| | | Controls.Add(btnSend); |
| | |
| | | Controls.Add(grpSetting); |
| | | Controls.Add(themeForm1); |
| | | FormBorderStyle = FormBorderStyle.None; |
| | | MinimumSize = new Size(261, 61); |
| | | Margin = new Padding(4); |
| | | MinimumSize = new Size(326, 76); |
| | | Name = "CommunicatorForm"; |
| | | Text = "通讯测试"; |
| | | TransparencyKey = Color.Fuchsia; |
| | |
| | | private ReaLTaiizor.Controls.ControlBox controlBox1; |
| | | private TextBox txtAddress; |
| | | private Label lblAddress; |
| | | private Label lblDataType; |
| | | private ComboBox cmbDataType; |
| | | } |
| | | } |
| | |
| | | |
| | | private void CommunicatorForm_Load(object sender, EventArgs e) |
| | | { |
| | | // 初始化数据类型 |
| | | cmbDataType.Items.Clear(); |
| | | cmbDataType.Items.AddRange(new string[] { "String", "Bool", "Byte", "Int", "DInt", "Real", "Double", "Word", "DWord" }); |
| | | |
| | | // 绑定索引改变事件 |
| | | cmbDataType.SelectedIndexChanged += (s, ev) => |
| | | { |
| | | if (communicator != null) |
| | | { |
| | | communicator.CommunicatorConnections.Add("数据类型", cmbDataType.Text); |
| | | } |
| | | }; |
| | | |
| | | // 使用 Enum.GetValues 获取 enum 类型的所有值 |
| | | foreach (CommunicatorType type in Enum.GetValues(typeof(CommunicatorType))) |
| | | { |
| | | cmbType.Items.Add(type.ToString()); |
| | | } |
| | | |
| | | // ... (保持不变) |
| | | |
| | | //选择Com会触发ValueChanged事件,没有输入通讯口的情况下选择到-1 |
| | | if (comConfig != null) |
| | |
| | | txtIP.Visible = false; |
| | | this.lblAddress.Visible = false; |
| | | this.txtAddress.Visible = false; |
| | | this.lblDataType.Visible = false; |
| | | this.cmbDataType.Visible = false; |
| | | |
| | | |
| | | lblIP.Text = "串口号"; |
| | | lblIP.Text = "波特率"; |
| | | lblIP.Text = "波特率"; // Bug: 这里 lblPort 应该被设置为 "波特率",但原代码复用了 lblIP? 不,lblIP.Text被设了两次。 |
| | | lblPort.Text = "波特率"; // 修正原代码的潜在Bug |
| | | |
| | | cmbIP.Text = communicator.CommunicatorConnections["地址"].ToString(); |
| | | txtPort.Text = communicator.CommunicatorConnections["端口"].ToString(); |
| | |
| | | txtIP.Visible = true; |
| | | this.lblAddress.Visible = false; |
| | | this.txtAddress.Visible = false; |
| | | this.lblDataType.Visible = false; |
| | | this.cmbDataType.Visible = false; |
| | | |
| | | |
| | | lblIP.Text = "监控文件"; |
| | | lblIP.Text = "写入文件"; |
| | | lblPort.Text = "写入文件"; // 修正原代码可能的错误 |
| | | |
| | | txtIP.Text = communicator.CommunicatorConnections["地址"].ToString(); |
| | | txtPort.Text = communicator.CommunicatorConnections["端口"].ToString(); |
| | |
| | | txtIP.Visible = true; |
| | | this.lblAddress.Visible = true; |
| | | this.txtAddress.Visible = true; |
| | | this.lblDataType.Visible = true; |
| | | this.cmbDataType.Visible = true; |
| | | |
| | | lblIP.Text = "IP"; |
| | | lblIP.Text = "槽"; |
| | | lblPort.Text = "槽"; // 原代码这里是 lblIP.Text="槽" 覆盖了 "IP" |
| | | |
| | | txtIP.Text = communicator.CommunicatorConnections["地址"].ToString(); |
| | | txtPort.Text = communicator.CommunicatorConnections["端口"].ToString(); |
| | | this.txtAddress.Text = communicator.CommunicatorConnections["变量地址"]?.ToString(); |
| | | |
| | | if (communicator.CommunicatorConnections.Contains("数据类型")) |
| | | this.cmbDataType.Text = communicator.CommunicatorConnections["数据类型"].ToString(); |
| | | else |
| | | this.cmbDataType.Text = "String"; |
| | | |
| | | this.grpSetting.ForeColor = SystemColors.Control; |
| | | btnRuleSend.Visible = false; |
| | | } |
| | |
| | | btnRuleSend.Enabled = false; |
| | | this.lblAddress.Visible = false; |
| | | this.txtAddress.Visible = false; |
| | | this.lblDataType.Visible = false; |
| | | this.cmbDataType.Visible = false; |
| | | |
| | | cmbIP.Visible = false; |
| | | txtIP.Visible = true; |
| | | |
| | | lblIP.Text = " IP"; |
| | | lblIP.Text = "端口"; |
| | | lblPort.Text = "端口"; |
| | | |
| | | txtIP.Text = communicator.CommunicatorConnections["地址"].ToString(); |
| | | txtPort.Text = communicator.CommunicatorConnections["端口"].ToString(); |
| | |
| | | { |
| | | communicator.CommunicatorConnections.Add("地址", cmbIP.SelectedItem.ToString()); |
| | | communicator.CommunicatorConnections.Add("端口", txtPort.Text); |
| | | } |
| | | else if (communicator is SiemensLBS7) |
| | | { |
| | | communicator.CommunicatorConnections.Add("地址", txtIP.Text); |
| | | communicator.CommunicatorConnections.Add("端口", txtPort.Text); |
| | | communicator.CommunicatorConnections.Add("变量地址", txtAddress.Text); |
| | | communicator.CommunicatorConnections.Add("数据类型", cmbDataType.Text); |
| | | } |
| | | else |
| | | { |
| | |
| | | MessageBox.Show(result ? "断开成功" : "断开失败,原因是:" + communicator.Msg); |
| | | } |
| | | |
| | | private void ShowLogMsg(string msg) |
| | | { |
| | | // 如果当前不是 UI 线程,则通过 Invoke 将操作调度到 UI 线程 |
| | | if (this.InvokeRequired) |
| | | { |
| | | this.Invoke(new Action<string>((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; |
| | | |
| | | communicator.SendMessage(txtSendMsg.Text); |
| | | |
| | | ShowSendMsg(txtSendMsg.Text); |
| | | if (communicator.SendMessage(txtSendMsg.Text)) |
| | | { |
| | | ShowSendMsg(txtSendMsg.Text); |
| | | } |
| | | else |
| | | { |
| | | ShowLogMsg(communicator.Msg); |
| | | } |
| | | } |
| | | |
| | | private void btnRuleSend_Click(object sender, EventArgs e) |
| | |
| | | //HexByte = strToHexByte(strSendMsg + crcString); |
| | | SendMsg = SendMsg + crcString; |
| | | |
| | | communicator.SendMessage(SendMsg); |
| | | if (communicator.SendMessage(SendMsg)) |
| | | { |
| | | ShowSendMsg(SendMsg); |
| | | } |
| | | else |
| | | { |
| | | ShowLogMsg(communicator.Msg); |
| | | } |
| | | } |
| | | |
| | | private void btnRun_Click(object sender, EventArgs e) |
| | |
| | | <data name="themeForm1.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64"> |
| | | <value> |
| | | iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAAO |
| | | wQAADsEBuJFr7QAAA+JJREFUWEftVkuIHGUQbt34iMEoq2S2q3p3yTJsuqpnJ+L6WBRdwaigohfFgEou |
| | | vgAADr4B6kKxwAAAA+JJREFUWEftVkuIHGUQbt34iMEoq2S2q3p3yTJsuqpnJ+L6WBRdwaigohfFgEou |
| | | BkVBUPCBCEG8BXNQ48GLeImCehIJxMsqhsSZruod46K4HtSIGjU+4iOr0c1I9fSsM3/PLNtCPO0H36m/ |
| | | evz/X11VnreKVRTAHPOZumkY6lFwqURws3BwZ8ywTQnuiCP/+iTCzY1qaUPzdm/Atf3PaHre6XPsjyQM |
| | | 2xLGV4XwIyX4QRj+UMK/lPFvJTyhBMeV8IgQvmRJuH4Ko+l5p9UjGBbCJ5RxTgj+VMZmXxKcSAjekHE/ |
| | |
| | | using LB_SmartVisionCommon; |
| | | using LB_SmartVisionCommon; |
| | | using S7.Net; |
| | | using System; |
| | | using System.Collections.Generic; |
| | | using System.Linq; |
| | | using System.Text; |
| | | using System.Threading.Tasks; |
| | | using System.Text.RegularExpressions; |
| | | using System.Threading; |
| | | |
| | | namespace LB_VisionProcesses.Communicators.SiemensS7 |
| | | { |
| | | public class SiemensLBS7 : BaseCommunicator |
| | | { |
| | | private Plc plc; |
| | | public string variable = string.Empty; |
| | | /// <summary> |
| | | /// |
| | | /// </summary> |
| | | /// <param name="name"></param> |
| | | public SiemensLBS7(string name = "西门子S7") |
| | | // 默认变量地址 |
| | | public string variable = "DB1.DBD0"; |
| | | // 数据类型 |
| | | private string dataType = "String"; |
| | | |
| | | // 缓存连接参数 |
| | | private string ip = "127.0.0.1"; |
| | | private short rack = 0; |
| | | private short slot = 1; |
| | | private CpuType cpuType = CpuType.S71500; |
| | | |
| | | public SiemensLBS7(string name = "西门子S7") : base(name) |
| | | { |
| | | CommunicatorConnections.Add("地址", "127.0.0.1"); |
| | | CommunicatorConnections.Add("端口", "1"); |
| | | CommunicatorConnections.Add("型号", S7.Net.CpuType.S71500); |
| | | CommunicatorBrand = CommunicatorBrand.SiemensS7; |
| | | CommunicatorName = name; |
| | | CommunicatorBrand = CommunicatorBrand.SiemensS7; |
| | | |
| | | // 初始化默认参数 |
| | | if (!CommunicatorConnections.Contains("地址")) CommunicatorConnections.Add("地址", "192.168.0.1"); |
| | | if (!CommunicatorConnections.Contains("机架号")) CommunicatorConnections.Add("机架号", "0"); |
| | | if (!CommunicatorConnections.Contains("插槽号")) CommunicatorConnections.Add("插槽号", "1"); |
| | | if (!CommunicatorConnections.Contains("型号")) CommunicatorConnections.Add("型号", CpuType.S71500); |
| | | if (!CommunicatorConnections.Contains("变量地址")) CommunicatorConnections.Add("变量地址", "DB1.DBD0"); |
| | | if (!CommunicatorConnections.Contains("数据类型")) CommunicatorConnections.Add("数据类型", "String"); |
| | | |
| | | // 兼容旧配置 "端口" |
| | | if (CommunicatorConnections.Contains("端口")) |
| | | { |
| | | CommunicatorConnections["插槽号"] = CommunicatorConnections["端口"]; |
| | | } |
| | | |
| | | // 设置默认心跳消息 |
| | | strHeartbeat = "HEARTBEAT"; |
| | | } |
| | | |
| | | public override bool Connect() |
| | | { |
| | | try |
| | | { |
| | | string IP = CommunicatorConnections["地址"].ToString(); |
| | | short slot; |
| | | short.TryParse(CommunicatorConnections["端口"].ToString(), out slot); |
| | | S7.Net.CpuType cpuType = (CpuType)CommunicatorConnections["型号"]; |
| | | variable = CommunicatorConnections["变量地址"].ToString(); |
| | | plc = new Plc(cpuType, IP, 0, slot); |
| | | plc.Open(); |
| | | return true; |
| | | // 更新参数 |
| | | if (CommunicatorConnections.Contains("地址")) ip = CommunicatorConnections["地址"].ToString(); |
| | | |
| | | if (CommunicatorConnections.Contains("机架号")) |
| | | short.TryParse(CommunicatorConnections["机架号"].ToString(), out rack); |
| | | |
| | | if (CommunicatorConnections.Contains("插槽号")) |
| | | short.TryParse(CommunicatorConnections["插槽号"].ToString(), out slot); |
| | | else if (CommunicatorConnections.Contains("端口")) |
| | | short.TryParse(CommunicatorConnections["端口"].ToString(), out slot); |
| | | |
| | | if (CommunicatorConnections.Contains("型号")) |
| | | { |
| | | if (CommunicatorConnections["型号"] is CpuType type) |
| | | cpuType = type; |
| | | else |
| | | Enum.TryParse(CommunicatorConnections["型号"].ToString(), out cpuType); |
| | | } |
| | | |
| | | if (CommunicatorConnections.Contains("变量地址")) |
| | | variable = CommunicatorConnections["变量地址"].ToString(); |
| | | |
| | | if (CommunicatorConnections.Contains("数据类型")) |
| | | dataType = CommunicatorConnections["数据类型"].ToString(); |
| | | |
| | | // 关闭旧连接 |
| | | plc?.Close(); |
| | | |
| | | plc = new Plc(cpuType, ip, rack, slot); |
| | | plc.Open(); |
| | | |
| | | if (plc.IsConnected) |
| | | { |
| | | bConnected = true; |
| | | AsyncLogHelper.Info($"Device:[{CommunicatorName}] 已连接到 {ip} 机架:{rack} 插槽:{slot}"); |
| | | return true; |
| | | } |
| | | else |
| | | { |
| | | bConnected = false; |
| | | AsyncLogHelper.Error($"Device:[{CommunicatorName}] 连接失败: IsConnected 为 false"); |
| | | return false; |
| | | } |
| | | } |
| | | catch |
| | | catch (Exception ex) |
| | | { |
| | | bConnected = false; |
| | | AsyncLogHelper.Error($"Device:[{CommunicatorName}] 连接错误: {ex.Message}"); |
| | | return false; |
| | | } |
| | | } |
| | |
| | | { |
| | | try |
| | | { |
| | | plc?.Close(); |
| | | if (plc != null) |
| | | { |
| | | plc.Close(); |
| | | bConnected = false; |
| | | AsyncLogHelper.Info($"Device:[{CommunicatorName}] 已断开连接"); |
| | | } |
| | | return true; |
| | | } |
| | | catch (Exception ex) |
| | | { |
| | | AsyncLogHelper.Error($"Device:[{CommunicatorName}] 断开连接错误: {ex.Message}"); |
| | | return false; |
| | | } |
| | | } |
| | | |
| | | public override bool SendMessage(string message) |
| | | { |
| | | if (plc == null || !plc.IsConnected) |
| | | { |
| | | Msg = "连接未开启"; |
| | | return false; |
| | | } |
| | | |
| | | if (message == strHeartbeat) return plc.IsConnected; |
| | | |
| | | try |
| | | { |
| | | string targetVar = variable; |
| | | string strValue = message; |
| | | |
| | | // 简单的协议解析:地址:值 |
| | | if (message.Contains(":")) |
| | | { |
| | | var parts = message.Split(new char[] { ':' }, 2); |
| | | if (parts.Length == 2 && !string.IsNullOrWhiteSpace(parts[0])) |
| | | { |
| | | targetVar = parts[0]; |
| | | strValue = parts[1]; |
| | | } |
| | | } |
| | | |
| | | object valueToWrite = strValue; |
| | | // 获取当前数据类型配置 |
| | | string currentDataType = CommunicatorConnections.Contains("数据类型") ? CommunicatorConnections["数据类型"].ToString() : "String"; |
| | | |
| | | // 根据配置的数据类型进行转换 |
| | | try |
| | | { |
| | | switch (currentDataType) |
| | | { |
| | | case "Bool": |
| | | if (strValue == "1") valueToWrite = true; |
| | | else if (strValue == "0") valueToWrite = false; |
| | | else valueToWrite = bool.Parse(strValue); |
| | | break; |
| | | case "Byte": |
| | | valueToWrite = byte.Parse(strValue); |
| | | break; |
| | | case "Int": // 16-bit |
| | | valueToWrite = short.Parse(strValue); |
| | | break; |
| | | case "DInt": // 32-bit |
| | | valueToWrite = int.Parse(strValue); |
| | | break; |
| | | case "Word": // 16-bit unsigned |
| | | valueToWrite = ushort.Parse(strValue); |
| | | break; |
| | | case "DWord": // 32-bit unsigned |
| | | valueToWrite = uint.Parse(strValue); |
| | | break; |
| | | case "Real": // Float |
| | | valueToWrite = float.Parse(strValue); |
| | | break; |
| | | case "Double": // LReal |
| | | valueToWrite = double.Parse(strValue); |
| | | break; |
| | | case "String": |
| | | default: |
| | | valueToWrite = strValue; |
| | | break; |
| | | } |
| | | } |
| | | catch (FormatException) |
| | | { |
| | | Msg = $"无效的{currentDataType}值,请输入正确格式。"; |
| | | if (currentDataType == "Bool") Msg += " (true/false 或 1/0)"; |
| | | AsyncLogHelper.Error($"Device:[{CommunicatorName}] {Msg}"); |
| | | return false; |
| | | } |
| | | catch (Exception castEx) |
| | | { |
| | | Msg = $"数据转换错误({currentDataType}): {castEx.Message}"; |
| | | AsyncLogHelper.Error($"Device:[{CommunicatorName}] {Msg}"); |
| | | return false; |
| | | } |
| | | |
| | | // 尝试写入 |
| | | plc.Write(targetVar, valueToWrite); |
| | | AsyncLogHelper.Info($"Device:[{CommunicatorName}] 写入({currentDataType}) {targetVar} = {valueToWrite}"); |
| | | return true; |
| | | } |
| | | catch (Exception ex) |
| | | { |
| | | Msg = $"发送消息错误: {ex.Message}"; |
| | | AsyncLogHelper.Error($"Device:[{CommunicatorName}] {Msg}"); |
| | | return false; |
| | | } |
| | | } |
| | | |
| | | public override string ReceiveMsg() |
| | | { |
| | | if (plc == null || !plc.IsConnected) return string.Empty; |
| | | |
| | | try |
| | | { |
| | | // 获取当前数据类型配置 |
| | | string currentDataType = CommunicatorConnections.Contains("数据类型") ? CommunicatorConnections["数据类型"].ToString() : "String"; |
| | | |
| | | if (currentDataType == "String") |
| | | { |
| | | var match = Regex.Match(variable, @"DB(\d+)\.DB[B|W|D|X]?(\d+)", RegexOptions.IgnoreCase); |
| | | if (match.Success) |
| | | { |
| | | try |
| | | { |
| | | int db = int.Parse(match.Groups[1].Value); |
| | | int startByte = int.Parse(match.Groups[2].Value); |
| | | |
| | | // 读取头部 (MaxLen, ActLen) |
| | | byte[] header = plc.ReadBytes(DataType.DataBlock, db, startByte, 2); |
| | | if (header != null && header.Length >= 2) |
| | | { |
| | | int actLen = header[1]; |
| | | if (actLen > 0) |
| | | { |
| | | // 读取实际字符数据 |
| | | byte[] strBytes = plc.ReadBytes(DataType.DataBlock, db, startByte + 2, actLen); |
| | | strReceiveMsg = Encoding.ASCII.GetString(strBytes); |
| | | return strReceiveMsg; |
| | | } |
| | | else |
| | | { |
| | | strReceiveMsg = string.Empty; |
| | | return strReceiveMsg; |
| | | } |
| | | } |
| | | } |
| | | catch (Exception ex) |
| | | { |
| | | AsyncLogHelper.Error($"Device:[{CommunicatorName}] 读取S7String失败: {ex.Message}"); |
| | | } |
| | | } |
| | | // 如果正则不匹配或读取失败,回退到默认读取 |
| | | } |
| | | |
| | | var result = plc.Read(variable); |
| | | if (result != null) |
| | | { |
| | | // 尝试根据 dataType 格式化输出 (S7.Net 读出来的类型可能与预期不符,特别是 DWord/Real) |
| | | // 例如 DBD0 默认读出来是 UInt32,如果 dataType 是 Real,需要转换 |
| | | if (currentDataType == "Real" && (result is uint || result is int)) |
| | | { |
| | | byte[] bytes = BitConverter.GetBytes(Convert.ToUInt32(result)); |
| | | float f = BitConverter.ToSingle(bytes, 0); |
| | | strReceiveMsg = f.ToString(); |
| | | } |
| | | else |
| | | { |
| | | strReceiveMsg = result.ToString(); |
| | | } |
| | | return strReceiveMsg; |
| | | } |
| | | } |
| | | catch (Exception ex) |
| | | { |
| | | AsyncLogHelper.Error($"Device:[{CommunicatorName}] 接收消息错误: {ex.Message}"); |
| | | } |
| | | return string.Empty; |
| | | } |
| | | |
| | | /// <summary> |
| | | /// 带填充的 S7 字符串写入,防止残留数据 |
| | | /// </summary> |
| | | private bool WriteS7StringWithPadding(string address, string value) |
| | | { |
| | | try |
| | | { |
| | | // 解析地址,例如 DB1.DBB0, DB1.DBD0 |
| | | var match = Regex.Match(address, @"DB(\d+)\.DB[B|W|D|X]?(\d+)", RegexOptions.IgnoreCase); |
| | | if (!match.Success) return false; |
| | | |
| | | int db = int.Parse(match.Groups[1].Value); |
| | | int startByte = int.Parse(match.Groups[2].Value); |
| | | |
| | | byte maxLen = 254; // 默认最大值 |
| | | try |
| | | { |
| | | var header = plc.ReadBytes(DataType.DataBlock, db, startByte, 1); |
| | | if (header != null && header.Length > 0 && header[0] > 0) |
| | | { |
| | | maxLen = header[0]; |
| | | } |
| | | } |
| | | catch { } |
| | | |
| | | byte[] buffer = new byte[maxLen + 2]; |
| | | buffer[0] = maxLen; |
| | | int currentLen = Math.Min(value.Length, maxLen); |
| | | buffer[1] = (byte)currentLen; |
| | | |
| | | if (currentLen > 0) |
| | | { |
| | | byte[] strBytes = Encoding.ASCII.GetBytes(value); |
| | | Array.Copy(strBytes, 0, buffer, 2, Math.Min(strBytes.Length, currentLen)); |
| | | } |
| | | |
| | | plc.WriteBytes(DataType.DataBlock, db, startByte, buffer); |
| | | return true; |
| | | } |
| | | catch |
| | |
| | | return false; |
| | | } |
| | | } |
| | | |
| | | public override bool SendMessage(string message) |
| | | |
| | | public object Read(string address) |
| | | { |
| | | try |
| | | { |
| | | if (plc!=null) |
| | | { |
| | | if (string.IsNullOrEmpty(variable)) |
| | | { |
| | | variable = CommunicatorConnections["变量地址"].ToString(); |
| | | } |
| | | plc.Write(variable, message); |
| | | return true; |
| | | } |
| | | else |
| | | { |
| | | return false; |
| | | } |
| | | } |
| | | catch |
| | | { |
| | | return false; |
| | | } |
| | | if (plc == null || !plc.IsConnected) return null; |
| | | return plc.Read(address); |
| | | } |
| | | |
| | | public void Write(string address, object value) |
| | | { |
| | | if (plc != null && plc.IsConnected) |
| | | plc.Write(address, value); |
| | | } |
| | | |
| | | public override void Dispose() |
| | | { |
| | | try |
| | | { |
| | | AsyncLogHelper.Info($"Device:[{CommunicatorName}],Dispose()"); |
| | | |
| | | AsyncLogHelper.Info($"Device:[{CommunicatorName}],释放资源(Dispose)"); |
| | | plc?.Close(); |
| | | plc = null; |
| | | |
| | | // Suppress finalization. |
| | | GC.SuppressFinalize(this); |
| | | } |
| | | catch (Exception ex) |
| | | { |
| | | AsyncLogHelper.Error($"Device:[{CommunicatorName}],Dispose(),Error" + ex); |
| | | AsyncLogHelper.Error($"Device:[{CommunicatorName}],释放资源(Dispose)错误: " + ex.Message); |
| | | } |
| | | } |
| | | } |