初始化上传

This commit is contained in:
2025-08-26 08:37:44 +08:00
commit 31d81b91b6
448 changed files with 80981 additions and 0 deletions

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

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

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

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

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

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

View 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)
{
}
}
}
}
}

View 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 ? "写入成功" : "写入失败";
}
}
}
}

View 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)
{
}
}
}

View 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("不支持数组批量写入");
}
}
}
}

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

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