using DocumentFormat.OpenXml.Bibliography;
using DocumentFormat.OpenXml.Drawing;
using Elastic.Clients.Elasticsearch;
using Furion.Logging;
using IoTClient;
using IoTClient.Clients.Modbus;
using IoTClient.Clients.PLC;
using IoTClient.Common.Enums;
using IoTClient.Enums;
using IoTClient.Interfaces;
using System.Text;
using System.Text.RegularExpressions;
namespace WCS.Application;
public class PLCUtil
{
public readonly long PlcId;
public readonly string PlcIP;
private SiemensClient _client;
private WcsPlc _modPlc;
private readonly object OLock = new object();
public PLCUtil(WcsPlc modPlc)
{
PlcId = modPlc.Id;
PlcIP = modPlc.IP;
_modPlc = modPlc;
_client = new SiemensClient((SiemensVersion)modPlc.PLCType, modPlc.IP, modPlc.Port);
_client.Open();
}
public bool Connected
{
get { return _client.Connected; }
}
public IoTClient.Result Open()
{
return _client.Open();
}
public IoTClient.Result Close()
{
return _client.Close();
}
///
/// 读取PLC值
///
/// DB区指定值
/// 字符类型
/// 偏移量/地址
/// 长度(字符串)
///
public (IoTClient.Result, dynamic value) GetPlcDBValue(PLCDataTypeEnum PosType, string DbNumber, string Pos, int? Length = 0)
{
lock (OLock)
{
string address;
if (DbNumber.StartsWith("DB"))
address = DbNumber + "." + Pos;
else
address = DbNumber + Pos;
return this.GetPlcDBValue(PosType, address, Length);
}
}
///
/// 读取PLC值
///
/// 字符类型
/// 偏移量/地址
/// 长度(字符串)
///
public (IoTClient.Result, dynamic value) GetPlcDBValue(PLCDataTypeEnum PosType, string Pos, int? Length = 0)
{
lock (OLock)
{
dynamic result = null;
switch (PosType)
{
case PLCDataTypeEnum.Bit:
result = _client.ReadBoolean(Pos);
break;
case PLCDataTypeEnum.Byte:
result = _client.ReadByte(Pos);
break;
case PLCDataTypeEnum.Short:
result = _client.ReadInt16(Pos);
break;
case PLCDataTypeEnum.UShort:
result = _client.ReadUInt16(Pos);
break;
case PLCDataTypeEnum.Int:
result = _client.ReadInt32(Pos);
break;
case PLCDataTypeEnum.UInt:
result = _client.ReadUInt32(Pos);
break;
case PLCDataTypeEnum.Long:
result = _client.ReadInt64(Pos);
break;
case PLCDataTypeEnum.ULong:
result = _client.ReadUInt64(Pos);
break;
case PLCDataTypeEnum.Float:
result = _client.ReadFloat(Pos);
break;
case PLCDataTypeEnum.Double:
result = _client.ReadDouble(Pos);
break;
case PLCDataTypeEnum.String:
{
string dpos = IncrementCode(Pos);
Result result1 = _client.ReadString(Pos, 2);
if (result1.IsSucceed)
{
//wxw改
if ((ushort)(result1.Value[1]) > (ushort)(result1.Value[0]))
{
break;
}
ushort let = (ushort)(result1.Value[1]);//(ushort)(result1.Value[0]) 备注:result1.Value[0]取的是设置的最大长度,result1.Value[0]取的是实际值长度
Result result2 = _client.ReadString(dpos, let);
Result result3 = new Result(result2);
if (result3.IsSucceed)
{
result3.Value = Encoding.ASCII.GetString(result2.Value, 0, let).Replace("\0", "");
result = result3;
}
}
else
{
result = result1;
}
}
break;
default:
result = new IoTClient.Result