同步发送复位指令测试

This commit is contained in:
hehaibing-1996
2024-12-09 10:26:39 +08:00
parent 7fe764f144
commit a37918a95d
2 changed files with 89 additions and 40 deletions

View File

@ -14,6 +14,11 @@ namespace WCS.BLL.HardWare
public class MXL4ShelfModule : IModuleBase
{
#region
/// <summary>
/// 复位命令
/// </summary>
public byte[] ResetData = { 0xBE, 0x52, 0x54, 0x41, 0x52, 0x54, 0x0A, 0xED };
/// <summary>
/// 进入入库模式
/// </summary>
@ -66,10 +71,7 @@ namespace WCS.BLL.HardWare
/// </summary>
public byte[] GoOutStockTakingModeData = { 0x0A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 };
/// <summary>
/// 复位命令
/// </summary>
public byte[] ResetData = { 0x13, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 };
/// <summary>
/// 查询当前电压值
/// </summary>
@ -122,7 +124,7 @@ namespace WCS.BLL.HardWare
.OrderBy(t => t.LightNumber)
.ToList();
char[] data = "0000000000000000".ToCharArray();
//禁用
char[] dataBan = "0000000000000000".ToCharArray();

View File

@ -34,6 +34,9 @@ namespace WCS.BLL
public ConcurrentDictionary<int, MessageDto> MessageList { get; set; } = new ConcurrentDictionary<int, MessageDto>();
public TcpClient tcpClient { get; set; }
//同步发送等待客户端 等待上一条指令发送成功并收到响应之后才发送下一条指令
public IWaitingClient<TcpClient> waitClient;
public object receivdLockObject = new object();
public object sendLockObject = new object();
@ -66,6 +69,8 @@ namespace WCS.BLL
tcpClient = new TcpClient();
if (string.IsNullOrEmpty(BindIPHost))
{
//载入配置
@ -83,6 +88,19 @@ namespace WCS.BLL
//添加控制台日志注入
a.AddConsoleLogger();
}));
var waitClient = tcpClient.CreateWaitingClient(new WaitingOptions()
{
FilterFunc = response => //设置用于筛选的fun委托当返回为true时才会响应返回
{
if (response.Data.Length == 13)
{
return true;
}
return false;
}
});
}
else
{
@ -183,42 +201,42 @@ namespace WCS.BLL
return EasyTask.CompletedTask;
};
//配置数据重发机制
Task.Run(async () =>
{
while (true)
{
try
{
//TODO如果指令已发两次 则取消重发
await Task.Delay(100);
if (MessageList.Count > 0)
{
var failedMessage = MessageList.Where(t => t.Value.LastSendTime < DateTime.Now.AddSeconds(-1))
.ToList();
foreach (var message in failedMessage)
{
Logs.Write("【指令重发】" + BitConverter.ToString(message.Value.Message) + "指令超时1s未响应", LogsType.InstructionResend);
}
MessageList.RemoveWhen(t => t.Value.SendTimes >= 2);
foreach (var item in MessageList)
{
if (item.Value.LastSendTime < DateTime.Now.AddSeconds(-1))
{
////配置数据重发机制
//Task.Run(async () =>
//{
// while (true)
// {
// try
// {
// //TODO如果指令已发两次 则取消重发
// await Task.Delay(100);
// if (MessageList.Count > 0)
// {
// var failedMessage = MessageList.Where(t => t.Value.LastSendTime < DateTime.Now.AddSeconds(-1))
// .ToList();
// foreach (var message in failedMessage)
// {
// Logs.Write("【指令重发】" + BitConverter.ToString(message.Value.Message) + "指令超时1s未响应", LogsType.InstructionResend);
// }
// MessageList.RemoveWhen(t => t.Value.SendTimes >= 2);
// foreach (var item in MessageList)
// {
// if (item.Value.LastSendTime < DateTime.Now.AddSeconds(-1))
// {
Send(item.Value.Message);
item.Value.SendTimes++;
item.Value.LastSendTime = DateTime.Now;
Logs.Write("【指令重发】" + BitConverter.ToString(item.Value.Message) + "已进行重发", LogsType.InstructionResend);
}
}
}
}
catch
{
}
}
});
// Send(item.Value.Message);
// item.Value.SendTimes++;
// item.Value.LastSendTime = DateTime.Now;
// Logs.Write("【指令重发】" + BitConverter.ToString(item.Value.Message) + "已进行重发", LogsType.InstructionResend);
// }
// }
// }
// }
// catch
// {
// }
// }
//});
}
catch (Exception ex)
{
@ -273,6 +291,35 @@ namespace WCS.BLL
}
}
public void SendThenReturn(byte[] message, bool IsReSend = false)
{
try
{
var boardId = (message[3] << 8) + message[4];
lock (sendLockObject)
{
var clientIpHost = tcpClient.IP + ":" + tcpClient.Port;
Logs.Write($"【同步等待发送{clientIpHost}】{BitConverter.ToString(message)}", LogsType.Instructions);
waitClient.SendThenReturn(message);
Thread.Sleep(3);
}
}
catch (Exception ex)
{
Logs.Write("【同步等待发送指令时发生异常】" + ex.Message, LogsType.Instructions);
//因异常断连时(网线已经被断了) 手动重连一次
if (ex is NotConnectedException)
{
Task.Run(() =>
{
ReConnectAsync();
});
}
throw ex;
}
}
//生成协议明细
public byte[] GenerateMessage(int boardId, byte[] data)
{