using HslCommunication;
using HslCommunication.Core.Address;
using HslCommunication.Profinet.Siemens;
using Newtonsoft.Json;
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Net.NetworkInformation;
using System.Text;
using System.Threading;
using WIDESEA_Common;
using WIDESEA_Common.CutomerModel;
using WIDESEA_Core.Extensions;
using WIDESEA_Entity.DomainModels;
using WIDESEA_Services.Repositories;
using WIDESEA_WCS.WCSClient.Delta;
using WIDESEA_WCS.WCSClient.Melsec;
using WIDESEA_WCS.WCSClient.Omron;
using WIDESEA_WCS.WCSClient.Siemens;
namespace WIDESEA_WCS.WCSClient
{
public class PLCClient
{
///
/// PLC连接名称
///
public string PLCName { get; set; }
///
/// PLC类型
///
public string PLCType { get; set; }
///
/// 西门子 PLC
///
public SiemensPLCClient SiemensPLCClient { get; set; }
///
/// 欧姆龙 PLC
///
public OmronPLCClient OmronPLCClient { get; set; }
public OmronCIPPLCClient OmronCIPPLCClient { get; set; }
///
/// 三菱 PLC
///
public MelsecPLCClient MelsecPLCClient { get; set; }
///
/// 三菱 PLC5010端口
///
public MelsecPLCClient5010 MelsecPLCClient5010 { get; set; }
///
/// 三菱 PLC5011端口
///
public MelsecPLCClient5011 MelsecPLCClient5011 { get; set; }
public MelsecPLCClient5002 MelsecPLCClient5002 { get; set; }
///
/// 台达PLC
///
public DeltaPLCClient DeltaPLCClient { get; set; }
///
/// 设备类型
///
public string EquipType { get; set; }
///
/// 设备编号
///
public string PLCDescroption { get; set; }
///
/// 下料地址
///
public string PLCDownLoc { get; set; }
///
/// 是否已连接
///
public bool IsConnected { get; set; } = false;
public PLCClient(string type, dt_plcinfohead plcinfohead)
{
PLCType = type;
switch (type)
{
case "SiemensPLCClient":
SiemensPLCClient = new SiemensPLCClient(HslCommunication.Profinet.Siemens.SiemensPLCS.S1200)
{
PLCIPAddress = plcinfohead.plcinfo_ip,
PLCName = plcinfohead.plcinfo_name,
PLCDescroption = plcinfohead.plcinfo_remark,
PLCDBItems = dt_plcinfodetailRepository.Instance.Find(x => x.plcdetail_headid == plcinfohead.plcinfo_id).Select(x => new DBItemGroup { ItemAddress = x.plcdetail_db.Trim() + "." + x.plcdetail_value.Trim(), ItemDataType = x.plcdetail_valtype.Trim(), ItemName = x.plcdetail_name.Trim(), ItemOperatorType = x.plcdetail_opratortype?.Trim(), EquipNum = x.plcdetail_number.Trim(), Remark = x.plcdetail_remark.Trim() }).ToList(),
//Slot = 0
};
break;
case "OmronPLCClient":
OmronPLCClient = new OmronPLCClient()
{
PLCIPAddress = plcinfohead.plcinfo_ip,
PLCName = plcinfohead.plcinfo_name,
PLCDescroption = plcinfohead.plcinfo_remark,
PLCDBItems = dt_plcinfodetailRepository.Instance.Find(x => x.plcdetail_headid == plcinfohead.plcinfo_id).Select(x => new DBItemGroup { ItemAddress = x.plcdetail_db.Trim() + "." + x.plcdetail_value.Trim(), ItemDataType = x.plcdetail_valtype.Trim(), ItemName = x.plcdetail_name.Trim(), ItemOperatorType = x.plcdetail_opratortype?.Trim(), EquipNum = x.plcdetail_number.Trim(), Remark = x.plcdetail_remark.Trim() }).ToList()
};
break;
case "MecselPLCClient":
MelsecPLCClient = new MelsecPLCClient()
{
PLCIPAddress = plcinfohead.plcinfo_ip,
PLCName = plcinfohead.plcinfo_name,
PLCDescroption = plcinfohead.plcinfo_remark,
PLCDBItems = dt_plcinfodetailRepository.Instance.Find(x => x.plcdetail_headid == plcinfohead.plcinfo_id).Select(x => new DBItemGroup { ItemAddress = x.plcdetail_db.Trim() + "." + x.plcdetail_value.Trim(), ItemDataType = x.plcdetail_valtype.Trim(), ItemName = x.plcdetail_name.Trim(), ItemOperatorType = x.plcdetail_opratortype?.Trim(), EquipNum = x.plcdetail_number.Trim(), Remark = x.plcdetail_remark.Trim() }).ToList()
};
break;
case "DeltaPLCClient":
DeltaPLCClient = new DeltaPLCClient()
{
PLCIPAddress = plcinfohead.plcinfo_ip,
PLCName = plcinfohead.plcinfo_name,
PLCDescroption = plcinfohead.plcinfo_remark,
PLCDBItems = dt_plcinfodetailRepository.Instance.Find(x => x.plcdetail_headid == plcinfohead.plcinfo_id).Select(x => new DBItemGroup { ItemAddress = x.plcdetail_db.Trim() + "." + x.plcdetail_value.Trim(), ItemDataType = x.plcdetail_valtype.Trim(), ItemName = x.plcdetail_name.Trim(), ItemOperatorType = x.plcdetail_opratortype?.Trim(), EquipNum = x.plcdetail_number.Trim(), Remark = x.plcdetail_remark.Trim() }).ToList()
};
break;
case "MecselPLCClient5010":
MelsecPLCClient5010 = new MelsecPLCClient5010()
{
PLCIPAddress = plcinfohead.plcinfo_ip,
PLCName = plcinfohead.plcinfo_name,
PLCDescroption = plcinfohead.plcinfo_remark,
PLCDBItems = dt_plcinfodetailRepository.Instance.Find(x => x.plcdetail_headid == plcinfohead.plcinfo_id).Select(x => new DBItemGroup { ItemAddress = x.plcdetail_db.Trim() + "." + x.plcdetail_value.Trim(), ItemDataType = x.plcdetail_valtype.Trim(), ItemName = x.plcdetail_name.Trim(), ItemOperatorType = x.plcdetail_opratortype?.Trim(), EquipNum = x.plcdetail_number.Trim(), Remark = x.plcdetail_remark.Trim() }).ToList()
};
break;
case "MecselPLCClient5011":
MelsecPLCClient5011 = new MelsecPLCClient5011()
{
PLCIPAddress = plcinfohead.plcinfo_ip,
PLCName = plcinfohead.plcinfo_name,
PLCDescroption = plcinfohead.plcinfo_remark,
PLCDBItems = dt_plcinfodetailRepository.Instance.Find(x => x.plcdetail_headid == plcinfohead.plcinfo_id).Select(x => new DBItemGroup { ItemAddress = x.plcdetail_db.Trim() + "." + x.plcdetail_value.Trim(), ItemDataType = x.plcdetail_valtype.Trim(), ItemName = x.plcdetail_name.Trim(), ItemOperatorType = x.plcdetail_opratortype?.Trim(), EquipNum = x.plcdetail_number.Trim(), Remark = x.plcdetail_remark.Trim() }).ToList()
};
break;
case "MecselPLCClient5002":
MelsecPLCClient5002 = new MelsecPLCClient5002()
{
PLCIPAddress = plcinfohead.plcinfo_ip,
PLCName = plcinfohead.plcinfo_name,
PLCDescroption = plcinfohead.plcinfo_remark,
PLCDBItems = dt_plcinfodetailRepository.Instance.Find(x => x.plcdetail_headid == plcinfohead.plcinfo_id).Select(x => new DBItemGroup { ItemAddress = x.plcdetail_db.Trim() + "." + x.plcdetail_value.Trim(), ItemDataType = x.plcdetail_valtype.Trim(), ItemName = x.plcdetail_name.Trim(), ItemOperatorType = x.plcdetail_opratortype?.Trim(), EquipNum = x.plcdetail_number.Trim(), Remark = x.plcdetail_remark.Trim() }).ToList()
};
break;
case "OmronCIPPLCClient":
OmronCIPPLCClient = new OmronCIPPLCClient()
{
PLCIPAddress = plcinfohead.plcinfo_ip,
PLCName = plcinfohead.plcinfo_name,
PLCDescroption = plcinfohead.plcinfo_remark,
PLCDBItems = dt_plcinfodetailRepository.Instance.Find(x => x.plcdetail_headid == plcinfohead.plcinfo_id).Select(x => new DBItemGroup { ItemAddress = x.plcdetail_db.Trim() , ItemDataType = x.plcdetail_valtype.Trim(), ItemName = x.plcdetail_name.Trim(), ItemOperatorType = x.plcdetail_opratortype?.Trim(), EquipNum = x.plcdetail_number.Trim(), Remark = x.plcdetail_remark.Trim() }).ToList()
};
break;
}
}
#region 连接PLC,将短连接切换成长连接模式
///
/// 连接PLC
///
public string Connect()
{
string str = "";
switch (PLCType)
{
case "SiemensPLCClient":
str = SiemensPLCClient.Connect();
IsConnected = SiemensPLCClient.IsConnected;
break;
case "OmronPLCClient":
str = OmronPLCClient.Connect();
IsConnected = OmronPLCClient.IsConnected;
break;
case "MecselPLCClient":
str = MelsecPLCClient.Connect();
IsConnected = MelsecPLCClient.IsConnected;
break;
case "DeltaPLCClient":
str = DeltaPLCClient.Connect();
IsConnected = DeltaPLCClient.IsConnected;
break;
case "MecselPLCClient5010":
str = MelsecPLCClient5010.Connect();
IsConnected = MelsecPLCClient5010.IsConnected;
break;
case "MecselPLCClient5011":
str = MelsecPLCClient5011.Connect();
IsConnected = MelsecPLCClient5011.IsConnected;
break;
case "MecselPLCClient5002":
str = MelsecPLCClient5002.Connect();
IsConnected = MelsecPLCClient5002.IsConnected;
break;
case "OmronCIPPLCClient":
str = OmronCIPPLCClient.Connect();
IsConnected = OmronCIPPLCClient.IsConnected;
break;
}
return str;
}
#endregion
#region 断开与PLC的连接,将短连接切换成长连接模式
///
/// 断开与PLC的连接
///
public void Disconnect()
{
switch (PLCType)
{
case "SiemensPLCClient1111":
SiemensPLCClient.Disconnect();
IsConnected = SiemensPLCClient.IsConnected;
break;
case "OmronPLCClient":
OmronPLCClient.Disconnect();
IsConnected = OmronPLCClient.IsConnected;
break;
case "MecselPLCClient5010":
MelsecPLCClient.Disconnect();
IsConnected = MelsecPLCClient.IsConnected;
break;
case "MecselPLCClient5011":
MelsecPLCClient5011.Disconnect();
IsConnected = MelsecPLCClient5011.IsConnected;
break;
case "MecselPLCClient5002":
MelsecPLCClient5002.Disconnect();
IsConnected = MelsecPLCClient5002.IsConnected;
break;
case "OmronCIPPLCClient":
OmronCIPPLCClient.Disconnect();
IsConnected = OmronCIPPLCClient.IsConnected;
break;
}
}
#endregion
#region 根据名称/描述读取PLC数据
///
/// 根据名称/描述读取PLC数据
///
/// 名称/描述(数据库中plcdetail_name列)
///
public virtual object ReadValue(string itemName)
{
object result = null;
switch (PLCType)
{
case "SiemensPLCClient":
result = SiemensPLCClient.ReadValue(itemName);
break;
case "OmronPLCClient":
result = OmronPLCClient.ReadValue(itemName);
break;
case "MelsecPLCClient":
result = MelsecPLCClient.ReadValue(itemName);
break;
}
return result;
}
#endregion
public virtual object ReadBarcodeValue(string itemName)
{
object result = null;
switch (PLCType)
{
case "SiemensPLCClient":
result = SiemensPLCClient.ReadBarcodeValue(itemName);
break;
case "OmronPLCClient":
result = OmronPLCClient.ReadValue(itemName);
break;
case "MelsecPLCClient":
result = MelsecPLCClient.ReadValue(itemName);
break;
}
return result;
}
#region 根据PLCDBItem读取PLC数据
///
/// 根据PLCDBItem读取PLC数据
///
///
///
public virtual object ReadValue(DBItemGroup item)
{
object result = null;
switch (PLCType)
{
case "SiemensPLC":
result = SiemensPLCClient.ReadValue(item);
break;
case "OmronPLC":
result = OmronPLCClient.ReadValue(item);
break;
case "MelsecPLC":
result = MelsecPLCClient.ReadValue(item);
break;
}
return result;
}
#endregion
#region 根据设备编号读取PLC数据
///
/// 根据设备编号读取PLC数据
///
/// 设备编号
/// json字符串
public object ReadValues(string equipNum)
{
object result = null;
switch (PLCType)
{
case "SiemensPLC":
result = SiemensPLCClient.ReadValues(equipNum);
break;
case "OmronPLC":
result = OmronPLCClient.ReadValues(equipNum);
break;
case "MelsecPLC":
result = MelsecPLCClient.ReadValues(equipNum);
break;
}
return result;
}
#endregion
#region 根据名称/描述读取PLC数据返回设备编号和值的JSON字符串
///
/// 根据名称/描述读取PLC数据返回设备编号和值的JSON字符串
///
/// 名称/描述(数据库中plcdetail_name列)
/// json字符串
public string ReadValuesByItemName(string itemName)
{
object result = null;
switch (PLCType)
{
case "SiemensPLC":
result = SiemensPLCClient.ReadValues(itemName);
break;
case "OmronPLC":
result = OmronPLCClient.ReadValues(itemName);
break;
case "MelsecPLC":
result = MelsecPLCClient.ReadValues(itemName);
break;
}
return result.Serialize();
}
#endregion
#region 根据名称/描述和设备编号读取PLC数据
///
/// 根据名称/描述和设备编号读取PLC数据
///
/// 名称/描述(数据库中plcdetail_name列)
/// 设备编号
///
public virtual object ReadValue(string itemName, string equipNum)
{
object result = null;
switch (PLCType)
{
case "SiemensPLCClient":
result = SiemensPLCClient.ReadValue(itemName, equipNum);
break;
case "OmronPLCClient":
result = OmronPLCClient.ReadValue(itemName, equipNum);
break;
case "MecselPLCClient":
result = MelsecPLCClient.ReadValue(itemName, equipNum);
break;
case "DeltaPLCClient":
result = DeltaPLCClient.ReadValue(itemName, equipNum);
break;
case "MecselPLCClient5010":
result = MelsecPLCClient5010.ReadValue(itemName, equipNum);
break;
case "MecselPLCClient5002":
result = MelsecPLCClient5002.ReadValue(itemName, equipNum);
break;
case "OmronCIPPLCClient":
result = OmronCIPPLCClient.ReadValue(itemName, equipNum);
break;
}
//return result.Serialize();
return result;
}
#endregion
#region 将数据写入到PLC中
///
/// 将数据写入到PLC中
///
/// 名称/描述(数据库中plcdetail_name列)
/// 写入的值
///
public virtual bool WriteValue(string itemName, object value)
{
bool result = false;
switch (PLCType)
{
case "SiemensPLCClient":
result = SiemensPLCClient.WriteValue(itemName, value);
break;
case "OmronPLCClient":
result = OmronPLCClient.WriteValue(itemName, value);
break;
case "MelsecPLCClient":
result = MelsecPLCClient.WriteValue(itemName, value);
break;
}
return result;
}
#endregion
public virtual bool WriteBarcodeValue(string itemName, object value)
{
bool result = false;
switch (PLCType)
{
case "SiemensPLCClient":
result = SiemensPLCClient.WriteBarcodeValue(itemName, value);
break;
case "OmronPLCClient":
result = OmronPLCClient.WriteValue(itemName, value);
break;
case "MelsecPLCClient":
result = MelsecPLCClient.WriteValue(itemName, value);
break;
}
return result;
}
#region 将数据写入到PLC中
///
/// 将数据写入到PLC中
///
/// 名称/描述(数据库中plcdetail_name列)
/// 写入的值
///
public virtual bool WriteValue(string itemName, string equipNum, object value)
{
bool result = false;
switch (PLCType)
{
case "SiemensPLCClient":
result = SiemensPLCClient.WriteValue(itemName, equipNum, value);
break;
case "OmronPLCClient":
result = OmronPLCClient.WriteValue(itemName, equipNum, value);
break;
case "MelsecPLCClient":
result = MelsecPLCClient.WriteValue(itemName, equipNum, value);
break;
case "MecselPLCClient5010":
result = MelsecPLCClient5010.WriteValue(itemName, equipNum, value);
break;
case "MecselPLCClient":
result = MelsecPLCClient.WriteValue(itemName, equipNum, value);
break;
case "OmronCIPPLCClient":
result = OmronCIPPLCClient.WriteValue(itemName, equipNum, value);
break;
}
return result;
}
#endregion
}
}