using HH.WCS.Mobox3.AnGang;
|
using HH.WCS.Mobox3.AnGang.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.AnGang.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>
|
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;
|
}
|
|
/// <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;
|
}
|
}
|
}
|