using System; using System.Collections.Generic; using System.Net.Sockets; using HH.WCS.Mobox3.HaiCheng.Util.Helper; namespace HH.WCS.Mobox3.HaiCheng.Util.EquipmentCommunication { internal class TcpClient { /// /// /// /// 127.0.0.1 /// 8888 /// 01 02 00 00 00 0C 78 0F /// private static string SendHexOnce(string ip, int port, string hex) { var res = string.Empty; Socket client = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); client.Connect(ip, port); client.ReceiveTimeout = 2000; if (client.Connected) { client.Send(PlcHelper.Hex2Bytes(hex)); byte[] buffer = new byte[1024]; try { var length = client.Receive(buffer, SocketFlags.None); byte[] data = new byte[length]; Array.Copy(buffer, data, length); res = BitConverter.ToString(data).Replace("-", ""); } catch (Exception ex) { LogHelper.Error(ex.Message, ex); } client.Disconnect(true); client.Dispose(); } client = null; return res; } /// /// 读保持寄存器 /// /// /// /// /// /// internal int[] ReadInputRegistersRtu(int address, int qty, string ip, int port = 502) { List res = new List(); var hex = $"0103{address.ToString("X4")}{qty.ToString("X4")}"; hex = hex + BitConverter.ToString(PlcHelper.CRC16LH(PlcHelper.Hex2Bytes(hex))).Replace("-", "").Replace(" ", ""); var data = SendHexOnce(ip, port, hex); if (!string.IsNullOrEmpty(data)) { if (PlcHelper.CheckCRC(data)) { var lenght = Convert.ToInt16(data.Substring(4, 2), 16) / 2; for (int i = 0; i < lenght; i++) { res[i] = Convert.ToInt16(data.Substring(6 + 4 * 1, 4), 16); } } } return res.ToArray(); } /// /// 写单个寄存器 /// /// /// /// /// internal bool WriteSingleRegisterRtu(int address, int value, string ip, int port = 502) { var res = false; var hex = $"0106{address.ToString("X4")}{value.ToString("X4")}"; hex = hex + BitConverter.ToString(PlcHelper.CRC16LH(PlcHelper.Hex2Bytes(hex))).Replace("-", "").Replace(" ", ""); var data = SendHexOnce(ip, port, hex); if (!string.IsNullOrEmpty(data)) { res = true; } return res; } } }