| | |
| | | lock (_linkLock) { |
| | | try { |
| | | |
| | | |
| | | // 若Socket存在但实际已断开,强制清理 |
| | | if (_clientSocket != null && (_clientSocket.Poll(0, SelectMode.SelectRead) && _clientSocket.Available == 0)) { |
| | | SafeCloseSocket(); |
| | |
| | | |
| | | // 原有逻辑 |
| | | if (_clientSocket != null && _clientSocket.Connected) { |
| | | LogHelper.Info($"电梯已连接,无需重连,IP:{ip},端口:{port}"); |
| | | //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; |
| | | } |
| | | } |
| | |
| | | } |
| | | } |
| | | |
| | | /// <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 { |