feat - 完善逻辑,修改界面,修复BUG

master
SoulStar 2 weeks ago
parent 49efceff65
commit 6bd493c0d7

@ -163,6 +163,77 @@ namespace SlnMesnac.Common
return encode.GetString(b);
}
/// <summary>
/// 将整数转换为指定位数的byte数组大端序
/// </summary>
/// <param name="length">目标byte数组长度</param>
/// <param name="num">要转换的整数</param>
/// <returns>指定长度的byte数组</returns>
public byte[] IntToBytes(int length, int num)
{
if (length <= 0)
throw new ArgumentException("长度必须大于0", nameof(length));
byte[] result = new byte[length];
// 从最高位开始填充
for (int i = 0; i < length; i++)
{
// 计算当前字节的位置(从高位到低位)
// 例如 length=2, i=0 时,移位 8 位i=1 时,移位 0 位
int shift = (length - 1 - i) * 8;
result[i] = (byte)((num >> shift) & 0xFF);
}
return result;
}
/// <summary>
/// 将byte数组转换为整数大端序
/// </summary>
public int BytesToInt(byte[] bytes)
{
if (bytes == null || bytes.Length == 0)
Console.WriteLine("字节数组不能为空");
if (bytes.Length > 4)
Console.WriteLine("字节数组长度不能超过4int最大4字节");
int result = 0;
// 从高位到低位组合(大端序)
for (int i = 0; i < bytes.Length; i++)
{
result = (result << 8) | bytes[i];
}
return result;
}
/// <summary>
/// 将byte数组转换为整数小端序
/// </summary>
public int BytesToIntLittleEndian(byte[] bytes)
{
if (bytes == null || bytes.Length == 0)
throw new ArgumentException("字节数组不能为空", nameof(bytes));
if (bytes.Length > 4)
throw new ArgumentException("字节数组长度不能超过4int最大4字节", nameof(bytes));
int result = 0;
// 从低位到高位组合(小端序)
for (int i = 0; i < bytes.Length; i++)
{
result |= (bytes[i] << (i * 8));
}
return result;
}
public byte[] Swap16Bytes(byte[] OldU16)
{
byte[] ReturnBytes = new byte[2];

@ -62,6 +62,11 @@ namespace SlnMesnac.Config
/// </summary>
public List<VisionConfig> visionConfig { get; set; }
/// <summary>
/// 视觉机械臂连接配置
/// </summary>
public List<DeviceInfoConfig> deviceInfoConfig { get; set; }
/// <summary>
/// Redis配置
/// </summary>
@ -77,6 +82,11 @@ namespace SlnMesnac.Config
/// </summary>
public string StationCode { get; set; }
/// <summary>
/// MES配置
/// </summary>
public string MESConfig { get; set; }
public AppConfig Value => this;
}
}

@ -0,0 +1,62 @@
using System;
using System.Collections.Generic;
using System.Linq;
namespace SlnMesnac.Config
{
/// <summary>
///
///</summary>
public class DeviceInfoConfig
{
/// <summary>
/// 备 注:
/// 默认值:
///</summary>
public string Deviceid { get; set; } = null!;
/// <summary>
/// 备 注:
/// 默认值:
///</summary>
public string? Name { get; set; }
/// <summary>
/// 备 注:
/// 默认值:
///</summary>
public string? Connectstr { get; set; }
/// <summary>
/// 备 注:
/// 默认值:
///</summary>
public decimal? Connectmode { get; set; }
/// <summary>
/// 备 注:
/// 默认值:
///</summary>
public string? Devicetype { get; set; }
/// <summary>
/// 备 注:所属汇集软件ID
/// 默认值:
///</summary>
public string? Collectid { get; set; }
/// <summary>
/// 备 注:
/// 默认值:
///</summary>
public string? Addr { get; set; }
/// <summary>
/// 备 注:
/// 默认值:
///</summary>
public int? Deleteflag { get; set; }
}
}

