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);
}
}
}
}