From a37918a95d71f6fd371759cff9b542024746cb61 Mon Sep 17 00:00:00 2001 From: hehaibing-1996 Date: Mon, 9 Dec 2024 10:26:39 +0800 Subject: [PATCH] =?UTF-8?q?=E5=90=8C=E6=AD=A5=E5=8F=91=E9=80=81=E5=A4=8D?= =?UTF-8?q?=E4=BD=8D=E6=8C=87=E4=BB=A4=E6=B5=8B=E8=AF=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- WCS.BLL/HardWare/MXL4ShelfModule.cs | 12 +-- WCS.BLL/Tool/TCPClient.cs | 117 +++++++++++++++++++--------- 2 files changed, 89 insertions(+), 40 deletions(-) diff --git a/WCS.BLL/HardWare/MXL4ShelfModule.cs b/WCS.BLL/HardWare/MXL4ShelfModule.cs index 1b9abfe..74c9736 100644 --- a/WCS.BLL/HardWare/MXL4ShelfModule.cs +++ b/WCS.BLL/HardWare/MXL4ShelfModule.cs @@ -14,6 +14,11 @@ namespace WCS.BLL.HardWare public class MXL4ShelfModule : IModuleBase { #region 协议 + /// + /// 复位命令 + /// + public byte[] ResetData = { 0xBE, 0x52, 0x54, 0x41, 0x52, 0x54, 0x0A, 0xED }; + /// /// 进入入库模式 /// @@ -66,10 +71,7 @@ namespace WCS.BLL.HardWare /// public byte[] GoOutStockTakingModeData = { 0x0A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }; - /// - /// 复位命令 - /// - public byte[] ResetData = { 0x13, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }; + /// /// 查询当前电压值 /// @@ -122,7 +124,7 @@ namespace WCS.BLL.HardWare .OrderBy(t => t.LightNumber) .ToList(); char[] data = "0000000000000000".ToCharArray(); - + //禁用 char[] dataBan = "0000000000000000".ToCharArray(); diff --git a/WCS.BLL/Tool/TCPClient.cs b/WCS.BLL/Tool/TCPClient.cs index 3c2b830..b5f1a35 100644 --- a/WCS.BLL/Tool/TCPClient.cs +++ b/WCS.BLL/Tool/TCPClient.cs @@ -34,6 +34,9 @@ namespace WCS.BLL public ConcurrentDictionary MessageList { get; set; } = new ConcurrentDictionary(); public TcpClient tcpClient { get; set; } + + //同步发送等待客户端 等待上一条指令发送成功并收到响应之后才发送下一条指令 + public IWaitingClient 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) {