初始化上传
This commit is contained in:
123
常用工具集/ViewModels/01PLC通信调试/MC3E服务模拟ViewModel.cs
Normal file
123
常用工具集/ViewModels/01PLC通信调试/MC3E服务模拟ViewModel.cs
Normal file
@@ -0,0 +1,123 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Collections.ObjectModel;
|
||||
using 常用工具集.Base;
|
||||
using EasyModbus;
|
||||
using MES.Utility.Core;
|
||||
using System.Windows;
|
||||
using 常用工具集.Utility.Network.Mitsubishi;
|
||||
using System.Linq;
|
||||
using Avalonia.Threading;
|
||||
|
||||
namespace 常用工具集.ViewModel._01PLC通信调试
|
||||
{
|
||||
public class MC3E服务模拟ViewModel : ViewModelBase
|
||||
{
|
||||
internal static MC3EServer server;
|
||||
public bool Enabled1 { get; set; } = true;
|
||||
public bool Enabled2 { get; set; } = false;
|
||||
public int Port { get; set; } = 5001;
|
||||
private List<string> logMessageList = new List<string>();
|
||||
public string Message
|
||||
{
|
||||
get
|
||||
{
|
||||
return logMessageList.GetStrArray("\r\n");
|
||||
}
|
||||
set
|
||||
{
|
||||
NotifyPropertyChanged();
|
||||
}
|
||||
}
|
||||
public string ButtonText { get; set; } = "开启服务";
|
||||
|
||||
private ushort _startAddess = 1;
|
||||
public ushort StartAddress
|
||||
{
|
||||
get { return _startAddess; }
|
||||
set
|
||||
{
|
||||
_startAddess = value;
|
||||
SetEveryList();
|
||||
NotifyPropertyChanged();
|
||||
}
|
||||
}
|
||||
|
||||
public int SelectIndex1 { get; set; } = -1;
|
||||
public ObservableCollection<MyDataGrid> List1 { get; set; } = new ObservableCollection<MyDataGrid>();
|
||||
public DelegateCommand StartCmd { get; set; }
|
||||
public DelegateCommand CellClickCmd { get; set; }
|
||||
public MC3E服务模拟ViewModel()
|
||||
{
|
||||
StartCmd = new DelegateCommand(StartCmdFunc);
|
||||
}
|
||||
|
||||
|
||||
|
||||
private void StartCmdFunc(object obj)
|
||||
{
|
||||
if (ButtonText == "开启服务")
|
||||
{
|
||||
server = new MC3EServer(Port);
|
||||
server.Start();
|
||||
//监听数据变化
|
||||
server.DataChangedEvent += DataChanged;
|
||||
server.LogChangedEvent += LogDataChanged;
|
||||
SetEveryList();
|
||||
Enabled1 = false;
|
||||
Enabled2 = true;
|
||||
ButtonText = "停止服务";
|
||||
}
|
||||
else
|
||||
{
|
||||
logMessageList.Clear();
|
||||
Message = Guid.NewGuid().ToString();
|
||||
server.Stop();
|
||||
server = null;
|
||||
List1.Clear();
|
||||
Enabled1 = true;
|
||||
Enabled2 = false;
|
||||
ButtonText = "开启服务";
|
||||
}
|
||||
}
|
||||
|
||||
private void LogDataChanged(string message)
|
||||
{
|
||||
|
||||
try
|
||||
{
|
||||
logMessageList.Insert(0, message);
|
||||
while (logMessageList.Count > 50)
|
||||
{
|
||||
logMessageList.RemoveAt(logMessageList.Count - 1);
|
||||
}
|
||||
}
|
||||
catch (Exception) { }
|
||||
Message = Guid.NewGuid().ToString();
|
||||
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
private void SetEveryList()
|
||||
{
|
||||
Dispatcher.UIThread.Invoke(() =>
|
||||
{
|
||||
ushort startAddress = StartAddress;
|
||||
List1.Clear();
|
||||
for (int i = startAddress; i < 10 + startAddress; i++)
|
||||
{
|
||||
MyDataGrid data = new MyDataGrid { Which = 3, Address = i, Value2 = MC3EServer._dataStorage[i] };
|
||||
List1.Add(data);
|
||||
}
|
||||
});
|
||||
|
||||
}
|
||||
|
||||
private void DataChanged(int address)
|
||||
{
|
||||
SetEveryList();
|
||||
}
|
||||
}
|
||||
}
|
||||
293
常用工具集/ViewModels/01PLC通信调试/ModbusRTUViewModel.cs
Normal file
293
常用工具集/ViewModels/01PLC通信调试/ModbusRTUViewModel.cs
Normal file
@@ -0,0 +1,293 @@
|
||||
using MES.Utility.Network;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.IO.Ports;
|
||||
using System.Linq;
|
||||
using 常用工具集.Base;
|
||||
|
||||
namespace 常用工具集.ViewModel._01PLC通信调试
|
||||
{
|
||||
public class ModbusRTUViewModel : ViewModelBase
|
||||
{
|
||||
public int SlaveId { get; set; } = 1;
|
||||
//串口号下拉列表数据
|
||||
public List<string> SerialList { get; set; }
|
||||
public int SerialIndex { get; set; } = 0;
|
||||
|
||||
/// <summary>
|
||||
/// 波特率
|
||||
/// </summary>
|
||||
public List<int> BaudRateList { get; set; }
|
||||
public int BaudRateIndex { get; set; } = 0;
|
||||
//校验
|
||||
public List<string> ParityList { get; set; }
|
||||
public int ParityIndex { get; set; } = 0;
|
||||
|
||||
//数据为
|
||||
public List<int> DataBitList { get; set; }
|
||||
public int DataBitIndex { get; set; } = 0;
|
||||
//停止位
|
||||
public List<string> StopBitList { get; set; }
|
||||
public int StopBitIndex { get; set; } = 0;
|
||||
|
||||
public bool Enabled1 { get; set; } = true;
|
||||
public bool Enabled2 { get; set; } = false;
|
||||
public int Address { get; set; } = 4001;
|
||||
public int StringLength { get; set; } = 100;
|
||||
public string ReadedValue { get; set; } = "";
|
||||
public string Message { get; set; } = "";
|
||||
|
||||
public string SendedBytesValue { get; set; } = "";
|
||||
public string RecivedBytesValue { get; set; } = "";
|
||||
public string Int16Value { get; set; } = "";
|
||||
public string Int32Value { get; set; } = "";
|
||||
public string RealValue { get; set; } = "";
|
||||
public string StringValue { get; set; } = "";
|
||||
public string DoubleValue { get; set; } = "";
|
||||
public string LongValue { get; set; } = "";
|
||||
|
||||
//STRING DOUBLE INT64 INT32 INT16 REAL
|
||||
private ModbusHelper modbus;
|
||||
|
||||
public DelegateCommand ConnectCmd { get; set; }
|
||||
public DelegateCommand DisconnectCmd { get; set; }
|
||||
public DelegateCommand WriteCmd { get; set; }
|
||||
public DelegateCommand ReadCmd { get; set; }
|
||||
public ModbusRTUViewModel()
|
||||
{
|
||||
//串口号
|
||||
string[] portNames = SerialPort.GetPortNames();
|
||||
if (portNames != null && portNames.Length > 0)
|
||||
{
|
||||
SerialList = portNames.ToList();
|
||||
}
|
||||
//波特率
|
||||
BaudRateList = new List<int>() { 110, 300, 600, 1200, 2400, 4800, 9600, 14400, 19200, 38400, 56000, 57600, 115200, 128000 };
|
||||
BaudRateIndex = 6;
|
||||
//校验
|
||||
ParityList = new List<string> { "None", "Odd", "Even", "Mark", "Space" };
|
||||
ParityIndex = 0;
|
||||
//数据位
|
||||
DataBitList = new List<int> { 5, 6, 7, 8 };
|
||||
DataBitIndex = 3;
|
||||
//停止位
|
||||
StopBitList = new List<string> { "None", "One", "Two", "OnePointFive" };
|
||||
StopBitIndex = 1;
|
||||
ConnectCmd = new DelegateCommand(ConnectCmdFunc);
|
||||
DisconnectCmd = new DelegateCommand(DisconnectCmdFunc);
|
||||
ReadCmd = new DelegateCommand(ReadCmdFunc);
|
||||
WriteCmd = new DelegateCommand(WriteCmdFunc);
|
||||
}
|
||||
|
||||
private void ConnectCmdFunc(object obj)
|
||||
{
|
||||
try
|
||||
{
|
||||
SharpModbus.SerialSettings setting = new SharpModbus.SerialSettings();
|
||||
setting.PortName = SerialList[SerialIndex];
|
||||
setting.BaudRate = BaudRateList[BaudRateIndex];
|
||||
setting.DataBits = DataBitList[DataBitIndex];
|
||||
setting.Parity = (Parity)ParityIndex;
|
||||
setting.StopBits = (StopBits)StopBitIndex;
|
||||
|
||||
modbus = new ModbusHelper(setting, 500, (byte)SlaveId);
|
||||
modbus.OnSended += Modbus_OnSended;
|
||||
modbus.OnRecived += Modbus_OnRecived;
|
||||
Enabled1 = false;
|
||||
Enabled2 = true;
|
||||
}
|
||||
catch
|
||||
{
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
private void DisconnectCmdFunc(object obj)
|
||||
{
|
||||
modbus.OnSended -= Modbus_OnSended;
|
||||
modbus.OnRecived -= Modbus_OnRecived;
|
||||
modbus.Dispose();
|
||||
modbus = null;
|
||||
Enabled1 = true;
|
||||
Enabled2 = false;
|
||||
}
|
||||
|
||||
private void ReadCmdFunc(object obj)
|
||||
{
|
||||
string cmd = obj.ToString();
|
||||
|
||||
ReadedValue = "";
|
||||
Message = "";
|
||||
SendedBytesValue = "";
|
||||
RecivedBytesValue = "";
|
||||
if (cmd == "INT16")
|
||||
{
|
||||
ushort value;
|
||||
bool flag = modbus.ReadHoldRegisterInt16(Address, out value);
|
||||
if (!flag)
|
||||
{
|
||||
Message = "读取失败";
|
||||
DisconnectCmdFunc(null);
|
||||
return;
|
||||
}
|
||||
Message = "读取成功";
|
||||
ReadedValue = value.ToString();
|
||||
}
|
||||
else if (cmd == "INT32")
|
||||
{
|
||||
int value;
|
||||
bool flag = modbus.ReadHoldRegisterInt32(Address, out value);
|
||||
if (!flag)
|
||||
{
|
||||
Message = "读取失败";
|
||||
DisconnectCmdFunc(null);
|
||||
return;
|
||||
}
|
||||
Message = "读取成功";
|
||||
ReadedValue = value.ToString();
|
||||
}
|
||||
else if (cmd == "INT64")
|
||||
{
|
||||
long value;
|
||||
bool flag = modbus.ReadHoldRegisterInt64(Address, out value);
|
||||
if (!flag)
|
||||
{
|
||||
Message = "读取失败";
|
||||
DisconnectCmdFunc(null);
|
||||
return;
|
||||
}
|
||||
Message = "读取成功";
|
||||
ReadedValue = value.ToString();
|
||||
}
|
||||
else if (cmd == "REAL")
|
||||
{
|
||||
float value;
|
||||
bool flag = modbus.ReadHoldRegisterFloat(Address, out value);
|
||||
if (!flag)
|
||||
{
|
||||
Message = "读取失败";
|
||||
DisconnectCmdFunc(null);
|
||||
return;
|
||||
}
|
||||
Message = "读取成功";
|
||||
ReadedValue = value.ToString();
|
||||
}
|
||||
else if (cmd == "DOUBLE")
|
||||
{
|
||||
double value;
|
||||
bool flag = modbus.ReadHoldRegisterDouble(Address, out value);
|
||||
if (!flag)
|
||||
{
|
||||
Message = "读取失败";
|
||||
DisconnectCmdFunc(null);
|
||||
return;
|
||||
}
|
||||
Message = "读取成功";
|
||||
ReadedValue = value.ToString();
|
||||
}
|
||||
else if (cmd == "STRING")
|
||||
{
|
||||
string value;
|
||||
bool flag = modbus.ReadHoldRegisterString(Address, StringLength, out value);
|
||||
if (!flag)
|
||||
{
|
||||
Message = "读取失败";
|
||||
DisconnectCmdFunc(null);
|
||||
return;
|
||||
}
|
||||
Message = "读取成功";
|
||||
ReadedValue = value.ToString();
|
||||
}
|
||||
|
||||
// DOUBLE
|
||||
|
||||
}
|
||||
|
||||
private void WriteCmdFunc(object obj)
|
||||
{
|
||||
string cmd = obj.ToString();
|
||||
ReadedValue = "";
|
||||
Message = "";
|
||||
SendedBytesValue = "";
|
||||
RecivedBytesValue = "";
|
||||
if (cmd == "INT16")
|
||||
{
|
||||
ushort value;
|
||||
bool flag = ushort.TryParse(Int16Value, out value);
|
||||
if (!flag)
|
||||
{
|
||||
Message = "请输入正确的数据";
|
||||
return;
|
||||
}
|
||||
flag = modbus.WriteHoldRegisterInt16(Address, value);
|
||||
Message = flag ? "写入成功" : "写入失败";
|
||||
}
|
||||
else if (cmd == "INT32")
|
||||
{
|
||||
int value;
|
||||
bool flag = int.TryParse(Int32Value, out value);
|
||||
if (!flag)
|
||||
{
|
||||
Message = "请输入正确的数据";
|
||||
return;
|
||||
}
|
||||
flag = modbus.WriteHoldRegisterInt32(Address, value);
|
||||
Message = flag ? "写入成功" : "写入失败";
|
||||
}
|
||||
else if (cmd == "INT64")
|
||||
{
|
||||
long value;
|
||||
bool flag = long.TryParse(LongValue, out value);
|
||||
if (!flag)
|
||||
{
|
||||
Message = "请输入正确的数据";
|
||||
return;
|
||||
}
|
||||
flag = modbus.WriteHoldRegisterInt64(Address, value);
|
||||
Message = flag ? "写入成功" : "写入失败";
|
||||
}
|
||||
else if (cmd == "REAL")
|
||||
{
|
||||
float value;
|
||||
bool flag = float.TryParse(RealValue, out value);
|
||||
if (!flag)
|
||||
{
|
||||
Message = "请输入正确的数据";
|
||||
return;
|
||||
}
|
||||
flag = modbus.WriteHoldRegisterFloat(Address, value);
|
||||
Message = flag ? "写入成功" : "写入失败";
|
||||
}
|
||||
else if (cmd == "DOUBLE")
|
||||
{
|
||||
double value;
|
||||
bool flag = double.TryParse(DoubleValue, out value);
|
||||
if (!flag)
|
||||
{
|
||||
Message = "请输入正确的数据";
|
||||
return;
|
||||
}
|
||||
flag = modbus.WriteHoldRegisterDouble(Address, value);
|
||||
Message = flag ? "写入成功" : "写入失败";
|
||||
}
|
||||
else if (cmd == "STRING")
|
||||
{
|
||||
bool flag = modbus.WriteHoldRegisterString(Address, StringLength, StringValue);
|
||||
Message = flag ? "写入成功" : "写入失败";
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
private void Modbus_OnRecived(byte[] bytes, string hexString)
|
||||
{
|
||||
RecivedBytesValue = hexString;
|
||||
}
|
||||
|
||||
private void Modbus_OnSended(byte[] bytes, string hexString)
|
||||
{
|
||||
SendedBytesValue = hexString;
|
||||
}
|
||||
}
|
||||
}
|
||||
300
常用工具集/ViewModels/01PLC通信调试/Modbus服务ViewModel.cs
Normal file
300
常用工具集/ViewModels/01PLC通信调试/Modbus服务ViewModel.cs
Normal file
@@ -0,0 +1,300 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Collections.ObjectModel;
|
||||
using 常用工具集.Base;
|
||||
using EasyModbus;
|
||||
using MES.Utility.Core;
|
||||
using System.Windows;
|
||||
using Avalonia.Threading;
|
||||
|
||||
namespace 常用工具集.ViewModel._01PLC通信调试
|
||||
{
|
||||
public class Modbus服务ViewModel : ViewModelBase
|
||||
{
|
||||
internal static ModbusServer server;
|
||||
public bool Enabled1 { get; set; } = true;
|
||||
public bool Enabled2 { get; set; } = false;
|
||||
public int Port { get; set; } = 502;
|
||||
private List<string> logMessageList = new List<string>();
|
||||
public string Message
|
||||
{
|
||||
get
|
||||
{
|
||||
return logMessageList.GetStrArray("\r\n");
|
||||
}
|
||||
set
|
||||
{
|
||||
NotifyPropertyChanged();
|
||||
}
|
||||
}
|
||||
public string ButtonText { get; set; } = "开启服务";
|
||||
|
||||
private ushort _startAddess = 1;
|
||||
public ushort StartAddress
|
||||
{
|
||||
get { return _startAddess; }
|
||||
set
|
||||
{
|
||||
_startAddess = value;
|
||||
SetEveryList();
|
||||
NotifyPropertyChanged();
|
||||
}
|
||||
}
|
||||
|
||||
public int SelectIndex1 { get; set; } = -1;
|
||||
public int SelectIndex2 { get; set; } = -1;
|
||||
public int SelectIndex3 { get; set; } = -1;
|
||||
public int SelectIndex4 { get; set; } = -1;
|
||||
public ObservableCollection<MyDataGrid> List1 { get; set; } = new ObservableCollection<MyDataGrid>();
|
||||
public ObservableCollection<MyDataGrid> List2 { get; set; } = new ObservableCollection<MyDataGrid>();
|
||||
public ObservableCollection<MyDataGrid> List3 { get; set; } = new ObservableCollection<MyDataGrid>();
|
||||
public ObservableCollection<MyDataGrid> List4 { get; set; } = new ObservableCollection<MyDataGrid>();
|
||||
public DelegateCommand StartCmd { get; set; }
|
||||
public DelegateCommand CellClickCmd { get; set; }
|
||||
public Modbus服务ViewModel()
|
||||
{
|
||||
StartCmd = new DelegateCommand(StartCmdFunc);
|
||||
}
|
||||
|
||||
|
||||
|
||||
private void StartCmdFunc(object obj)
|
||||
{
|
||||
if (ButtonText == "开启服务")
|
||||
{
|
||||
server = new ModbusServer(Port);
|
||||
server.Start();
|
||||
//监听数据变化
|
||||
server.CoilsChanged += new ModbusServer.CoilsChangedHandler(CoilsChanged);
|
||||
server.HoldingRegistersChanged += new ModbusServer.HoldingRegistersChangedHandler(HoldingRegistersChanged);
|
||||
server.LogDataChanged += new ModbusServer.LogDataChangedHandler(LogDataChanged);
|
||||
SetEveryList();
|
||||
Enabled1 = false;
|
||||
Enabled2 = true;
|
||||
ButtonText = "停止服务";
|
||||
}
|
||||
else
|
||||
{
|
||||
logMessageList.Clear();
|
||||
Message = Guid.NewGuid().ToString();
|
||||
server.Dispose();
|
||||
server = null;
|
||||
List1.Clear(); List2.Clear(); List3.Clear(); List4.Clear();
|
||||
Enabled1 = true;
|
||||
Enabled2 = false;
|
||||
ButtonText = "开启服务";
|
||||
}
|
||||
}
|
||||
|
||||
private void LogDataChanged()
|
||||
{
|
||||
Dispatcher.UIThread.Invoke(() =>
|
||||
{
|
||||
try
|
||||
{
|
||||
logMessageList.Clear();
|
||||
string listBoxData;
|
||||
for (int i = 0; i < server.ModbusLogData.Length; i++)
|
||||
{
|
||||
if (server.ModbusLogData[i] == null)
|
||||
break;
|
||||
if (server.ModbusLogData[i].request)
|
||||
{
|
||||
listBoxData = server.ModbusLogData[i].timeStamp.ToString("H:mm:ss.ff") + " Request from Client - Functioncode: " + server.ModbusLogData[i].functionCode.ToString();
|
||||
if (server.ModbusLogData[i].functionCode <= 4)
|
||||
{
|
||||
listBoxData = listBoxData + " ; Starting Address: " + server.ModbusLogData[i].startingAdress.ToString() + " Quantity: " + server.ModbusLogData[i].quantity.ToString();
|
||||
}
|
||||
if (server.ModbusLogData[i].functionCode == 5)
|
||||
{
|
||||
listBoxData = listBoxData + " ; Output Address: " + server.ModbusLogData[i].startingAdress.ToString() + " Output Value: ";
|
||||
if (server.ModbusLogData[i].receiveCoilValues[0] == 0)
|
||||
listBoxData = listBoxData + "False";
|
||||
if (server.ModbusLogData[i].receiveCoilValues[0] == 0xFF00)
|
||||
listBoxData = listBoxData + "True";
|
||||
}
|
||||
if (server.ModbusLogData[i].functionCode == 6)
|
||||
{
|
||||
listBoxData = listBoxData + " ; Starting Address: " + server.ModbusLogData[i].startingAdress.ToString() + " Register Value: " + server.ModbusLogData[i].receiveRegisterValues[0].ToString();
|
||||
}
|
||||
if (server.ModbusLogData[i].functionCode == 15)
|
||||
{
|
||||
listBoxData = listBoxData + " ; Starting Address: " + server.ModbusLogData[i].startingAdress.ToString() + " Quantity: " + server.ModbusLogData[i].quantity.ToString() + " Byte Count: " + server.ModbusLogData[i].byteCount.ToString() + " Values Received: ";
|
||||
for (int j = 0; j < server.ModbusLogData[i].quantity; j++)
|
||||
{
|
||||
int shift = j % 16;
|
||||
if ((i == server.ModbusLogData[i].quantity - 1) & (server.ModbusLogData[i].quantity % 2 != 0))
|
||||
{
|
||||
if (shift < 8)
|
||||
shift = shift + 8;
|
||||
else
|
||||
shift = shift - 8;
|
||||
}
|
||||
int mask = 0x1;
|
||||
mask = mask << (shift);
|
||||
if ((server.ModbusLogData[i].receiveCoilValues[j / 16] & (ushort)mask) == 0)
|
||||
listBoxData = listBoxData + " False";
|
||||
else
|
||||
listBoxData = listBoxData + " True";
|
||||
}
|
||||
}
|
||||
if (server.ModbusLogData[i].functionCode == 16)
|
||||
{
|
||||
listBoxData = listBoxData + " ; Starting Address: " + server.ModbusLogData[i].startingAdress.ToString() + " Quantity: " + server.ModbusLogData[i].quantity.ToString() + " Byte Count: " + server.ModbusLogData[i].byteCount.ToString() + " Values Received: ";
|
||||
for (int j = 0; j < server.ModbusLogData[i].quantity; j++)
|
||||
{
|
||||
listBoxData = listBoxData + " " + server.ModbusLogData[i].receiveRegisterValues[j];
|
||||
}
|
||||
}
|
||||
if (server.ModbusLogData[i].functionCode == 23)
|
||||
{
|
||||
listBoxData = listBoxData + " ; Starting Address Read: " + server.ModbusLogData[i].startingAddressRead.ToString() + " ; Quantity Read: " + server.ModbusLogData[i].quantityRead.ToString() + " ; Starting Address Write: " + server.ModbusLogData[i].startingAddressWrite.ToString() + " ; Quantity Write: " + server.ModbusLogData[i].quantityWrite.ToString() + " ; Byte Count: " + server.ModbusLogData[i].byteCount.ToString() + " ; Values Received: ";
|
||||
for (int j = 0; j < server.ModbusLogData[i].quantityWrite; j++)
|
||||
{
|
||||
listBoxData = listBoxData + " " + server.ModbusLogData[i].receiveRegisterValues[j];
|
||||
}
|
||||
}
|
||||
|
||||
logMessageList.Add(listBoxData);
|
||||
}
|
||||
if (server.ModbusLogData[i].response)
|
||||
{
|
||||
if (server.ModbusLogData[i].exceptionCode > 0)
|
||||
{
|
||||
listBoxData = server.ModbusLogData[i].timeStamp.ToString("H:mm:ss.ff");
|
||||
listBoxData = listBoxData + (" Response To Client - Error code: " + Convert.ToString(server.ModbusLogData[i].errorCode, 16));
|
||||
listBoxData = listBoxData + " Exception Code: " + server.ModbusLogData[i].exceptionCode.ToString();
|
||||
logMessageList.Add(listBoxData);
|
||||
|
||||
|
||||
}
|
||||
else
|
||||
{
|
||||
listBoxData = (server.ModbusLogData[i].timeStamp.ToString("H:mm:ss.ff") + " Response To Client - Functioncode: " + server.ModbusLogData[i].functionCode.ToString());
|
||||
|
||||
if (server.ModbusLogData[i].functionCode <= 4)
|
||||
{
|
||||
listBoxData = listBoxData + " ; Bytecount: " + server.ModbusLogData[i].byteCount.ToString() + " ; Send values: ";
|
||||
}
|
||||
if (server.ModbusLogData[i].functionCode == 5)
|
||||
{
|
||||
listBoxData = listBoxData + " ; Starting Address: " + server.ModbusLogData[i].startingAdress.ToString() + " ; Output Value: ";
|
||||
if (server.ModbusLogData[i].receiveCoilValues[0] == 0)
|
||||
listBoxData = listBoxData + "False";
|
||||
if (server.ModbusLogData[i].receiveCoilValues[0] == 0xFF00)
|
||||
listBoxData = listBoxData + "True";
|
||||
}
|
||||
if (server.ModbusLogData[i].functionCode == 6)
|
||||
{
|
||||
listBoxData = listBoxData + " ; Starting Address: " + server.ModbusLogData[i].startingAdress.ToString() + " ; Register Value: " + server.ModbusLogData[i].receiveRegisterValues[0].ToString();
|
||||
}
|
||||
if (server.ModbusLogData[i].functionCode == 15)
|
||||
{
|
||||
listBoxData = listBoxData + " ; Starting Address: " + server.ModbusLogData[i].startingAdress.ToString() + " ; Quantity: " + server.ModbusLogData[i].quantity.ToString();
|
||||
}
|
||||
if (server.ModbusLogData[i].functionCode == 16)
|
||||
{
|
||||
listBoxData = listBoxData + " ; Starting Address: " + server.ModbusLogData[i].startingAdress.ToString() + " ; Quantity: " + server.ModbusLogData[i].quantity.ToString();
|
||||
}
|
||||
if (server.ModbusLogData[i].functionCode == 23)
|
||||
{
|
||||
listBoxData = listBoxData + " ; ByteCount: " + server.ModbusLogData[i].byteCount.ToString() + " ; Send Register Values: ";
|
||||
}
|
||||
if (server.ModbusLogData[i].sendCoilValues != null)
|
||||
{
|
||||
for (int j = 0; j < server.ModbusLogData[i].sendCoilValues.Length; j++)
|
||||
{
|
||||
listBoxData = listBoxData + server.ModbusLogData[i].sendCoilValues[j].ToString() + " ";
|
||||
}
|
||||
}
|
||||
if (server.ModbusLogData[i].sendRegisterValues != null)
|
||||
{
|
||||
for (int j = 0; j < server.ModbusLogData[i].sendRegisterValues.Length; j++)
|
||||
{
|
||||
listBoxData = listBoxData + server.ModbusLogData[i].sendRegisterValues[j].ToString() + " ";
|
||||
}
|
||||
}
|
||||
logMessageList.Add(listBoxData);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
catch (Exception) { }
|
||||
Message = Guid.NewGuid().ToString();
|
||||
});
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
private void SetEveryList()
|
||||
{
|
||||
ushort startAddress = StartAddress;
|
||||
List1.Clear();
|
||||
for (int i = startAddress; i < 10 + startAddress; i++)
|
||||
{
|
||||
MyDataGrid data = new MyDataGrid { Which = 1, Address = i, Value1 = server.coils[i + 1] };
|
||||
|
||||
if (server.coils[i + 1])
|
||||
{
|
||||
data.Color = "Green";
|
||||
}
|
||||
else
|
||||
{
|
||||
data.Color = "Red";
|
||||
}
|
||||
List1.Add(data);
|
||||
}
|
||||
|
||||
List2.Clear();
|
||||
for (int i = startAddress; i < 10 + startAddress; i++)
|
||||
{
|
||||
MyDataGrid data = new MyDataGrid { Which = 2, Address = i, Value1 = server.discreteInputs[i + 1] };
|
||||
if (server.discreteInputs[i + 1])
|
||||
{
|
||||
data.Color = "Green";
|
||||
}
|
||||
else
|
||||
{
|
||||
data.Color = "Red";
|
||||
}
|
||||
List2.Add(data);
|
||||
}
|
||||
|
||||
List3.Clear();
|
||||
for (int i = startAddress; i < 10 + startAddress; i++)
|
||||
{
|
||||
MyDataGrid data = new MyDataGrid { Which = 3, Address = i, Value2 = server.holdingRegisters[i + 1] };
|
||||
List3.Add(data);
|
||||
}
|
||||
|
||||
List4.Clear();
|
||||
for (int i = startAddress; i < 10 + startAddress; i++)
|
||||
{
|
||||
MyDataGrid data = new MyDataGrid { Which = 4, Address = i, Value2 = server.inputRegisters[i + 1] };
|
||||
List4.Add(data);
|
||||
}
|
||||
}
|
||||
|
||||
private void HoldingRegistersChanged(int register, int numberOfRegisters)
|
||||
{
|
||||
Dispatcher.UIThread.Invoke(() => { SetEveryList(); });
|
||||
}
|
||||
|
||||
private void CoilsChanged(int coil, int numberOfCoils)
|
||||
{
|
||||
Dispatcher.UIThread.Invoke(() => { SetEveryList(); });
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
public class MyDataGrid : ViewModelBase
|
||||
{
|
||||
public int Which { get; set; }
|
||||
public int Address { get; set; }
|
||||
|
||||
public bool Value1 { get; set; }
|
||||
public ushort Value2 { get; set; }
|
||||
public string Color { get; set; }
|
||||
}
|
||||
}
|
||||
190
常用工具集/ViewModels/01PLC通信调试/Modbus调试1ViewModel.cs
Normal file
190
常用工具集/ViewModels/01PLC通信调试/Modbus调试1ViewModel.cs
Normal file
@@ -0,0 +1,190 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using 常用工具集.Base;
|
||||
using MES.Utility.Network;
|
||||
using MES.Utility.Core;
|
||||
namespace 常用工具集.ViewModel._01PLC通信调试
|
||||
{
|
||||
public class Modbus调试1ViewModel : ViewModelBase
|
||||
{
|
||||
private ModbusHelper modbus;
|
||||
public bool Enabled1 { get; set; } = true;
|
||||
public bool Enabled2 { get; set; } = false;
|
||||
|
||||
|
||||
public string IpAddress { get; set; } = "192.168.1.100";
|
||||
public int Port { get; set; } = 502;
|
||||
|
||||
public ushort ReadAddress { get; set; } = 100;
|
||||
public ushort WriteAddress { get; set; } = 100;
|
||||
public ushort ReadCount { get; set; } = 5;
|
||||
public string ReadResult1 { get; set; } = "";
|
||||
public string ReadResult2 { get; set; } = "";
|
||||
public string ReadResult3 { get; set; } = "";
|
||||
public string ReadResult4 { get; set; } = "";
|
||||
public string WriteValue1 { get; set; } = "";
|
||||
public string WriteValue2 { get; set; } = "";
|
||||
public string WriteValue3 { get; set; } = "";
|
||||
public string WriteValue4 { get; set; } = "";
|
||||
|
||||
|
||||
public DelegateCommand ConnectCmd { get; set; }
|
||||
public DelegateCommand DisconnectCmd { get; set; }
|
||||
|
||||
|
||||
public DelegateCommand ReadCmd { get; set; } //1线圈 2状态. 3保持.4输入
|
||||
public DelegateCommand WriteCmd { get; set; } //1单个线圈 2单个保持. 3多个线圈 4多个保持
|
||||
|
||||
|
||||
public Modbus调试1ViewModel()
|
||||
{
|
||||
ConnectCmd = new DelegateCommand(ConnectCmdFunc);
|
||||
DisconnectCmd = new DelegateCommand(DisconnectCmdFunc);
|
||||
ReadCmd = new DelegateCommand(ReadCmdFunc);
|
||||
WriteCmd = new DelegateCommand(WriteCmdFunc);
|
||||
}
|
||||
|
||||
private void ConnectCmdFunc(object obj)
|
||||
{
|
||||
try
|
||||
{
|
||||
modbus = new ModbusHelper(IpAddress, Port);
|
||||
Enabled1 = false;
|
||||
Enabled2 = true;
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
modbus = null;
|
||||
GlobalValues.Error("连接失败");
|
||||
}
|
||||
}
|
||||
|
||||
private void DisconnectCmdFunc(object obj)
|
||||
{
|
||||
modbus.Dispose();
|
||||
modbus = null;
|
||||
ReadResult1 = ""; ReadResult2 = ""; ReadResult3 = ""; ReadResult4 = "";
|
||||
WriteValue1 = ""; WriteValue2 = ""; WriteValue3 = ""; WriteValue4 = "";
|
||||
Enabled1 = true;
|
||||
Enabled2 = false;
|
||||
}
|
||||
|
||||
private void ReadCmdFunc(object obj)
|
||||
{
|
||||
int cmd = Convert.ToInt32(obj.ToString());
|
||||
bool flag = false;
|
||||
switch (cmd)
|
||||
{
|
||||
case 1:
|
||||
flag = modbus.ReadCoils(ReadAddress, ReadCount, out bool[] values);
|
||||
if (!flag)
|
||||
{
|
||||
GlobalValues.Error("读取失败");
|
||||
DisconnectCmdFunc(null);
|
||||
return;
|
||||
}
|
||||
ReadResult1 = values.Select(it => it ? "1" : "0").ToList().GetStrArray(" ");
|
||||
return;
|
||||
case 2:
|
||||
flag = modbus.ReadInputs(ReadAddress, ReadCount, out bool[] values2);
|
||||
if (!flag)
|
||||
{
|
||||
GlobalValues.Error("读取失败");
|
||||
DisconnectCmdFunc(null);
|
||||
return;
|
||||
}
|
||||
ReadResult2 = values2.Select(it => it ? "1" : "0").ToList().GetStrArray(" ");
|
||||
return;
|
||||
case 3:
|
||||
flag = modbus.ReadHoldingRegisters(ReadAddress, ReadCount, out ushort[] values3);
|
||||
if (!flag)
|
||||
{
|
||||
GlobalValues.Error("读取失败");
|
||||
DisconnectCmdFunc(null);
|
||||
return;
|
||||
}
|
||||
ReadResult3 = values3.Select(it => Convert.ToString(it)).ToList().GetStrArray(" ");
|
||||
return;
|
||||
case 4:
|
||||
flag = modbus.ReadInputRegisters(ReadAddress, ReadCount, out ushort[] values4);
|
||||
if (!flag)
|
||||
{
|
||||
GlobalValues.Error("读取失败");
|
||||
DisconnectCmdFunc(null);
|
||||
return;
|
||||
}
|
||||
ReadResult4 = values4.Select(it => Convert.ToString(it)).ToList().GetStrArray(" "); ;
|
||||
return;
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
private void WriteCmdFunc(object obj)
|
||||
{
|
||||
try
|
||||
{
|
||||
int cmd = Convert.ToInt32(obj.ToString());
|
||||
bool flag = false;
|
||||
switch (cmd)
|
||||
{
|
||||
case 1:
|
||||
flag = modbus.WriteCoil(WriteAddress, WriteValue1 == "1" ? true : false);
|
||||
if (!flag)
|
||||
{
|
||||
GlobalValues.Error("写入失败");
|
||||
DisconnectCmdFunc(null);
|
||||
}
|
||||
else
|
||||
{
|
||||
GlobalValues.Success("写入成功");
|
||||
}
|
||||
return;
|
||||
case 2:
|
||||
flag = modbus.WriteRegister(WriteAddress, Convert.ToUInt16(WriteValue2));
|
||||
if (!flag)
|
||||
{
|
||||
GlobalValues.Error("写入失败");
|
||||
DisconnectCmdFunc(null);
|
||||
}
|
||||
else
|
||||
{
|
||||
GlobalValues.Success("写入成功");
|
||||
}
|
||||
return;
|
||||
case 3:
|
||||
List<bool> data1 = WriteValue3.Split(' ').Where(it => !it.IsNullOrEmpty()).Select(it => it == "1" ? true : false).ToList();
|
||||
flag = modbus.WriteCoils(WriteAddress, data1.ToArray());
|
||||
if (!flag)
|
||||
{
|
||||
GlobalValues.Error("写入失败");
|
||||
DisconnectCmdFunc(null);
|
||||
}
|
||||
else
|
||||
{
|
||||
GlobalValues.Success("写入成功");
|
||||
}
|
||||
return;
|
||||
case 4:
|
||||
List<ushort> data2 = WriteValue4.Split(' ').Where(it => !it.IsNullOrEmpty()).Select(it => Convert.ToUInt16(it)).ToList();
|
||||
flag = modbus.WriteRegisters(ReadAddress, data2.ToArray());
|
||||
if (!flag)
|
||||
{
|
||||
GlobalValues.Error("写入失败");
|
||||
DisconnectCmdFunc(null);
|
||||
}
|
||||
else
|
||||
{
|
||||
GlobalValues.Success("写入成功");
|
||||
}
|
||||
return;
|
||||
|
||||
}
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
GlobalValues.Error($"写入失败:{ex.Message}");
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
253
常用工具集/ViewModels/01PLC通信调试/Modbus调试2ViewModel.cs
Normal file
253
常用工具集/ViewModels/01PLC通信调试/Modbus调试2ViewModel.cs
Normal file
@@ -0,0 +1,253 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
using 常用工具集.Base;
|
||||
using MES.Utility.Network;
|
||||
using S7.Net;
|
||||
|
||||
namespace 常用工具集.ViewModel._01PLC通信调试
|
||||
{
|
||||
public class Modbus调试2ViewModel : ViewModelBase
|
||||
{
|
||||
public bool Enabled1 { get; set; } = true;
|
||||
public bool Enabled2 { get; set; } = false;
|
||||
public string IpAddress { get; set; } = "192.168.1.10";
|
||||
public int Port { get; set; } = 502;
|
||||
|
||||
public int Address { get; set; } = 4001;
|
||||
public int StringLength { get; set; } = 100;
|
||||
public string ReadedValue { get; set; } = "";
|
||||
public string Message { get; set; } = "";
|
||||
|
||||
public string SendedBytesValue { get; set; } = "";
|
||||
public string RecivedBytesValue { get; set; } = "";
|
||||
public string Int16Value { get; set; } = "";
|
||||
public string Int32Value { get; set; } = "";
|
||||
public string RealValue { get; set; } = "";
|
||||
public string StringValue { get; set; } = "";
|
||||
public string DoubleValue { get; set; } = "";
|
||||
public string LongValue { get; set; } = "";
|
||||
|
||||
//STRING DOUBLE INT64 INT32 INT16 REAL
|
||||
private ModbusHelper modbus;
|
||||
|
||||
public DelegateCommand ConnectCmd { get; set; }
|
||||
public DelegateCommand DisconnectCmd { get; set; }
|
||||
public DelegateCommand WriteCmd { get; set; }
|
||||
public DelegateCommand ReadCmd { get; set; }
|
||||
public Modbus调试2ViewModel()
|
||||
{
|
||||
ConnectCmd = new DelegateCommand(ConnectCmdFunc);
|
||||
DisconnectCmd = new DelegateCommand(DisconnectCmdFunc);
|
||||
ReadCmd = new DelegateCommand(ReadCmdFunc);
|
||||
WriteCmd = new DelegateCommand(WriteCmdFunc);
|
||||
}
|
||||
|
||||
private void ConnectCmdFunc(object obj)
|
||||
{
|
||||
try
|
||||
{
|
||||
modbus = new ModbusHelper(IpAddress, Port);
|
||||
modbus.OnSended += Modbus_OnSended;
|
||||
modbus.OnRecived += Modbus_OnRecived;
|
||||
Enabled1 = false;
|
||||
Enabled2 = true;
|
||||
}
|
||||
catch
|
||||
{
|
||||
GlobalValues.Error("连接失败");
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
private void DisconnectCmdFunc(object obj)
|
||||
{
|
||||
modbus.OnSended -= Modbus_OnSended;
|
||||
modbus.OnRecived -= Modbus_OnRecived;
|
||||
modbus.Dispose();
|
||||
modbus = null;
|
||||
Enabled1 = true;
|
||||
Enabled2 = false;
|
||||
}
|
||||
|
||||
private void ReadCmdFunc(object obj)
|
||||
{
|
||||
string cmd = obj.ToString();
|
||||
|
||||
ReadedValue = "";
|
||||
Message = "";
|
||||
SendedBytesValue = "";
|
||||
RecivedBytesValue = "";
|
||||
if (cmd == "INT16")
|
||||
{
|
||||
ushort value;
|
||||
bool flag = modbus.ReadHoldRegisterInt16(Address, out value);
|
||||
if (!flag)
|
||||
{
|
||||
Message = "读取失败";
|
||||
DisconnectCmdFunc(null);
|
||||
return;
|
||||
}
|
||||
Message = "读取成功";
|
||||
ReadedValue = value.ToString();
|
||||
}
|
||||
else if (cmd == "INT32")
|
||||
{
|
||||
int value;
|
||||
bool flag = modbus.ReadHoldRegisterInt32(Address, out value);
|
||||
if (!flag)
|
||||
{
|
||||
Message = "读取失败";
|
||||
DisconnectCmdFunc(null);
|
||||
return;
|
||||
}
|
||||
Message = "读取成功";
|
||||
ReadedValue = value.ToString();
|
||||
}
|
||||
else if (cmd == "INT64")
|
||||
{
|
||||
long value;
|
||||
bool flag = modbus.ReadHoldRegisterInt64(Address, out value);
|
||||
if (!flag)
|
||||
{
|
||||
Message = "读取失败";
|
||||
DisconnectCmdFunc(null);
|
||||
return;
|
||||
}
|
||||
Message = "读取成功";
|
||||
ReadedValue = value.ToString();
|
||||
}
|
||||
else if (cmd == "REAL")
|
||||
{
|
||||
float value;
|
||||
bool flag = modbus.ReadHoldRegisterFloat(Address, out value);
|
||||
if (!flag)
|
||||
{
|
||||
Message = "读取失败";
|
||||
DisconnectCmdFunc(null);
|
||||
return;
|
||||
}
|
||||
Message = "读取成功";
|
||||
ReadedValue = value.ToString();
|
||||
}
|
||||
else if (cmd == "DOUBLE")
|
||||
{
|
||||
double value;
|
||||
bool flag = modbus.ReadHoldRegisterDouble(Address, out value);
|
||||
if (!flag)
|
||||
{
|
||||
Message = "读取失败";
|
||||
DisconnectCmdFunc(null);
|
||||
return;
|
||||
}
|
||||
Message = "读取成功";
|
||||
ReadedValue = value.ToString();
|
||||
}
|
||||
else if (cmd == "STRING")
|
||||
{
|
||||
string value;
|
||||
bool flag = modbus.ReadHoldRegisterString(Address, StringLength, out value);
|
||||
if (!flag)
|
||||
{
|
||||
Message = "读取失败";
|
||||
DisconnectCmdFunc(null);
|
||||
return;
|
||||
}
|
||||
Message = "读取成功";
|
||||
ReadedValue = value.ToString();
|
||||
}
|
||||
|
||||
// DOUBLE
|
||||
|
||||
}
|
||||
|
||||
private void WriteCmdFunc(object obj)
|
||||
{
|
||||
string cmd = obj.ToString();
|
||||
ReadedValue = "";
|
||||
Message = "";
|
||||
SendedBytesValue = "";
|
||||
RecivedBytesValue = "";
|
||||
if (cmd == "INT16")
|
||||
{
|
||||
ushort value;
|
||||
bool flag = ushort.TryParse(Int16Value, out value);
|
||||
if (!flag)
|
||||
{
|
||||
Message = "请输入正确的数据";
|
||||
return;
|
||||
}
|
||||
flag = modbus.WriteHoldRegisterInt16(Address, value);
|
||||
Message = flag ? "写入成功" : "写入失败";
|
||||
}
|
||||
else if (cmd == "INT32")
|
||||
{
|
||||
int value;
|
||||
bool flag = int.TryParse(Int32Value, out value);
|
||||
if (!flag)
|
||||
{
|
||||
Message = "请输入正确的数据";
|
||||
return;
|
||||
}
|
||||
flag = modbus.WriteHoldRegisterInt32(Address, value);
|
||||
Message = flag ? "写入成功" : "写入失败";
|
||||
}
|
||||
else if (cmd == "INT64")
|
||||
{
|
||||
long value;
|
||||
bool flag = long.TryParse(LongValue, out value);
|
||||
if (!flag)
|
||||
{
|
||||
Message = "请输入正确的数据";
|
||||
return;
|
||||
}
|
||||
flag = modbus.WriteHoldRegisterInt64(Address, value);
|
||||
Message = flag ? "写入成功" : "写入失败";
|
||||
}
|
||||
else if (cmd == "REAL")
|
||||
{
|
||||
float value;
|
||||
bool flag = float.TryParse(RealValue, out value);
|
||||
if (!flag)
|
||||
{
|
||||
Message = "请输入正确的数据";
|
||||
return;
|
||||
}
|
||||
flag = modbus.WriteHoldRegisterFloat(Address, value);
|
||||
Message = flag ? "写入成功" : "写入失败";
|
||||
}
|
||||
else if (cmd == "DOUBLE")
|
||||
{
|
||||
double value;
|
||||
bool flag = double.TryParse(DoubleValue, out value);
|
||||
if (!flag)
|
||||
{
|
||||
Message = "请输入正确的数据";
|
||||
return;
|
||||
}
|
||||
flag = modbus.WriteHoldRegisterDouble(Address, value);
|
||||
Message = flag ? "写入成功" : "写入失败";
|
||||
}
|
||||
else if (cmd == "STRING")
|
||||
{
|
||||
bool flag = modbus.WriteHoldRegisterString(Address, StringLength, StringValue);
|
||||
Message = flag ? "写入成功" : "写入失败";
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
private void Modbus_OnRecived(byte[] bytes, string hexString)
|
||||
{
|
||||
RecivedBytesValue = hexString;
|
||||
}
|
||||
|
||||
private void Modbus_OnSended(byte[] bytes, string hexString)
|
||||
{
|
||||
SendedBytesValue = hexString;
|
||||
}
|
||||
}
|
||||
}
|
||||
389
常用工具集/ViewModels/01PLC通信调试/OPCUA调试ViewModel.cs
Normal file
389
常用工具集/ViewModels/01PLC通信调试/OPCUA调试ViewModel.cs
Normal file
@@ -0,0 +1,389 @@
|
||||
using System;
|
||||
using System.Collections.ObjectModel;
|
||||
using System.Linq;
|
||||
using 常用工具集.Base;
|
||||
using System.Threading;
|
||||
using OpcUaHelper;
|
||||
using Org.BouncyCastle.Crypto.Tls;
|
||||
using System.Threading.Tasks;
|
||||
using Opc.Ua.Client;
|
||||
using Opc.Ua;
|
||||
using Ursa.Controls;
|
||||
|
||||
namespace 常用工具集.ViewModel._01PLC通信调试
|
||||
{
|
||||
public class OPCUA调试ViewModel : ViewModelBase
|
||||
{
|
||||
private bool stop = false;
|
||||
private OpcUaClient client;
|
||||
private object _lock = new object();
|
||||
private Thread thread;
|
||||
public bool Enabled1 { get; set; } = true;
|
||||
public bool Enabled2 { get; set; } = false;
|
||||
|
||||
public string OpcServer { get; set; } = "opc.tcp://10.10.0.40";
|
||||
public string Node { get; set; } = "ns=4;s=|var|Inovance-ARM-Linux.Application.StorageDatas.gStorageDatas[10].MaterialInfo.Width";
|
||||
public string Result { get; set; } = "";
|
||||
|
||||
public string WriteValue { get; set; } = "";
|
||||
public string SelecedValue { get; set; } = "";
|
||||
public int SelectedIndex { get; set; } = -1;
|
||||
public ObservableCollection<MyNode> NodeList { get; set; } = new ObservableCollection<MyNode>();
|
||||
public DelegateCommand ConnectCmd { get; set; }
|
||||
public DelegateCommand DisconnectCmd { get; set; }
|
||||
public DelegateCommand SubscribeCmd { get; set; }
|
||||
public DelegateCommand ReadValueCmd { get; set; }
|
||||
public DelegateCommand WriteValueCmd { get; set; }
|
||||
public DelegateCommand CancelSubscribeCmd { get; set; }
|
||||
|
||||
public DelegateCommand OpenBrowerCmd { get; set; }
|
||||
public OPCUA调试ViewModel()
|
||||
{
|
||||
ConnectCmd = new DelegateCommand(ConnectCmdFunc);
|
||||
DisconnectCmd = new DelegateCommand(DisconnectCmdFunc);
|
||||
SubscribeCmd = new DelegateCommand(SubscribeCmdFunc);
|
||||
ReadValueCmd = new DelegateCommand(ReadValueCmdFunc);
|
||||
WriteValueCmd = new DelegateCommand(WriteValueCmdFunc);
|
||||
CancelSubscribeCmd = new DelegateCommand(CancelSubscribeCmdFunc);
|
||||
OpenBrowerCmd = new DelegateCommand(OpenBrowerCmdFunc);
|
||||
}
|
||||
|
||||
private void OpenBrowerCmdFunc(object obj)
|
||||
{
|
||||
//new OpcUaHelper.Forms.FormBrowseServer().Show();
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// 建立连接
|
||||
/// </summary>
|
||||
/// <param name="obj"></param>
|
||||
private void ConnectCmdFunc(object obj)
|
||||
{
|
||||
try
|
||||
{
|
||||
client = new OpcUaClient();
|
||||
DateTime start = DateTime.Now;
|
||||
bool connected = false;
|
||||
Task task = client.ConnectServer(OpcServer);
|
||||
while (true)
|
||||
{
|
||||
if (client.Connected)
|
||||
{
|
||||
connected = true;
|
||||
break;
|
||||
}
|
||||
if ((DateTime.Now - start).TotalMilliseconds > 1000)
|
||||
{
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (!connected)
|
||||
{
|
||||
GlobalValues.Error($"连接失败");
|
||||
client = null;
|
||||
return;
|
||||
}
|
||||
Enabled1 = false;
|
||||
Enabled2 = true;
|
||||
stop = false;
|
||||
thread = new Thread(() =>
|
||||
{
|
||||
while (true)
|
||||
{
|
||||
try
|
||||
{
|
||||
if (stop)
|
||||
{
|
||||
break;
|
||||
}
|
||||
Loop();
|
||||
Thread.Sleep(1000);
|
||||
}
|
||||
catch (ThreadInterruptedException ex)
|
||||
{
|
||||
break;
|
||||
}
|
||||
catch (Exception e)
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
});
|
||||
thread.Start();
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
GlobalValues.Error($"连接失败:{ex.Message}");
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// 断开连接
|
||||
/// </summary>
|
||||
/// <param name="obj"></param>
|
||||
private void DisconnectCmdFunc(object obj)
|
||||
{
|
||||
foreach (MyNode node in NodeList)
|
||||
{
|
||||
client.RemoveSubscription(node.NodeName);
|
||||
}
|
||||
NodeList.Clear();
|
||||
client.Disconnect();
|
||||
client = null;
|
||||
Enabled1 = true;
|
||||
Enabled2 = false;
|
||||
stop = true;
|
||||
thread.Interrupt();
|
||||
thread = null;
|
||||
}
|
||||
|
||||
|
||||
private void SubscribeCmdFunc(object obj)
|
||||
{
|
||||
string node = Node;
|
||||
if (NodeList.Any(x => x.NodeName == node))
|
||||
return;
|
||||
lock (_lock)
|
||||
{
|
||||
NodeList.Add(new MyNode { NodeName = node, Value = null });
|
||||
}
|
||||
client.AddSubscription(node, node, CallBack);
|
||||
}
|
||||
|
||||
private void CallBack(string key, MonitoredItem item, MonitoredItemNotificationEventArgs itemNotify)
|
||||
{
|
||||
MonitoredItemNotification notification = itemNotify.NotificationValue as MonitoredItemNotification;
|
||||
DataValue dataValue = notification.Value;
|
||||
bool isGood = StatusCode.IsGood(dataValue.StatusCode);
|
||||
if (isGood)
|
||||
{
|
||||
lock (_lock)
|
||||
{
|
||||
MyNode node = NodeList.Where(it => it.NodeName == key).FirstOrDefault();
|
||||
node.Value = dataValue.Value;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
lock (_lock)
|
||||
{
|
||||
MyNode node = NodeList.Where(it => it.NodeName == key).FirstOrDefault();
|
||||
node.Value = null;
|
||||
}
|
||||
}
|
||||
}
|
||||
private void ReadValueCmdFunc(object obj)
|
||||
{
|
||||
try
|
||||
{
|
||||
DataValue dataValue = client.ReadNode(new NodeId(Node));
|
||||
if (!StatusCode.IsGood(dataValue.StatusCode))
|
||||
{
|
||||
Result = "";
|
||||
GlobalValues.Error("读取失败");
|
||||
return;
|
||||
}
|
||||
Result = dataValue.Value.ToString();
|
||||
GlobalValues.Success($"读取成功");
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
Result = "";
|
||||
GlobalValues.Error($"读取失败:{ex.Message}");
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
private void WriteValueCmdFunc(object obj)
|
||||
{
|
||||
try
|
||||
{
|
||||
string cmd = obj.ToString();
|
||||
if (cmd == "bool")
|
||||
{
|
||||
bool value;
|
||||
bool flag = bool.TryParse(WriteValue, out value);
|
||||
if (!flag)
|
||||
{
|
||||
GlobalValues.Error("数据转换失败,请输入正确的数据");
|
||||
return;
|
||||
}
|
||||
flag = client.WriteNode<bool>(Node, value);
|
||||
if (!flag)
|
||||
{
|
||||
GlobalValues.Error("写入失败");
|
||||
return;
|
||||
}
|
||||
GlobalValues.Success("写入成功");
|
||||
}
|
||||
else if (cmd == "uint16")
|
||||
{
|
||||
ushort value;
|
||||
bool flag = ushort.TryParse(WriteValue, out value);
|
||||
if (!flag)
|
||||
{
|
||||
GlobalValues.Error("数据转换失败,请输入正确的数据");
|
||||
return;
|
||||
}
|
||||
flag = client.WriteNode<ushort>(Node, value);
|
||||
if (!flag)
|
||||
{
|
||||
GlobalValues.Error("写入失败");
|
||||
return;
|
||||
}
|
||||
GlobalValues.Success("写入成功");
|
||||
}
|
||||
else if (cmd == "int16")
|
||||
{
|
||||
short value;
|
||||
bool flag = short.TryParse(WriteValue, out value);
|
||||
if (!flag)
|
||||
{
|
||||
GlobalValues.Error("数据转换失败,请输入正确的数据");
|
||||
return;
|
||||
}
|
||||
flag = client.WriteNode<short>(Node, value);
|
||||
if (!flag)
|
||||
{
|
||||
GlobalValues.Error("写入失败");
|
||||
return;
|
||||
}
|
||||
GlobalValues.Success("写入成功");
|
||||
}
|
||||
else if (cmd == "int32")
|
||||
{
|
||||
int value;
|
||||
bool flag = int.TryParse(WriteValue, out value);
|
||||
if (!flag)
|
||||
{
|
||||
GlobalValues.Error("数据转换失败,请输入正确的数据");
|
||||
return;
|
||||
}
|
||||
flag = client.WriteNode<int>(Node, value);
|
||||
if (!flag)
|
||||
{
|
||||
GlobalValues.Error("写入失败");
|
||||
return;
|
||||
}
|
||||
GlobalValues.Success("写入成功");
|
||||
}
|
||||
else if (cmd == "int64")
|
||||
{
|
||||
long value;
|
||||
bool flag = long.TryParse(WriteValue, out value);
|
||||
if (!flag)
|
||||
{
|
||||
GlobalValues.Error("数据转换失败,请输入正确的数据");
|
||||
return;
|
||||
}
|
||||
flag = client.WriteNode<long>(Node, value);
|
||||
if (!flag)
|
||||
{
|
||||
GlobalValues.Error("写入失败");
|
||||
return;
|
||||
}
|
||||
GlobalValues.Success("写入成功");
|
||||
}
|
||||
else if (cmd == "float")
|
||||
{
|
||||
float value;
|
||||
bool flag = float.TryParse(WriteValue, out value);
|
||||
if (!flag)
|
||||
{
|
||||
GlobalValues.Error("数据转换失败,请输入正确的数据");
|
||||
return;
|
||||
}
|
||||
flag = client.WriteNode<float>(Node, value);
|
||||
if (!flag)
|
||||
{
|
||||
GlobalValues.Error("写入失败");
|
||||
return;
|
||||
}
|
||||
GlobalValues.Success("写入成功");
|
||||
}
|
||||
else if (cmd == "double")
|
||||
{
|
||||
double value;
|
||||
bool flag = double.TryParse(WriteValue, out value);
|
||||
if (!flag)
|
||||
{
|
||||
GlobalValues.Error("数据转换失败,请输入正确的数据");
|
||||
return;
|
||||
}
|
||||
flag = client.WriteNode<double>(Node, value);
|
||||
if (!flag)
|
||||
{
|
||||
GlobalValues.Error("写入失败");
|
||||
return;
|
||||
}
|
||||
GlobalValues.Success("写入成功");
|
||||
}
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
MessageBox.ShowAsync(ex.Message);
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 取消订阅
|
||||
/// </summary>
|
||||
/// <param name="obj"></param>
|
||||
private void CancelSubscribeCmdFunc(object obj)
|
||||
{
|
||||
try
|
||||
{
|
||||
if (SelectedIndex < 0)
|
||||
{
|
||||
return;
|
||||
}
|
||||
lock (_lock)
|
||||
{
|
||||
MyNode selectKey = NodeList[SelectedIndex];
|
||||
client.RemoveSubscription(selectKey.NodeName);
|
||||
NodeList.RemoveAt(SelectedIndex);
|
||||
}
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
private void Loop()
|
||||
{
|
||||
if (SelectedIndex < 0)
|
||||
{
|
||||
return;
|
||||
}
|
||||
lock (_lock)
|
||||
{
|
||||
MyNode selectKey = NodeList[SelectedIndex];
|
||||
object value = selectKey.Value;
|
||||
if (value == null)
|
||||
{
|
||||
SelecedValue = "";
|
||||
}
|
||||
else
|
||||
{
|
||||
SelecedValue = value.ToString();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public class MyNode : ViewModelBase
|
||||
{
|
||||
public string NodeName { get; set; }
|
||||
|
||||
public object Value { get; set; }
|
||||
}
|
||||
}
|
||||
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)
|
||||
{
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
242
常用工具集/ViewModels/01PLC通信调试/三菱MC协议ViewModel.cs
Normal file
242
常用工具集/ViewModels/01PLC通信调试/三菱MC协议ViewModel.cs
Normal file
@@ -0,0 +1,242 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
using 常用工具集.Base;
|
||||
using McProtocol;
|
||||
using McProtocol.Mitsubishi;
|
||||
|
||||
namespace 常用工具集.ViewModel._01PLC通信调试
|
||||
{
|
||||
public class 三菱MC协议ViewModel : ViewModelBase
|
||||
{
|
||||
public List<string> MCList { get; set; } = new List<string>() { "MC1E", "MC3E", "MC4E" };
|
||||
public int MCIndex { get; set; } = 1;
|
||||
|
||||
public bool Enabled1 { get; set; } = true;
|
||||
public bool Enabled2 { get; set; } = false;
|
||||
public string IpAddress { get; set; } = "127.0.0.1";
|
||||
public int Port { get; set; } = 5001;
|
||||
public string Address { get; set; } = "D100";
|
||||
public string Address2 { get; set; } = "D10";
|
||||
public int StringLength { get; set; } = 50;
|
||||
public string BoolValue { get; set; } = "true";
|
||||
public string Int16Value { get; set; } = "";
|
||||
public string Int32Value { get; set; } = "";
|
||||
public string RealValue { get; set; } = "";
|
||||
public string StringValue { get; set; } = "";
|
||||
public int BytesCount { get; set; } = 50;
|
||||
public string ReadedValue { get; set; } = "";
|
||||
public string Message { get; set; } = "";
|
||||
|
||||
public DelegateCommand ConnectCmd { get; set; }
|
||||
public DelegateCommand DisconnectCmd { get; set; }
|
||||
|
||||
public DelegateCommand ReadCmd { get; set; }
|
||||
public DelegateCommand WriteCmd { get; set; }
|
||||
private McHelper plc;
|
||||
public 三菱MC协议ViewModel()
|
||||
{
|
||||
ConnectCmd = new DelegateCommand(ConnectCmdFunc);
|
||||
DisconnectCmd = new DelegateCommand(DisconnectCmdFunc);
|
||||
ReadCmd = new DelegateCommand(ReadCmdFunc);
|
||||
WriteCmd = new DelegateCommand(WriteCmdFunc);
|
||||
}
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// 连接
|
||||
/// </summary>
|
||||
/// <param name="obj"></param>
|
||||
private void ConnectCmdFunc(object obj)
|
||||
{
|
||||
// // MC1E = 4, MC3E = 11, MC4E = 15
|
||||
if (MCIndex == 0)
|
||||
{
|
||||
this.plc = new McHelper(IpAddress, Port, McFrame.MC1E);
|
||||
}
|
||||
else if (MCIndex == 1)
|
||||
{
|
||||
this.plc = new McHelper(IpAddress, Port, McFrame.MC3E);
|
||||
}
|
||||
else if (MCIndex == 2)
|
||||
{
|
||||
this.plc = new McHelper(IpAddress, Port, McFrame.MC4E);
|
||||
}
|
||||
else
|
||||
{
|
||||
this.plc = new McHelper(IpAddress, Port);
|
||||
}
|
||||
|
||||
|
||||
bool flag = plc.Connect();
|
||||
if (flag)
|
||||
{
|
||||
Enabled2 = true;
|
||||
Enabled1 = false;
|
||||
}
|
||||
else
|
||||
{
|
||||
GlobalValues.Error("PLC连接失败");
|
||||
}
|
||||
}
|
||||
/// <summary>
|
||||
/// 断开连接
|
||||
/// </summary>
|
||||
/// <param name="obj"></param>
|
||||
private void DisconnectCmdFunc(object obj)
|
||||
{
|
||||
try { plc.Dispose(); } catch { }
|
||||
plc = null;
|
||||
Enabled1 = true;
|
||||
Enabled2 = false;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 读取操作
|
||||
/// </summary>
|
||||
/// <param name="obj"></param>
|
||||
private void ReadCmdFunc(object obj)
|
||||
{
|
||||
ReadedValue = string.Empty;
|
||||
Message = string.Empty;
|
||||
string cmd = obj.ToString();
|
||||
if (cmd == "BOOL")
|
||||
{
|
||||
//bool value;
|
||||
//bool flag = plc.ReadBool(Address, out value);
|
||||
//if (!flag)
|
||||
//{
|
||||
// ReadedValue = string.Empty;
|
||||
// Message = "读取失败";
|
||||
// return;
|
||||
//}
|
||||
//ReadedValue = value.ToString();
|
||||
Message = "该功能暂未实现";
|
||||
}
|
||||
else if (cmd == "INT16")
|
||||
{
|
||||
short value;
|
||||
bool flag = plc.ReadInt16(Address, out value);
|
||||
if (!flag)
|
||||
{
|
||||
ReadedValue = string.Empty;
|
||||
Message = "读取失败";
|
||||
return;
|
||||
}
|
||||
ReadedValue = value.ToString();
|
||||
Message = "读取成功";
|
||||
}
|
||||
else if (cmd == "INT32")
|
||||
{
|
||||
int value;
|
||||
bool flag = plc.ReadInt32(Address, out value);
|
||||
if (!flag)
|
||||
{
|
||||
ReadedValue = string.Empty;
|
||||
Message = "读取失败";
|
||||
return;
|
||||
}
|
||||
ReadedValue = value.ToString();
|
||||
Message = "读取成功";
|
||||
}
|
||||
else if (cmd == "REAL")
|
||||
{
|
||||
float value;
|
||||
bool flag = plc.ReadFloat(Address, out value);
|
||||
if (!flag)
|
||||
{
|
||||
ReadedValue = string.Empty;
|
||||
Message = "读取失败";
|
||||
return;
|
||||
}
|
||||
ReadedValue = value.ToString();
|
||||
Message = "读取成功";
|
||||
}
|
||||
else if (cmd == "STRING")
|
||||
{
|
||||
string value;
|
||||
bool flag = plc.ReadString(Address, StringLength, out value);
|
||||
if (!flag)
|
||||
{
|
||||
ReadedValue = string.Empty;
|
||||
Message = "读取失败";
|
||||
return;
|
||||
}
|
||||
ReadedValue = value.ToString();
|
||||
Message = "读取成功";
|
||||
}
|
||||
else if (cmd == "Bytes")
|
||||
{
|
||||
//ReadedValue = string.Empty;
|
||||
//Message = string.Empty;
|
||||
//byte[] value;
|
||||
//bool flag = plc.ReadBytes(Address2, BytesCount, out value);
|
||||
//if (!flag)
|
||||
//{
|
||||
// ReadedValue = string.Empty;
|
||||
// Message = "读取失败";
|
||||
// return;
|
||||
//}
|
||||
//ReadedValue = ToHexStrFromByte(value);
|
||||
Message = "该功能暂未实现";
|
||||
}
|
||||
}
|
||||
|
||||
private void WriteCmdFunc(object obj)
|
||||
{
|
||||
ReadedValue = string.Empty;
|
||||
Message = string.Empty;
|
||||
string cmd = obj.ToString();
|
||||
if (cmd == "BOOL")
|
||||
{
|
||||
Message = "该功能有问题,已弃用";
|
||||
return;
|
||||
}
|
||||
else if (cmd == "INT16")
|
||||
{
|
||||
short value;
|
||||
bool flag = short.TryParse(Int16Value, out value);
|
||||
if (!flag)
|
||||
{
|
||||
Message = "请输入正确的数据";
|
||||
return;
|
||||
}
|
||||
flag = plc.WriteInt16(Address, value);
|
||||
Message = flag ? "写入成功" : "写入失败";
|
||||
}
|
||||
else if (cmd == "INT32")
|
||||
{
|
||||
int value;
|
||||
bool flag = int.TryParse(Int32Value, out value);
|
||||
if (!flag)
|
||||
{
|
||||
Message = "请输入正确的数据";
|
||||
return;
|
||||
}
|
||||
flag = plc.WriteInt32(Address, value);
|
||||
Message = flag ? "写入成功" : "写入失败";
|
||||
}
|
||||
else if (cmd == "REAL")
|
||||
{
|
||||
float value;
|
||||
bool flag = float.TryParse(RealValue, out value);
|
||||
if (!flag)
|
||||
{
|
||||
Message = "请输入正确的数据";
|
||||
return;
|
||||
}
|
||||
flag = plc.WriteFloat(Address, value);
|
||||
Message = flag ? "写入成功" : "写入失败";
|
||||
}
|
||||
else if (cmd == "STRING")
|
||||
{
|
||||
bool flag = plc.WriteString(Address, StringLength, StringValue);
|
||||
Message = flag ? "写入成功" : "写入失败";
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
}
|
||||
292
常用工具集/ViewModels/01PLC通信调试/串口调试工具ViewModel.cs
Normal file
292
常用工具集/ViewModels/01PLC通信调试/串口调试工具ViewModel.cs
Normal file
@@ -0,0 +1,292 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.IO.Ports;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
using System.Windows.Forms;
|
||||
using SerialDebug;
|
||||
using 常用工具集.Base;
|
||||
using MES.Utility.Core;
|
||||
using System.IO;
|
||||
using System.Text.RegularExpressions;
|
||||
using System.Threading;
|
||||
|
||||
namespace 常用工具集.ViewModel._01PLC通信调试
|
||||
{
|
||||
public class 串口调试工具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 List<string> SerialList { get; set; }
|
||||
public int SerialIndex { get; set; } = 0;
|
||||
|
||||
/// <summary>
|
||||
/// 波特率
|
||||
/// </summary>
|
||||
public List<int> BaudRateList { get; set; }
|
||||
public int BaudRateIndex { get; set; } = 0;
|
||||
//校验
|
||||
public List<string> ParityList { get; set; }
|
||||
public int ParityIndex { get; set; } = 0;
|
||||
|
||||
//数据为
|
||||
public List<int> DataBitList { get; set; }
|
||||
public int DataBitIndex { get; set; } = 0;
|
||||
|
||||
//数据为
|
||||
public List<string> FlowControlList { get; set; } = new List<string>() { "None", "XOnXOff", "RequestToSend", "RequestToSendXOnXOff" };
|
||||
|
||||
public int FlowControlIndex { get; set; } = 0;
|
||||
//停止位
|
||||
public List<string> StopBitList { get; set; }
|
||||
public int StopBitIndex { get; set; } = 0;
|
||||
|
||||
public int Timeout { get; set; } = 100;
|
||||
|
||||
|
||||
public bool RTSChecked { get; set; } = true;
|
||||
|
||||
|
||||
public bool DTRChecked { get; set; } = false;
|
||||
|
||||
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 CSerialDebug sp;
|
||||
public 串口调试工具ViewModel()
|
||||
{
|
||||
serialPort = new SerialPort();
|
||||
sp = new CSerialDebug(serialPort);
|
||||
//串口号
|
||||
string[] portNames = SerialPort.GetPortNames();
|
||||
if (portNames != null && portNames.Length > 0)
|
||||
{
|
||||
SerialList = portNames.ToList();
|
||||
}
|
||||
//波特率
|
||||
BaudRateList = new List<int>() { 110, 300, 600, 1200, 2400, 4800, 9600, 14400, 19200, 38400, 56000, 57600, 115200, 128000 };
|
||||
BaudRateIndex = 6;
|
||||
//校验
|
||||
ParityList = new List<string> { "None", "Odd", "Even", "Mark", "Space" };
|
||||
ParityIndex = 0;
|
||||
//数据位
|
||||
DataBitList = new List<int> { 5, 6, 7, 8 };
|
||||
DataBitIndex = 3;
|
||||
//停止位
|
||||
StopBitList = new List<string> { "None", "One", "Two", "OnePointFive" };
|
||||
StopBitIndex = 1;
|
||||
|
||||
//打开关闭串口
|
||||
OpenSerialCmd = new DelegateCommand(OpenSerialCmdFunc);
|
||||
ClearReciveCmd = new DelegateCommand(ClearReciveCmdFunc);
|
||||
ClearSendCmd = new DelegateCommand(ClearSendCmdFunc);
|
||||
SendCmd = new DelegateCommand(SendCmdFunc);
|
||||
}
|
||||
|
||||
private void OpenSerialCmdFunc(object obj)
|
||||
{
|
||||
try
|
||||
{
|
||||
if (ButtonText == "打开")
|
||||
{
|
||||
serialPort.PortName = SerialList[SerialIndex];
|
||||
serialPort.BaudRate = BaudRateList[BaudRateIndex];
|
||||
serialPort.Parity = (Parity)ParityIndex;
|
||||
serialPort.DataBits = DataBitList[DataBitIndex];
|
||||
serialPort.StopBits = (StopBits)StopBitIndex;
|
||||
serialPort.Handshake = (Handshake)FlowControlIndex;
|
||||
serialPort.DtrEnable = DTRChecked;
|
||||
serialPort.RtsEnable = RTSChecked;
|
||||
serialPort.ReadBufferSize = 2 * 1024 * 1024;// 2M
|
||||
|
||||
sp.ReceiveTimeOut = Timeout;
|
||||
sp.Start();
|
||||
sp.ReceivedEvent += new CSerialDebug.ReceivedEventHandler(sp_ReceivedEvent);
|
||||
sp.SendCompletedEvent += new CSerialDebug.SendCompletedEventHandler(sp_SendCompletedEvent);
|
||||
sp.SendOverEvent += new EventHandler(sp_SendOverEvent);
|
||||
ButtonText = "关闭";
|
||||
Enabled1 = false;
|
||||
Enabled2 = true;
|
||||
}
|
||||
else
|
||||
{
|
||||
sp.StopSend();
|
||||
sp.ReceivedEvent -= new CSerialDebug.ReceivedEventHandler(sp_ReceivedEvent);
|
||||
sp.SendCompletedEvent -= new CSerialDebug.SendCompletedEventHandler(sp_SendCompletedEvent);
|
||||
sp.SendOverEvent -= new EventHandler(sp_SendOverEvent);
|
||||
sp.Stop();
|
||||
ButtonText = "打开";
|
||||
Enabled1 = true;
|
||||
Enabled2 = false;
|
||||
}
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
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 (SendContent.IsNullOrEmpty())
|
||||
{
|
||||
GlobalValues.Error("没有任何可发送的数据");
|
||||
return;
|
||||
}
|
||||
//要发送的数据
|
||||
List<CSendParam> list = new List<CSendParam>();
|
||||
SendParamFormat format = SendParamFormat.ASCII;
|
||||
if (SendHexChecked)
|
||||
{
|
||||
format = SendParamFormat.Hex;
|
||||
}
|
||||
int sendInterval = Convert.ToInt32(CycleTime);
|
||||
CSendParam param = new CSendParam(format, SendParamMode.SendAfterLastSend, sendInterval, SendContent, ConvertChecked);
|
||||
list.Add(param);
|
||||
if (CycleChecked)
|
||||
{
|
||||
sp.Send(list, 0);
|
||||
}
|
||||
else
|
||||
{
|
||||
sp.Send(list, 1);
|
||||
}
|
||||
|
||||
}
|
||||
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)
|
||||
{
|
||||
}
|
||||
}
|
||||
}
|
||||
635
常用工具集/ViewModels/01PLC通信调试/倍福ADS调试ViewModel.cs
Normal file
635
常用工具集/ViewModels/01PLC通信调试/倍福ADS调试ViewModel.cs
Normal file
@@ -0,0 +1,635 @@
|
||||
using System;
|
||||
using 常用工具集.Base;
|
||||
using System.Collections.Generic;
|
||||
using MES.Utility.Core;
|
||||
using System.Text;
|
||||
using System.Linq;
|
||||
using TwinCAT.Ads.TypeSystem;
|
||||
using TwinCAT.Ads;
|
||||
|
||||
namespace 常用工具集.ViewModel._01PLC通信调试
|
||||
{
|
||||
public class 倍福ADS调试ViewModel : ViewModelBase
|
||||
{
|
||||
public bool Enabled1 { get; set; } = true;
|
||||
public bool Enabled2 { get; set; } = false;
|
||||
public string NetId { get; set; } = "192.168.1.10.1.1";
|
||||
public int Port { get; set; } = 851;
|
||||
|
||||
public string VarName { get; set; } = "Global_LaserCutting.gHmiPlc.Output.Mes.DeviceStatus.bEMG";
|
||||
public int StringLength { get; set; } = 80;
|
||||
public string DataType { get; set; } = "";
|
||||
public string ReadedValue { get; set; } = "";
|
||||
public string Message1 { get; set; } = "";
|
||||
public string Message2 { get; set; } = "";
|
||||
|
||||
public string BoolValue { get; set; } = "";
|
||||
|
||||
private AdsServer ads;
|
||||
|
||||
public DelegateCommand ConnectCmd { get; set; }
|
||||
public DelegateCommand DisconnectCmd { get; set; }
|
||||
public DelegateCommand WriteCmd { get; set; }
|
||||
public DelegateCommand ReadCmd { get; set; }
|
||||
public 倍福ADS调试ViewModel()
|
||||
{
|
||||
ConnectCmd = new DelegateCommand(ConnectCmdFunc);
|
||||
DisconnectCmd = new DelegateCommand(DisconnectCmdFunc);
|
||||
ReadCmd = new DelegateCommand(ReadCmdFunc);
|
||||
WriteCmd = new DelegateCommand(WriteCmdFunc);
|
||||
}
|
||||
|
||||
private void ConnectCmdFunc(object obj)
|
||||
{
|
||||
try
|
||||
{
|
||||
ads = new AdsServer(NetId, Port);
|
||||
ads.Connect();
|
||||
Enabled1 = false;
|
||||
Enabled2 = true;
|
||||
}
|
||||
catch
|
||||
{
|
||||
GlobalValues.Error("连接失败");
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
private void DisconnectCmdFunc(object obj)
|
||||
{
|
||||
ads.Disconnect();
|
||||
ads = null;
|
||||
Enabled1 = true;
|
||||
Enabled2 = false;
|
||||
}
|
||||
|
||||
private void ReadCmdFunc(object obj)
|
||||
{
|
||||
string cmd = obj.ToString();
|
||||
ReadedValue = "";
|
||||
Message1 = "";
|
||||
DataType = "";
|
||||
try
|
||||
{
|
||||
object value = ads.Read(VarName, out string type);
|
||||
Message1 = "读取成功";
|
||||
DataType = type;
|
||||
if (value.GetType().IsArray)
|
||||
{
|
||||
Array array = value as Array;
|
||||
List<string> list = new List<string>();
|
||||
for (int i = 0; i < array.Length; i++)
|
||||
{
|
||||
list.Add(array.GetValue(i).ToString());
|
||||
}
|
||||
ReadedValue = list.GetStrArray(" ");
|
||||
}
|
||||
else
|
||||
{
|
||||
ReadedValue = value.ToString();
|
||||
}
|
||||
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
Message1 = $"读取失败:{ex.Message}";
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
private void WriteCmdFunc(object obj)
|
||||
{
|
||||
string cmd = obj.ToString();
|
||||
try
|
||||
{
|
||||
|
||||
if (string.IsNullOrEmpty(BoolValue))
|
||||
{
|
||||
Message2 = "请输入数据";
|
||||
return;
|
||||
}
|
||||
ads.Write(VarName, BoolValue);
|
||||
Message2 = $"写入成功";
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
Message2 = $"写入失败:{ex.Message}";
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
public class AdsServer
|
||||
{
|
||||
Dictionary<string, IAdsSymbol> symbolDict = new Dictionary<string, IAdsSymbol>();
|
||||
|
||||
public delegate void TcAdsStateChangedEventHandler(AdsState state);
|
||||
public delegate void TcAdsRouteChangedEventHandler(AmsRouterState state);
|
||||
public AmsRouterState AsmRouteState { get; set; } = AmsRouterState.Stop;
|
||||
public AdsState AdsState { get; set; } = AdsState.Stop;
|
||||
|
||||
public AdsClient ads;
|
||||
|
||||
public bool SystemIsRunning => ads.IsConnected;
|
||||
|
||||
private TcAdsRouteChangedEventHandler tcAdsSystemStateChangedHandler;
|
||||
public event TcAdsRouteChangedEventHandler TcSystemStateChanged
|
||||
{
|
||||
add
|
||||
{
|
||||
this.tcAdsSystemStateChangedHandler = (TcAdsRouteChangedEventHandler)Delegate.Combine(this.tcAdsSystemStateChangedHandler, value);
|
||||
value(AsmRouteState);
|
||||
}
|
||||
remove
|
||||
{
|
||||
this.tcAdsSystemStateChangedHandler = (TcAdsRouteChangedEventHandler)Delegate.Remove(this.tcAdsSystemStateChangedHandler, value);
|
||||
}
|
||||
}
|
||||
|
||||
private TcAdsStateChangedEventHandler tcAdsClientStateChangedHandler;
|
||||
public event TcAdsStateChangedEventHandler TcPlcStateChanged
|
||||
{
|
||||
add
|
||||
{
|
||||
this.tcAdsClientStateChangedHandler = (TcAdsStateChangedEventHandler)Delegate.Combine(this.tcAdsClientStateChangedHandler, value);
|
||||
value(AdsState);
|
||||
}
|
||||
remove
|
||||
{
|
||||
this.tcAdsClientStateChangedHandler = (TcAdsStateChangedEventHandler)Delegate.Remove(this.tcAdsClientStateChangedHandler, value);
|
||||
}
|
||||
}
|
||||
|
||||
private int _clientPortNr = 801;
|
||||
|
||||
private string _netId = "";
|
||||
|
||||
public AdsServer(string netId, int portNr)
|
||||
{
|
||||
this._netId = netId;
|
||||
this._clientPortNr = portNr;
|
||||
ads = new AdsClient();
|
||||
ads.RouterStateChanged += Client_AmsRouterNotification;
|
||||
ads.AdsStateChanged += Client_AdsStateChanged;
|
||||
}
|
||||
|
||||
private void Client_AmsRouterNotification(object sender, AmsRouterNotificationEventArgs e)
|
||||
{
|
||||
AsmRouteState = e.State;
|
||||
tcAdsSystemStateChangedHandler?.Invoke(AsmRouteState);
|
||||
}
|
||||
|
||||
public void Connect()
|
||||
{
|
||||
ads.Connect(this._netId, this._clientPortNr);
|
||||
|
||||
}
|
||||
|
||||
public void Disconnect()
|
||||
{
|
||||
ads.Disconnect();
|
||||
ads.Dispose();
|
||||
}
|
||||
|
||||
private void Client_AdsStateChanged(object sender, AdsStateChangedEventArgs e)
|
||||
{
|
||||
AdsState = e.State.AdsState;
|
||||
tcAdsClientStateChangedHandler?.Invoke(AdsState);
|
||||
}
|
||||
|
||||
|
||||
public object Read(string symbolPath, out string oDataType)
|
||||
{
|
||||
if (!SystemIsRunning)
|
||||
{
|
||||
throw new Exception("PLC链接失败");
|
||||
}
|
||||
//bool isArray = symbolPath.Contains("[") && symbolPath.Contains("]");
|
||||
//int index1 = symbolPath.IndexOf("["); int index2 = symbolPath.IndexOf("]");
|
||||
//uint index = uint.Parse(symbolPath.Substring(index1 + 1, index2 - index1 - 1));
|
||||
//symbolPath = symbolPath.Substring(0, index1);
|
||||
|
||||
IAdsSymbol symbol = null;
|
||||
if (symbolDict.ContainsKey(symbolPath))
|
||||
{
|
||||
symbol = symbolDict[symbolPath];
|
||||
}
|
||||
else
|
||||
{
|
||||
symbol = ads.ReadSymbol(symbolPath);
|
||||
if (symbol == null)
|
||||
throw new Exception("找不到该变量");
|
||||
symbolDict.Add(symbolPath, symbol);
|
||||
}
|
||||
oDataType = symbol.TypeName;
|
||||
if (symbol.TypeName.Substring(0, 3) != "ARR")
|
||||
{
|
||||
AdsDataTypeId datatype = symbol.DataTypeId;
|
||||
//BOOL
|
||||
if (datatype == AdsDataTypeId.ADST_BIT)
|
||||
return ads.ReadAny((uint)symbol.IndexGroup, (uint)symbol.IndexOffset, typeof(bool));
|
||||
//byte
|
||||
if (datatype == AdsDataTypeId.ADST_UINT8)
|
||||
return ads.ReadAny((uint)symbol.IndexGroup, (uint)symbol.IndexOffset, typeof(byte));
|
||||
//sbyte
|
||||
if (datatype == AdsDataTypeId.ADST_INT8)
|
||||
return ads.ReadAny((uint)symbol.IndexGroup, (uint)symbol.IndexOffset, typeof(sbyte));
|
||||
//ushort
|
||||
if (datatype == AdsDataTypeId.ADST_UINT16)
|
||||
return ads.ReadAny((uint)symbol.IndexGroup, (uint)symbol.IndexOffset, typeof(ushort));
|
||||
//short
|
||||
if (datatype == AdsDataTypeId.ADST_INT16)
|
||||
return ads.ReadAny((uint)symbol.IndexGroup, (uint)symbol.IndexOffset, typeof(short));
|
||||
if (datatype == AdsDataTypeId.ADST_UINT32)
|
||||
return ads.ReadAny((uint)symbol.IndexGroup, (uint)symbol.IndexOffset, typeof(uint));
|
||||
if (datatype == AdsDataTypeId.ADST_INT32)
|
||||
return ads.ReadAny((uint)symbol.IndexGroup, (uint)symbol.IndexOffset, typeof(int));
|
||||
if (datatype == AdsDataTypeId.ADST_REAL32)
|
||||
return ads.ReadAny((uint)symbol.IndexGroup, (uint)symbol.IndexOffset, typeof(float));
|
||||
if (datatype == AdsDataTypeId.ADST_REAL64)
|
||||
return ads.ReadAny((uint)symbol.IndexGroup, (uint)symbol.IndexOffset, typeof(double));
|
||||
if (datatype == AdsDataTypeId.ADST_STRING)
|
||||
return ads.ReadAnyString((uint)symbol.IndexGroup, (uint)symbol.IndexOffset, symbol.Size, Encoding.Default);
|
||||
if (datatype == AdsDataTypeId.ADST_WSTRING)
|
||||
{
|
||||
Memory<byte> stream = new Memory<byte>(new byte[symbol.Size]);
|
||||
int readLength = ads.Read((uint)symbol.IndexGroup, (uint)symbol.IndexOffset, stream);
|
||||
byte[] bytes = stream.ToArray().ToList().Take(readLength).ToArray();
|
||||
int charCount = readLength / 2;
|
||||
char[] charArray = new char[charCount];
|
||||
for (int i = 0; i < charCount; i++)
|
||||
{
|
||||
char value = (char)(bytes[i * 2 + 1] << 8 | bytes[i * 2]);
|
||||
charArray[i] = value;
|
||||
if (value == 0)
|
||||
break;
|
||||
}
|
||||
return new String(charArray).Trim('\0');
|
||||
}
|
||||
if (datatype == AdsDataTypeId.ADST_BIGTYPE)
|
||||
{
|
||||
if (symbol.TypeName.StartsWith("TIME") || symbol.TypeName.StartsWith("DATE") || symbol.TypeName.StartsWith("TOD"))
|
||||
{
|
||||
return ads.ReadAny((uint)symbol.IndexGroup, (uint)symbol.IndexOffset, typeof(DateTime));
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
AdsDataTypeId datatype = symbol.DataTypeId;
|
||||
if (datatype == AdsDataTypeId.ADST_BIT)
|
||||
{
|
||||
//if (isArray)
|
||||
//{
|
||||
// return (bool)ads.ReadAny((uint)symbol.IndexGroup, (uint)symbol.IndexOffset + index, typeof(bool));
|
||||
//}
|
||||
bool[] values = new bool[symbol.Size];
|
||||
for (uint i = 0; i < symbol.Size; i++)
|
||||
{
|
||||
values[i] = (bool)ads.ReadAny((uint)symbol.IndexGroup, (uint)symbol.IndexOffset + i, typeof(bool));
|
||||
}
|
||||
return values;
|
||||
}
|
||||
|
||||
//byte
|
||||
if (datatype == AdsDataTypeId.ADST_UINT8)
|
||||
{
|
||||
//if (isArray)
|
||||
//{
|
||||
// return (byte)ads.ReadAny((uint)symbol.IndexGroup, (uint)symbol.IndexOffset + index, typeof(byte)); ;
|
||||
//}
|
||||
byte[] values = new byte[symbol.Size];
|
||||
for (uint i = 0; i < symbol.Size; i++)
|
||||
{
|
||||
values[i] = (byte)ads.ReadAny((uint)symbol.IndexGroup, (uint)symbol.IndexOffset + i, typeof(byte));
|
||||
}
|
||||
return values;
|
||||
}
|
||||
//sbyte
|
||||
if (datatype == AdsDataTypeId.ADST_INT8)
|
||||
{
|
||||
//if (isArray)
|
||||
//{
|
||||
// return (sbyte)ads.ReadAny((uint)symbol.IndexGroup, (uint)symbol.IndexOffset + index, typeof(sbyte));
|
||||
//}
|
||||
sbyte[] values = new sbyte[symbol.Size];
|
||||
for (uint i = 0; i < symbol.Size; i++)
|
||||
{
|
||||
values[i] = (sbyte)ads.ReadAny((uint)symbol.IndexGroup, (uint)symbol.IndexOffset + i, typeof(sbyte));
|
||||
}
|
||||
return values;
|
||||
}
|
||||
//ushort
|
||||
if (datatype == AdsDataTypeId.ADST_UINT16)
|
||||
{
|
||||
//if (isArray)
|
||||
//{
|
||||
// return (ushort)ads.ReadAny((uint)symbol.IndexGroup, (uint)symbol.IndexOffset + (index * 2U), typeof(ushort));
|
||||
//}
|
||||
int count = symbol.Size / 2;
|
||||
ushort[] values = new ushort[count];
|
||||
for (uint i = 0; i < count; i++)
|
||||
{
|
||||
values[i] = (ushort)ads.ReadAny((uint)symbol.IndexGroup, (uint)symbol.IndexOffset + (i * 2U), typeof(ushort));
|
||||
}
|
||||
return values;
|
||||
}
|
||||
//short
|
||||
if (datatype == AdsDataTypeId.ADST_INT16)
|
||||
{
|
||||
//if (isArray)
|
||||
//{
|
||||
// return (short)ads.ReadAny((uint)symbol.IndexGroup, (uint)symbol.IndexOffset + (index * 2U), typeof(short));
|
||||
//}
|
||||
int count = symbol.Size / 2;
|
||||
short[] values = new short[count];
|
||||
for (uint i = 0; i < count; i++)
|
||||
{
|
||||
values[i] = (short)ads.ReadAny((uint)symbol.IndexGroup, (uint)symbol.IndexOffset + (i * 2U), typeof(short));
|
||||
}
|
||||
return values;
|
||||
}
|
||||
if (datatype == AdsDataTypeId.ADST_UINT32)
|
||||
{
|
||||
//if (isArray)
|
||||
//{
|
||||
// return (uint)ads.ReadAny((uint)symbol.IndexGroup, (uint)symbol.IndexOffset + (index * 4U), typeof(uint));
|
||||
//}
|
||||
int count = symbol.Size / 4;
|
||||
uint[] values = new uint[count];
|
||||
for (uint i = 0; i < count; i++)
|
||||
{
|
||||
values[i] = (uint)ads.ReadAny((uint)symbol.IndexGroup, (uint)symbol.IndexOffset + (i * 4U), typeof(uint));
|
||||
}
|
||||
return values;
|
||||
}
|
||||
if (datatype == AdsDataTypeId.ADST_INT32)
|
||||
{
|
||||
//if (isArray)
|
||||
//{
|
||||
// return (int)ads.ReadAny((uint)symbol.IndexGroup, (uint)symbol.IndexOffset + (index * 4U), typeof(int));
|
||||
//}
|
||||
int count = symbol.Size / 4;
|
||||
int[] values = new int[count];
|
||||
for (uint i = 0; i < count; i++)
|
||||
{
|
||||
values[i] = (int)ads.ReadAny((uint)symbol.IndexGroup, (uint)symbol.IndexOffset + (i * 4U), typeof(int));
|
||||
}
|
||||
return values;
|
||||
}
|
||||
if (datatype == AdsDataTypeId.ADST_REAL32)
|
||||
{
|
||||
//if (isArray)
|
||||
//{
|
||||
// return (float)ads.ReadAny((uint)symbol.IndexGroup, (uint)symbol.IndexOffset + (index * 4U), typeof(float));
|
||||
//}
|
||||
int count = symbol.Size / 4;
|
||||
float[] values = new float[count];
|
||||
for (uint i = 0; i < count; i++)
|
||||
{
|
||||
values[i] = (float)ads.ReadAny((uint)symbol.IndexGroup, (uint)symbol.IndexOffset + (i * 4U), typeof(float));
|
||||
}
|
||||
return values;
|
||||
}
|
||||
if (datatype == AdsDataTypeId.ADST_REAL64)
|
||||
{
|
||||
//if (isArray)
|
||||
//{
|
||||
// return (double)ads.ReadAny((uint)symbol.IndexGroup, (uint)symbol.IndexOffset + (index * 8U), typeof(double));
|
||||
//}
|
||||
int count = symbol.Size / 8;
|
||||
double[] values = new double[count];
|
||||
for (uint i = 0; i < count; i++)
|
||||
{
|
||||
values[i] = (double)ads.ReadAny((uint)symbol.IndexGroup, (uint)symbol.IndexOffset + (i * 8U), typeof(double));
|
||||
}
|
||||
return values;
|
||||
}
|
||||
//TC3 字符串数组为 ADST_STRING
|
||||
if (datatype == AdsDataTypeId.ADST_STRING)
|
||||
{
|
||||
int every = 81;
|
||||
if (symbol.TypeName.Contains("OF STRING"))
|
||||
{
|
||||
int index = symbol.TypeName.IndexOf("OF STRING(");
|
||||
if (index != 1)
|
||||
{
|
||||
int index2 = symbol.TypeName.LastIndexOf(")");
|
||||
every = Convert.ToInt32(symbol.TypeName.Substring(index + 10, index2 - index - 10)) + 1;
|
||||
}
|
||||
int count = symbol.Size / every;
|
||||
string[] values = new string[count];
|
||||
for (uint i = 0; i < count; i++)
|
||||
{
|
||||
values[i] = ads.ReadAnyString((uint)symbol.IndexGroup, (uint)(symbol.IndexOffset + (i * every)), every, Encoding.Default);
|
||||
}
|
||||
return values;
|
||||
}
|
||||
}
|
||||
if (datatype == AdsDataTypeId.ADST_WSTRING)
|
||||
{
|
||||
int every = 512;
|
||||
if (symbol.TypeName.Contains("OF WSTRING"))
|
||||
{
|
||||
int index = symbol.TypeName.IndexOf("OF WSTRING(");
|
||||
if (index != 1)
|
||||
{
|
||||
int index2 = symbol.TypeName.LastIndexOf(")");
|
||||
every = (Convert.ToInt32(symbol.TypeName.Substring(index + 11, index2 - index - 11)) + 1) * 2;
|
||||
}
|
||||
int count = symbol.Size / every;
|
||||
string[] values = new string[count];
|
||||
for (uint i = 0; i < count; i++)
|
||||
{
|
||||
Memory<byte> stream = new Memory<byte>(new byte[every]);
|
||||
int readLength = ads.Read((uint)symbol.IndexGroup, (uint)(symbol.IndexOffset + (i * every)), stream);
|
||||
byte[] bytes = stream.ToArray().ToList().Take(readLength).ToArray();
|
||||
int charCount = readLength / 2;
|
||||
char[] charArray = new char[charCount];
|
||||
for (int j = 0; j < charCount; j++)
|
||||
{
|
||||
char value = (char)(bytes[j * 2 + 1] << 8 | bytes[j * 2]);
|
||||
charArray[j] = value;
|
||||
if (value == 0)
|
||||
break;
|
||||
}
|
||||
values[i] = new String(charArray).Trim('\0');
|
||||
}
|
||||
return values;
|
||||
}
|
||||
}
|
||||
if (datatype == AdsDataTypeId.ADST_BIGTYPE)
|
||||
{
|
||||
//TC2 字符串为ADST_BIGTYPE
|
||||
if (symbol.TypeName.Contains("OF STRING"))
|
||||
{
|
||||
//if (isArray)
|
||||
//{
|
||||
// return ads.ReadAnyString((uint)symbol.IndexGroup, (uint)symbol.IndexOffset + (index * 81U), 81, Encoding.Default);
|
||||
//}
|
||||
int count = symbol.Size / 81;
|
||||
string[] values = new string[count];
|
||||
for (uint i = 0; i < count; i++)
|
||||
{
|
||||
values[i] = ads.ReadAnyString((uint)symbol.IndexGroup, (uint)symbol.IndexOffset + (i * 81U), 81, Encoding.Default);
|
||||
}
|
||||
return values;
|
||||
}
|
||||
|
||||
if (symbol.TypeName.Contains("OF TIME") || symbol.TypeName.Contains("OF DATE"))
|
||||
{
|
||||
//if (isArray)
|
||||
//{
|
||||
// return (DateTime)ads.ReadAny((uint)symbol.IndexGroup, (uint)symbol.IndexOffset + (index * 4), typeof(DateTime));
|
||||
//}
|
||||
int count = symbol.Size / 4;
|
||||
DateTime[] values = new DateTime[count];
|
||||
for (uint i = 0; i < count; i++)
|
||||
{
|
||||
values[i] = (DateTime)ads.ReadAny((uint)symbol.IndexGroup, (uint)symbol.IndexOffset + (i * 4), typeof(DateTime));
|
||||
}
|
||||
return values;
|
||||
}
|
||||
if (symbol.TypeName.Contains("OF TOD"))
|
||||
{
|
||||
//if (isArray)
|
||||
//{
|
||||
// return (DateTime)ads.ReadAny((uint)symbol.IndexGroup, (uint)symbol.IndexOffset + (index * 4), typeof(DateTime));
|
||||
//}
|
||||
int count = symbol.Size / 4;
|
||||
DateTime[] values = new DateTime[count];
|
||||
for (uint i = 0; i < count; i++)
|
||||
{
|
||||
values[i] = (DateTime)ads.ReadAny((uint)symbol.IndexGroup, (uint)symbol.IndexOffset + (i * 4), typeof(DateTime));
|
||||
}
|
||||
return values;
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
throw new Exception("不支持的数据类型");
|
||||
}
|
||||
|
||||
public void Write(string symbolPath, string value)
|
||||
{
|
||||
if (!SystemIsRunning)
|
||||
{
|
||||
throw new Exception("PLC链接失败");
|
||||
}
|
||||
IAdsSymbol symbol = null;
|
||||
if (symbolDict.ContainsKey(symbolPath))
|
||||
{
|
||||
symbol = symbolDict[symbolPath];
|
||||
}
|
||||
else
|
||||
{
|
||||
symbol = ads.ReadSymbol(symbolPath);
|
||||
if (symbol == null)
|
||||
throw new Exception("找不到该变量");
|
||||
symbolDict.Add(symbolPath, symbol);
|
||||
}
|
||||
if (symbol.TypeName.Substring(0, 3) != "ARR")
|
||||
{
|
||||
AdsDataTypeId datatype = symbol.DataTypeId;
|
||||
//BOOL
|
||||
if (datatype == AdsDataTypeId.ADST_BIT)
|
||||
{
|
||||
ads.WriteAny((uint)symbol.IndexGroup, (uint)symbol.IndexOffset, bool.Parse(value));
|
||||
return;
|
||||
}
|
||||
//byte
|
||||
if (datatype == AdsDataTypeId.ADST_UINT8)
|
||||
{
|
||||
ads.WriteAny((uint)symbol.IndexGroup, (uint)symbol.IndexOffset, byte.Parse(value));
|
||||
return;
|
||||
}
|
||||
//sbyte
|
||||
if (datatype == AdsDataTypeId.ADST_INT8)
|
||||
{
|
||||
ads.WriteAny((uint)symbol.IndexGroup, (uint)symbol.IndexOffset, sbyte.Parse(value));
|
||||
return;
|
||||
}
|
||||
//ushort
|
||||
if (datatype == AdsDataTypeId.ADST_UINT16)
|
||||
{
|
||||
ads.WriteAny((uint)symbol.IndexGroup, (uint)symbol.IndexOffset, ushort.Parse(value));
|
||||
return;
|
||||
}
|
||||
if (datatype == AdsDataTypeId.ADST_INT16)
|
||||
{
|
||||
ads.WriteAny((uint)symbol.IndexGroup, (uint)symbol.IndexOffset, short.Parse(value));
|
||||
return;
|
||||
}
|
||||
if (datatype == AdsDataTypeId.ADST_UINT32)
|
||||
{
|
||||
ads.WriteAny((uint)symbol.IndexGroup, (uint)symbol.IndexOffset, uint.Parse(value));
|
||||
return;
|
||||
}
|
||||
if (datatype == AdsDataTypeId.ADST_INT32)
|
||||
{
|
||||
ads.WriteAny((uint)symbol.IndexGroup, (uint)symbol.IndexOffset, int.Parse(value));
|
||||
return;
|
||||
}
|
||||
if (datatype == AdsDataTypeId.ADST_REAL32)
|
||||
{
|
||||
ads.WriteAny((uint)symbol.IndexGroup, (uint)symbol.IndexOffset, float.Parse(value));
|
||||
return;
|
||||
}
|
||||
if (datatype == AdsDataTypeId.ADST_REAL64)
|
||||
{
|
||||
ads.WriteAny((uint)symbol.IndexGroup, (uint)symbol.IndexOffset, double.Parse(value));
|
||||
return;
|
||||
}
|
||||
if (datatype == AdsDataTypeId.ADST_STRING)
|
||||
{
|
||||
ads.WriteAnyString(symbolPath, value, symbol.Size,Encoding.Default);
|
||||
//ads.WriteAnyString((uint)symbol.IndexGroup, (uint)symbol.IndexOffset, value, symbol.Size, Encoding.Default);
|
||||
return;
|
||||
}
|
||||
if (datatype == AdsDataTypeId.ADST_WSTRING)
|
||||
{
|
||||
char[] charArray = value.ToCharArray();
|
||||
byte[] bytes = new byte[charArray.Length * 2];
|
||||
for (int i = 0; i < charArray.Length; i++)
|
||||
{
|
||||
bytes[i * 2] = (byte)(charArray[i] & 0xFF);
|
||||
bytes[i * 2 + 1] = (byte)(charArray[i] >> 8 & 0xFF);
|
||||
}
|
||||
if (bytes.Length > symbol.Size)
|
||||
{
|
||||
ads.Write((uint)symbol.IndexGroup, (uint)symbol.IndexOffset, new ReadOnlyMemory<byte>(bytes));
|
||||
}
|
||||
else
|
||||
{
|
||||
byte[] newBytes = new byte[symbol.Size];
|
||||
for (int i = 0; i < bytes.Length; i++)
|
||||
{
|
||||
newBytes[i] = bytes[i];
|
||||
}
|
||||
ads.Write((uint)symbol.IndexGroup, (uint)symbol.IndexOffset, new ReadOnlyMemory<byte>(newBytes));
|
||||
}
|
||||
return;
|
||||
}
|
||||
if (datatype == AdsDataTypeId.ADST_BIGTYPE)
|
||||
{
|
||||
if (symbol.TypeName.StartsWith("TIME") || symbol.TypeName.StartsWith("DATE") || symbol.TypeName.StartsWith("TOD"))
|
||||
{
|
||||
bool flag = DateTime.TryParse(value, out DateTime result);
|
||||
if (!flag)
|
||||
throw new Exception("格式转换失败");
|
||||
ads.WriteAny((uint)symbol.IndexGroup, (uint)symbol.IndexOffset, result);
|
||||
return;
|
||||
}
|
||||
}
|
||||
throw new Exception("不支持的数据类型");
|
||||
}
|
||||
else
|
||||
{
|
||||
throw new Exception("不支持数组批量写入");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
218
常用工具集/ViewModels/01PLC通信调试/欧姆龙Fins调试ViewModel.cs
Normal file
218
常用工具集/ViewModels/01PLC通信调试/欧姆龙Fins调试ViewModel.cs
Normal file
@@ -0,0 +1,218 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using 常用工具集.Base;
|
||||
using OmronLib;
|
||||
using MES.Utility.Core;
|
||||
using Ursa.Controls;
|
||||
|
||||
namespace 常用工具集.ViewModel._01PLC通信调试
|
||||
{
|
||||
public class 欧姆龙Fins调试ViewModel : ViewModelBase
|
||||
{
|
||||
private Omron omron;
|
||||
public bool Enabled1 { get; set; } = true;
|
||||
public bool Enabled2 { get; set; } = false;
|
||||
public string IpAddress { get; set; } = "192.168.1.3";
|
||||
public int Port { get; set; } = 9600;
|
||||
|
||||
public List<string> AreaList { get; set; }
|
||||
public List<Omron.AreaType> AreaTypeList { get; set; }
|
||||
public int WriteAreaIndex { get; set; } = 0;
|
||||
public int ReadAreaIndex { get; set; } = 0;
|
||||
public int ReadAddress { get; set; } = 1042;
|
||||
public int WriteAddress { get; set; } = 1042;
|
||||
public int ReadCount { get; set; } = 1;
|
||||
public string ReadResult { get; set; } = "";
|
||||
|
||||
public int StrLength { get; set; } = 50;
|
||||
public string WriteValue { get; set; } = "";
|
||||
public DelegateCommand ConnectCmd { get; set; }
|
||||
public DelegateCommand DisconnectCmd { get; set; }
|
||||
public DelegateCommand ReadCmd { get; set; }//1读取 2字符串 3Float 4Short
|
||||
public DelegateCommand WriteCmd { get; set; }//1写入 2.Float 3Short 4字符串
|
||||
|
||||
public 欧姆龙Fins调试ViewModel()
|
||||
{
|
||||
AreaList = new List<string>
|
||||
{
|
||||
"CIO_Bit","WR_Bit","HR_Bit","AR_Bit",
|
||||
"DM_Bit","CIO_Word","WR_Word","HR_Word","AR_Word","DM_Word"
|
||||
};
|
||||
AreaTypeList = new List<Omron.AreaType>
|
||||
{
|
||||
Omron.AreaType.CIO_Bit,Omron.AreaType.WR_Bit,Omron.AreaType.HR_Bit,Omron.AreaType.AR_Bit,
|
||||
Omron.AreaType.DM_Bit,Omron.AreaType.CIO_Word,Omron.AreaType.WR_Word,Omron.AreaType.HR_Word,Omron.AreaType.AR_Word,Omron.AreaType.DM_Word
|
||||
};
|
||||
ReadAreaIndex = 9;
|
||||
WriteAreaIndex = 9;
|
||||
ConnectCmd = new DelegateCommand(ConnectCmdFunc);
|
||||
DisconnectCmd = new DelegateCommand(DisconnectCmdFunc);
|
||||
ReadCmd = new DelegateCommand(ReadCmdFunc);
|
||||
WriteCmd = new DelegateCommand(WriteCmdFunc);
|
||||
}
|
||||
|
||||
private void ConnectCmdFunc(object obj)
|
||||
{
|
||||
try
|
||||
{
|
||||
omron = new Omron();
|
||||
omron.IPAddr = System.Net.IPAddress.Parse(IpAddress);
|
||||
omron.Port = Port;
|
||||
string info;
|
||||
if (!omron.PlcConnect(out info))
|
||||
{
|
||||
GlobalValues.Error($"连接失败");
|
||||
}
|
||||
else
|
||||
{
|
||||
GlobalValues.Success("连接成功");
|
||||
Enabled1 = false;
|
||||
Enabled2 = true;
|
||||
}
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
GlobalValues.Error($"连接失败:{ex.Message}");
|
||||
}
|
||||
}
|
||||
|
||||
private void DisconnectCmdFunc(object obj)
|
||||
{
|
||||
omron.DisConnect();
|
||||
omron = null;
|
||||
Enabled1 = true;
|
||||
Enabled2 = false;
|
||||
}
|
||||
|
||||
private void ReadCmdFunc(object obj)
|
||||
{
|
||||
string cmd = obj.ToString();
|
||||
if (cmd == "1")
|
||||
{
|
||||
string[] res;
|
||||
bool isSucess = omron.Read(AreaTypeList[ReadAreaIndex], ReadAddress, 0, ReadCount, out res);
|
||||
if (!isSucess)
|
||||
{
|
||||
GlobalValues.Error("读取失败");
|
||||
DisconnectCmdFunc(obj);
|
||||
return;
|
||||
}
|
||||
ReadResult = res.ToList().GetStrArray(" ");
|
||||
}
|
||||
else if (cmd == "2")
|
||||
{
|
||||
string res;
|
||||
bool isSucess = omron.ReadString(ReadAddress, ReadCount, out res);
|
||||
if (!isSucess)
|
||||
{
|
||||
GlobalValues.Error("读取失败");
|
||||
DisconnectCmdFunc(obj);
|
||||
return;
|
||||
}
|
||||
ReadResult = res;
|
||||
}
|
||||
else if (cmd == "3")
|
||||
{
|
||||
float[] res;
|
||||
bool isSucess = omron.ReadFloats(ReadAddress, ReadCount, out res);
|
||||
if (!isSucess)
|
||||
{
|
||||
|
||||
GlobalValues.Error("读取失败");
|
||||
DisconnectCmdFunc(obj);
|
||||
return;
|
||||
}
|
||||
ReadResult = res.Select(it => Convert.ToString(it)).ToList().GetStrArray(" ");
|
||||
}
|
||||
else if (cmd == "4")
|
||||
{
|
||||
short[] res;
|
||||
bool isSucess = omron.ReadShorts(ReadAddress, ReadCount, out res);
|
||||
if (!isSucess)
|
||||
{
|
||||
GlobalValues.Error("读取失败");
|
||||
DisconnectCmdFunc(obj);
|
||||
return;
|
||||
}
|
||||
ReadResult = res.Select(it => Convert.ToString(it)).ToList().GetStrArray(" ");
|
||||
}
|
||||
}
|
||||
|
||||
private void WriteCmdFunc(object obj)
|
||||
{
|
||||
try
|
||||
{
|
||||
//1写入 2.Float 3Short 4字符串
|
||||
string cmd = obj.ToString();
|
||||
if (cmd == "1")
|
||||
{
|
||||
int[] intValues = WriteValue.Split(' ').Where(it => !it.IsNullOrEmpty()).Select(it => Convert.ToInt32(it)).ToArray();
|
||||
if (WriteAreaIndex < 5)
|
||||
{
|
||||
bool[] values = intValues.Select(it => it == 1 ? true : false).ToArray();
|
||||
bool isSucess = omron.WriteBits(AreaTypeList[WriteAreaIndex], WriteAddress, 0, values.Length, values);
|
||||
if (!isSucess)
|
||||
{
|
||||
GlobalValues.Error("写入失败");
|
||||
DisconnectCmdFunc(obj);
|
||||
return;
|
||||
}
|
||||
GlobalValues.Success("写入成功");
|
||||
}
|
||||
else
|
||||
{
|
||||
bool isSucess = omron.WriteWords(AreaTypeList[WriteAreaIndex], WriteAddress, intValues.Length, intValues);
|
||||
if (!isSucess)
|
||||
{
|
||||
GlobalValues.Error("写入失败");
|
||||
DisconnectCmdFunc(obj);
|
||||
return;
|
||||
}
|
||||
GlobalValues.Success("写入成功");
|
||||
}
|
||||
|
||||
}
|
||||
else if (cmd == "2")
|
||||
{
|
||||
float[] floatValues = WriteValue.Split(' ').Where(it => !it.IsNullOrEmpty()).Select(it => Convert.ToSingle(it)).ToArray();
|
||||
bool isSucess = omron.WriteFloat(WriteAddress, floatValues);
|
||||
if (!isSucess)
|
||||
{
|
||||
GlobalValues.Error("写入失败");
|
||||
DisconnectCmdFunc(obj);
|
||||
return;
|
||||
}
|
||||
GlobalValues.Success("写入成功");
|
||||
}
|
||||
else if (cmd == "3")
|
||||
{
|
||||
short[] floatValues = WriteValue.Split(' ').Where(it => !it.IsNullOrEmpty()).Select(it => Convert.ToInt16(it)).ToArray();
|
||||
bool isSucess = omron.WriteShort(WriteAddress, floatValues);
|
||||
if (!isSucess)
|
||||
{
|
||||
GlobalValues.Error("写入失败");
|
||||
DisconnectCmdFunc(obj);
|
||||
return;
|
||||
}
|
||||
GlobalValues.Success("写入成功");
|
||||
}
|
||||
else if (cmd == "4")
|
||||
{
|
||||
bool isSucess = omron.WriteString(WriteAddress, WriteValue, StrLength);
|
||||
if (!isSucess)
|
||||
{
|
||||
GlobalValues.Error("写入失败");
|
||||
DisconnectCmdFunc(obj);
|
||||
return;
|
||||
}
|
||||
GlobalValues.Success("写入成功");
|
||||
}
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
MessageBox.ShowAsync($"操作异常:{ex.Message}");
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
264
常用工具集/ViewModels/01PLC通信调试/西门子PLC调试ViewModel.cs
Normal file
264
常用工具集/ViewModels/01PLC通信调试/西门子PLC调试ViewModel.cs
Normal file
@@ -0,0 +1,264 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
using 常用工具集.Base;
|
||||
using MES.Utility.Network.S7netplus;
|
||||
using S7.Net;
|
||||
|
||||
namespace 常用工具集.ViewModel._01PLC通信调试
|
||||
{
|
||||
public class 西门子PLC调试ViewModel : ViewModelBase
|
||||
{
|
||||
public bool Enabled1 { get; set; } = true;
|
||||
public bool Enabled2 { get; set; } = false;
|
||||
public string IpAddress { get; set; } = "192.168.1.11";
|
||||
public string Address { get; set; } = "DB44.DBD80";
|
||||
|
||||
public List<string> PlcTypeList { get; set; }
|
||||
public List<CpuType> PlcTypeEnumList { get; set; }
|
||||
public int PlcTypeIndex { get; set; } = 0;
|
||||
public short R { get; set; } = 0;
|
||||
public short S { get; set; } = 1;
|
||||
|
||||
public int DBAddress2 { get; set; } = 40;
|
||||
public int Address2 { get; set; } = 80;
|
||||
public int StringLength { get; set; } = 50;
|
||||
public string BoolValue { get; set; } = "true";
|
||||
public string Int16Value { get; set; } = "";
|
||||
public string Int32Value { get; set; } = "";
|
||||
public string RealValue { get; set; } = "";
|
||||
public string StringValue { get; set; } = "";
|
||||
public string StringValue1 { get; set; } = "";
|
||||
public int BytesCount { get; set; } = 50;
|
||||
public string ReadedValue { get; set; } = "";
|
||||
public string Message { get; set; } = "";
|
||||
|
||||
public DelegateCommand ConnectCmd { get; set; }
|
||||
public DelegateCommand DisconnectCmd { get; set; }
|
||||
|
||||
public DelegateCommand ReadCmd { get; set; }
|
||||
public DelegateCommand WriteCmd { get; set; }
|
||||
private S7Helper plc;
|
||||
public 西门子PLC调试ViewModel()
|
||||
{
|
||||
PlcTypeList = new List<string> { "S7-1200", "S7-1500", "S7-200", "S7-300", "S7-400" };
|
||||
PlcTypeEnumList = new List<CpuType> { CpuType.S71200, CpuType.S71500, CpuType.S7200, CpuType.S7300, CpuType.S7400 };
|
||||
ConnectCmd = new DelegateCommand(ConnectCmdFunc);
|
||||
DisconnectCmd = new DelegateCommand(DisconnectCmdFunc);
|
||||
ReadCmd = new DelegateCommand(ReadCmdFunc);
|
||||
WriteCmd = new DelegateCommand(WriteCmdFunc);
|
||||
}
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// 连接
|
||||
/// </summary>
|
||||
/// <param name="obj"></param>
|
||||
private void ConnectCmdFunc(object obj)
|
||||
{
|
||||
try
|
||||
{
|
||||
this.plc = new S7Helper(PlcTypeEnumList[PlcTypeIndex], IpAddress, R, S);
|
||||
Enabled2 = true;
|
||||
Enabled1 = false;
|
||||
}
|
||||
catch
|
||||
{
|
||||
GlobalValues.Error("PLC连接失败");
|
||||
}
|
||||
}
|
||||
/// <summary>
|
||||
/// 断开连接
|
||||
/// </summary>
|
||||
/// <param name="obj"></param>
|
||||
private void DisconnectCmdFunc(object obj)
|
||||
{
|
||||
try { plc.Dispose(); } catch { }
|
||||
plc = null;
|
||||
Enabled1 = true;
|
||||
Enabled2 = false;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 读取操作
|
||||
/// </summary>
|
||||
/// <param name="obj"></param>
|
||||
private void ReadCmdFunc(object obj)
|
||||
{
|
||||
ReadedValue = string.Empty;
|
||||
Message = string.Empty;
|
||||
string cmd = obj.ToString();
|
||||
if (cmd == "BOOL")
|
||||
{
|
||||
bool value;
|
||||
bool flag = plc.ReadBool(Address, out value);
|
||||
if (!flag)
|
||||
{
|
||||
ReadedValue = string.Empty;
|
||||
Message = "读取失败";
|
||||
return;
|
||||
}
|
||||
ReadedValue = value.ToString();
|
||||
Message = "读取成功";
|
||||
}
|
||||
else if (cmd == "INT16")
|
||||
{
|
||||
ushort value;
|
||||
bool flag = plc.ReadInt16(Address, out value);
|
||||
if (!flag)
|
||||
{
|
||||
ReadedValue = string.Empty;
|
||||
Message = "读取失败";
|
||||
return;
|
||||
}
|
||||
ReadedValue = value.ToString();
|
||||
Message = "读取成功";
|
||||
}
|
||||
else if (cmd == "INT32")
|
||||
{
|
||||
int value;
|
||||
bool flag = plc.ReadInt32(Address, out value);
|
||||
if (!flag)
|
||||
{
|
||||
ReadedValue = string.Empty;
|
||||
Message = "读取失败";
|
||||
return;
|
||||
}
|
||||
ReadedValue = value.ToString();
|
||||
Message = "读取成功";
|
||||
}
|
||||
else if (cmd == "REAL")
|
||||
{
|
||||
float value;
|
||||
bool flag = plc.ReadSingle(Address, out value);
|
||||
if (!flag)
|
||||
{
|
||||
ReadedValue = string.Empty;
|
||||
Message = "读取失败";
|
||||
return;
|
||||
}
|
||||
ReadedValue = value.ToString();
|
||||
Message = "读取成功";
|
||||
}
|
||||
else if (cmd == "STRING1")
|
||||
{
|
||||
string value;
|
||||
bool flag = plc.ReadString(Address, StringLength, out value);
|
||||
if (!flag)
|
||||
{
|
||||
ReadedValue = string.Empty;
|
||||
Message = "读取失败";
|
||||
return;
|
||||
}
|
||||
ReadedValue = value.ToString();
|
||||
Message = "读取成功";
|
||||
}
|
||||
else if (cmd == "STRING")
|
||||
{
|
||||
string value;
|
||||
bool flag = plc.ReadBytesString(Address, StringLength, out value);
|
||||
if (!flag)
|
||||
{
|
||||
ReadedValue = string.Empty;
|
||||
Message = "读取失败";
|
||||
return;
|
||||
}
|
||||
ReadedValue = value.ToString();
|
||||
Message = "读取成功";
|
||||
}
|
||||
else if (cmd == "Bytes")
|
||||
{
|
||||
byte[] value;
|
||||
bool flag = plc.ReadBytes(DBAddress2, Address2, BytesCount, out value);
|
||||
if (!flag)
|
||||
{
|
||||
Message = "读取失败";
|
||||
return;
|
||||
}
|
||||
ReadedValue = ToHexStrFromByte(value);
|
||||
Message = "读取成功";
|
||||
}
|
||||
}
|
||||
|
||||
private void WriteCmdFunc(object obj)
|
||||
{
|
||||
ReadedValue = string.Empty;
|
||||
Message = string.Empty;
|
||||
string cmd = obj.ToString();
|
||||
if (cmd == "BOOL")
|
||||
{
|
||||
bool value;
|
||||
bool flag = bool.TryParse(BoolValue, out value);
|
||||
if (!flag)
|
||||
{
|
||||
Message = "请输入true或者false";
|
||||
return;
|
||||
}
|
||||
flag = plc.WriteBool(Address, value);
|
||||
Message = flag ? "写入成功" : "写入失败";
|
||||
}
|
||||
else if (cmd == "INT16")
|
||||
{
|
||||
ushort value;
|
||||
bool flag = ushort.TryParse(Int16Value, out value);
|
||||
if (!flag)
|
||||
{
|
||||
Message = "请输入正确的数据";
|
||||
return;
|
||||
}
|
||||
flag = plc.WriteInt16(Address, value);
|
||||
Message = flag ? "写入成功" : "写入失败";
|
||||
}
|
||||
else if (cmd == "INT32")
|
||||
{
|
||||
int value;
|
||||
bool flag = int.TryParse(Int32Value, out value);
|
||||
if (!flag)
|
||||
{
|
||||
Message = "请输入正确的数据";
|
||||
return;
|
||||
}
|
||||
flag = plc.WriteInt32(Address, value);
|
||||
Message = flag ? "写入成功" : "写入失败";
|
||||
}
|
||||
else if (cmd == "REAL")
|
||||
{
|
||||
float value;
|
||||
bool flag = float.TryParse(RealValue, out value);
|
||||
if (!flag)
|
||||
{
|
||||
Message = "请输入正确的数据";
|
||||
return;
|
||||
}
|
||||
Message = flag ? "写入成功" : "写入失败";
|
||||
}
|
||||
else if (cmd == "STRING1")
|
||||
{
|
||||
bool flag = plc.WriteString(Address, StringValue1, StringLength);
|
||||
Message = flag ? "写入成功" : "写入失败";
|
||||
}
|
||||
else if (cmd == "STRING")
|
||||
{
|
||||
bool flag = plc.WriteBytesString(Address, StringValue, StringLength);
|
||||
Message = flag ? "写入成功" : "写入失败";
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 字节数组转16进制字符串:空格分隔
|
||||
/// </summary>
|
||||
/// <param name="byteDatas"></param>
|
||||
/// <returns></returns>
|
||||
private string ToHexStrFromByte(byte[] byteDatas)
|
||||
{
|
||||
StringBuilder builder = new StringBuilder();
|
||||
for (int i = 0; i < byteDatas.Length; i++)
|
||||
{
|
||||
builder.Append(string.Format("{0:X2} ", byteDatas[i]));
|
||||
}
|
||||
return builder.ToString().Trim();
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user