using IoTClient;
using IoTClient.Clients.Modbus;
using IoTClient.Common.Enums;
using IoTClient.Enums;
using IoTClient.Models;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace WCS.Application;
///
/// Modbus
///
public class ModbusUtil
{
public readonly long PlcId;
public readonly string PlcIP;
private ModbusTcpClient _client;
private WcsPlc _modPlc;
private readonly object OLock = new object();
public ModbusUtil(WcsPlc modPlc)
{
//测试代码
//WCS.Application.ModbusUtil modUtil = new WCS.Application.ModbusUtil(new WCS.Application.WcsPlc() { IP = "127.0.0.1", Port = 502 });
//var result = modUtil.GetDBValue(WCS.Application.PLCDataTypeEnum.Int, "4");
//Console.WriteLine(result.value);
//var result2 = modUtil.SetDBValue(WCS.Application.PLCDataTypeEnum.Int, "4", "44");
//Console.WriteLine(result2.IsSucceed);
PlcId = modPlc.Id;
PlcIP = modPlc.IP;
_modPlc = modPlc;
_client = new ModbusTcpClient(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值
///
/// 字符类型
/// 偏移量/地址
/// 站号
///
public (IoTClient.Result, dynamic value) GetDBValue(PLCDataTypeEnum PosType, string Pos, byte StationNumber = 1)
{
lock (OLock)
{
dynamic result = null;
switch (PosType)
{
case PLCDataTypeEnum.Bit:
result = _client.ReadCoil(Pos, StationNumber);
break;
case PLCDataTypeEnum.Byte:
result = _client.ReadDiscrete(Pos, StationNumber);
break;
case PLCDataTypeEnum.Short:
result = _client.ReadInt16(Pos, StationNumber);
break;
case PLCDataTypeEnum.UShort:
result = _client.ReadUInt16(Pos, StationNumber);
break;
case PLCDataTypeEnum.Int:
result = _client.ReadInt32(Pos, StationNumber);
break;
case PLCDataTypeEnum.UInt:
result = _client.ReadUInt32(Pos, StationNumber);
break;
case PLCDataTypeEnum.Long:
result = _client.ReadInt64(Pos, StationNumber);
break;
case PLCDataTypeEnum.ULong:
result = _client.ReadUInt64(Pos, StationNumber);
break;
case PLCDataTypeEnum.Float:
result = _client.ReadFloat(Pos, StationNumber);
break;
case PLCDataTypeEnum.Double:
result = _client.ReadDouble(Pos, StationNumber);
break;
case PLCDataTypeEnum.String:
result = _client.ReadString(Pos, StationNumber);
break;
default:
result = new IoTClient.Result