using DocumentFormat.OpenXml.Bibliography;
using Elastic.Clients.Elasticsearch;
using IoTClient;
using IoTClient.Clients.Modbus;
using IoTClient.Clients.PLC;
using IoTClient.Common.Enums;
using IoTClient.Enums;
using IoTClient.Interfaces;
namespace WCS.Application;
public class PLCUtil
{
public readonly long PlcId;
private SiemensClient _client;
private WcsPlc _modPlc;
public PLCUtil(WcsPlc modPlc)
{
PlcId = modPlc.Id;
_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)
{
string address;
if (DbNumber.StartsWith("DB"))
address = DbNumber + "." + Pos;
else
address = DbNumber + Pos;
dynamic result = null;
switch (PosType)
{
case PLCDataTypeEnum.Bit:
result = _client.ReadBoolean(address);
break;
case PLCDataTypeEnum.Byte:
result = _client.ReadByte(address);
break;
case PLCDataTypeEnum.Short:
result = _client.ReadInt16(address);
break;
case PLCDataTypeEnum.UShort:
result = _client.ReadUInt16(address);
break;
case PLCDataTypeEnum.Int:
result = _client.ReadInt32(address);
break;
case PLCDataTypeEnum.UInt:
result = _client.ReadUInt32(address);
break;
case PLCDataTypeEnum.Long:
result = _client.ReadInt64(address);
break;
case PLCDataTypeEnum.ULong:
result = _client.ReadUInt64(address);
break;
case PLCDataTypeEnum.Float:
result = _client.ReadFloat(address);
break;
case PLCDataTypeEnum.Double:
result = _client.ReadDouble(address);
break;
case PLCDataTypeEnum.String:
result = _client.ReadString(address);
break;
default:
result = new IoTClient.Result