using HslCommunication;
using HslCommunication.Profinet.Delta;
using Microsoft.Extensions.DependencyInjection;
using Serilog;
using Sln.Iot.Serilog;
namespace Sln.Iot.PLC
{
public class PLCConnect
{
private SerilogHelper? LogHelper;
public static DeltaSerialOverTcp DeltaInstance1;
///
/// 锁对象1
///
private static readonly object locker1 = new object();
public PLCConnect(SerilogHelper serilogHelper)
{
LogHelper = serilogHelper;
DeltaInstance1 = CreateDeltaConnect("127.0.0.1", 502, 1, serilogHelper);
}
///
/// 创建台达PLC连接
///
///
///
///
///
///
public static DeltaSerialOverTcp CreateDeltaConnect(string ip, int port, byte stationNo, SerilogHelper log)
{
DeltaSerialOverTcp plc = new DeltaSerialOverTcp(ip, port, stationNo);
try
{
var res = plc.ConnectServer();
}
catch (Exception ex)
{
log.Error($"连接PLC[{ip}]失败", ex);
}
return plc;
}
///
/// PLC2写入数据
///
/// 地址
/// 值
/// 数据类型
///
public static OperateResult PlcWrite(string address, object value, DataTypeEnum type)
{
var result = new OperateResult() { IsSuccess = false };
lock (locker1)
{
switch (type)
{
case DataTypeEnum.Bool:
result = DeltaInstance1.Write(address, Convert.ToBoolean(value));
break;
case DataTypeEnum.Byte:
result = DeltaInstance1.Write(address, Convert.ToByte(value));
break;
case DataTypeEnum.Int16:
result = DeltaInstance1.Write(address, Convert.ToInt16(value));
break;
case DataTypeEnum.UInt16:
result = DeltaInstance1.Write(address, Convert.ToUInt16(value));
break;
case DataTypeEnum.Int32:
result = DeltaInstance1.Write(address, Convert.ToInt32(value));
break;
case DataTypeEnum.UInt32:
result = DeltaInstance1.Write(address, Convert.ToUInt32(value));
break;
case DataTypeEnum.Int64:
result = DeltaInstance1.Write(address, Convert.ToInt64(value));
break;
case DataTypeEnum.UInt64:
result = DeltaInstance1.Write(address, Convert.ToUInt64(value));
break;
case DataTypeEnum.Float:
result = DeltaInstance1.Write(address, Convert.ToSingle(value));
break;
case DataTypeEnum.Double:
result = DeltaInstance1.Write(address, Convert.ToDouble(value));
break;
case DataTypeEnum.String:
result = DeltaInstance1.Write(address, Convert.ToString(value));
break;
default:
throw new ArgumentException($"Unsupported data type: {type}");
}
}
return result;
}
///
/// 写入byte数组
///
///
///
///
public static OperateResult PlcWriteBytes(string address, byte[] data)
{
lock (locker1)
{
var res = DeltaInstance1.Write(address, data);
return res;
}
}
///
/// 读取int32
///
///
public OperateResult ReadInt32(string address)
{
lock (locker1)
{
var res = DeltaInstance1.ReadInt32(address);
return res;
}
}
///
/// 读取int16
///
///
public OperateResult ReadInt16(string address)
{
lock (locker1)
{
var res = DeltaInstance1.ReadInt16(address);
return res;
}
}
///
/// 读取float
///
///
///
public OperateResult ReadFloat(string address)
{
lock (locker1)
{
var res = DeltaInstance1.ReadFloat(address);
return res;
}
}
///
/// 读取Bool
///
///
///
public OperateResult ReadBool(string address)
{
lock (locker1)
{
var res = DeltaInstance1.ReadBool(address);
return res;
}
}
///
/// 读取字节数组
///
///
///
///
public static OperateResult ReadByte2(string address, ushort length)
{
lock (locker1)
{
var res = DeltaInstance1.Read(address, length);
return res;
}
}
}
}