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
|
{
|
/// <summary>
|
/// PLC连接名称
|
/// </summary>
|
public string PLCName { get; set; }
|
|
/// <summary>
|
/// PLC类型
|
/// </summary>
|
public string PLCType { get; set; }
|
|
/// <summary>
|
/// 西门子 PLC
|
/// </summary>
|
public SiemensPLCClient SiemensPLCClient { get; set; }
|
|
/// <summary>
|
/// 欧姆龙 PLC
|
/// </summary>
|
public OmronPLCClient OmronPLCClient { get; set; }
|
|
public OmronCIPPLCClient OmronCIPPLCClient { get; set; }
|
|
/// <summary>
|
/// 三菱 PLC
|
/// </summary>
|
public MelsecPLCClient MelsecPLCClient { get; set; }
|
|
/// <summary>
|
/// 三菱 PLC5010端口
|
/// </summary>
|
public MelsecPLCClient5010 MelsecPLCClient5010 { get; set; }
|
|
/// <summary>
|
/// 三菱 PLC5011端口
|
/// </summary>
|
public MelsecPLCClient5011 MelsecPLCClient5011 { get; set; }
|
|
public MelsecPLCClient5002 MelsecPLCClient5002 { get; set; }
|
|
/// <summary>
|
/// 台达PLC
|
/// </summary>
|
public DeltaPLCClient DeltaPLCClient { get; set; }
|
|
/// <summary>
|
/// 设备类型
|
/// </summary>
|
public string EquipType { get; set; }
|
|
/// <summary>
|
/// 设备编号
|
/// </summary>
|
public string PLCDescroption { get; set; }
|
/// <summary>
|
/// 下料地址
|
/// </summary>
|
public string PLCDownLoc { get; set; }
|
|
/// <summary>
|
/// 是否已连接
|
/// </summary>
|
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,将短连接切换成长连接模式
|
/// <summary>
|
/// 连接PLC
|
/// </summary>
|
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的连接,将短连接切换成长连接模式
|
/// <summary>
|
/// 断开与PLC的连接
|
/// </summary>
|
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数据
|
/// <summary>
|
/// 根据名称/描述读取PLC数据
|
/// </summary>
|
/// <param name="itemName">名称/描述(数据库中plcdetail_name列)</param>
|
/// <returns></returns>
|
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数据
|
/// <summary>
|
/// 根据PLCDBItem读取PLC数据
|
/// </summary>
|
/// <param name="item"></param>
|
/// <returns></returns>
|
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数据
|
/// <summary>
|
/// 根据设备编号读取PLC数据
|
/// </summary>
|
/// <param name="equipNum">设备编号</param>
|
/// <returns>json字符串</returns>
|
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字符串
|
/// <summary>
|
/// 根据名称/描述读取PLC数据返回设备编号和值的JSON字符串
|
/// </summary>
|
/// <param name="itemName">名称/描述(数据库中plcdetail_name列)</param>
|
/// <returns>json字符串</returns>
|
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数据
|
/// <summary>
|
/// 根据名称/描述和设备编号读取PLC数据
|
/// </summary>
|
/// <param name="itemName">名称/描述(数据库中plcdetail_name列)</param>
|
/// <param name="equipNum">设备编号</param>
|
/// <returns></returns>
|
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中
|
/// <summary>
|
/// 将数据写入到PLC中
|
/// </summary>
|
/// <param name="itemName">名称/描述(数据库中plcdetail_name列)</param>
|
/// <param name="value">写入的值</param>
|
/// <returns></returns>
|
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中
|
/// <summary>
|
/// 将数据写入到PLC中
|
/// </summary>
|
/// <param name="itemName">名称/描述(数据库中plcdetail_name列)</param>
|
/// <param name="value">写入的值</param>
|
/// <returns></returns>
|
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
|
|
}
|
}
|