kazelee
2025-05-26 53d582ad41d8450b21045b2d862a532ecc57a9ba
device/TcpClientHelper.cs
@@ -64,7 +64,6 @@
            lock (_linkLock) {
                try {
                    // 若Socket存在但实际已断开,强制清理
                    if (_clientSocket != null && (_clientSocket.Poll(0, SelectMode.SelectRead) && _clientSocket.Available == 0)) {
                        SafeCloseSocket();
@@ -72,13 +71,18 @@
                    // 原有逻辑
                    if (_clientSocket != null && _clientSocket.Connected) {
                        LogHelper.Info($"电梯已连接,无需重连,IP:{ip},端口:{port}");
                        return false;
                        //if (ip == _ip && port == _port) {
                            LogHelper.Info($"产线已连接,无需重连,IP:{ip},端口:{port}");
                            return false;
                        //}
                        //LogHelper.Info($"oldIP={_ip};newIP={ip};oldPort={_port};newPort={port}");
                        //SafeCloseSocket();
                    }
                    return Init(ip, port);
                }
                catch (Exception ex) {
                    LogHelper.Error($"电梯重连失败,IP:{ip},端口:{port},异常:{ex.Message}", ex);
                    LogHelper.Error($"产线重连失败,IP:{ip},端口:{port},异常:{ex.Message}", ex);
                    return false;
                }
            }
@@ -210,6 +214,77 @@
            }
        }
        /// <summary>
        /// {\"item_code\":\"CG1001\",\"batch_no\":\"BN1001\",\"cntr_code\":\"CN2505111\"}<br/>
        /// {"item_code":"CG1001","batch_no":"BN1001","cntr_code":"CN2505111"}
        /// </summary>
        /// <param name="read"></param>
        /// <returns></returns>
        public static bool TryReadProductionLine(out byte[] read) {
            read = null;
            try {
                if (_clientSocket != null && _clientSocket?.Connected == true) {
                    if (!_receivedDataQueue.TryGetValue($"{_ip}:{_port}", out byte[] result)) {
                        LogHelper.Info($"读产线托盘下线数据失败");
                        //read = result;
                        return false;
                    }
                    LogHelper.Info($"读产线托盘下线数据成功:{BitConverter.ToString(result)}");
                    read = result;
                    return true;
                }
                else {
                    //LogHelper.Info($"_clientSocket={_clientSocket} connected={_clientSocket?.Connected}");
                    Link(_ip, _port);
                    LogHelper.Info($"读产线托盘下线数据失败(未连接),准备重连");
                    return false;
                }
            }
            catch (Exception ex) {
                //LogHelper.Error($"读产线托盘下线数据失败(发生了异常:{JsonConvert.SerializeObject(ex)}):{ex.Message}", ex);
                LogHelper.InfoEx(ex);
                return false;
                /* 异常处理 */
            }
            //return false;
        }
        /// <summary>
        /// 将Modbus寄存器数组转换为字节数组
        /// </summary>
        /// <param name="registers">Modbus寄存器数组</param>
        /// <returns>字节数组</returns>
        public static byte[] ConvertRegistersToBytes(ushort[] registers) {
            // 每个寄存器是16位(2字节),所以总字节数是寄存器数量的2倍
            byte[] bytes = new byte[registers.Length * 2];
            for (int i = 0; i < registers.Length; i++) {
                // Modbus使用大端序,高位字节在前
                bytes[i * 2] = (byte)(registers[i] >> 8);     // 高位字节
                bytes[i * 2 + 1] = (byte)(registers[i] & 0xFF); // 低位字节
            }
            return bytes;
        }
        /// <summary>
        /// 将字节数组转换为字符串
        /// </summary>
        /// <param name="bytes">字节数组</param>
        /// <returns>转换后的字符串</returns>
        public static string ConvertBytesToString(byte[] bytes) {
            // 查找第一个0x00字节(字符串结束符)的位置
            int length = Array.IndexOf(bytes, (byte)0);
            if (length < 0) length = bytes.Length; // 如果没有结束符,使用全部字节
            // 根据设备使用的编码转换(常见的有ASCII或UTF-8)
            // 这里使用ASCII编码作为示例,实际应根据设备文档确定编码方式
            return Encoding.ASCII.GetString(bytes, 0, length);
            // 如果是UTF-8编码,使用下面这行代替上面那行
            // return Encoding.UTF8.GetString(bytes, 0, length);
        }
        public static bool WriteElevatorDownOk(byte[] sends) {
            try {