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 } }