@ -14,7 +14,7 @@ using SqlSugar;
using System;
using System.Collections.Generic;
using System.Threading.Tasks;
using System.Linq;
#region << 版 本 注 释 >>
/*--------------------------------------------------------------------
* (c) 2024 WenJY
@ -61,7 +61,8 @@ namespace SlnMesnac.Extensions
AppConfig appConfig = x.GetService<AppConfig>();
_StringChange = x.GetService<StringChange>();
_TcpServer = x.GetService<TcpServer>();
List<Base_device_info> baseRfidInfos = sqlSugarClient.Queryable<Base_device_info>().Where(x=>x.Collectid == appConfig.StationCode).ToList();
List<DeviceInfoConfig> baseRfidInfos = appConfig.deviceInfoConfig.Where(x => x.Collectid == appConfig.StationCode).ToList();
//sensor_Infos = sqlSugarClient.Queryable<Base_sensor_info>().Where(x => x.Deleteflag == 0).ToList();
List<RfidAbsractFactory> absractFactories = new List<RfidAbsractFactory>();

@ -96,10 +96,6 @@ namespace Models
[SugarColumn(ColumnName="objid" ,IsIdentity = true) ]
public int Objid { get; set; }
public string State = "未连接";
public Type FactoryType;
}

@ -25,5 +25,7 @@ namespace SlnMesnac.Model.domain
public string ProductName { get; set; }
[JsonPropertyName("PlanQty")]
public double PlanQty { get; set; }
[JsonPropertyName("NextProductNo")]
public int NextProductNo { get; set; }
}
}

@ -4,6 +4,8 @@ using SlnMesnac.Model.domain;
using SlnMesnac.Model.dto;
using SlnMesnac.Rfid.Dto;
using SlnMesnac.Rfid.Enum;
using SlnMesnac.Rfid.NewRFIDConnect;
using SlnMesnac.Rfid.NewRFIDConnect.entity;
using SlnMesnac.Serilog;
using SlnMesnac.TouchSocket;
using System;
@ -53,6 +55,57 @@ namespace SlnMesnac.Rfid.Factory
}
}
/// <summary>
/// 真心跳设置
/// </summary>
/// <returns></returns>
public override async Task<bool> Set_HeartBeat(byte second)
{
byte[] data = new byte[3];
data[0] = 0x00;
data[1] = second;
data[2] = 0x01;
BaseSendDataEntity entity = new BaseSendDataEntity()
{
Code = 0xBF,
Data = data
};
byte[] result = BaseRFIDDataAnalyse.BaseSendDataAnalyse(entity);
var waitClient = _tcpClient.CreateWaitingClient(new WaitingOptions()
{
FilterFunc = response =>
{
// 检查响应数据是否符合预期
if (response.Memory.Length > 0)
{
// 可以根据实际情况添加更多的检查逻辑
return true;
}
return false;
}
});
using (var responsedData = await waitClient.SendThenResponseAsync(result, 2000))
{
var reciveBuffer = responsedData.Memory.ToArray();
byte[] resultBuffer = PareReceiveBufferData(reciveBuffer, reciveBuffer.Length);
Log.Information($"{m_deviceID}接收读取指令{_stringChange.bytesToHexStr(resultBuffer, resultBuffer.Length)}");
if (resultBuffer[3] == 0xBF || resultBuffer[4] == 0x00)
{
return true;
}
else
{
return false;
}
}
}
public override async Task<bool> ConnectAsync(string ip, int port, string deviceid)
{
try
@ -722,7 +775,7 @@ namespace SlnMesnac.Rfid.Factory
throw new NotImplementedException();
}
public override Task<bool> Set_Write(string pSelectData, string pWriteData)
public override Task<bool> Set_Write(byte[] pSelectData, string pWriteData)
{
throw new NotImplementedException();
}

@ -9,6 +9,8 @@ using SlnMesnac.Model.dto;
using SlnMesnac.Repository.service;
using SlnMesnac.Rfid.Dto;
using SlnMesnac.Rfid.Enum;
using SlnMesnac.Rfid.NewRFIDConnect;
using SlnMesnac.Rfid.NewRFIDConnect.entity;
using SlnMesnac.Serilog;
using SlnMesnac.TouchSocket;
using SqlSugar;
@ -17,6 +19,7 @@ using System.Collections;
using System.Collections.Generic;
using System.Drawing;
using System.Linq;
using System.Security.Cryptography;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
@ -47,7 +50,7 @@ using TouchSocket.Sockets;
#endregion << 版 本 注 释 >>
namespace SlnMesnac.Rfid.Factory
{
public class RflyFactory:RfidAbsractFactory
public class RflyFactory : RfidAbsractFactory
{
private SerilogHelper _logger;
private readonly TcpClient _tcpClient = new TcpClient();
@ -56,13 +59,13 @@ namespace SlnMesnac.Rfid.Factory
private string m_deviceID;
private MeshttpClient _meshttpClient;
public RflyFactory(SerilogHelper logger,StringChange stringChange, MeshttpClient meshttpClient)
public RflyFactory(SerilogHelper logger, StringChange stringChange, MeshttpClient meshttpClient)
{
_logger = logger;
_stringChange = stringChange;
_meshttpClient = meshttpClient;
}
/// <summary>
/// 建立连接
/// </summary>
@ -90,7 +93,7 @@ namespace SlnMesnac.Rfid.Factory
/// <param name="ip"></param>
/// <param name="port"></param>
/// <returns></returns>
public override async Task<bool> ConnectAsync(string ip, int port,string deviceid)
public override async Task<bool> ConnectAsync(string ip, int port, string deviceid)
{
try
{
@ -107,6 +110,18 @@ namespace SlnMesnac.Rfid.Factory
Array.Copy(e.Memory.Span.ToArray(), 0, receivedBuffer, 0, e.Memory.Span.Length);
if (receivedBuffer.Length > 3)
{
//心跳
if (e.Memory.Span.ToArray()[3] == 0xBF)
{
if (GloalVar.HeartBeatRecoard.TryGetValue(deviceid, out var value))
{
GloalVar.HeartBeatRecoard[deviceid] = DateTime.Now;
}
else
{
GloalVar.HeartBeatRecoard.Add(deviceid, DateTime.Now);
}
}
//连续盘点返回
if (e.Memory.Span.ToArray()[3] == 0x01)
{
@ -145,7 +160,7 @@ namespace SlnMesnac.Rfid.Factory
}
else
{
Log.Information($"{m_deviceID},IP:{m_strIP}接收原始报文{_stringChange.bytesToHexStr(receivedBuffer, receivedBuffer.Length)}");
//Log.Information($"{m_deviceID},IP:{m_strIP}接收原始报文{_stringChange.bytesToHexStr(receivedBuffer, receivedBuffer.Length)}");
}
}
@ -154,9 +169,9 @@ namespace SlnMesnac.Rfid.Factory
}
return EasyTask.CompletedTask;
return EasyTask.CompletedTask;
};
Log.Information($"{m_deviceID},IP:{m_strIP}连接成功");
return true;
}
catch (Exception e)
@ -165,6 +180,58 @@ namespace SlnMesnac.Rfid.Factory
return false;
}
}
/// <summary>
/// 真心跳设置
/// </summary>
/// <returns></returns>
public override async Task<bool> Set_HeartBeat(byte second)
{
byte[] data = new byte[3];
data[0] = 0x00;
data[1] = second;
data[2] = 0x01;
BaseSendDataEntity entity = new BaseSendDataEntity()
{
Code = 0xBF,
Data = data
};
byte[] result = BaseRFIDDataAnalyse.BaseSendDataAnalyse(entity);
var waitClient = _tcpClient.CreateWaitingClient(new WaitingOptions()
{
FilterFunc = response =>
{
// 检查响应数据是否符合预期
if (response.Memory.Length > 0)
{
// 可以根据实际情况添加更多的检查逻辑
return true;
}
return false;
}
});
using (var responsedData = await waitClient.SendThenResponseAsync(result, 2000))
{
var reciveBuffer = responsedData.Memory.ToArray();
byte[] resultBuffer = PareReceiveBufferData(reciveBuffer, reciveBuffer.Length);
Log.Information($"{m_deviceID}接收读取指令{_stringChange.bytesToHexStr(resultBuffer, resultBuffer.Length)}");
if (resultBuffer[3] == 0xBF || resultBuffer[4] == 0x00)
{
return true;
}
else
{
return false;
}
}
}
/// <summary>
/// 异步按时间段盘点
/// </summary>
@ -229,11 +296,11 @@ namespace SlnMesnac.Rfid.Factory
return tagInfoList;
}
}
catch (Exception e)
{
Log.Information($"{m_deviceID}数据接收异常"+ e);
Log.Information($"{m_deviceID}数据接收异常" + e);
return tagInfoList;
//throw new InvalidOperationException($"{m_strIP}按时间段盘点异常:{e.Message}");
}
@ -276,7 +343,7 @@ namespace SlnMesnac.Rfid.Factory
FilterFunc = response =>
{
// 检查响应数据是否符合预期
if ( response.Memory.Length > 0)
if (response.Memory.Length > 0)
{
// 可以根据实际情况添加更多的检查逻辑
return true;
@ -432,7 +499,7 @@ namespace SlnMesnac.Rfid.Factory
return DB.ToString();
}
}
return DB.ToString();
}
@ -468,6 +535,11 @@ namespace SlnMesnac.Rfid.Factory
}
}
/// <summary>
/// 停止连续盘点
/// </summary>
/// <returns></returns>
public override async Task<bool> Set_StopIdentify()
{
byte[] bCRC = new byte[4];
@ -487,39 +559,46 @@ namespace SlnMesnac.Rfid.Factory
pMessagePack.m_pData[7] = 0x0D;
#endregion 指令封装
var waitClient = _tcpClient.CreateWaitingClient(new WaitingOptions()
{
FilterFunc = response =>
{
// 检查响应数据是否符合预期
if (response.Memory.Length > 0)
{
// 可以根据实际情况添加更多的检查逻辑
return true;
}
return false;
}
});
Log.Information($"{m_deviceID}发送停止连续盘点指令{_stringChange.bytesToHexStr(pMessagePack.m_pData, pMessagePack.m_pData.Length)}");
using (var responsedData = await waitClient.SendThenResponseAsync(pMessagePack.m_pData, 2000))
{
var reciveBuffer = responsedData.Memory.ToArray();
Log.Information($"{m_deviceID}接收停止连续盘点指令{_stringChange.bytesToHexStr(reciveBuffer, reciveBuffer.Length)}");
if (reciveBuffer[3] == 0x12)
{
return true;
}
}
return false;
_tcpClient.SendAsync(pMessagePack.m_pData).GetAwaiter().GetResult();
//var waitClient = _tcpClient.CreateWaitingClient(new WaitingOptions()
//{
// FilterFunc = response =>
// {
// // 检查响应数据是否符合预期
// if (response.Memory.Length > 0)
// {
// // 可以根据实际情况添加更多的检查逻辑
// return true;
// }
// return false;
// }
//});
//Log.Information($"{m_deviceID}发送停止连续盘点指令{_stringChange.bytesToHexStr(pMessagePack.m_pData, pMessagePack.m_pData.Length)}");
//using (var responsedData = await waitClient.SendThenResponseAsync(pMessagePack.m_pData, 2000))
//{
// var reciveBuffer = responsedData.Memory.ToArray();
// Log.Information($"{m_deviceID}接收停止连续盘点指令{_stringChange.bytesToHexStr(reciveBuffer, reciveBuffer.Length)}");
// if (reciveBuffer[3] == 0x12)
// {
// return true;
// }
//}
//return false;
return true;
}
catch (Exception e)
{
//throw new InvalidOperationException($"{m_strIP}暂停盘点异常:{e.Message}");
Log.Error($"{m_deviceID},IP:{m_strIP}暂停盘点异常:{e.Message}");
return false;
//throw new InvalidOperationException($"{m_strIP}设置功率异常:{e.Message}");
}
}
/// <summary>
/// 开始连续盘点
/// </summary>
/// <returns></returns>
public override async Task<bool> Set_BeginIdentify()
{
byte[] bCRC = new byte[4];
@ -539,30 +618,32 @@ namespace SlnMesnac.Rfid.Factory
pMessagePack.m_pData[7] = 0x0D;
#endregion 指令封装
var waitClient = _tcpClient.CreateWaitingClient(new WaitingOptions()
{
FilterFunc = response =>
{
// 检查响应数据是否符合预期
if (response.Memory.Length > 0)
{
// 可以根据实际情况添加更多的检查逻辑
return true;
}
return false;
}
});
Log.Information($"{m_deviceID}发送连续盘点指令{_stringChange.bytesToHexStr(pMessagePack.m_pData, pMessagePack.m_pData.Length)}");
using (var responsedData = await waitClient.SendThenResponseAsync(pMessagePack.m_pData, 2000))
{
var reciveBuffer = responsedData.Memory.ToArray();
Log.Information($"{m_deviceID}接收连续盘点指令{_stringChange.bytesToHexStr(reciveBuffer, reciveBuffer.Length)}");
if (reciveBuffer[3] == 0x11)
{
return true;
}
}
return false;
_tcpClient.SendAsync(pMessagePack.m_pData).GetAwaiter().GetResult();
//var waitClient = _tcpClient.CreateWaitingClient(new WaitingOptions()
//{
// FilterFunc = response =>
// {
// // 检查响应数据是否符合预期
// if (response.Memory.Length > 0)
// {
// // 可以根据实际情况添加更多的检查逻辑
// return true;
// }
// return false;
// }
//});
//Log.Information($"{m_deviceID}发送连续盘点指令{_stringChange.bytesToHexStr(pMessagePack.m_pData, pMessagePack.m_pData.Length)}");
//using (var responsedData = await waitClient.SendThenResponseAsync(pMessagePack.m_pData, 2000))
//{
// var reciveBuffer = responsedData.Memory.ToArray();
// Log.Information($"{m_deviceID}接收连续盘点指令{_stringChange.bytesToHexStr(reciveBuffer, reciveBuffer.Length)}");
// if (reciveBuffer[3] == 0x11)
// {
// return true;
// }
//}
return true;
}
catch (Exception e)
{
@ -571,22 +652,29 @@ namespace SlnMesnac.Rfid.Factory
}
}
public override async Task<bool> Set_Write(string pSelectData, string pWriteData)
/// <summary>
/// 写入
/// </summary>
/// <param name="pSelectData"></param>
/// <param name="pWriteData"></param>
/// <returns></returns>
public override async Task<bool> Set_Write(byte[] pSelectData, string pWriteData)
{
byte[] bSelectData;
byte[] bWriteData = null;
if (Convert.ToByte(pWriteData.Length % 2) != 0)
{
bWriteData = new byte [pWriteData.Length + 1];
}
if (string.IsNullOrEmpty(pSelectData))
{
bSelectData = Encoding.ASCII.GetBytes("JG26522604101");
bWriteData = new byte[pWriteData.Length + 1];
}
else
{
bSelectData = Encoding.ASCII.GetBytes(pSelectData);
bWriteData = new byte[pWriteData.Length];
}
if (pSelectData == null || pSelectData.Count() == 0)
{
pSelectData = Encoding.ASCII.GetBytes("JG26522604101");
}
if (string.IsNullOrEmpty(pWriteData))
{
bWriteData = Encoding.ASCII.GetBytes("JG26522604102");
@ -594,44 +682,76 @@ namespace SlnMesnac.Rfid.Factory
else
{
byte[] bytes = Encoding.ASCII.GetBytes(pWriteData);
Array.Copy(bytes,0, bWriteData, 0, bytes.Length);
Array.Copy(bytes, 0, bWriteData, 0, bytes.Length);
//bWriteData = Encoding.ASCII.GetBytes(pWriteData);
}
byte[] bCRC = new byte[21 + bSelectData.Length + bWriteData.Length];
int length = 18 + bSelectData.Length + Convert.ToByte((bWriteData.Length % 2 == 0) ? bWriteData.Length : (bWriteData.Length + 1));
//计算PC并衔接
byte[] finalWriteData = new byte[bWriteData.Length + 2];
byte[] pc = _stringChange.IntToBytes(2, ((bWriteData.Length / 2) * 8)).Reverse().ToArray();
Array.Copy(pc, 0, finalWriteData, 0, 2);
Array.Copy(bWriteData, 0, finalWriteData, 2, bWriteData.Length);
try
{
#region 指令封装
MessagePack pMessagePack = new MessagePack();
pMessagePack.m_pData = new byte[24 + bSelectData.Length + bWriteData.Length];
pMessagePack.m_pData[0] = 0xAA;
pMessagePack.m_pData[1] = 0x55;
pMessagePack.m_pData[2] = Convert.ToByte(length);
pMessagePack.m_pData[3] = 0x03;
pMessagePack.m_pData[4] = 0x01;
pMessagePack.m_pData[5] = 0xF4;
pMessagePack.m_pData[6] = 0x00;
pMessagePack.m_pData[7] = 0x00;
pMessagePack.m_pData[8] = 0x00;
pMessagePack.m_pData[9] = 0x00;
pMessagePack.m_pData[10] = 0x01;
pMessagePack.m_pData[11] = 0x00;
pMessagePack.m_pData[12] = 0x00;
pMessagePack.m_pData[13] = 0x00;
pMessagePack.m_pData[14] = 0x20;
pMessagePack.m_pData[15] = 0x70;
Array.Copy(bSelectData, 0, pMessagePack.m_pData, 16, bSelectData.Length); //写入数据
pMessagePack.m_pData[16 + bSelectData.Length] = 0x01;
pMessagePack.m_pData[17 + bSelectData.Length] = 0x00;
pMessagePack.m_pData[18 + bSelectData.Length] = 0x00;
pMessagePack.m_pData[19 + bSelectData.Length] = 0x00;
pMessagePack.m_pData[20 + bSelectData.Length] = 0x02;
pMessagePack.m_pData[21 + bSelectData.Length] = Convert.ToByte((bWriteData.Length % 2 == 0) ? bWriteData.Length / 2 : (bWriteData.Length + 1) / 2);
Array.Copy(bWriteData, 0, pMessagePack.m_pData, 16 + Convert.ToByte((bWriteData.Length % 2 == 0) ? bWriteData.Length : (bWriteData.Length + 1)) + 6, bWriteData.Length); //写入数据
Array.Copy(pMessagePack.m_pData, 2, bCRC, 0, 21 + bWriteData.Length + bSelectData.Length);
pMessagePack.m_pData[22 + bSelectData.Length + bWriteData.Length] = _stringChange.CalculateVerify(bCRC, bCRC.Length);
pMessagePack.m_pData[23 + bSelectData.Length + bWriteData.Length] = 0x0D;
//自动根据写入数据封装
Base03HENtity rawData = new Base03HENtity()
{
TimeOut = _stringChange.IntToBytes(2, 1000),
AccessPassword = _stringChange.IntToBytes(4, 0),
SelectBank = 01,
SelectAddress = _stringChange.IntToBytes(4, 32),
SelectLength = (byte)(pSelectData.Count() * 8),
SelectData = pSelectData,
WriteBank = 01,
WriteAddress = _stringChange.IntToBytes(4, 1),
WordCount = (byte)((finalWriteData.Count() / 2)),
WriteData = finalWriteData
};
int selectLength = rawData.SelectLength / 8;
int wordCount = rawData.WordCount * 2;
byte[] bytes = new byte[2 + 4 + 1 + 4 + 1 + selectLength + 1 + 4 + 1 + wordCount];
int index = 0;
Array.Copy(rawData.TimeOut, 0, bytes, index, 2);
index += 2;
Array.Copy(rawData.AccessPassword, 0, bytes, index, 4);
index += 4;
bytes[index] = rawData.SelectBank;
index++;
Array.Copy(rawData.SelectAddress, 0, bytes, index, 4);
index += 4;
bytes[index] = rawData.SelectLength;
index++;
Array.Copy(rawData.SelectData, 0, bytes, index, selectLength);
index += selectLength;
bytes[index] = rawData.WriteBank;
index++;
Array.Copy(rawData.WriteAddress, 0, bytes, index, 4);
index += 4;
bytes[index] = rawData.WordCount;
index++;
Array.Copy(rawData.WriteData, 0, bytes, index, wordCount);
index += wordCount;
BaseSendDataEntity entity = new BaseSendDataEntity()
{
Code = 0x03,
Data = bytes
};
byte[] result = BaseRFIDDataAnalyse.BaseSendDataAnalyse(entity);
#endregion 指令封装
var waitClient = _tcpClient.CreateWaitingClient(new WaitingOptions()
@ -647,13 +767,14 @@ namespace SlnMesnac.Rfid.Factory
return false;
}
});
Log.Information($"{m_deviceID}发送写入指令{_stringChange.bytesToHexStr(pMessagePack.m_pData, pMessagePack.m_pData.Length)}");
using (var responsedData = await waitClient.SendThenResponseAsync(pMessagePack.m_pData, 2000))
Log.Information($"{m_deviceID}发送写入指令{_stringChange.bytesToHexStr(result, result.Length)}");
using (var responsedData = await waitClient.SendThenResponseAsync(result, 2000))
{
var reciveBuffer = responsedData.Memory.ToArray();
Log.Information($"{m_deviceID}接收写入指令{_stringChange.bytesToHexStr(reciveBuffer, reciveBuffer.Length)}");
if (reciveBuffer[3] == 0x03 && reciveBuffer[4] == 0x00)
{
Log.Information($"写入成功,写入数值{pWriteData}");
return true;
}
}
@ -661,8 +782,7 @@ namespace SlnMesnac.Rfid.Factory
}
catch (Exception e)
{
return false;
//throw new InvalidOperationException($"{m_strIP}设置功率异常:{e.Message}");
throw new InvalidOperationException($"{m_strIP}写入异常:{e.Message}");
}
}
@ -1355,7 +1475,7 @@ namespace SlnMesnac.Rfid.Factory
}
_Action?.Invoke(m_deviceID, tagInfoList);
}
}
catch (Exception ex)
{
@ -1396,7 +1516,7 @@ namespace SlnMesnac.Rfid.Factory
using (var responsedData = await waitClient.SendThenResponseAsync(pMessagePack.m_pData, 2000))
{
var reciveBuffer = responsedData.Memory.ToArray();
if (reciveBuffer[3] == 0x90)
{
if (reciveBuffer.Length == 8)
@ -1414,7 +1534,7 @@ namespace SlnMesnac.Rfid.Factory
Array.Copy(reciveBuffer, 8, messagebuffer, 0, reciveBuffer.Length - 8);
DealMessageData(messagebuffer);
}
}
if (reciveBuffer[3] == 0x02)
{
@ -1430,6 +1550,60 @@ namespace SlnMesnac.Rfid.Factory
}
}
/// <summary>
/// 将byte数组转换为十六进制字符串格式00 0A 0B
/// </summary>
public string BytesToHexString(byte[] bytes)
{
if (bytes == null || bytes.Length == 0)
return string.Empty;
StringBuilder sb = new StringBuilder();
for (int i = 0; i < bytes.Length; i++)
{
sb.Append(bytes[i].ToString("X2"));
if (i < bytes.Length - 1)
sb.Append(" ");
}
return sb.ToString();
}
/// <summary>
/// 将十六进制字符串转换回byte数组
/// </summary>
public byte[] HexStringToBytes(string hexString)
{
if (string.IsNullOrWhiteSpace(hexString))
{
Console.WriteLine("传入数据为空");
return new byte[0];
}
// 移除所有空格
hexString = hexString.Replace(" ", "");
// 检查长度是否为偶数
if (hexString.Length % 2 != 0)
Console.WriteLine("格式不正确16进制字符串必须为偶数");
byte[] bytes = new byte[hexString.Length / 2];
try
{
for (int i = 0; i < bytes.Length; i++)
{
bytes[i] = Convert.ToByte(hexString.Substring(i * 2, 2), 16);
}
}
catch { Console.WriteLine("格式不正确"); }
return bytes;
}
#endregion

@ -0,0 +1,14 @@
using System;
using System.Collections.Generic;
using System.Text;
namespace SlnMesnac.Rfid
{
/// <summary>
/// 全局变量
/// </summary>
public class GloalVar
{
public static Dictionary<string, DateTime> HeartBeatRecoard { get; set; } = new Dictionary<string, DateTime>();
}
}

@ -0,0 +1,104 @@
using SlnMesnac.Rfid.NewRFIDConnect.entity;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace SlnMesnac.Rfid.NewRFIDConnect
{
/// <summary>
/// RFID基础数据分析
/// </summary>
public class BaseRFIDDataAnalyse
{
/// <summary>
/// 基础接收数据解析
/// </summary>
/// <param name="data"></param>
/// <returns></returns>
public static BaseReciveDataEntity BaseReceiveAnalyse(byte[] data)
{
BaseReciveDataEntity result = new BaseReciveDataEntity();
int index = 0;
index += 2;
//取Length
result.DataLength = data[index];
index++;
//取Code
result.Code = data[index];
index++;
//取Status
result.Status = data[index];
index++;
result.Data = new byte[result.DataLength];
//取Data
Array.Copy(data, 5, result.Data, 0, result.DataLength);
index += result.DataLength;
//算Xor
result.Xor = data[index];
int xor = 0;
for (int i = 0; i < 3 + result.DataLength; i++)
{
xor ^= data[i + 2];
}
if(xor != data[data.Length - 2])
{
//_logHelper.Error("数据校验和未通过");
return null;
}
return result;
}
/// <summary>
/// 发送数据封装
/// </summary>
/// <param name="entity"></param>
/// <returns></returns>
public static byte[] BaseSendDataAnalyse(BaseSendDataEntity entity)
{
byte[] result = new byte[entity.Data.Length + 6];
int index = 2;
//指令头
result[0] = 0xAA;
result[1] = 0x55;
//数据长度
result[index] = (byte)entity.Data.Length;
index++;
//指令编号
result[index] = entity.Code;
index++;
//数据
Array.Copy(entity.Data, 0, result, 4, entity.Data.Length);
index += entity.Data.Length;
//校验和
int xor = 0;
for (int i = 0; i < 2 + entity.Data.Length; i++)
{
xor ^= result[i + 2];
}
result[index] = (byte)xor;
index++;
//帧尾
result[index] = 0x0D;
return result;
}
}
}

@ -0,0 +1,258 @@
using SlnMesnac.Rfid.NewRFIDConnect.entity;
using RFIDTest.entity;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Xml.Linq;
namespace SlnMesnac.Rfid.NewRFIDConnect
{
public class RfidDataAnalyse
{
/// <summary>
/// 02H时间段盘点发送
/// </summary>
/// <param name="millisecond">盘点时间毫秒数</param>
/// <returns></returns>
public byte[] Send02H(ushort millisecond)
{
byte[] bytes = BitConverter.GetBytes(millisecond);
bytes = bytes.Reverse().ToArray();
BaseSendDataEntity entity = new BaseSendDataEntity()
{
Code = 0x02,
Data = bytes
};
byte[] result = BaseRFIDDataAnalyse.BaseSendDataAnalyse(entity);
return result;
}
/// <summary>
/// 接受02H盘点数据 (默认EPC 4位)
/// </summary>
/// <param name="data">数据体</param>
/// <returns></returns>
public Receive02HEntity Receive02H(byte[] data)
{
Receive02HEntity entity = new Receive02HEntity();
int index = 0;
if (data.Length != 0)
{
//取读到多少个标签
entity.TagCount = data[index];
entity.Data = new List<Single02HReceive>();
index++;
}
else
{
entity.TagCount = 0;
}
//取每一个读到的标签
for (int i = 0; i < entity.TagCount; i++)
{
Single02HReceive EPCData = new Single02HReceive();
//取单个标签读取的次数
EPCData.Count = data[index];
index++;
//取信号强度
EPCData.RSSI = data[index];
index++;
//取天线端口
EPCData.Ant = data[index];
index++;
//取EPC区域
EPCData.PC = new byte[2];
Array.Copy(data, index, EPCData.PC, 0, 2);
index += 2;
//取读到标签的EPC
EPCData.EPC = new byte[12];
try
{
Array.Copy(data, index, EPCData.EPC, 0, 12);
}
catch (Exception ex)
{
return null;
}
index += 12;
entity.Data.Add(EPCData);
}
return entity;
}
/// <summary>
/// 发送心跳配置包
/// </summary>
/// <returns></returns>
public byte[] SendBFH(byte second)
{
byte[] data = new byte[3];
data[0] = 0x00;
data[1] = second;
data[2] = 0x01;
BaseSendDataEntity entity = new BaseSendDataEntity()
{
Code = 0xBF,
Data = data
};
byte[] result = BaseRFIDDataAnalyse.BaseSendDataAnalyse(entity);
return result;
}
/// <summary>
/// 接收心跳包
/// </summary>
/// <returns></returns>
public uint ReceiveBFH(byte[] data)
{
uint result = BitConverter.ToUInt32(data, 0);
return result;
}
/// <summary>
/// 发送连续盘点请求
/// </summary>
/// <param name="millisecond"></param>
/// <returns></returns>
public byte[] Send11H()
{
byte[] bytes = new byte[2] { 0x00, 0x00 };
//byte[] bytes = BitConverter.GetBytes(millisecond);
//bytes = bytes.Reverse().ToArray();
BaseSendDataEntity entity = new BaseSendDataEntity()
{
Code = 0x11,
Data = bytes
};
byte[] result = BaseRFIDDataAnalyse.BaseSendDataAnalyse(entity);
return result;
}
/// <summary>
/// 发送停止盘点请求
/// </summary>
/// <returns></returns>
public byte[] Send12H()
{
byte[] bytes = new byte[2] { 0x00, 0x00 };
//byte[] bytes = BitConverter.GetBytes(millisecond);
//bytes = bytes.Reverse().ToArray();
BaseSendDataEntity entity = new BaseSendDataEntity()
{
Code = 0x12,
Data = bytes
};
byte[] result = BaseRFIDDataAnalyse.BaseSendDataAnalyse(entity);
return result;
}
/// <summary>
/// 接受连续盘点结果
/// </summary>
/// <param name="data"></param>
/// <returns></returns>
public ReciveResult11HEntity Receive11H(byte[] data)
{
int index = 0;
ReciveResult11HEntity entity = new ReciveResult11HEntity();
entity.Count = data[index];
index++;
entity.RSSI = data[index];
index++;
entity.Ant = data[index];
index++;
entity.PC = new byte[2];
Array.Copy(data, index, entity.PC, 0, 2);
index += 2;
int restLength = data.Length - index;
entity.EPC = new byte[restLength];
Array.Copy(data, index, entity.EPC, 0, restLength);
index += 12;
return entity;
}
/// <summary>
/// 发送写入请求
/// </summary>
/// <returns></returns>
public byte[] Send03H(Base03HENtity rawData)
{
int selectLength = rawData.SelectLength / 8;
int wordCount = rawData.WordCount * 2;
byte[] bytes = new byte[2 + 4 + 1 + 4 + 1 + selectLength + 1 + 4 + 1 + wordCount];
int index = 0;
Array.Copy(rawData.TimeOut, 0, bytes, index, 2);
index += 2;
Array.Copy(rawData.AccessPassword, 0, bytes, index, 4);
index += 4;
bytes[index] = rawData.SelectBank;
index++;
Array.Copy(rawData.SelectAddress, 0, bytes, index, 4);
index += 4;
bytes[index] = rawData.SelectLength;
index++;
Array.Copy(rawData.SelectData, 0, bytes, index, selectLength);
index += selectLength;
bytes[index] = rawData.WriteBank;
index++;
Array.Copy(rawData.WriteAddress, 0, bytes, index, 4);
index += 4;
bytes[index] = rawData.WordCount;
index++;
Array.Copy(rawData.WriteData, 0, bytes, index, wordCount);
index += wordCount;
BaseSendDataEntity entity = new BaseSendDataEntity()
{
Code = 0x03,
Data = bytes
};
byte[] result = BaseRFIDDataAnalyse.BaseSendDataAnalyse(entity);
return result;
}
/// <summary>
/// 发送功率设置包
/// </summary>
/// <param name="power"></param>
/// <returns></returns>
public byte[] Send42H(int power)
{
return new byte[0];
}
}
}

@ -0,0 +1,29 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace SlnMesnac.Rfid.NewRFIDConnect.entity
{
/// <summary>
/// 心跳设置包
/// </summary>
public class BFHSendEntity
{
/// <summary>
/// 返回模式00严格按时间 01空闲返回
/// </summary>
public byte Mode { get; set; }
/// <summary>
/// 返回时间(单位秒)
/// </summary>
public byte Time { get; set; }
/// <summary>
/// 保留一直等于01就行
/// </summary>
public byte Rev { get; set; }
}
}

@ -0,0 +1,61 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace SlnMesnac.Rfid.NewRFIDConnect.entity
{
public class Base03HENtity
{
/// <summary>
/// 超时时间
/// </summary>
public byte[] TimeOut { get; set; }
/// <summary>
/// 访问密码
/// </summary>
public byte[] AccessPassword { get; set; }
/// <summary>
/// 选择区域01 EPC, 02 TID, 03 User
/// </summary>
public byte SelectBank { get; set; }
/// <summary>
/// 选择地址
/// </summary>
public byte[] SelectAddress { get; set; }
/// <summary>
/// 选择匹配数据长度
/// </summary>
public byte SelectLength { get; set; }
/// <summary>
/// 选择匹配数据
/// </summary>
public byte[] SelectData { get; set; }
/// <summary>
/// 写入标签区域00 Reserved, 01 EPC, 02 TID, 03 User
/// </summary>
public byte WriteBank { get; set; }
/// <summary>
/// 写入地址word
/// </summary>
public byte[] WriteAddress { get; set; }
/// <summary>
/// 写入数据量(word)
/// </summary>
public byte WordCount { get; set; }
/// <summary>
/// 写入数据
/// </summary>
public byte[] WriteData { get; set; }
}
}

@ -0,0 +1,38 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace RFIDTest.entity
{
public class Send11HEntity
{
public byte[] TimeOut { get; set; }
}
public class ReciveResult11HEntity
{
public byte Count { get; set; }
/// <summary>
/// 信号强度
/// </summary>
public byte RSSI { get; set; }
/// <summary>
/// 天线端口
/// </summary>
public byte Ant { get; set; }
/// <summary>
/// EPC区域 10h-20h
/// </summary>
public byte[] PC { get; set; }
/// <summary>
/// 读到的EPC内容
/// </summary>
public byte[] EPC { get; set; }
}
}

@ -0,0 +1,39 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace SlnMesnac.Rfid.NewRFIDConnect.entity
{
/// <summary>
/// 接收数据基础类
/// </summary>
public class BaseReciveDataEntity
{
/// <summary>
/// 数据长度2
/// </summary>
public byte DataLength { get; set; }
/// <summary>
/// 指令编号
/// </summary>
public byte Code { get; set; }
/// <summary>
/// 状态码
/// </summary>
public byte Status { get; set; }
/// <summary>
/// 数据
/// </summary>
public byte[] Data { get; set; }
/// <summary>
/// 校验位
/// </summary>
public byte Xor { get; set; }
}
}

@ -0,0 +1,24 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace SlnMesnac.Rfid.NewRFIDConnect.entity
{
/// <summary>
/// 发送数据基础类
/// </summary>
public class BaseSendDataEntity
{
/// <summary>
/// 指令编号
/// </summary>
public byte Code { get; set; }
/// <summary>
/// 数据
/// </summary>
public byte[] Data { get; set; }
}
}

@ -0,0 +1,51 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Security.Cryptography;
using System.Text;
using System.Threading.Tasks;
namespace SlnMesnac.Rfid.NewRFIDConnect.entity
{
public class Receive02HEntity
{
/// <summary>
/// 标签个数
/// </summary>
public byte TagCount { get; set; }
/// <summary>
/// 时间段内读到的数据集合
/// </summary>
public List<Single02HReceive> Data { get; set; }
}
public class Single02HReceive
{
/// <summary>
/// 读取次数
/// </summary>
public byte Count { get; set; }
/// <summary>
/// 信号强度
/// </summary>
public byte RSSI { get; set; }
/// <summary>
/// 天线端口
/// </summary>
public byte Ant { get; set; }
/// <summary>
/// EPC区域
/// </summary>
public byte[] PC { get; set; }
/// <summary>
/// EPC内容
/// </summary>
public byte[] EPC { get; set; }
}
}

@ -128,15 +128,26 @@ namespace SlnMesnac.Rfid
/// <returns></returns>
public abstract Task<bool> Set_BeginIdentify();
/// <summary>
/// 停止连续盘点
/// </summary>
/// <returns></returns>
public abstract Task<bool> Set_StopIdentify();
/// <summary>
/// 心跳指令发送
/// </summary>
/// <returns></returns>
public abstract Task<bool> Set_HeartBeat(byte second);
/// <summary>
/// 写入指令
/// </summary>
/// <param name="pSelectData"></param>
/// <param name="pWriteData"></param>
/// <returns></returns>
public abstract Task<bool> Set_Write(string pSelectData,string pWriteData);
public abstract Task<bool> Set_Write(byte[] pSelectData,string pWriteData);
public abstract Task<bool> Set_StopIdentify();

@ -45,8 +45,9 @@ namespace SlnMesnac.TouchSocket
var _server = service.GetService<TcpServer>();
_server.Init(5656);
var _httpclient = service.GetService<MeshttpClient>();
var _appSetting = service.GetService<AppConfig>();
//_server.Init(6001);
await _httpclient.CreateWebApiClientAsync("10.20.8.51:8005");
await _httpclient.CreateWebApiClientAsync(_appSetting.MESConfig);
//await _httpclient.CreateWebApiClientAsync("127.0.0.1:9881");
//_httpclient.CreateWebApiClient("127.0.0.1:9880");

@ -48,12 +48,12 @@
<ColumnDefinition Width="*"/>
</Grid.ColumnDefinitions>
<StackPanel Grid.Column="0" VerticalAlignment="Center" HorizontalAlignment="Left" Orientation="Horizontal">
<Button Content="首 页" x:Name="Index" Command="{Binding ControlOnClickCommand}" CommandParameter="{Binding Name,ElementName=Index}" Style="{StaticResource BUTTON_AGREE}" Width="100" Height="30" Background="#009999" BorderBrush="#FF36B5C1" Margin="10,0,10,0"/>
<Button Content="首 页" x:Name="Index" Command="{Binding ControlOnClickCommand}" CommandParameter="{Binding Name,ElementName=Index}" Style="{StaticResource BUTTON_AGREE}" Width="150" Height="50" Background="#009999" BorderBrush="#FF36B5C1" Margin="10,0,30,0" FontSize="27"/>
<!--<Button Content="键 盘" Visibility="Hidden" Command="{Binding OpenSystemKeyboardCommand}" Style="{StaticResource BUTTON_AGREE}" Width="100" Height="30" Background="#009999" BorderBrush="#FF36B5C1" Margin="0,0,10,0"/>
<Button Content="最小化" Visibility="Hidden" x:Name="Minimized" Command="{Binding FormControlCommand}" CommandParameter="{Binding Name,ElementName=Minimized}" Style="{StaticResource BUTTON_AGREE}" Width="100" Height="30" Background="#FF9900" BorderBrush="#FF9900" Margin="0,0,10,0"/>
<Button Content="退 出" Visibility="Hidden" x:Name="Exit" Command="{Binding FormControlCommand}" CommandParameter="{Binding Name,ElementName=Exit}" Style="{StaticResource BUTTON_AGREE}" Width="100" Height="30" Background="#FF0033" BorderBrush="#FF0033" Margin="0,0,10,0"/>-->
<Button Content="订单导入" x:Name="ChangeType" Command="{Binding ControlOnClickCommand}" CommandParameter="{Binding Name,ElementName=ChangeType}" Style="{StaticResource BUTTON_AGREE}" Width="100" Height="30" Background="#009999" BorderBrush="#FF36B5C1" Margin="0,0,10,0"/>
<Button Content="数据查询" x:Name="HistorySearch" Command="{Binding ControlOnClickCommand}" CommandParameter="{Binding Name,ElementName=HistorySearch}" Style="{StaticResource BUTTON_AGREE}" Width="100" Height="30" Background="#009999" BorderBrush="#FF36B5C1" Margin="0,0,10,0"/>
<Button Content="订单导入" x:Name="ChangeType" Command="{Binding ControlOnClickCommand}" CommandParameter="{Binding Name,ElementName=ChangeType}" Style="{StaticResource BUTTON_AGREE}" Width="150" Height="50" Background="#009999" BorderBrush="#FF36B5C1" Margin="0,0,30,0" FontSize="27"/>
<Button Content="数据查询" x:Name="HistorySearch" Command="{Binding ControlOnClickCommand}" CommandParameter="{Binding Name,ElementName=HistorySearch}" Style="{StaticResource BUTTON_AGREE}" Width="150" Height="50" Background="#009999" BorderBrush="#FF36B5C1" Margin="0,0,30,0" FontSize="27"/>
<Button Content="报警记录" Visibility="Hidden" x:Name="AlarmRecord" Command="{Binding ControlOnClickCommand}" CommandParameter="{Binding Name,ElementName=AlarmRecord}" Style="{StaticResource BUTTON_AGREE}" Width="100" Height="30" Background="#FF9900" BorderBrush="#FF36B5C1" Margin="0,0,10,0"/>
<Button Content="代码生成" Visibility="Hidden" x:Name="Generate" Command="{Binding FormControlCommand}" CommandParameter="{Binding Name,ElementName=Generate}" Style="{StaticResource BUTTON_AGREE}" Width="100" Height="30" Background="#009999" BorderBrush="#FF36B5C1" Margin="0,0,10,0"/>

@ -132,8 +132,34 @@ namespace SlnMesnac.WPF.Model
}
public string WriteTime { get; set; }
public string WriteStatus { get; set; }
public string _WriteTime = "";
public string WriteTime
{
get { return _WriteTime; }
set
{
if (_WriteTime != value)
{
_WriteTime = value;
OnPropertyChanged(nameof(WriteTime));
}
}
}
public string _WriteStatus = "";
public string WriteStatus
{
get { return _WriteStatus; }
set
{
if (_WriteStatus != value)
{
_WriteStatus = value;
OnPropertyChanged(nameof(WriteStatus));
}
}
}
private string _ReadTime = "";
public string ReadTime
@ -163,6 +189,19 @@ namespace SlnMesnac.WPF.Model
}
}
private string _NextProductNo = "";
public string NextProductNo
{
get { return _NextProductNo; }
set
{
if (_NextProductNo != value)
{
_NextProductNo = value;
OnPropertyChanged(nameof(NextProductNo));
}
}
}
/// <summary>
/// 备 注:

@ -1,235 +0,0 @@
<UserControl x:Class="SlnMesnac.WPF.Page.IndexPage.AlarmRecord"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:materialDesign="http://materialdesigninxaml.net/winfx/xaml/themes"
xmlns:local="clr-namespace:SlnMesnac.WPF.Page.IndexPage"
xmlns:cvt2="clr-namespace:SlnMesnac.WPF.Converter.Generate"
mc:Ignorable="d"
d:DesignHeight="900" d:DesignWidth="1620" Background="Transparent">
<UserControl.Resources>
<!--<converters:IsCheckedConverter x:Key="IsCheckedConverter"/>-->
<!-- 定义样式 -->
<Style x:Key="CustomDatePicker" TargetType="DatePicker">
<!-- 设置背景颜色 -->
<Setter Property="Background" Value="LightBlue"></Setter>
<!-- 设置边框颜色 -->
<Setter Property="BorderBrush" Value="DarkBlue"></Setter>
<!-- 设置字体样式 -->
<Setter Property="FontSize" Value="14"></Setter>
<!-- 设置前景色(文本颜色) -->
<Setter Property="Foreground" Value="Black"></Setter>
</Style>
<!-- 定义日历的样式 -->
<Style x:Key="CustomCalendarStyle" TargetType="Calendar">
<!-- 设置背景颜色 -->
<Setter Property="Background" Value="White"></Setter>
<!-- 设置边框颜色 -->
<Setter Property="BorderBrush" Value="Blue"></Setter>
<Setter Property="Width" Value="250"></Setter>
<Setter Property="Height" Value="250"></Setter>
<!-- 设置字体样式 -->
<Setter Property="FontSize" Value="12"></Setter>
</Style>
<Style x:Key="DataGridTextColumnCenterSytle" TargetType="{x:Type TextBlock}">
<Setter Property="VerticalAlignment" Value="Center" />
<Setter Property="FontSize" Value="18"/>
</Style>
<Style TargetType="DataGrid">
<!--网格线颜色-->
<Setter Property="CanUserResizeColumns" Value="false"/>
<Setter Property="Background" Value="#1152AC" />
<Setter Property="BorderBrush" Value="#4285DE" />
<Setter Property="Foreground" Value="White"/>
<Setter Property="HorizontalGridLinesBrush">
<Setter.Value>
<SolidColorBrush Color="#4285DE"/>
</Setter.Value>
</Setter>
<Setter Property="VerticalGridLinesBrush">
<Setter.Value>
<SolidColorBrush Color="#1152AC"/>
</Setter.Value>
</Setter>
</Style>
<!--列头标题栏样式-->
<Style TargetType="DataGridColumnHeader">
<Setter Property="HorizontalContentAlignment" Value="Center" />
<Setter Property="BorderBrush" Value="#dddddd" />
<Setter Property="Height" Value="40"/>
<Setter Property="FontSize" Value="18"/>
<Setter Property="Background" Value="#4285DE"/>
<Setter Property="Foreground" Value="White"/>
</Style>
<!--单元格样式-->
<Style TargetType="DataGridCell">
<Setter Property="FocusVisualStyle" Value="{x:Null}" />
<Setter Property="BorderThickness" Value="0" />
<Setter Property="BorderBrush" Value="#4285DE" />
<Setter Property="Height" Value="40"/>
<Setter Property="FontSize" Value="12"/>
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type DataGridCell}">
<Grid Background="{TemplateBinding Background}" >
<ContentPresenter HorizontalAlignment="Center" VerticalAlignment="Center" />
</Grid>
</ControlTemplate>
</Setter.Value>
</Setter>
<Style.Triggers>
<Trigger Property="IsSelected" Value="True">
<Setter Property="Background" Value="#4285DE"/>
<Setter Property="Foreground" Value="#dddddd"/>
</Trigger>
</Style.Triggers>
</Style>
</UserControl.Resources>
<Border Grid.Row="1" Grid.Column="1" BorderBrush="#0288d1" BorderThickness="2" CornerRadius="5" Background="Transparent" Margin="5">
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="0.8*"/>
<RowDefinition Height="9*"/>
</Grid.RowDefinitions>
<Border Grid.Row="0" BorderBrush="#0288d1" BorderThickness="0,0,0,1" CornerRadius="0" Background="#1157b9" Margin="1,1,5,5" >
<TextBlock Text="报警记录" FontSize="25" FontWeight="Bold" Foreground="White" VerticalAlignment="Center" HorizontalAlignment="Center"/>
</Border>
<Border Grid.Row="1" BorderBrush="Green" BorderThickness="0" CornerRadius="5" Background="Transparent" Margin="1,1,5,5">
<Grid Margin="10,5">
<Grid.RowDefinitions>
<RowDefinition Height="*"/>
<RowDefinition Height="4*"/>
</Grid.RowDefinitions>
<StackPanel Orientation="horizontal" Grid.Row="0" HorizontalAlignment="Left" VerticalAlignment="Center">
<Label Content="MES订单号:" FontSize="20" Foreground="Black"/>
<TextBox IsReadOnly="False" IsEnabled="True" Text="{Binding MesOrderNo,Mode=TwoWay}" Width="250" FontSize="20" Foreground="Black" Margin="0 0 30 0" />
<Label Content="写入状态" FontSize="20" Foreground="Black"/>
<ComboBox Width="70" Height="30" FontSize="20" SelectedItem="{Binding QueryIsCheck,Mode=TwoWay}" Margin="10,0,30,0" Foreground="Black">
<ComboBoxItem Content="成功" Background="White" Foreground="#4285DE"/>
<ComboBoxItem Content="失败" Foreground="#4285DE"/>
<ComboBoxItem Content="" Foreground="#4285DE"/>
</ComboBox>
<TextBlock Text="开始时间" Margin="10 0" Foreground="Black" FontSize="20" VerticalAlignment="Center"/>
<DatePicker Style="{StaticResource CustomDatePicker}"
x:Name="BeginTime" FontSize="20"
Width="170" Margin="10 0" BorderBrush="Black"
materialDesign:CalendarAssist.IsHeaderVisible="False">
<DatePicker.SelectedDate >
<Binding
Path="BeginDate"
UpdateSourceTrigger="PropertyChanged">
<Binding.ValidationRules>
</Binding.ValidationRules>
</Binding>
</DatePicker.SelectedDate>
</DatePicker>
<TextBlock Text="结束时间" Margin="10 0" Foreground="Black" FontSize="20" VerticalAlignment="Center"/>
<DatePicker Style="{StaticResource CustomDatePicker}"
x:Name="EndTime" Margin="10 0"
Width="170" BorderBrush="Black" FontSize="20"
materialDesign:CalendarAssist.IsHeaderVisible="False">
<DatePicker.SelectedDate>
<Binding
Path="EndDate"
UpdateSourceTrigger="PropertyChanged">
<Binding.ValidationRules>
</Binding.ValidationRules>
</Binding>
</DatePicker.SelectedDate>
</DatePicker>
<Button
Content="查询" Width="200" FontSize="20" Command="{Binding GetOrderInfoCommand}" CommandParameter="{Binding Name,ElementName=Search}"
Background="#009999" Margin="0 0 100 0"/>
</StackPanel>
<UniformGrid Grid.Row="1">
<DataGrid x:Name="listDataGrid" Grid.Row="0" ItemsSource="{Binding realreaddata}" Background="#00000000"
ColumnHeaderHeight="35" Height="{Binding Path=ActualHeight, ElementName=ScanPanel}"
RowHeight="50" AutoGenerateColumns="False" RowHeaderWidth="0" FontSize="20"
GridLinesVisibility="None" ScrollViewer.HorizontalScrollBarVisibility="Auto"
ScrollViewer.VerticalScrollBarVisibility="Auto" BorderThickness="0" CanUserAddRows="False" SelectionMode="Single" IsReadOnly="True"
Foreground="Black" >
<DataGrid.Columns>
<DataGridTextColumn Binding="{Binding objid}" Header="ID" Width="0.5*" ElementStyle="{StaticResource DataGridTextColumnCenterSytle}"/>
<DataGridTextColumn Binding="{Binding orderno}" Header="订单号" Width="2*" ElementStyle="{StaticResource DataGridTextColumnCenterSytle}" />
<DataGridTextColumn Binding="{Binding lineno}" Header="产线号" Width="0.5*" ElementStyle="{StaticResource DataGridTextColumnCenterSytle}" />
<DataGridTextColumn Binding="{Binding producttype}" Header="产品类型" Width="1*" ElementStyle="{StaticResource DataGridTextColumnCenterSytle}" />
<DataGridTextColumn Binding="{Binding rfidepc}" Header="原始EPC" Width="2*" ElementStyle="{StaticResource DataGridTextColumnCenterSytle}" />
<DataGridTextColumn Binding="{Binding rfidascii}" Header="RFID编码" Width="2*" ElementStyle="{StaticResource DataGridTextColumnCenterSytle}" />
<DataGridTextColumn Binding="{Binding readtime,StringFormat=\{0:yyyy-MM-dd HH:mm:ss\}}" Header="读取时间" Width="1.5*" ElementStyle="{StaticResource DataGridTextColumnCenterSytle}"/>
<DataGridTextColumn Binding="{Binding writetime,StringFormat=\{0:yyyy-MM-dd HH:mm:ss\}}" Header="写入时间" Width="1.5*" ElementStyle="{StaticResource DataGridTextColumnCenterSytle}"/>
<!--<DataGridTextColumn Binding="{Binding writestatus}" Header="写入状态" Width="1*" ElementStyle="{StaticResource DataGridTextColumnCenterSytle}" />-->
<DataGridTemplateColumn Header="写入状态" Width="1*">
<DataGridTemplateColumn.CellStyle>
<Style TargetType="DataGridCell">
<Setter Property="HorizontalAlignment" Value="Center"/>
<Setter Property="VerticalAlignment" Value="Center"/>
<Setter Property="Background" Value="Transparent"/>
<Setter Property="Foreground" Value="Black"/>
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="DataGridCell">
<Border Background="{TemplateBinding Background}"
BorderThickness="0"
Padding="5">
<ContentPresenter VerticalAlignment="Center"
HorizontalAlignment="Center"/>
</Border>
</ControlTemplate>
</Setter.Value>
</Setter>
<Style.Triggers>
<!-- 成功:绿色文字 -->
<DataTrigger Binding="{Binding writestatus}" Value="成功">
<Setter Property="Foreground" Value="#FF008000"/>
</DataTrigger>
<!-- 失败:红色文字 -->
<DataTrigger Binding="{Binding writestatus}" Value="失败">
<Setter Property="Foreground" Value="#FFFF0000"/>
</DataTrigger>
</Style.Triggers>
</Style>
</DataGridTemplateColumn.CellStyle>
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<TextBlock Text="{Binding writestatus}"
HorizontalAlignment="Center"
VerticalAlignment="Center"/>
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
</DataGrid.Columns>
</DataGrid>
</UniformGrid>
</Grid>
</Border>
</Grid>
</Border>
</UserControl>

@ -1,34 +0,0 @@
using SlnMesnac.WPF.Attribute;
using SlnMesnac.WPF.ViewModel.IndexPage;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
namespace SlnMesnac.WPF.Page.IndexPage
{
[RegisterAsSingletonAttribute]
/// <summary>
/// AlarmRecord.xaml 的交互逻辑
/// </summary>
public partial class AlarmRecord : UserControl
{
AlarmRecordViewModel alarmRecordViewModel;
public AlarmRecord()
{
InitializeComponent();
alarmRecordViewModel = new AlarmRecordViewModel();
this.DataContext = alarmRecordViewModel;
}
}
}

@ -86,7 +86,7 @@
<Border Grid.Row="1" Grid.Column="1" BorderBrush="#0288d1" BorderThickness="2" CornerRadius="5" Background="Transparent" Margin="5">
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="0.8*"/>
<RowDefinition Height="50"/>
<RowDefinition Height="9*"/>
</Grid.RowDefinitions>
@ -96,7 +96,7 @@
<Border Grid.Row="1" BorderBrush="Green" BorderThickness="0" CornerRadius="5" Background="Transparent" Margin="1,1,5,5">
<Grid Margin="10,5">
<Grid.RowDefinitions>
<RowDefinition Height="*"/>
<RowDefinition Height="70"/>
<RowDefinition Height="4*"/>
</Grid.RowDefinitions>
<StackPanel Orientation="horizontal" Grid.Row="0" HorizontalAlignment="Left" VerticalAlignment="Center">
@ -119,8 +119,8 @@
<DatePicker Style="{StaticResource CustomDatePicker}"
x:Name="BeginTime" FontSize="20"
Width="170" Margin="10 0" BorderBrush="Black"
materialDesign:CalendarAssist.IsHeaderVisible="False">
Width="170" Height="30" Margin="10 0" BorderBrush="Black">
<!--materialDesign:CalendarAssist.IsHeaderVisible="False">-->
<DatePicker.SelectedDate >
<Binding
Path="BeginDate"
@ -132,8 +132,11 @@
</DatePicker>
<Button
Content="从MES获取订单信息" VerticalAlignment="Center" Width="200" FontSize="20" Command="{Binding GetOrderInfoCommand}" CommandParameter="{Binding Name,ElementName=Search}"
Background="#009999" Margin="0 0 100 0"/>
Content="从MES获取订单信息" Width="200" Height="50" FontSize="20" Command="{Binding GetOrderInfoCommand}" CommandParameter="{Binding Name, ElementName=Search}"
Background="#009999" Style="{StaticResource BUTTON_AGREE}"/>
<Button
Content="暂停盘点" Width="200" Height="50" FontSize="20" Margin="10,0,0,0" Command="{Binding StopReadCommand}" CommandParameter="{Binding Name, ElementName=Search}"
Background="#009999" Style="{StaticResource BUTTON_AGREE}"/>
</StackPanel>
<UniformGrid Grid.Row="1">
<DataGrid x:Name="listDataGrid" Grid.Row="0" ItemsSource="{Binding ChangeTypePanel}" Background="#00000000"
@ -148,10 +151,11 @@
<!--<DataGridTextColumn Binding="{Binding ProductName}" Header="物料名称" Width="1.5*" ElementStyle="{StaticResource DataGridTextColumnCenterSytle}" />-->
<DataGridTextColumn Binding="{Binding ProductType}" Header="物料类型" Width="1.5*" ElementStyle="{StaticResource DataGridTextColumnCenterSytle}" />
<DataGridTextColumn Binding="{Binding PlanQty}" Header="计划数量" Width="1*" ElementStyle="{StaticResource DataGridTextColumnCenterSytle}" />
<DataGridTextColumn Binding="{Binding NextProductNo}" Header="带号" Width="1*" ElementStyle="{StaticResource DataGridTextColumnCenterSytle}" />
<DataGridTemplateColumn Header="操作" Width="1.5*">
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<Button Content="切换" Height="40" Width="100" Command="{Binding DataContext.UpdateCommand, RelativeSource={RelativeSource AncestorType={x:Type DataGrid}}}"
<Button Content="开始生产" Height="40" Width="100" Command="{Binding DataContext.UpdateCommand, RelativeSource={RelativeSource AncestorType={x:Type DataGrid}}}"
CommandParameter="{Binding}"/>
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>

@ -32,6 +32,5 @@ namespace SlnMesnac.WPF.Page.IndexPage
ChangeTypeView = new ChangeTypeViewModel();
this.DataContext = ChangeTypeView;
}
}
}

@ -1,100 +0,0 @@
<Window x:Class="SlnMesnac.WPF.Page.IndexPage.DetailTaskContent"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:local="clr-namespace:SlnMesnac.WPF.Page.IndexPage"
mc:Ignorable="d"
Height="650" Width="1020" WindowStartupLocation="CenterScreen" Loaded="Window_Loaded">
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="6*"/>
<RowDefinition Height="60*"/>
</Grid.RowDefinitions>
<Border Grid.Row="0" Margin="0,5,0,0" BorderBrush="#007DFA" BorderThickness="1" CornerRadius="0" Background="#1254AB">
<StackPanel Grid.Column="0" VerticalAlignment="Center" HorizontalAlignment="Center">
<TextBlock Name="AreaTask" Text="1号站台任务列表" FontSize="30" Foreground="White" Height="37" Width="249"/>
</StackPanel>
</Border>
<Border Grid.Row="1" Margin="0,5,0,0" BorderBrush="#007DFA" BorderThickness="1" CornerRadius="0" Background="#1254AB">
<DataGrid x:Name="AreaTaskDataGrid" Style="{DynamicResource DataGridStyle}" ColumnHeaderHeight="22" RowHeight="40" AutoGenerateColumns="False" RowHeaderWidth="0" GridLinesVisibility="None" ScrollViewer.HorizontalScrollBarVisibility="Hidden" ScrollViewer.VerticalScrollBarVisibility="Hidden" BorderThickness="0">
<DataGrid.Resources>
<Style x:Key="DataGridStyle" TargetType="DataGrid">
<Setter Property="AlternationCount" Value="2"/>
<Setter Property="ColumnHeaderStyle" Value="{DynamicResource DataGridColumnHeaderStyle}"/>
<Setter Property="CellStyle" Value="{DynamicResource DataGridCellStyle}"/>
<Setter Property="RowStyle" Value="{DynamicResource DataGridRowStyle}"/>
</Style>
<Style x:Key="DataGridColumnHeaderStyle" TargetType="DataGridColumnHeader">
<Setter Property="HorizontalContentAlignment" Value="Center"/>
<Setter Property="VerticalContentAlignment" Value="Center"/>
<Setter Property="Background" Value="White"/>
</Style>
<Style x:Key="DataGridRowStyle" TargetType="{x:Type DataGridRow}">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type DataGridRow}">
<Grid x:Name="DGR_Border" Background="{TemplateBinding Background}" SnapsToDevicePixels="True">
<Border BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="1"/>
<DataGridCellsPresenter Grid.Column="1" ItemsPanel="{TemplateBinding ItemsPanel}"/>
</Grid>
<ControlTemplate.Triggers>
<Trigger Property="IsSelected" Value="True">
<Setter Property="BorderBrush" Value="#00BCD4"/>
</Trigger>
<Trigger Property="AlternationIndex" Value="0">
<Setter Property="Background" Value="#E9F3FD"/>
</Trigger>
</ControlTemplate.Triggers>
</ControlTemplate>
</Setter.Value>
</Setter>
<Style.Triggers>
<Trigger Property="IsNewItem" Value="True">
<Setter Property="Margin" Value="{Binding NewItemMargin, RelativeSource={RelativeSource AncestorType={x:Type DataGrid}}}"/>
</Trigger>
</Style.Triggers>
</Style>
<Style x:Key="DataGridCellStyle" TargetType="{x:Type DataGridCell}">
<Setter Property="Background" Value="Transparent"/>
<Setter Property="BorderBrush" Value="Transparent"/>
<Setter Property="BorderThickness" Value="0"/>
<Setter Property="VerticalContentAlignment" Value="Center"/>
<Setter Property="HorizontalContentAlignment" Value="Center"/>
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type DataGridCell}">
<Border Background="{TemplateBinding Background}" BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="{TemplateBinding BorderThickness}" SnapsToDevicePixels="True">
<ContentPresenter SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}" HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}" VerticalAlignment="{TemplateBinding VerticalContentAlignment}"/>
</Border>
<ControlTemplate.Triggers>
<Trigger Property="IsSelected" Value="True">
<Setter Property="Foreground" Value="Gray"/>
</Trigger>
</ControlTemplate.Triggers>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
</DataGrid.Resources>
<DataGrid.Columns>
<DataGridTextColumn Binding="{Binding id}" Header="编号" Width="60"/>
<!--<DataGridTextColumn Binding="{Binding MachineID}" Header="机台编号" Width="60"/>-->
<DataGridTextColumn Binding="{Binding taskno}" Header="任务编号" Width="*"/>
<DataGridTextColumn Binding="{Binding flightno}" Header="航班号" Width="*"/>
<DataGridTextColumn Binding="{Binding agvno}" Header="AGV" Width="0.6*"/>
<DataGridTextColumn Binding="{Binding manipulatorno}" Header="AMR" Width="0.6*"/>
<DataGridTextColumn Binding="{Binding taskstate}" Header="任务状态" Width="*"/>
<DataGridTextColumn Binding="{Binding totalcount}" Header="总抓取数量" Width="*"/>
<DataGridTextColumn Binding="{Binding loadcount}" Header="已抓取数量" Width="*"/>
<DataGridTextColumn Binding="{Binding starttime,StringFormat=\{0:yyyy-MM-dd HH:mm:ss\}}" Header="开始时间" Width="*"/>
<DataGridTextColumn Binding="{Binding finishtime,StringFormat=\{0:yyyy-MM-dd HH:mm:ss\}}" Header="完成时间" Width="*"/>
</DataGrid.Columns>
</DataGrid>
</Border>
</Grid>
</Window>

@ -1,67 +0,0 @@
using SlnMesnac.Repository.service;
using SlnMesnac.Repository;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
using static Microsoft.WindowsAPICodePack.Shell.PropertySystem.SystemProperties.System;
using Microsoft.Extensions.DependencyInjection;
using Task = System.Threading.Tasks.Task;
using SlnMesnac.WPF.Attribute;
namespace SlnMesnac.WPF.Page.IndexPage
{
/// <summary>
/// DetailTaskContent.xaml 的交互逻辑
/// </summary>
[RegisterAsSingletonAttribute]
public partial class DetailTaskContent : Window
{
public Action<AirportTask> _Taskaction;
private IAirportTaskService _taskservice;
public AirportTask AirportTask;
public DetailTaskContent()
{
InitializeComponent();
}
private async void LoadAreaTaskInfo()
{
try
{
List<AirportTask> Task = _taskservice.GetTaskInfoListAsync(AirportTask.conveyorno).Result;
this.AreaTaskDataGrid.ItemsSource = Task;
}
catch (Exception ex)
{
}
}
//在载入行的时候在行表头添加编号
private void dgvMH_LoadingRow(object sender, DataGridRowEventArgs e)
{
e.Row.Header = (e.Row.GetIndex() + 1).ToString();
}
private void Window_Loaded(object sender, RoutedEventArgs e)
{
if (AirportTask != null)
{
AreaTask.Text = AirportTask.conveyorno + "号站台任务列表";
}
_taskservice = App.ServiceProvider.GetService<IAirportTaskService>();
LoadAreaTaskInfo();
}
}
}

@ -103,7 +103,7 @@
<Border Grid.Row="1" Grid.Column="1" BorderBrush="#0288d1" BorderThickness="2" CornerRadius="5" Background="Transparent" Margin="5">
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="0.8*"/>
<RowDefinition Height="50"/>
<RowDefinition Height="9*"/>
</Grid.RowDefinitions>
@ -113,7 +113,7 @@
<Border Grid.Row="1" BorderBrush="Green" BorderThickness="0" CornerRadius="5" Background="Transparent" Margin="1,1,5,5">
<Grid Margin="10,5">
<Grid.RowDefinitions>
<RowDefinition Height="*"/>
<RowDefinition Height="70"/>
<RowDefinition Height="4*"/>
</Grid.RowDefinitions>
<StackPanel Orientation="horizontal" Grid.Row="0" HorizontalAlignment="Left" VerticalAlignment="Center">
@ -132,8 +132,8 @@
<DatePicker Style="{StaticResource CustomDatePicker}"
x:Name="BeginTime" FontSize="20"
Width="170" Margin="10 0" BorderBrush="Black"
materialDesign:CalendarAssist.IsHeaderVisible="False">
Width="170" Margin="10 0" BorderBrush="Black">
<!--materialDesign:CalendarAssist.IsHeaderVisible="False">-->
<DatePicker.SelectedDate >
<Binding
Path="BeginDate"
@ -148,8 +148,8 @@
<TextBlock Text="结束时间" Margin="10 0" Foreground="Black" FontSize="20" VerticalAlignment="Center"/>
<DatePicker Style="{StaticResource CustomDatePicker}"
x:Name="EndTime" Margin="10 0"
Width="170" BorderBrush="Black" FontSize="20"
materialDesign:CalendarAssist.IsHeaderVisible="False">
Width="170" BorderBrush="Black" FontSize="20">
<!--materialDesign:CalendarAssist.IsHeaderVisible="False">-->
<DatePicker.SelectedDate>
<Binding
Path="EndDate"
@ -159,9 +159,10 @@
</Binding>
</DatePicker.SelectedDate>
</DatePicker>
<Button
Content="查询" Width="200" FontSize="20" Command="{Binding GetOrderInfoCommand}" CommandParameter="{Binding Name,ElementName=Search}"
Background="#009999" Margin="0 0 100 0"/>
<Button Content="查询" Width="100" FontSize="20" Command="{Binding GetOrderInfoCommand}" CommandParameter="{Binding Name,ElementName=Search}"
Background="#009999" Style="{StaticResource BUTTON_AGREE}" Margin="0,0,20,0"/>
<Button Content="导出" Width="100" FontSize="20" Command="{Binding ExportCommand}" CommandParameter="{Binding Name,ElementName=Search}"
Background="#009999" Style="{StaticResource BUTTON_AGREE}" />
</StackPanel>
<UniformGrid Grid.Row="1">
<DataGrid x:Name="listDataGrid" Grid.Row="0" ItemsSource="{Binding realreaddata}" Background="#00000000"

@ -32,6 +32,10 @@ namespace SlnMesnac.WPF.Page.IndexPage
HistorySearchView = new HistorySearchViewModel();
this.DataContext = HistorySearchView;
}
private void listDataGrid_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
}
}
}

@ -1,198 +0,0 @@
<UserControl x:Class="SlnMesnac.WPF.Page.IndexPage.MaterialBind"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:local="clr-namespace:SlnMesnac.WPF.Page.IndexPage" xmlns:i="http://schemas.microsoft.com/expression/2010/interactivity"
xmlns:converters="clr-namespace:SlnMesnac.WPF.Converter.Generate"
mc:Ignorable="d"
d:DesignHeight="1080" d:DesignWidth="1920" Background="#FF031B3D">
<UserControl.Resources>
<converters:ConfigToDynamicGridViewConverter x:Key="ConfigToDynamicGridViewConverter"/>
<DataTemplate x:Key="LogMsgTemplate">
<TextBlock Text="{Binding}" FontSize="20" Foreground="White" TextWrapping="Wrap" MaxWidth="800"/>
</DataTemplate>
<DataTemplate x:Key="FlightTemplate">
<StackPanel Margin="10,0,0,0">
<Button Content="{Binding StationName}" Foreground="Black"/>
</StackPanel>
</DataTemplate>
</UserControl.Resources>
<Grid Margin="1 5 1 0">
<Grid.ColumnDefinitions>
<ColumnDefinition/>
<ColumnDefinition/>
</Grid.ColumnDefinitions>
<Grid.RowDefinitions>
<RowDefinition/>
<RowDefinition/>
</Grid.RowDefinitions>
<Border Grid.Row="0" Grid.Column="0" BorderBrush="#0288d1" BorderThickness="1" CornerRadius="5" Background="Transparent" Margin="3,1,5,5">
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="1*"/>
<RowDefinition Height="9*"/>
</Grid.RowDefinitions>
<Border Grid.Row="0" BorderBrush="#0288d1" BorderThickness="0,0,0,1" CornerRadius="0" Background="#1157b9" Margin="1,1,3,5" >
<TextBlock Text="扫描信息" FontSize="20" Foreground="White" VerticalAlignment="Center" HorizontalAlignment="Center" FontWeight="Bold"/>
</Border>
<!--扫描信息-->
<Border Grid.Row="1" BorderBrush="#0288d1" BorderThickness="0" CornerRadius="5" Background="Transparent" Margin="1,1,3,5">
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*"/>
<ColumnDefinition Width="6*"/>
<ColumnDefinition Width="0.5*"/>
</Grid.ColumnDefinitions>
<Border BorderThickness="0" Background="Transparent" CornerRadius="5" Margin="10,10,0,0" Grid.ColumnSpan="2">
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="0.5*"/>
<RowDefinition Height="0.7*"/>
<RowDefinition Height="1.7*"/>
</Grid.RowDefinitions>
<StackPanel Grid.Row="0" Grid.Column="0" Orientation="Horizontal" VerticalAlignment="Center" >
<TextBlock Text="壳体条码" FontSize="22" Foreground="White" HorizontalAlignment="Left" VerticalAlignment="Center" Margin="0 0 30 0"/>
<TextBox FontSize="20" Text="{Binding KTBoxCode,Mode=TwoWay}" BorderBrush="White" Foreground="White" Width="250" IsReadOnly="True" Margin="0 0 10 0" HorizontalContentAlignment="Center" VerticalContentAlignment="Center" />
<TextBox FontSize="20" Text="{Binding KTBoxTime,Mode=TwoWay}" BorderBrush="White" Foreground="White" Width="200" IsReadOnly="True" Margin="10 0 0 0" HorizontalContentAlignment="Center" VerticalContentAlignment="Center"/>
<TextBlock Visibility="{Binding OKIsVis}" Grid.Row="0" Text="OK" FontSize="30" HorizontalAlignment="Center" VerticalAlignment="Center" Margin="10 0 0 0" FontWeight="Bold" Foreground="LightGreen"></TextBlock>
<TextBox FontSize="20" Text="{Binding OKCount,Mode=TwoWay}" BorderBrush="White" Foreground="White" Width="60" IsReadOnly="True" Margin="10 0 0 0" HorizontalContentAlignment="Center" VerticalContentAlignment="Center"/>
<Button Content="清 空" Command="{Binding ResetCommand}" Background="#FF1CC57B" Width="50" Margin="5 0 0 0"/>
</StackPanel>
<StackPanel Grid.Row="1" Grid.Column="0" Orientation="Horizontal" VerticalAlignment="Center" >
<TextBlock x:Name="tb_MaterialCode" Text="组件条码" FontSize="22" Foreground="White" HorizontalAlignment="Left" VerticalAlignment="Center" Margin="0 0 30 0"/>
<TextBox FontSize="20" Text="{Binding ZJBoxCode,Mode=TwoWay}" BorderBrush="White" Foreground="White" Width="250" IsReadOnly="True" Margin="0 0 10 0" HorizontalContentAlignment="Center" VerticalContentAlignment="Center" />
<TextBox FontSize="20" Text="{Binding ZJBoxTime,Mode=TwoWay}" BorderBrush="White" Foreground="White" Width="200" IsReadOnly="True" Margin="10 0 0 0" HorizontalContentAlignment="Center" VerticalContentAlignment="Center"/>
<TextBlock Visibility="{Binding NGIsVis}" Grid.Row="1" Text="NG" FontSize="30" HorizontalAlignment="Center" VerticalAlignment="Center" Margin="10 0 0 0" FontWeight="Bold" Foreground="OrangeRed"></TextBlock>
<TextBox FontSize="20" Text="{Binding NGCount,Mode=TwoWay}" BorderBrush="White" Foreground="White" Width="60" IsReadOnly="True" Margin="10 0 0 0" HorizontalContentAlignment="Center" VerticalContentAlignment="Center"/>
</StackPanel>
<Border Grid.Row="2" BorderBrush="#1254AB" BorderThickness="2" Margin="0,10,0,0">
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="2*"/>
<RowDefinition Height="9*"/>
</Grid.RowDefinitions>
<TextBlock Grid.Row="0" Text="日志信息" FontSize="18" Foreground="White" HorizontalAlignment="Center" VerticalAlignment="Center"/>
<ScrollViewer Grid.Row="1" HorizontalScrollBarVisibility="Hidden" VerticalScrollBarVisibility="Hidden">
<ItemsControl ItemsSource="{Binding LogMessages}" ItemTemplate="{StaticResource LogMsgTemplate}" />
</ScrollViewer>
</Grid>
</Border>
<!--<StackPanel Grid.Row="2" Grid.RowSpan="2" Margin="0 40 0 0" >
<TextBlock Text="提示信息:" FontSize="22" Foreground="White"/>
<ScrollViewer Grid.Row="1" HorizontalScrollBarVisibility="Hidden" VerticalScrollBarVisibility="Hidden">
<ItemsControl ItemsSource="{Binding LogMessages}" ItemTemplate="{StaticResource LogMsgTemplate}" />
</ScrollViewer>
--><!--<TextBox FontSize="18" BorderBrush="White" BorderThickness="1"
MinHeight="70" IsReadOnly="True" Foreground="{Binding MsgColor}" Margin="0 5 0 0"
AcceptsReturn="True" Text="{Binding Message,Mode=TwoWay}"
TextWrapping="Wrap"
VerticalScrollBarVisibility="Auto" Height="70" />--><!--
</StackPanel>-->
</Grid>
</Border>
</Grid>
</Border>
</Grid>
</Border>
<Border Grid.Row="1" Grid.ColumnSpan="2" BorderBrush="#0288d1" BorderThickness="1" CornerRadius="5" Background="#FF031B3D" Margin="3,1,3,5">
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="1*"/>
<RowDefinition Height="9*"/>
</Grid.RowDefinitions>
<Border Grid.Row="0" BorderBrush="#0288d1" BorderThickness="0,0,0,1" CornerRadius="0" Background="Transparent" Margin="1,1,5,5" >
<TextBlock Text="扫描记录" FontSize="20" FontWeight="Bold" Foreground="White" VerticalAlignment="Center" HorizontalAlignment="Center" />
</Border>
<!--计划列表-->
<Border x:Name="ScanPanel" Grid.Row="1" Grid.Column="0" BorderBrush="#0288d1" BorderThickness="0" CornerRadius="5" Background="Transparent" Margin="1,1,5,5">
<Grid>
<ListView Background="#FF031B3D" Foreground="White" FontSize="18" Height="{Binding Path=ActualHeight, ElementName=ScanPanel}" ItemsSource="{Binding TaskInfoDataGrid}" View="{Binding ColumnConfig,Converter={StaticResource ConfigToDynamicGridViewConverter}}">
</ListView>
<!--<Grid.RowDefinitions>
<RowDefinition Height="auto"/>
<RowDefinition Height="*"/>
</Grid.RowDefinitions>
<DataGrid x:Name="dg_TaskInfo" Grid.Row="0" ItemsSource="{Binding TaskInfoDataGrid}" Background="#00000000"
ColumnHeaderHeight="35" Height="{Binding Path=ActualHeight, ElementName=ScanPanel}"
RowHeight="50" AutoGenerateColumns="False" RowHeaderWidth="0" FontSize="18"
GridLinesVisibility="None" ScrollViewer.HorizontalScrollBarVisibility="Auto" LoadingRow="dgv_LoadingRow"
ScrollViewer.VerticalScrollBarVisibility="Auto" BorderThickness="0" CanUserAddRows="False" SelectionMode="Single" IsReadOnly="True"
Foreground="White" >
<DataGrid.Columns>
<DataGridTemplateColumn Width="55" Header="序号" >
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<TextBlock Text="{Binding RelativeSource={RelativeSource Mode=FindAncestor,AncestorType={x:Type DataGridRow}}, Path=Header}" FontSize="18" HorizontalAlignment="Left" VerticalAlignment="Center" Margin="10,0,0,0"></TextBlock>
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
<DataGridTextColumn Binding="{Binding TaskNo}" Header="任务编号" Width="2*" />
<DataGridTextColumn Binding="{Binding KBarCode}" Header="壳体条码" Width="2*" />
<DataGridTextColumn Binding="{Binding QBarCode}" Header="前盖条码" Width="2*" />
<DataGridTextColumn Binding="{Binding Station1}" Header="前盖轴封" Width="*" />
<DataGridTextColumn Binding="{Binding Station2}" Header="曲轴压入转子" Width="*" />
<DataGridTextColumn Binding="{Binding Station3}" Header="曲轴压入前盖" Width="*" />
<DataGridTextColumn Binding="{Binding Station4}" Header="电机壳压轴承" Width="*" />
<DataGridTextColumn Binding="{Binding Station5}" Header="前盖轴封检漏" Width="*" />
<DataGridTextColumn Binding="{Binding Station6}" Header="转子充磁" Width="*" />
<DataGridTextColumn Binding="{Binding RecordTime,StringFormat=\{0:yyyy-MM-dd HH:mm:ss\}}" Header="扫描时间" Width="1.7*" />
</DataGrid.Columns>
</DataGrid>-->
</Grid>
</Border>
</Grid>
</Border>
<!--日志信息-->
<Border Grid.Row="0" Grid.Column="1" BorderBrush="#0288d1" BorderThickness="1" CornerRadius="5" Background="#FF031B3D" Margin="3,1,3,5">
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="1*"/>
<RowDefinition Height="9*"/>
</Grid.RowDefinitions>
<Border Grid.Row="0" BorderBrush="#0288d1" BorderThickness="0,0,0,1" CornerRadius="0" Background="Transparent" Margin="1,1,1,5" >
<Grid>
<TextBlock Text="工位信息" FontSize="20" FontWeight="Bold" Foreground="White" VerticalAlignment="Center" HorizontalAlignment="Center" />
</Grid>
</Border>
<Border Grid.Row="1" BorderBrush="#0288d1" BorderThickness="1" CornerRadius="10" Background="Transparent" Margin="5,1,5,5">
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="3*"/>
</Grid.ColumnDefinitions>
<StackPanel x:Name="stackpanel1">
</StackPanel>
<!--<ScrollViewer HorizontalScrollBarVisibility="Hidden" VerticalScrollBarVisibility="Hidden">
<ItemsControl ItemsSource="{Binding StationQualityInfos}" ItemTemplate="{StaticResource FlightTemplate}"/>
</ScrollViewer>-->
</Grid>
</Border>
</Grid>
</Border>
</Grid>
</UserControl>

@ -1,72 +0,0 @@
using ATC_MaterialBind.Entity;
using SlnMesnac.Plc;
using SlnMesnac.WPF.Attribute;
using SlnMesnac.WPF.ViewModel.IndexPage;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Automation.Peers;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
namespace SlnMesnac.WPF.Page.IndexPage
{
/// <summary>
/// MaterialBind.xaml 的交互逻辑
/// </summary>
[RegisterAsSingletonAttribute]
public partial class MaterialBind : UserControl
{
IndexContentViewModel indexContentViewModel;
public MaterialBind()
{
InitializeComponent();
indexContentViewModel = new IndexContentViewModel();
indexContentViewModel._Action += RefreshStationQuallity;
this.DataContext = indexContentViewModel;
//load();
}
private void RefreshStationQuallity(List<StationQualityInfo> stationQualityInfos)
{
Application.Current.Dispatcher.Invoke(new Action(() =>
{
stackpanel1.Children.Clear();
if (stationQualityInfos != null && stationQualityInfos.Count > 0)
{
List<UIElement> buttons = new List<UIElement>();
foreach (var item in stationQualityInfos)
{
buttons.Add(new Button { FontSize = 20, Background = item.State == "1" ? Brushes.Lime : Brushes.Red, Height = 50, Content = item.StationName });
}
foreach (UIElement button in buttons)
{
stackpanel1.Children.Add(button);
}
}
else {
stackpanel1.Children.Remove(this);
}
}));
}
//在载入行的时候在行表头添加编号
private void dgv_LoadingRow(object sender, DataGridRowEventArgs e)
{
e.Row.Header = (e.Row.GetIndex() + 1).ToString();
}
}
}

@ -9,7 +9,7 @@
d:DesignHeight="500" d:DesignWidth="900">
<UserControl.Resources>
<ResourceDictionary>
<Style x:Key="DataGridTextColumnCenterSytle" TargetType="{x:Type TextBlock}">
<Setter Property="VerticalAlignment" Value="Center" />
@ -75,11 +75,22 @@
<Setter Property="Padding" Value="16"/>
</Style>
<!-- 成功状态样式 -->
<Style x:Key="SuccessTextStyle" TargetType="TextBlock">
<Setter Property="Foreground" Value="#00C851"/>
<Setter Property="FontWeight" Value="Bold"/>
<Style.Triggers>
<!-- 成功 = 红色 -->
<DataTrigger Binding="{Binding LastWriteState}" Value="失败">
<Setter Property="Foreground" Value="Red"/>
</DataTrigger>
<!-- 失败 = 绿色 -->
<DataTrigger Binding="{Binding LastWriteState}" Value="成功">
<Setter Property="Foreground" Value="#00C851"/>
</DataTrigger>
</Style.Triggers>
</Style>
<!-- 生产中状态样式 -->
<Style x:Key="ProducingTextStyle" TargetType="TextBlock">
@ -121,14 +132,17 @@
FontSize="24"
FontWeight="Bold"
Foreground="White"/>
</StackPanel>
<StackPanel Grid.Column="1" >
<Button
Content="查询" Width="200" Visibility="Hidden" FontSize="20" Command="{Binding GetOrderInfoCommand}" CommandParameter="{Binding Name,ElementName=Search}"
Background="#009999" Margin="0 0 100 0"/>
<StackPanel Grid.Column="1" Orientation="Horizontal" VerticalAlignment="Center" HorizontalAlignment="Right">
<!--<Button
Content="查询" Width="200" Visibility="Hidden" FontSize="20" Command="{Binding GetOrderInfoCommand}" CommandParameter="{Binding Name,ElementName=Search}"
Background="#009999" Margin="0 0 100 0"/>-->
<TextBlock Text="上次读取状态:" FontSize="15" Foreground="White" Margin="0,0,8,0"/>
<TextBlock Text="{Binding LastWriteState,Mode=TwoWay}" FontSize="15" Style="{StaticResource SuccessTextStyle}" Margin="0,0,8,0"/>
<!--<TextBlock Text="成功" FontSize="15" Style="{StaticResource SuccessTextStyle}" Margin="0,0,8,0"/>-->
</StackPanel>
<!-- 当前时间 -->
<StackPanel Grid.Column="2" Orientation="Horizontal" VerticalAlignment="Center">
@ -147,100 +161,102 @@
</Border>
<!-- 主要内容区域 -->
<ScrollViewer Grid.Row="1" VerticalScrollBarVisibility="Auto" Padding="20">
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="1*"/>
<RowDefinition Height="2*"/>
</Grid.RowDefinitions>
<!--<ScrollViewer Grid.Row="1" VerticalScrollBarVisibility="Auto" Padding="20">-->
<Grid Grid.Row="1">
<Grid.RowDefinitions>
<RowDefinition Height="1*"/>
<RowDefinition Height="2*"/>
</Grid.RowDefinitions>
<!-- 系统概览 -->
<!-- 上半部分:订单信息 + RFID实时信息 -->
<TabControl ItemsSource="{Binding Deviceinfo}">
<TabControl.ItemContainerStyle>
<Style TargetType="TabItem">
<!-- 切换标签时保留Content不销毁重建 -->
<Setter Property="FocusVisualStyle" Value="{x:Null}"/>
</Style>
</TabControl.ItemContainerStyle>
<TabControl.ItemTemplate>
<DataTemplate>
<TextBlock Text="{Binding LineName}" Padding="5 2"/>
</DataTemplate>
</TabControl.ItemTemplate>
<!-- 6号线标签页 -->
<TabControl.ContentTemplate>
<DataTemplate>
<Grid Margin="10">
<!-- 网格布局分为左右两列分别放订单信息和RFID信息 -->
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*"/>
<ColumnDefinition Width="*"/>
</Grid.ColumnDefinitions>
<!-- 当前生产订单信息面板 -->
<Border Grid.Column="0" BorderThickness="1" BorderBrush="#E0E0E0"
<!-- 系统概览 -->
<!-- 上半部分:订单信息 + RFID实时信息 -->
<TabControl ItemsSource="{Binding Deviceinfo}">
<TabControl.ItemContainerStyle>
<Style TargetType="TabItem">
<!-- 切换标签时保留Content不销毁重建 -->
<Setter Property="FocusVisualStyle" Value="{x:Null}"/>
</Style>
</TabControl.ItemContainerStyle>
<TabControl.ItemTemplate>
<DataTemplate>
<TextBlock Text="{Binding LineName}" Padding="5 2"/>
</DataTemplate>
</TabControl.ItemTemplate>
<!-- 6号线标签页 -->
<TabControl.ContentTemplate>
<DataTemplate>
<Grid Margin="10">
<!-- 网格布局分为左右两列分别放订单信息和RFID信息 -->
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*"/>
<ColumnDefinition Width="*"/>
</Grid.ColumnDefinitions>
<!-- 当前生产订单信息面板 -->
<Border Grid.Column="0" BorderThickness="1" BorderBrush="#E0E0E0"
CornerRadius="4" Margin="0,0,5,0">
<Grid Margin="10">
<Grid.RowDefinitions>
<RowDefinition Height="1*"/>
<RowDefinition Height="1*"/>
<RowDefinition Height="1*"/>
<RowDefinition Height="1*"/>
<RowDefinition Height="1*"/>
<RowDefinition Height="1*"/>
<!--<RowDefinition Height="1*"/>
<Grid Margin="10">
<Grid.RowDefinitions>
<RowDefinition Height="1*"/>
<RowDefinition Height="1*"/>
<RowDefinition Height="1*"/>
<RowDefinition Height="1*"/>
<RowDefinition Height="1*"/>
<RowDefinition Height="1*"/>
<RowDefinition Height="1*"/>
<!--<RowDefinition Height="1*"/>
<RowDefinition Height="1*"/>
<RowDefinition Height="1*"/>-->
</Grid.RowDefinitions>
</Grid.RowDefinitions>
<!-- 面板标题 -->
<StackPanel Grid.Row="0" Orientation="Horizontal" Margin="0,0,0,10">
<TextBlock Text="当前生产订单信息" FontWeight="Bold" FontSize="15"/>
</StackPanel>
<!-- 面板标题 -->
<StackPanel Grid.Row="0" Orientation="Horizontal" Margin="0,0,0,10">
<TextBlock Text="当前生产订单信息" FontWeight="Bold" FontSize="15"/>
</StackPanel>
<!-- 订单编号 -->
<Grid Grid.Row="1">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="100"/>
<ColumnDefinition Width="*"/>
</Grid.ColumnDefinitions>
<TextBlock Text="订单编号:" FontSize="15"/>
<TextBlock Text="{Binding OrderNo,Mode=TwoWay}" Grid.Column="1" FontSize="15"/>
</Grid>
<!-- 产线名称 -->
<Grid Grid.Row="2">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="100"/>
<ColumnDefinition Width="*"/>
</Grid.ColumnDefinitions>
<TextBlock Text="产线名称:" FontSize="15"/>
<TextBlock Text="{Binding LineName,Mode=TwoWay}" Grid.Column="1" FontSize="15"/>
</Grid>
<!-- 产线编号 -->
<Grid Grid.Row="3">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="100"/>
<ColumnDefinition Width="*"/>
</Grid.ColumnDefinitions>
<TextBlock Text="产线编号:" FontSize="15"/>
<TextBlock Text="{Binding LineNo,Mode=TwoWay}" Grid.Column="1" FontSize="15"/>
</Grid>
<!-- 产品类型 -->
<Grid Grid.Row="4">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="100"/>
<ColumnDefinition Width="*"/>
</Grid.ColumnDefinitions>
<TextBlock Text="产品类型:" FontSize="15"/>
<TextBlock Text="{Binding ProductType,Mode=TwoWay}" Grid.Column="1" FontSize="15"/>
</Grid>
<!-- 订单编号 -->
<Grid Grid.Row="1">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="100"/>
<ColumnDefinition Width="*"/>
</Grid.ColumnDefinitions>
<TextBlock Text="订单编号:" FontSize="15"/>
<TextBlock Text="{Binding OrderNo,Mode=TwoWay}" Grid.Column="1" FontSize="15"/>
</Grid>
<!-- 产线名称 -->
<Grid Grid.Row="2">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="100"/>
<ColumnDefinition Width="*"/>
</Grid.ColumnDefinitions>
<TextBlock Text="产线名称:" FontSize="15"/>
<TextBlock Text="{Binding LineName,Mode=TwoWay}" Grid.Column="1" FontSize="15"/>
</Grid>
<!-- 产线编号 -->
<Grid Grid.Row="3">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="100"/>
<ColumnDefinition Width="*"/>
</Grid.ColumnDefinitions>
<TextBlock Text="产线编号:" FontSize="15"/>
<TextBlock Text="{Binding LineNo,Mode=TwoWay}" Grid.Column="1" FontSize="15"/>
</Grid>
<!-- RFID总数量 -->
<!--<Grid Grid.Row="5">
<!-- 产品类型 -->
<Grid Grid.Row="4">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="100"/>
<ColumnDefinition Width="*"/>
</Grid.ColumnDefinitions>
<TextBlock Text="产品类型:" FontSize="15"/>
<TextBlock Text="{Binding ProductType,Mode=TwoWay}" Grid.Column="1" FontSize="15"/>
</Grid>
<!-- RFID总数量 -->
<!--<Grid Grid.Row="5">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="100"/>
<ColumnDefinition Width="7*"/>
@ -250,8 +266,8 @@
<TextBlock Text="{Binding RfidCount,Mode=TwoWay}" FontSize="15" Grid.Column="1" Grid.ColumnSpan="2"/>
</Grid>-->
<!-- 已写入数量 -->
<!--<Grid Grid.Row="6">
<!-- 已写入数量 -->
<!--<Grid Grid.Row="6">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="100"/>
<ColumnDefinition Width="*"/>
@ -259,17 +275,27 @@
<TextBlock Text="已写入数量:" FontSize="15"/>
<TextBlock Text="{Binding WriteCount,Mode=TwoWay}" FontSize="15" Grid.Column="1"/>
</Grid>-->
<Grid Grid.Row="7">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="100"/>
<ColumnDefinition Width="*"/>
</Grid.ColumnDefinitions>
<TextBlock Text="下一序列号:" FontSize="15"/>
<TextBlock Text="{Binding SerialNo,Mode=TwoWay}" Grid.Column="1" FontSize="15"/>
</Grid>
<Grid Grid.Row="5">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="100"/>
<ColumnDefinition Width="*"/>
</Grid.ColumnDefinitions>
<TextBlock Text="下一序列号:" FontSize="15"/>
<TextBlock Text="{Binding SerialNo,Mode=TwoWay}" Grid.Column="1" FontSize="15"/>
</Grid>
<!-- 生产状态 -->
<!--<Grid Grid.Row="8">
<!-- 产品类型 -->
<Grid Grid.Row="6">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="100"/>
<ColumnDefinition Width="*"/>
</Grid.ColumnDefinitions>
<TextBlock Text="带号:" FontSize="15"/>
<TextBlock Text="{Binding NextProductNo,Mode=TwoWay}" Grid.Column="1" FontSize="15"/>
</Grid>
<!-- 生产状态 -->
<!--<Grid Grid.Row="8">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="100"/>
<ColumnDefinition Width="*"/>
@ -277,105 +303,107 @@
<TextBlock Text="生产状态:" FontSize="15"/>
<TextBlock Text="{Binding ProductStatus,Mode=TwoWay}" FontSize="15" Style="{StaticResource ProducingTextStyle}" Grid.Column="1"/>
</Grid>-->
</Grid>
</Border>
</Grid>
</Border>
<!-- 实时RFID读写信息面板 -->
<Border Grid.Column="1" BorderThickness="1" BorderBrush="#E0E0E0"
<!-- 实时RFID读写信息面板 -->
<Border Grid.Column="1" BorderThickness="1" BorderBrush="#E0E0E0"
CornerRadius="4" Margin="5,0,0,0">
<Grid Margin="10">
<Grid Margin="10">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*"/>
<ColumnDefinition Width="*"/>
</Grid.ColumnDefinitions>
<Grid.RowDefinitions>
<RowDefinition Height="1*"/>
<RowDefinition Height="1*"/>
<RowDefinition Height="1*"/>
<RowDefinition Height="1*"/>
<RowDefinition Height="1*"/>
<RowDefinition Height="1*"/>
<RowDefinition Height="1*"/>
</Grid.RowDefinitions>
<!-- 面板标题 -->
<StackPanel Grid.Row="0" Orientation="Horizontal" Margin="0,0,0,10" Grid.ColumnSpan="2">
<TextBlock Text="实时RFID读写信息" FontWeight="Bold" FontSize="15"/>
</StackPanel>
<!-- 设备状态 -->
<Grid Grid.Row="1" Grid.ColumnSpan="2">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*"/>
<ColumnDefinition Width="100"/>
<ColumnDefinition Width="*"/>
</Grid.ColumnDefinitions>
<Grid.RowDefinitions>
<RowDefinition Height="30"/>
<RowDefinition Height="30"/>
<RowDefinition Height="30"/>
<RowDefinition Height="30"/>
<RowDefinition Height="30"/>
<RowDefinition Height="30"/>
<RowDefinition Height="30"/>
</Grid.RowDefinitions>
<!-- 面板标题 -->
<StackPanel Grid.Row="0" Orientation="Horizontal" Margin="0,0,0,10" Grid.ColumnSpan="2">
<TextBlock Text="实时RFID读写信息" FontWeight="Bold" FontSize="15"/>
</StackPanel>
<!-- 设备状态 -->
<Grid Grid.Row="1" Grid.ColumnSpan="2">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="100"/>
<ColumnDefinition Width="*"/>
</Grid.ColumnDefinitions>
<TextBlock Text="设备状态:" FontSize="15"/>
<TextBlock Text="{Binding IsOnline,Mode=TwoWay}" FontSize="15" Grid.Column="1"/>
</Grid>
<!-- RFID编码 -->
<Grid Grid.Row="2" Grid.ColumnSpan="2">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="100"/>
<ColumnDefinition Width="*"/>
</Grid.ColumnDefinitions>
<TextBlock Text="RFID编码:" FontSize="15"/>
<TextBlock Text="{Binding RfidASCII,Mode=TwoWay}" FontSize="15" Grid.Column="1"/>
</Grid>
<!-- 原始EPC -->
<Grid Grid.Row="3" Grid.ColumnSpan="2">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="100"/>
<ColumnDefinition Width="*"/>
</Grid.ColumnDefinitions>
<TextBlock Text="原始EPC:" FontSize="15"/>
<TextBlock Text="{Binding RfidEPC,Mode=TwoWay}" FontSize="15" Grid.Column="1"/>
</Grid>
<!-- 读取时间 -->
<Grid Grid.Row="4" Grid.ColumnSpan="2">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="100"/>
<ColumnDefinition Width="*"/>
</Grid.ColumnDefinitions>
<TextBlock Text="读取时间:" FontSize="15"/>
<TextBlock Text="{Binding ReadTime,Mode=TwoWay}" FontSize="15" Grid.Column="1"/>
</Grid>
<!-- 写入时间 -->
<Grid Grid.Row="5" Grid.ColumnSpan="2">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="100"/>
<ColumnDefinition Width="*"/>
</Grid.ColumnDefinitions>
<TextBlock Text="写入时间:" FontSize="15"/>
<TextBlock Text="{Binding WriteTime,Mode=TwoWay}" FontSize="15" Grid.Column="1"/>
</Grid>
<!-- 写入状态 -->
<Grid Grid.Row="6" Grid.ColumnSpan="2">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="100"/>
<ColumnDefinition Width="*"/>
</Grid.ColumnDefinitions>
<TextBlock Text="写入状态:" FontSize="15"/>
<TextBlock Text="{Binding WriteStatus,Mode=TwoWay}" FontSize="15" Style="{StaticResource SuccessTextStyle}" Grid.Column="1"/>
</Grid>
<TextBlock Text="设备状态:" FontSize="15"/>
<TextBlock Text="{Binding IsOnline,Mode=TwoWay}" FontSize="15" Grid.Column="1"/>
</Grid>
<!-- RFID编码 -->
<Grid Grid.Row="2" Grid.ColumnSpan="2">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="100"/>
<ColumnDefinition Width="*"/>
</Grid.ColumnDefinitions>
<TextBlock Text="RFID编码:" FontSize="15"/>
<TextBlock Text="{Binding RfidASCII,Mode=TwoWay}" FontSize="15" Grid.Column="1"/>
</Grid>
</Border>
</Grid>
</DataTemplate>
</TabControl.ContentTemplate>
<!-- 原始EPC -->
<Grid Grid.Row="3" Grid.ColumnSpan="2">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="100"/>
<ColumnDefinition Width="*"/>
</Grid.ColumnDefinitions>
<TextBlock Text="原始EPC:" FontSize="15"/>
<TextBlock Text="{Binding RfidEPC,Mode=TwoWay}" FontSize="15" Grid.Column="1"/>
</Grid>
<!-- 7号线标签页 -->
<!--<TabItem Header="7号线">
<!-- 读取时间 -->
<Grid Grid.Row="4" Grid.ColumnSpan="2">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="100"/>
<ColumnDefinition Width="*"/>
</Grid.ColumnDefinitions>
<TextBlock Text="读取时间:" FontSize="15"/>
<TextBlock Text="{Binding ReadTime,Mode=TwoWay}" FontSize="15" Grid.Column="1"/>
</Grid>
<!-- 写入时间 -->
<Grid Grid.Row="5" Grid.ColumnSpan="2">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="100"/>
<ColumnDefinition Width="*"/>
</Grid.ColumnDefinitions>
<TextBlock Text="写入时间:" FontSize="15"/>
<TextBlock Text="{Binding WriteTime,Mode=TwoWay}" FontSize="15" Grid.Column="1"/>
</Grid>
<!-- 写入状态 -->
<Grid Grid.Row="6" Grid.ColumnSpan="2">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="100"/>
<ColumnDefinition Width="*"/>
</Grid.ColumnDefinitions>
<TextBlock Text="写入状态:" FontSize="15"/>
<TextBlock Text="{Binding WriteStatus,Mode=TwoWay}" FontSize="15" Style="{StaticResource SuccessTextStyle}" Grid.Column="1"/>
</Grid>
</Grid>
</Border>
</Grid>
</DataTemplate>
</TabControl.ContentTemplate>
<!-- 7号线标签页 -->
<!--<TabItem Header="7号线">
<Grid Margin="10">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*"/>
<ColumnDefinition Width="*"/>
</Grid.ColumnDefinitions>
--><!-- 当前生产订单信息面板 --><!--
-->
<!-- 当前生产订单信息面板 -->
<!--
<Border Grid.Column="0" BorderThickness="1" BorderBrush="#E0E0E0"
CornerRadius="4" Margin="0,0,5,0">
<Grid Margin="10">
@ -389,12 +417,16 @@
<RowDefinition Height="1*"/>
</Grid.RowDefinitions>
--><!-- 面板标题 --><!--
-->
<!-- 面板标题 -->
<!--
<StackPanel Grid.Row="0" Orientation="Horizontal" Margin="0,0,0,10">
<TextBlock Text="当前生产订单信息" FontWeight="Bold" FontSize="15"/>
</StackPanel>
--><!-- 订单编号 --><!--
-->
<!-- 订单编号 -->
<!--
<Grid Grid.Row="1">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="100"/>
@ -404,7 +436,9 @@
<TextBlock Text="S260402000112832604106" Grid.Column="1"/>
</Grid>
--><!-- 产线编号 --><!--
-->
<!-- 产线编号 -->
<!--
<Grid Grid.Row="2">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="100"/>
@ -414,7 +448,9 @@
<TextBlock Text="7号线" Grid.Column="1"/>
</Grid>
--><!-- 产品类型 --><!--
-->
<!-- 产品类型 -->
<!--
<Grid Grid.Row="3">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="100"/>
@ -424,7 +460,9 @@
<TextBlock Text="整芯带" Grid.Column="1"/>
</Grid>
--><!-- RFID总数量 --><!--
-->
<!-- RFID总数量 -->
<!--
<Grid Grid.Row="4">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="100"/>
@ -435,7 +473,9 @@
<TextBlock Text="20" Grid.Column="1" Grid.ColumnSpan="2"/>
</Grid>
--><!-- 已写入数量 --><!--
-->
<!-- 已写入数量 -->
<!--
<Grid Grid.Row="5">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="100"/>
@ -445,7 +485,9 @@
<TextBlock Text="8" Grid.Column="1"/>
</Grid>
--><!-- 生产状态 --><!--
-->
<!-- 生产状态 -->
<!--
<Grid Grid.Row="6">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="100"/>
@ -457,7 +499,9 @@
</Grid>
</Border>
--><!-- 实时RFID读写信息面板 --><!--
-->
<!-- 实时RFID读写信息面板 -->
<!--
<Border Grid.Column="1" BorderThickness="1" BorderBrush="#E0E0E0"
CornerRadius="4" Margin="5,0,0,0">
<Grid Margin="10">
@ -474,12 +518,16 @@
<RowDefinition Height="30"/>
</Grid.RowDefinitions>
--><!-- 面板标题 --><!--
-->
<!-- 面板标题 -->
<!--
<StackPanel Grid.Row="0" Orientation="Horizontal" Margin="0,0,0,10" Grid.ColumnSpan="2">
<TextBlock Text="实时RFID读写信息" FontWeight="Bold" FontSize="15"/>
</StackPanel>
--><!-- RFID编码 --><!--
-->
<!-- RFID编码 -->
<!--
<Grid Grid.Row="1" Grid.ColumnSpan="2">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="100"/>
@ -489,7 +537,9 @@
<TextBlock Text="S260402000112832604106 08" Grid.Column="1"/>
</Grid>
--><!-- 原始EPC --><!--
-->
<!-- 原始EPC -->
<!--
<Grid Grid.Row="2" Grid.ColumnSpan="2">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="100"/>
@ -499,7 +549,9 @@
<TextBlock Text="303032313B312D34567890ABCD" Grid.Column="1"/>
</Grid>
--><!-- 读取时间 --><!--
-->
<!-- 读取时间 -->
<!--
<Grid Grid.Row="3" Grid.ColumnSpan="2">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="100"/>
@ -509,7 +561,9 @@
<TextBlock Text="2026-04-02 15:30:22" Grid.Column="1"/>
</Grid>
--><!-- 写入时间 --><!--
-->
<!-- 写入时间 -->
<!--
<Grid Grid.Row="4" Grid.ColumnSpan="2">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="100"/>
@ -519,7 +573,9 @@
<TextBlock Text="2026-04-02 15:30:23" Grid.Column="1"/>
</Grid>
--><!-- 写入状态 --><!--
-->
<!-- 写入状态 -->
<!--
<Grid Grid.Row="5" Grid.ColumnSpan="2">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="100"/>
@ -534,30 +590,32 @@
</Grid>
</TabItem>-->
</TabControl>
<!-- 下半部分最近10条RFID读写记录 -->
<Border Grid.Row="1" BorderThickness="1" BorderBrush="#E0E0E0"
</TabControl>
<!-- 下半部分最近10条RFID读写记录 -->
<ScrollViewer Grid.Row="1" VerticalScrollBarVisibility="Auto" Padding="0">
<Border BorderThickness="1" BorderBrush="#E0E0E0"
CornerRadius="4" Margin="0,10,0,0">
<Grid Margin="10">
<Grid.RowDefinitions>
<RowDefinition Height="1*"/>
<RowDefinition Height="9*"/>
<RowDefinition Height="30px"/>
<RowDefinition Height="*"/>
</Grid.RowDefinitions>
<!-- 面板标题 -->
<TextBlock Grid.Row="0" Text="最近10条RFID读写记录" FontSize="15"
VerticalAlignment="Center" Margin="0,0,0,5"/>
VerticalAlignment="Center" Margin="10,0,0,0"/>
<!-- 数据表格绑定ViewModel中的历史记录 -->
<Grid Grid.Row="1">
<DataGrid x:Name="senorlistDataGrid" Grid.Row="0" ItemsSource="{Binding RFIDHistoryRecords}" Background="#00000000"
ColumnHeaderHeight="35" Height="{Binding Path=ActualHeight, ElementName=ScanPanel}"
RowHeight="50" AutoGenerateColumns="False" RowHeaderWidth="0" FontSize="15"
GridLinesVisibility="None" ScrollViewer.HorizontalScrollBarVisibility="Auto"
ScrollViewer.VerticalScrollBarVisibility="Auto" BorderThickness="0" CanUserAddRows="False" SelectionMode="Single" IsReadOnly="True" MaxHeight="400" VerticalScrollBarVisibility="Auto"
Foreground="Black" >
ColumnHeaderHeight="35" Height="{Binding Path=ActualHeight, ElementName=ScanPanel}"
RowHeight="50" AutoGenerateColumns="False" RowHeaderWidth="0" FontSize="15"
GridLinesVisibility="None" ScrollViewer.HorizontalScrollBarVisibility="Auto"
ScrollViewer.VerticalScrollBarVisibility="Auto" BorderThickness="0" CanUserAddRows="False" SelectionMode="Single" IsReadOnly="True" VerticalScrollBarVisibility="Auto"
Foreground="Black" >
<DataGrid.Columns>
<!--<DataGridTextColumn Binding="{Binding SerialNumber}" Header="编号" Width="0.1*" ElementStyle="{StaticResource DataGridTextColumnCenterSytle}"/>-->
<DataGridTextColumn Binding="{Binding OrderNumber}" Header="订单号" Width="1*" ElementStyle="{StaticResource DataGridTextColumnCenterSytle}" />
@ -614,8 +672,9 @@
</Grid>
</Grid>
</Border>
</Grid>
</ScrollViewer>
</ScrollViewer>
</Grid>
<!--</ScrollViewer>-->
<!-- 状态栏 -->
<!--<Border Grid.Row="2"
@ -627,7 +686,9 @@
<ColumnDefinition Width="Auto"/>
</Grid.ColumnDefinitions>
--><!-- 系统状态 --><!--
-->
<!-- 系统状态 -->
<!--
<StackPanel Grid.Column="0" Orientation="Horizontal">
<Border Width="10"
Height="10"
@ -650,7 +711,9 @@
FontWeight="Bold"/>
</StackPanel>
--><!-- 版本信息 --><!--
-->
<!-- 版本信息 -->
<!--
<StackPanel Grid.Column="1" Orientation="Horizontal">
<TextBlock Text="版本v1.0.0"
Foreground="#BDC3C7"

@ -1,18 +0,0 @@
<Window x:Class="SlnMesnac.WPF.Page.IndexPage.SetPower"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:local="clr-namespace:SlnMesnac.WPF.Page.IndexPage"
mc:Ignorable="d"
Title="SetPower" Height="450" Width="800" WindowStartupLocation="CenterOwner" Loaded="Window_Loaded">
<Grid>
<Button x:Name="button" Content="获取" HorizontalAlignment="Left" Margin="461,79,0,0" VerticalAlignment="Top" Height="38" Width="107" Click="button_Click"/>
<Label x:Name="label" Content="当前功率" HorizontalAlignment="Left" Margin="170,85,0,0" VerticalAlignment="Top"/>
<TextBox x:Name="textBox" FontSize="22" IsReadOnly="True" HorizontalAlignment="Left" Margin="270,83,0,0" TextWrapping="Wrap" Text="" VerticalAlignment="Top" Width="120" RenderTransformOrigin="0.214,0.157"/>
<Button x:Name="button复制__C_" Content="写入" HorizontalAlignment="Left" Margin="461,148,0,0" VerticalAlignment="Top" Height="38" Width="107" Click="button复制__C__Click"/>
<Label x:Name="label复制__C_" Content="写入功率" HorizontalAlignment="Left" Margin="170,154,0,0" VerticalAlignment="Top"/>
<TextBox x:Name="textBox复制__C_" FontSize="22" HorizontalAlignment="Left" Margin="270,152,0,0" TextWrapping="Wrap" Text="" VerticalAlignment="Top" Width="120" RenderTransformOrigin="0.214,0.157"/>
</Grid>
</Window>

@ -1,83 +0,0 @@
using Microsoft.Extensions.DependencyInjection;
using SlnMesnac.Rfid;
using SlnMesnac.WPF.Attribute;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Shapes;
namespace SlnMesnac.WPF.Page.IndexPage
{
/// <summary>
/// SetPower.xaml 的交互逻辑
/// </summary>
[RegisterAsSingletonAttribute]
public partial class SetPower : Window
{
public List<RfidAbsractFactory> rfidList;
private string _combineID;
public SetPower(string combineID)
{
_combineID = combineID;
InitializeComponent();
}
private async void Window_Loaded(object sender, RoutedEventArgs e)
{
try
{
rfidList = App.ServiceProvider.GetRequiredService<List<RfidAbsractFactory>>();
string DB = await rfidList.Find(x => x.ConfigKey == _combineID).Get_Rf();
textBox.Text = DB.ToString();
}
catch (Exception ex)
{
}
}
private async void button_Click(object sender, RoutedEventArgs e)
{
try
{
string DB = await rfidList.Find(x => x.ConfigKey == _combineID).Get_Rf();
textBox.Text = DB.ToString();
}
catch (Exception ex)
{
}
}
private async void button__C__Click(object sender, RoutedEventArgs e)
{
try
{
if (string.IsNullOrEmpty(textBox__C_.Text))
{
MessageBox.Show("写入功率不能为空!","注意",MessageBoxButton.OK,MessageBoxImage.Warning);
return;
}
bool iflag = await rfidList.Find(x => x.ConfigKey == _combineID).Set_Rf(int.Parse(textBox__C_.Text));
if (iflag)
{
MessageBox.Show("功率修改成功!");
}
}
catch (Exception ex)
{
}
}
}
}

@ -49,14 +49,15 @@
</ItemGroup>
<ItemGroup>
<PackageReference Include="CommunityToolkit.Mvvm" Version="8.2.2" />
<PackageReference Include="CommunityToolkit.Mvvm" Version="8.4.2" />
<PackageReference Include="EPPlus" Version="8.5.3" />
<PackageReference Include="Lierda.WPFHelper" Version="1.0.3" />
<PackageReference Include="MaterialDesignThemes" Version="4.8.0" />
<PackageReference Include="MaterialDesignThemes" Version="5.3.1" />
<PackageReference Include="MvvmLightLibs" Version="5.4.1.1" />
<PackageReference Include="NVelocity" Version="1.2.0" />
<PackageReference Include="Rougamo.Fody" Version="5.0.2" />
<PackageReference Include="Scrutor" Version="7.0.0" />
<PackageReference Include="System.Text.Json" Version="10.0.5" />
<PackageReference Include="System.Text.Json" Version="11.0.0-preview.3.26207.106" />
<PackageReference Include="WindowsAPICodePack-Shell" Version="1.1.1" />
</ItemGroup>

@ -51,6 +51,7 @@ namespace SlnMesnac.WPF.ViewModel.IndexPage
appConfig = App.ServiceProvider.GetService<AppConfig>();
BeginDate = DateTime.Now.Date; // 当天的 0:00:00
UpdateCommand = new RelayCommand<object>(t => Update(t));
StopReadingCommand = new RelayCommand<object>(t => StopRead(t));
GetOrderInfoCommand = new RelayCommand<object>(t=> RefreshData(t));
sqlSugarClient = App.ServiceProvider.GetService<ISqlSugarClient>();
rfidList = App.ServiceProvider.GetRequiredService<List<RfidAbsractFactory>>();
@ -78,6 +79,8 @@ namespace SlnMesnac.WPF.ViewModel.IndexPage
}
public RelayCommand<object> GetOrderInfoCommand { get; set; }
public RelayCommand<object> StopReadingCommand { get; set; }
private void Update(object parameter)
{
if (parameter == null)
@ -92,8 +95,9 @@ namespace SlnMesnac.WPF.ViewModel.IndexPage
var ProductName = model.ProductName;
var ProductType = model.ProductType;
var PlanQty = model.PlanQty;
var NextProductNo = model.NextProductNo;
List<Base_device_info> DeviceInfos = sqlSugarClient.Queryable<Base_device_info>().Where(expression: x => x.Collectid == appConfig.StationCode && x.Name == QueryIsCheck.ToString().Trim() && x.Deleteflag == 0).ToList();
List<DeviceInfoConfig> DeviceInfos = appConfig.deviceInfoConfig.Where(x => x.Collectid == appConfig.StationCode && x.Name == QueryIsCheck.ToString().Trim() && x.Deleteflag == 0).ToList();
string mesOrderNo = MesOrderNo;
string rfidCount = RfidCount;
Real_DataInfo real_Data = new Real_DataInfo()
@ -101,15 +105,48 @@ namespace SlnMesnac.WPF.ViewModel.IndexPage
OrderNo = model.OrderNo,
Deviceid = DeviceInfos[0].Deviceid,
LineName = QueryIsCheck.ToString().Trim(),
LineNo = lineno,
LineNo = DeviceInfos[0].Addr,
ProductType = model.ProductType,
RfidCount = model.PlanQty.ToString(),
NextProductNo = model.NextProductNo.ToString("D3")
};
WeakReferenceMessenger.Default.Send(real_Data);
WeakReferenceMessenger.Default.Send(real_Data);
MessageBox.Show("MES订单切换成功!", "系统提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
Log.Information($"{mesOrderNo}MES订单切换成功{JsonSerializer.Serialize(real_Data)}");
MainWindowViewModel.ReturnHomeAction?.Invoke();
}
/// <summary>
/// 停止读取RFID数据
/// </summary>
/// <param name="parameter"></param>
/// <returns></returns>
[RelayCommand]
private async Task StopRead(object parameter)
{
//获取设备编号
if (string.IsNullOrEmpty(QueryIsCheck.ToString().Trim()))
{
MessageBox.Show("请选择产线!", "系统提示", MessageBoxButtons.OK, MessageBoxIcon.Warning);
return;
}
List<DeviceInfoConfig> DeviceInfos = appConfig.deviceInfoConfig.Where(x => x.Collectid == appConfig.StationCode && x.Name == QueryIsCheck.ToString().Trim() && x.Deleteflag == 0).ToList();
var res = rfidList.FirstOrDefault(x => x.deviceid == DeviceInfos[0].Deviceid).Set_StopIdentify().GetAwaiter().GetResult();
if (res)
{
MessageBox.Show("停止盘点成功!", "系统提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
}
else
{
MessageBox.Show("停止盘点失败!", "系统提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
}
}
/// <summary>
/// 从MES获取订单信息
/// </summary>
@ -127,31 +164,14 @@ namespace SlnMesnac.WPF.ViewModel.IndexPage
}
else
{
if (QueryIsCheck.ToString().Trim() == "2#硫化线")
{
lineno = "VM002";
}
else if (QueryIsCheck.ToString().Trim() == "3#硫化线")
{
lineno = "VM003";
}
else if (QueryIsCheck.ToString().Trim() == "6#硫化线上")
{
lineno = "VM006";
}
else if (QueryIsCheck.ToString().Trim() == "6#硫化线下")
{
lineno = "VM006";
}
else if (QueryIsCheck.ToString().Trim() == "7#硫化线")
{
lineno = "VM007";
}
List<DeviceInfoConfig> DeviceInfos = appConfig.deviceInfoConfig.Where(x => x.Collectid == appConfig.StationCode && x.Name == QueryIsCheck.ToString().Trim() && x.Deleteflag == 0).ToList();
lineno = DeviceInfos[0].Addr;
}
Console.WriteLine("调用MES获取订单接口");
//调用MES接口获取生产订单信息
//MessageBox.Show("MES订单获取成功!", "系统提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
List<MesOrderInfo> mesOrderInfos = new List<MesOrderInfo>();
//string response = "{\"code\":200,\"msg\":\"success\",\"data\":[{\"OrderNo\":\"SS075\",\"ProductCode\":\"4030502500100006\",\"ProductType\":\"钢丝带-ST-井下阻燃钢丝带\",\"ProductName\":\"输送带-井下阻燃钢丝带-ST\",\"ProductSpec\":\"1400mmST/S2500*18+8MT/MTD7.2P15N89\",\"PlanQty\":130.00,\"NextProductNo\":1}]}\r\n";
string response = await _httpclient.GetMesOrderInfo(lineno, BeginDate.ToString("yyyy-MM-dd"));
Console.WriteLine("接收MES接口返回:"+ response);
// 反序列化
@ -182,6 +202,7 @@ namespace SlnMesnac.WPF.ViewModel.IndexPage
{
Log.Information($"JSON解析失败: {ex.Message}");
Log.Information($"原始内容: {response}");
MessageBox.Show("MES订单获取失败");
}
}

@ -5,6 +5,7 @@ using CommunityToolkit.Mvvm.Messaging;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Logging;
using Models;
using OfficeOpenXml;
using SlnMesnac.Common;
using SlnMesnac.Config;
using SlnMesnac.Model.domain;
@ -16,6 +17,7 @@ using SqlSugar;
using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.IO;
using System.Linq;
using System.Linq.Expressions;
using System.Runtime.ConstrainedExecution;
@ -42,6 +44,7 @@ namespace SlnMesnac.WPF.ViewModel.IndexPage
{
sqlSugarClient = App.ServiceProvider.GetService<ISqlSugarClient>();
GetOrderInfoCommand = new RelayCommand<object>(t=> RefreshData(t));
ExportCommand = new RelayCommand<object>(t=> ExportData(t));
BeginDate = DateTime.Now.Date; // 当天的 0:00:00
EndDate = DateTime.Now.Date.AddDays(2).AddSeconds(-1); // 当天的 23:59:59
RefreshHistoryData();
@ -61,6 +64,11 @@ namespace SlnMesnac.WPF.ViewModel.IndexPage
public RelayCommand<object> GetOrderInfoCommand { get; set; }
public RelayCommand<object> ExportCommand { get; set; }
/// <summary>
/// 从MES获取订单信息
/// </summary>
@ -97,7 +105,7 @@ namespace SlnMesnac.WPF.ViewModel.IndexPage
realreaddata.Clear();
foreach (var item in real_readdataInfos)
{
realreaddata.Add(item);
realreaddata.Insert(0, item);
}
});
}
@ -107,6 +115,95 @@ namespace SlnMesnac.WPF.ViewModel.IndexPage
}
}
/// <summary>
/// 导出订单信息
/// </summary>
/// <param name="parameter"></param>
/// <returns></returns>
[RelayCommand]
private async Task ExportData(object? parameter)
{
try
{
// 代码方式配置
ExcelPackage.License.SetNonCommercialPersonal("provate");//个人
if (realreaddata == null || realreaddata.Count == 0)
{
MessageBox.Show("没有可导出的数据!");
return;
}
// 选择保存路径
var dialog = new SaveFileDialog
{
Filter = "Excel文件 (*.xlsx)|*.xlsx",
FileName = $"订单数据_{DateTime.Now:yyyyMMddHHmmss}.xlsx"
};
if (dialog.ShowDialog() != DialogResult.OK)
return;
using (var package = new ExcelPackage())
{
var sheet = package.Workbook.Worksheets.Add("Sheet1");
// ===== 表头 =====
sheet.Cells[1, 1].Value = "ID";
sheet.Cells[1, 2].Value = "订单号";
sheet.Cells[1, 3].Value = "产线";
sheet.Cells[1, 4].Value = "产品类型";
sheet.Cells[1, 5].Value = "RFID EPC";
sheet.Cells[1, 6].Value = "RFID ASCII";
sheet.Cells[1, 7].Value = "读取时间";
sheet.Cells[1, 8].Value = "写入时间";
sheet.Cells[1, 9].Value = "写入状态";
sheet.Cells[1, 10].Value = "序列号";
// 表头加粗
using (var range = sheet.Cells[1, 1, 1, 10])
{
range.Style.Font.Bold = true;
}
// ===== 数据 =====
int row = 2;
foreach (var item in realreaddata)
{
sheet.Cells[row, 1].Value = item.objid;
sheet.Cells[row, 2].Value = item.orderno;
sheet.Cells[row, 3].Value = item.lineno;
sheet.Cells[row, 4].Value = item.producttype;
sheet.Cells[row, 5].Value = item.rfidepc;
sheet.Cells[row, 6].Value = item.rfidascii;
sheet.Cells[row, 7].Value = item.readtime?.ToString("yyyy-MM-dd HH:mm:ss");
sheet.Cells[row, 8].Value = item.writetime?.ToString("yyyy-MM-dd HH:mm:ss");
sheet.Cells[row, 9].Value = item.writestatus;
sheet.Cells[row, 10].Value = item.serialno;
row++;
}
// 自动列宽
sheet.Cells[sheet.Dimension.Address].AutoFitColumns();
// 冻结首行
sheet.View.FreezePanes(2, 1);
// 保存文件
File.WriteAllBytes(dialog.FileName, package.GetAsByteArray());
}
MessageBox.Show($"导出成功!{dialog.FileName}");
}
catch (Exception ex)
{
MessageBox.Show($"导出失败:{ex.Message}");
}
}
private ComboBoxItem _QueryIsCheck = new ComboBoxItem() { Content = "" };
public ComboBoxItem QueryIsCheck
{

@ -13,6 +13,7 @@ using SlnMesnac.Model.Enum;
using SlnMesnac.Repository;
using SlnMesnac.Repository.service;
using SlnMesnac.Rfid;
using SlnMesnac.Rfid.Enum;
using SlnMesnac.Serilog;
using SlnMesnac.TouchSocket;
using SlnMesnac.WPF.Attribute;
@ -77,6 +78,24 @@ namespace SlnMesnac.WPF.ViewModel.IndexPage
}
}
}
/// <summary>
/// 上一次写入状态
/// </summary>
private string _lastWriteState;
public string LastWriteState
{
get => _lastWriteState;
set
{
if (_lastWriteState != value)
{
_lastWriteState = value;
RaisePropertyChanged(() => LastWriteState);
}
}
}
public ProductionLineViewModel()
{
GetOrderInfoCommand = new RelayCommand<object>(t => RefreshData(t));
@ -90,7 +109,8 @@ namespace SlnMesnac.WPF.ViewModel.IndexPage
_TcpServer = App.ServiceProvider.GetRequiredService<TcpServer>();
rfidList = App.ServiceProvider.GetRequiredService<List<RfidAbsractFactory>>();
rfidList.ForEach(rfid => {
rfidList.ForEach(rfid =>
{
rfid._Action += RecvIdentifyData_Instance;
//rfid._RefreshLogMessageAction += RefreshLogMessage;
});
@ -142,7 +162,7 @@ namespace SlnMesnac.WPF.ViewModel.IndexPage
if (real_Readdatas.Count > 0)
{
SNo = real_Readdatas.Max(x => x.serialno);
SNo = (Convert.ToInt32(SNo) + 1).ToString("D2");
SNo = (Convert.ToInt32(SNo) + 1).ToString("D2");
}
else
{
@ -153,11 +173,14 @@ namespace SlnMesnac.WPF.ViewModel.IndexPage
Deviceinfo.FirstOrDefault(x => x.Deviceid == real_Data.Deviceid).ProductType = real_Data.ProductType;
Deviceinfo.FirstOrDefault(x => x.Deviceid == real_Data.Deviceid).LineNo = real_Data.LineNo;
Deviceinfo.FirstOrDefault(x => x.Deviceid == real_Data.Deviceid).RfidCount = real_Data.RfidCount;
Deviceinfo.FirstOrDefault(x => x.Deviceid == real_Data.Deviceid).NextProductNo = real_Data.NextProductNo;
rfidList.FirstOrDefault(x => x.deviceid == real_Data.Deviceid).Set_BeginIdentify().GetAwaiter().GetResult();
}
private void LoadDeviceInfo()
{
List<Base_device_info> DeviceInfos = sqlSugarClient.Queryable<Base_device_info>().Where(expression: x => x.Collectid == appConfig.StationCode && x.Deleteflag == 0).ToList();
List<DeviceInfoConfig> DeviceInfos = appConfig.deviceInfoConfig.Where(x => x.Collectid == appConfig.StationCode && x.Deleteflag == 0).ToList();
List<Real_DataInfo> real_DataInfos = new List<Real_DataInfo>();
foreach (var item in DeviceInfos)
@ -177,7 +200,7 @@ namespace SlnMesnac.WPF.ViewModel.IndexPage
RfidASCII = "",
RfidEPC = "",
ReadTime = "",
WriteTime ="",
WriteTime = "",
ProductStatus = "",
WriteStatus = "",
};
@ -245,7 +268,7 @@ namespace SlnMesnac.WPF.ViewModel.IndexPage
ReadTime = item.ReadTime,
WriteTime = item.WriteTime,
ProductStatus = item.ProductStatus,
WriteStatus=item.WriteStatus,
WriteStatus = item.WriteStatus,
RfidEPC = item.RfidEPC,
};
Deviceinfo.Add(real_DataInfo);
@ -269,32 +292,52 @@ namespace SlnMesnac.WPF.ViewModel.IndexPage
return;
}
//读到停止连续盘点
bool stopflag = await rfidList.FirstOrDefault(x => x.deviceid == iCombineId).Set_StopIdentify();
//bool stopflag = await rfidList.FirstOrDefault(x => x.deviceid == iCombineId).Set_StopIdentify();
//查询数据库是否已存在记录
bool iflag = false;
List<real_readdata> real_Readdatas = sqlSugarClient.Queryable<real_readdata>().Where(expression: x => x.rfidascii == tagInfos[0].EPCstring).ToList();
string epcascii = Encoding.ASCII.GetString(tagInfos[0].EPC);
epcascii = epcascii.Replace("\0", "");
List<real_readdata> real_Readdatas = sqlSugarClient.Queryable<real_readdata>().Where(expression: x => x.rfidascii == epcascii).ToList();
//如果不存在则写入
if (real_Readdatas.Count <= 0)
//if (true)
{
if (string.IsNullOrEmpty(Deviceinfo.FirstOrDefault(x => x.Deviceid == iCombineId).SerialNo))
{
return;
}
Deviceinfo.FirstOrDefault(x => x.Deviceid == iCombineId).ReadTime = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss");
//拼接订单号写入标签
string WriteData = Deviceinfo.FirstOrDefault(x => x.Deviceid == iCombineId).OrderNo + Deviceinfo.FirstOrDefault(x => x.Deviceid == iCombineId).LineNo + DateTime.Now.ToString("yy")+ Deviceinfo.FirstOrDefault(x => x.Deviceid == iCombineId).SerialNo + Deviceinfo.FirstOrDefault(x => x.Deviceid == iCombineId).SerialNo;
////测试写入
//bool writeflag = await rfidList.FirstOrDefault(x => x.deviceid == iCombineId).Set_Write(Encoding.ASCII.GetString(tagInfos[0].EPC), "JG26522604101");
//if (!writeflag)
//{
// writeflag = await rfidList.FirstOrDefault(x => x.deviceid == iCombineId).Set_Write(Encoding.ASCII.GetString(tagInfos[0].EPC), "JG26522604101");
// if (!writeflag)
// {
// writeflag = await rfidList.FirstOrDefault(x => x.deviceid == iCombineId).Set_Write(Encoding.ASCII.GetString(tagInfos[0].EPC), "JG26522604101");
// }
//}
string WriteData = Deviceinfo.FirstOrDefault(x => x.Deviceid == iCombineId).OrderNo
+ Deviceinfo.FirstOrDefault(x => x.Deviceid == iCombineId).LineNo
+ DateTime.Now.ToString("yy")
+ Deviceinfo.FirstOrDefault(x => x.Deviceid == iCombineId).NextProductNo
+ Deviceinfo.FirstOrDefault(x => x.Deviceid == iCombineId).SerialNo;
//写入 三次重写
bool writeflag = await rfidList.FirstOrDefault(x => x.deviceid == iCombineId).Set_Write(tagInfos[0].EPC, WriteData);
if (!writeflag)
{
Log.Error($"第一次写入失败,重试中...");
writeflag = await rfidList.FirstOrDefault(x => x.deviceid == iCombineId).Set_Write(tagInfos[0].EPC, WriteData);
if (!writeflag)
{
Log.Error($"第二次写入失败,重试中...");
writeflag = await rfidList.FirstOrDefault(x => x.deviceid == iCombineId).Set_Write(tagInfos[0].EPC, WriteData);
if (!writeflag)
{
Log.Error($"第三次写入失败,立即开始重新盘点");
LastWriteState = "失败";
rfidList.FirstOrDefault(x => x.deviceid == iCombineId).Set_BeginIdentify().GetAwaiter().GetResult();
return;
}
}
}
Deviceinfo.FirstOrDefault(x => x.Deviceid == iCombineId).WriteTime = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss");
Deviceinfo.FirstOrDefault(x => x.Deviceid == iCombineId).WriteStatus = "成功";
LastWriteState = "成功";
Deviceinfo.FirstOrDefault(x => x.Deviceid == iCombineId).RfidASCII = WriteData;
Deviceinfo.FirstOrDefault(x => x.Deviceid == iCombineId).RfidEPC = tagInfos[0].EPCstring;
Deviceinfo.FirstOrDefault(x => x.Deviceid == iCombineId).SerialNo = (Convert.ToInt32(Deviceinfo.FirstOrDefault(x => x.Deviceid == iCombineId).SerialNo) + 1).ToString("D2");
//保存写入记录
real_readdata real_Readdata = new real_readdata()
@ -312,16 +355,24 @@ namespace SlnMesnac.WPF.ViewModel.IndexPage
var a = sqlSugarClient.Ado.Context.CopyNew().Insertable<real_readdata>(real_Readdata).ExecuteCommand();
//刷新界面
RefreshEventArgs(iCombineId, tagInfos);
//Deviceinfo.FirstOrDefault(x => x.Deviceid == iCombineId).RfidASCII = Encoding.ASCII.GetString(tagInfos[0].EPC);
//Deviceinfo.FirstOrDefault(x => x.Deviceid == iCombineId).ReadTime = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss");
//RefreshEventArgs(iCombineId, tagInfos);
AddRFIDData(iCombineId, tagInfos);
bool startflag = await rfidList.FirstOrDefault(x => x.deviceid == iCombineId).Set_BeginIdentify();
}
await Task.Run(async () =>
{
await Task.Delay(1000);
await rfidList.FirstOrDefault(x => x.deviceid == iCombineId)!.Set_BeginIdentify();
});
}
catch (Exception e)
{
Log.Error($"RecvIdentifyData_Instance异常{e.Message}");
Log.Error($"读结果准备写入时异常:{e.Message}");
}
finally
{
}
}
public void RefreshEventArgs(string iCombineId, List<TagInfo> tagInfos)
@ -334,24 +385,24 @@ namespace SlnMesnac.WPF.ViewModel.IndexPage
Deviceinfo.FirstOrDefault(x => x.Deviceid == iCombineId).RfidASCII = Encoding.ASCII.GetString(tagInfos[0].EPC);
Deviceinfo.FirstOrDefault(x => x.Deviceid == iCombineId).ReadTime = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss");
}));
}
}
catch (Exception ex)
{
Log.Information($"异常:{ex.Message}");
}
}
// 添加数据的方法(核心:添加前/后判断行数)
public void AddRFIDData(string iCombineId,List<TagInfo> tagInfos)
public void AddRFIDData(string iCombineId, List<TagInfo> tagInfos)
{
// 1. 判断当前行数是否>10是则清空
if (RFIDHistoryRecords.Count >= 10)
{
RFIDHistoryRecords.Clear();
}
//// 1. 判断当前行数是否>10是则清空
//if (RFIDHistoryRecords.Count >= 10)
//{
// RFIDHistoryRecords.Clear();
//}
App.Current.Dispatcher.Invoke(() =>
{
RFIDHistoryRecords.Add(new RFIDRecord
RFIDHistoryRecords.Insert(0, new RFIDRecord
{
OrderNumber = Deviceinfo.FirstOrDefault(x => x.Deviceid == iCombineId).OrderNo,
LineNumber = Deviceinfo.FirstOrDefault(x => x.Deviceid == iCombineId).LineNo,
@ -362,7 +413,7 @@ namespace SlnMesnac.WPF.ViewModel.IndexPage
WriteTime = Deviceinfo.FirstOrDefault(x => x.Deviceid == iCombineId).ReadTime,
WriteStatus = Deviceinfo.FirstOrDefault(x => x.Deviceid == iCombineId).WriteStatus // 模拟1条失败数据
});
RFIDHistoryRecords.OrderByDescending(x=>x.ReadTime).ToList();
//RFIDHistoryRecords.OrderByDescending(x => x.ReadTime).ToList();
});
}
@ -410,7 +461,7 @@ namespace SlnMesnac.WPF.ViewModel.IndexPage
{
Log.Information($"监听设备状态异常:{ex.Message}");
}
await Task.Delay(1000 * 30);
await Task.Delay(1000 * 20);
}
});
}
@ -437,78 +488,24 @@ namespace SlnMesnac.WPF.ViewModel.IndexPage
{
try
{
bool iflag = await device.ConnectAsync(device.ip, device.port, device.deviceid);
if (iflag)
//基于心跳检测的断线重连机制
if (GloalVar.HeartBeatRecoard.TryGetValue(device.deviceid, out var value))
{
//bool iflag11111 = await device.Set_BeginIdentify();
//bool ifa = await device.Set_Write("","");
//string ifla = await device.Get_Frequencyband();
//bool ifla1 = await device.Set_FilterData("FC 08");
//string ia = await device.Get_FilterData();
iflag = await device.SendHeartPack();
if (!iflag)
{
//device.Close();
bool iflag1 = await device.ConnectAsync(device.ip, device.port, device.deviceid);
iflag = await device.SendHeartPack();
if (iflag)
{
Deviceinfo.FirstOrDefault(x => x.Deviceid == device.deviceid).IsOnline = "已连接";
}
else
{
Deviceinfo.FirstOrDefault(x => x.Deviceid == device.deviceid).IsOnline = "未连接";
}
}
else
if (value.AddSeconds(15) < DateTime.Now)
{
await Reconnect(device);
Deviceinfo.FirstOrDefault(x => x.Deviceid == device.deviceid).IsOnline = "已连接";
}
}
else
{
//更新界面状态
Deviceinfo.FirstOrDefault(x => x.Deviceid == device.deviceid).IsOnline = "未连接";
device.Close();
bool iflag1 = await device.ConnectAsync(device.ip, device.port, device.ConfigKey);
iflag = await device.SendHeartPack();
if (iflag)
{
Deviceinfo.FirstOrDefault(x => x.Deviceid == device.deviceid).IsOnline = "已连接";
}
await Reconnect(device);
Deviceinfo.FirstOrDefault(x => x.Deviceid == device.deviceid).IsOnline = "已连接";
var res = false;
//无限获取心跳返回报文
Log.Information($"准备第一次获取心跳");
res = await device.Set_HeartBeat(5);
}
//存库,如果没有则插入如果存在则更新
//lock (string.Empty)
//{
// try
// {
// List<Base_device_state> Base_device_state = sqlSugarClient.Ado.Context.CopyNew().Queryable<Base_device_state>().Where(x => x.DeviceId == int.Parse(device.deviceid)).ToList();
// if (Base_device_state != null && Base_device_state.Count > 0)
// {
// //只更新
// Base_device_state[0].DeviceState = iflag ? 1 : 0;
// Base_device_state[0].DeviceTime = DateTime.Now;
// sqlSugarClient.Ado.Context.CopyNew().Updateable(Base_device_state).UpdateColumns(it => new { it.DeviceState, it.DeviceTime }).ExecuteCommand();
// }
// else
// {
// Base_device_state base_device_state = new Base_device_state()
// {
// DeviceId = int.Parse(device.deviceid),
// DeviceState = iflag ? 1 : 0,
// DeviceTime = DateTime.Now,
// };
// var a = sqlSugarClient.Ado.Context.CopyNew().Insertable<Base_device_state>(base_device_state).ExecuteCommand();
// }
// }
// catch (Exception ex)
// {
// Log.Information($"更新RFID状态异常:{ex.Message}", ex);
// }
//}
}
catch (Exception ex)
{
@ -516,5 +513,22 @@ namespace SlnMesnac.WPF.ViewModel.IndexPage
}
}
/// <summary>
/// 无限重连
/// </summary>
/// <param name="device"></param>
/// <returns></returns>
private async Task Reconnect(RfidAbsractFactory device)
{
var res = false;
do
{
Deviceinfo.FirstOrDefault(x => x.Deviceid == device.deviceid).IsOnline = "未连接";
Log.Information($"[{device.deviceid}]:[{device.ip}:{device.port}]连接中...");
res = await device.ConnectAsync(device.ip, device.port, device.deviceid);
}
while (!res);
}
}
}

@ -29,12 +29,16 @@ namespace SlnMesnac.WPF.ViewModel
//private TcpServer _tcpServer;
//代码生成
private readonly GenerateControl generateControl = new GenerateControl();
private readonly ChangeType changeType = new ChangeType();
private readonly HistorySearch historySearch = new HistorySearch();
//private MiddleWare indexContent = new MiddleWare();
private ProductionLineUserControl indexContent = new ProductionLineUserControl();
//private ChangeType changeType = new ChangeType();
private AppConfig _appConfig;
private MeshttpClient _airPorthttpClient;
public static Action ReturnHomeAction;
#region 参数定义
/// <summary>
/// PLC设备状态
@ -123,7 +127,7 @@ namespace SlnMesnac.WPF.ViewModel
ControlOnClickCommand = new RelayCommand<object>(obj => ControlOnClick(obj));
FormControlCommand = new RelayCommand<object>(x => FormControl(x));
UserContent = indexContent;
ReturnHomeAction = () => UserContent = indexContent;
}
/// <summary>
@ -190,10 +194,10 @@ namespace SlnMesnac.WPF.ViewModel
UserContent = indexContent;
break;
case "ChangeType":
UserContent = new ChangeType();
UserContent = changeType;
break;
case "HistorySearch":
UserContent = new HistorySearch();
UserContent = historySearch;
break;
default: break;
}

@ -71,12 +71,37 @@
"IsFlag": true
}
],
"redisConfig": "175.27.215.92:6379,password=redis@2023",
"deviceInfoConfig": [
{
"DeviceId": "10001",
"Name": "Line1",
"ConnectStr": "192.168.0.7:20108",
"Connectmode": "1",
"Devicetype": "RFly_I160",
"Collectid": "102",
"Addr": "VM006",
"Deleteflag": "0"
},
{
"DeviceId": "10002",
"Name": "Line2",
"ConnectStr": "192.168.0.7:20108",
"Connectmode": "1",
"Devicetype": "RFly_I160",
"Collectid": "102",
"Addr": "VM006",
"Deleteflag": "1"
}
],
"redisConfig": "175.27.215.92:6379,password=redis@2023",
"ComPort": "COM1",
"StationCode": "102"
"StationCode": "102",
"MESConfig": "10.20.8.61:8001"
},
"ProductConfig": {
"OKCount": "0",

Loading…
Cancel
Save