New file |
| | |
| | | using HH.WCS.Mobox3.FJJT; |
| | | using HH.WCS.Mobox3.FJJT.device; |
| | | using System; |
| | | using System.Collections.Generic; |
| | | using System.Linq; |
| | | using System.Net.Sockets; |
| | | using System.Text; |
| | | using System.Threading.Tasks; |
| | | |
| | | namespace HH.WCS.Mobox3.FJJT.device { |
| | | internal class TcpClient |
| | | { |
| | | /// <summary> |
| | | /// |
| | | /// </summary> |
| | | /// <param name="ip">127.0.0.1</param> |
| | | /// <param name="port">8888</param> |
| | | /// <param name="hex">01 02 00 00 00 0C 78 0F</param> |
| | | /// <returns></returns> |
| | | public 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; |
| | | } |
| | | |
| | | /// <summary> |
| | | /// 读保持寄存器,modbus rtu的封装 |
| | | /// </summary> |
| | | /// <param name="address"></param> |
| | | /// <param name="qty"></param> |
| | | /// <param name="ip"></param> |
| | | /// <param name="port"></param> |
| | | /// <returns></returns> |
| | | internal int[] ReadInputRegistersRtu(int address, int qty, string ip, int port = 502) { |
| | | List<int> res = new List<int>(); |
| | | 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(); |
| | | } |
| | | /// <summary> |
| | | /// 写单个寄存器 |
| | | /// </summary> |
| | | /// <param name="address"></param> |
| | | /// <param name="value"></param> |
| | | /// <param name="ip"></param> |
| | | /// <param name="port"></param> |
| | | 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; |
| | | } |
| | | } |
| | | } |