初始化上传
This commit is contained in:
363
常用工具集/ViewModels/01PLC通信调试/Socket调试ViewModel.cs
Normal file
363
常用工具集/ViewModels/01PLC通信调试/Socket调试ViewModel.cs
Normal file
@@ -0,0 +1,363 @@
|
||||
using MES.Utility.Core;
|
||||
using SerialDebug;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.IO;
|
||||
using System.IO.Ports;
|
||||
using System.Linq;
|
||||
using System.Net.Sockets;
|
||||
using System.Text;
|
||||
using System.Threading;
|
||||
using System.Threading.Tasks;
|
||||
using 常用工具集.Base;
|
||||
using 常用工具集.Utility.Network;
|
||||
using static EasyModbus.TCPHandler;
|
||||
|
||||
namespace 常用工具集.ViewModel._01PLC通信调试
|
||||
{
|
||||
public class Socket调试ViewModel : ViewModelBase
|
||||
{
|
||||
private System.IO.Ports.SerialPort serialPort;
|
||||
public bool Enabled1 { get; set; } = true;
|
||||
public bool Enabled2 { get; set; } = false;
|
||||
public string ButtonText { get; set; } = "打开";
|
||||
|
||||
public string IpAddress { get; set; } = "127.0.0.1";
|
||||
public int Port { get; set; } = 502;
|
||||
public int Timeout { get; set; } = 1000;
|
||||
|
||||
public bool ReciveASCChecked { get; set; } = true;
|
||||
public bool ReciveHexChecked { get; set; } = false;
|
||||
|
||||
|
||||
public bool SendASCChecked { get; set; } = true;
|
||||
public bool SendHexChecked { get; set; } = false;
|
||||
public bool ConvertChecked { get; set; } = true;
|
||||
public bool CycleChecked { get; set; } = false;
|
||||
public int CycleTime { get; set; } = 1000;
|
||||
|
||||
|
||||
public string SendContent { get; set; } = "";
|
||||
|
||||
private object _lock = new object();
|
||||
private List<string> msgList = new List<string>();
|
||||
public string Message
|
||||
{
|
||||
get
|
||||
{
|
||||
lock (_lock)
|
||||
{
|
||||
return msgList.GetStrArray("\r\n");
|
||||
}
|
||||
}
|
||||
set
|
||||
{
|
||||
NotifyPropertyChanged();
|
||||
}
|
||||
}
|
||||
|
||||
public DelegateCommand OpenSerialCmd { get; set; }
|
||||
public DelegateCommand ClearReciveCmd { get; set; }
|
||||
public DelegateCommand ClearSendCmd { get; set; }
|
||||
public DelegateCommand SendCmd { get; set; }
|
||||
|
||||
private TcpClient client;
|
||||
private Stream stream;
|
||||
private Thread sendThread;
|
||||
public Thread readThread;
|
||||
|
||||
public Socket调试ViewModel()
|
||||
{
|
||||
serialPort = new SerialPort();
|
||||
//打开关闭串口
|
||||
OpenSerialCmd = new DelegateCommand(OpenSerialCmdFunc);
|
||||
ClearReciveCmd = new DelegateCommand(ClearReciveCmdFunc);
|
||||
ClearSendCmd = new DelegateCommand(ClearSendCmdFunc);
|
||||
SendCmd = new DelegateCommand(SendCmdFunc);
|
||||
}
|
||||
|
||||
private void OpenSerialCmdFunc(object obj)
|
||||
{
|
||||
try
|
||||
{
|
||||
if (ButtonText == "打开")
|
||||
{
|
||||
client = new TcpClient();
|
||||
IAsyncResult asyncResult = client.BeginConnect(IpAddress, Port, null, null);
|
||||
if (!asyncResult.AsyncWaitHandle.WaitOne(Timeout))
|
||||
{
|
||||
GlobalValues.Error("连接超时");
|
||||
return;
|
||||
}
|
||||
client.EndConnect(asyncResult);
|
||||
stream = client.GetStream();
|
||||
ButtonText = "关闭";
|
||||
Enabled1 = false;
|
||||
Enabled2 = true;
|
||||
readThread = new Thread(ReadThread);
|
||||
readThread.Start();
|
||||
}
|
||||
else
|
||||
{
|
||||
sendThread?.Interrupt();
|
||||
sendThread = null;
|
||||
readThread.Interrupt();
|
||||
readThread = null;
|
||||
stream.Close();
|
||||
client.Close();
|
||||
client.Dispose();
|
||||
client = null;
|
||||
ButtonText = "打开";
|
||||
Enabled1 = true;
|
||||
Enabled2 = false;
|
||||
}
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
client.Close();
|
||||
client = null;
|
||||
GlobalValues.Error(ex.Message);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
private void ClearReciveCmdFunc(object obj)
|
||||
{
|
||||
lock (_lock)
|
||||
{
|
||||
msgList.Clear();
|
||||
}
|
||||
Message = Guid.NewGuid().ToString();
|
||||
}
|
||||
|
||||
private void ClearSendCmdFunc(object obj)
|
||||
{
|
||||
SendContent = string.Empty;
|
||||
}
|
||||
|
||||
private void SendCmdFunc(object obj)
|
||||
{
|
||||
try
|
||||
{
|
||||
|
||||
if (sendThread != null)
|
||||
{
|
||||
GlobalValues.Error("正在执行循环周期发送,不能发送数据");
|
||||
return;
|
||||
}
|
||||
if (SendContent.IsNullOrEmpty())
|
||||
{
|
||||
GlobalValues.Error("没有任何可发送的数据");
|
||||
return;
|
||||
}
|
||||
//要发送的数据
|
||||
SendParamFormat format = SendParamFormat.ASCII;
|
||||
if (SendHexChecked)
|
||||
{
|
||||
format = SendParamFormat.Hex;
|
||||
}
|
||||
int sendInterval = Convert.ToInt32(CycleTime);
|
||||
CSendParam param = new CSendParam(format, SendParamMode.SendAfterLastSend, sendInterval, SendContent, ConvertChecked);
|
||||
|
||||
if (CycleChecked)
|
||||
{
|
||||
sendThread = new Thread(SendThread);
|
||||
sendThread.Start(param);
|
||||
}
|
||||
else
|
||||
{
|
||||
SendData(param);
|
||||
}
|
||||
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
GlobalValues.Error(ex.Message);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
private void sp_SendCompletedEvent(object sender, SendCompletedEventArgs e)
|
||||
{
|
||||
if (e.SendParam == null)
|
||||
{
|
||||
GlobalValues.Error("发送失败");
|
||||
OpenSerialCmdFunc(null);
|
||||
return;
|
||||
}
|
||||
lock (_lock)
|
||||
{
|
||||
msgList.Add($"{e.TimeString}[-->]");
|
||||
if (SendASCChecked)
|
||||
{
|
||||
msgList.Add(e.SendParam.ASCIIString);
|
||||
}
|
||||
else
|
||||
{
|
||||
msgList.Add(e.SendParam.HexString);
|
||||
}
|
||||
if (msgList.Count > 300)
|
||||
{
|
||||
int cha = msgList.Count - 300;
|
||||
//lines.Reverse();
|
||||
//差多少,删多少
|
||||
for (int i = 0; i < cha; i++)
|
||||
{
|
||||
msgList.RemoveAt(0);
|
||||
}
|
||||
}
|
||||
}
|
||||
Message = Guid.NewGuid().ToString();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 接收事件
|
||||
/// </summary>
|
||||
/// <param name="sender"></param>
|
||||
/// <param name="e"></param>
|
||||
void sp_ReceivedEvent(object sender, SerialDebugReceiveData e)
|
||||
{
|
||||
if (e != null)
|
||||
{
|
||||
lock (_lock)
|
||||
{
|
||||
msgList.Add($"{e.TimeString}[<--]");
|
||||
if (ReciveASCChecked)
|
||||
{
|
||||
msgList.Add(e.ASCIIString);
|
||||
}
|
||||
else
|
||||
{
|
||||
msgList.Add(e.HexString);
|
||||
}
|
||||
if (msgList.Count > 300)
|
||||
{
|
||||
int cha = msgList.Count - 300;
|
||||
//lines.Reverse();
|
||||
//差多少,删多少
|
||||
for (int i = 0; i < cha; i++)
|
||||
{
|
||||
msgList.RemoveAt(0);
|
||||
}
|
||||
}
|
||||
}
|
||||
Message = Guid.NewGuid().ToString();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
void sp_SendOverEvent(object sender, EventArgs e)
|
||||
{
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
private void ReadThread(object obj)
|
||||
{
|
||||
while (true)
|
||||
{
|
||||
try
|
||||
{
|
||||
var available = client.Available;
|
||||
if (available > 0)
|
||||
{
|
||||
byte[] bytes = new byte[available];
|
||||
stream.Read(bytes, 0, bytes.Length);
|
||||
SerialDebugReceiveData data = new SerialDebugReceiveData(bytes);
|
||||
lock (_lock)
|
||||
{
|
||||
msgList.Add($"{DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff")}[<--]");
|
||||
if (ReciveASCChecked)
|
||||
{
|
||||
msgList.Add(data.ASCIIString);
|
||||
}
|
||||
else
|
||||
{
|
||||
msgList.Add(data.HexString);
|
||||
}
|
||||
if (msgList.Count > 300)
|
||||
{
|
||||
int cha = msgList.Count - 300;
|
||||
//lines.Reverse();
|
||||
//差多少,删多少
|
||||
for (int i = 0; i < cha; i++)
|
||||
{
|
||||
msgList.RemoveAt(0);
|
||||
}
|
||||
}
|
||||
}
|
||||
Message = Guid.NewGuid().ToString();
|
||||
}
|
||||
Thread.Sleep(1);
|
||||
}
|
||||
catch (ThreadInterruptedException ex)
|
||||
{
|
||||
break;
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private void SendData(CSendParam param)
|
||||
{
|
||||
try
|
||||
{
|
||||
stream.Write(param.DataBytes, 0, param.DataBytes.Length);
|
||||
lock (_lock)
|
||||
{
|
||||
msgList.Add($"{DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff")}[<--]");
|
||||
if (ReciveASCChecked)
|
||||
{
|
||||
msgList.Add(param.ASCIIString);
|
||||
}
|
||||
else
|
||||
{
|
||||
msgList.Add(param.HexString);
|
||||
}
|
||||
if (msgList.Count > 300)
|
||||
{
|
||||
int cha = msgList.Count - 300;
|
||||
//lines.Reverse();
|
||||
//差多少,删多少
|
||||
for (int i = 0; i < cha; i++)
|
||||
{
|
||||
msgList.RemoveAt(0);
|
||||
}
|
||||
}
|
||||
}
|
||||
Message = Guid.NewGuid().ToString();
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
private void SendThread(object obj)
|
||||
{
|
||||
CSendParam parm = (CSendParam)obj;
|
||||
while (true)
|
||||
{
|
||||
try
|
||||
{
|
||||
SendData(parm);
|
||||
Thread.Sleep(CycleTime);
|
||||
}
|
||||
catch (ThreadInterruptedException ex)
|
||||
{
|
||||
break;
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user