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}");
|
}
|
}
|
|
/// <summary>
|
/// 通讯回调运行
|
/// </summary>
|
/// <param name="CCDName"></param>
|
/// <param name="image"></param>
|
private void ShowReceiveMsg(string strReceiveMsg)
|
{
|
// 如果当前不是 UI 线程,则通过 Invoke 将操作调度到 UI 线程
|
if (this.InvokeRequired)
|
{
|
this.Invoke(new Action<string>((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<string>((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<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;
|
|
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);
|
ushort crcHexByte = BaseCommunicator.CRC16Calculate(HexByte, HexByte.Length);
|
|
string crcString = crcHexByte.ToString("X4");
|
//HexByte = strToHexByte(strSendMsg + crcString);
|
SendMsg = SendMsg + crcString;
|
|
if (communicator.SendMessage(SendMsg))
|
ShowSendMsg(SendMsg);
|
else
|
ShowLogMsg(communicator.Msg);
|
}
|
|
private void txtAddress_TextChanged(object sender, EventArgs e)
|
{
|
if (communicator != null)
|
{
|
communicator.CommunicatorConnections.Add("变量地址", txtAddress.Text);
|
communicatorChanged(communicator);
|
}
|
}
|
|
private void cmbVarType_SelectedIndexChanged(object sender, EventArgs e)
|
{
|
//if (communicator != null && !communicator.CommunicatorConnections.Contains("变量类型"))
|
//{
|
// communicator.CommunicatorConnections.Add("变量类型", cmbVarType.Text);
|
//}
|
//else if (communicator != null)
|
//{
|
// communicator.CommunicatorConnections["变量类型"] = cmbVarType.Text;
|
// communicatorChanged(communicator);
|
//}
|
}
|
}
|
}
|