using OPCAutomation; using System; using System.Collections.Generic; using System.Data; using System.Linq; using System.Text; using System.Threading; namespace PunchingMistake { public class PlcInvoke { private OPCServer opcServer; private OPCGroups opcGroups; private OPCGroup opcGroup1; private OPCItems opcItems; private static OPCItem[] opcItemm1; public static bool _linkDev = true; public Action ShowLinkInfo = null; //public Action ShowScanInfo = null; public Action ShowMessage = null; public event Action DevAfterReturnResult = null; //private Entity_t_PreAssembleLine t_PreAssembleLine = new Entity_t_PreAssembleLine(); /// /// 接收到的值 /// public Dictionary _OpcAddressDict = new Dictionary(); public DataTable _OpcAddressTable = new DataTable(); private string _channelDev = string.Empty; public bool AllowReceive = false; public string _stationNo; private string _lineRowID = ""; public PlcInvoke(string channelDev, string stationNo) { _channelDev = channelDev; _stationNo = stationNo; } public void SetLineID(string lineID) { _lineRowID = lineID; } public bool InitDev(int rate) { if (_linkDev == false) { return false; } try { // int rate = 500; CreateServer(); if (ConnectServer()) { opcGroups = opcServer.OPCGroups; opcGroup1 = opcGroups.Add("GRP"); SetGroupProperty(opcGroup1, rate); opcItems = opcGroup1.OPCItems; opcItems.DefaultIsActive = true; LoadOpcItem(_stationNo); opcGroup1.DataChange += OpcGroup1_DataChange; ShowLinkInfo(true, true); } return true; } catch (Exception ex) { ShowLinkInfo(false, true); //MyLogger.Write("设备初始化发生错误,错误原因:" + ex.Message); LogHelper.WriteLog("设备初始化发生错误,错误原因:" + ex.Message); //throw new Exception("设备初始化发生错误,错误原因:" + ex.Message); return false; } } /// /// /// /// PLC地址点位 /// 操作类型 冲孔,流钻,EOL,返修 public void SendToPLC( bool isInit,string lineRowID) { if(isInit == false) { _lineRowID = lineRowID; foreach (OPCItem item in opcItemm1) { if (item.ItemID.Contains("Start")) { item.Write(2); ShowMessage("发送启动信号:" + 2, true); } //if (item.ItemID.Contains("caseNo")) //{ // item.Write(caseNo); // ShowMessage("发送料盒号:" + caseNo, true); //} } ShowMessage("发送启动信号成功", true); } else { foreach (OPCItem item in opcItemm1) { if (item.ItemID.Contains("Start")) { item.Write(1); } if (item.ItemID.Contains("ScrewL")) { item.Write(0); } if (item.ItemID.Contains("ScrewR")) { item.Write(0); } if (item.ItemID.Contains("RivetL")) { item.Write(0); } if (item.ItemID.Contains("RivetR")) { item.Write(0); } if (item.ItemID.Contains("IrIs")) { item.Write(0); } //if (item.ItemID.Contains("NutL")) //{ // item.Write(0); //} //if (item.ItemID.Contains("NutR")) //{ // item.Write(0); //} //螺钉类型 不用初始化 } ShowMessage("发送初始化设备信号成功", true); } AllowReceive = true; } public void WriteToPLCTest() { foreach (OPCItem item in opcItemm1) { if (item.ItemID.Contains("ScrewL")) { item.Write(8); } if (item.ItemID.Contains("ScrewR")) { item.Write(8); } if (item.ItemID.Contains("RivetL")) { item.Write(8); } if (item.ItemID.Contains("RivetR")) { item.Write(8); } if (item.ItemID.Contains("IrIs")) { item.Write(8); } //if (item.ItemID.Contains("NutL")) //{ // item.Write(8); //} //if (item.ItemID.Contains("NutR")) //{ // item.Write(8); //} //螺钉类型 不用初始化 } } void LoadOpcItem(string stationNo) { Dictionary dict = GetPlcAddress();// GetDevInfo(); opcItemm1 = new OPCItem[dict.Count]; int i = 0; foreach (var dictItem in dict) { opcItemm1[i] = opcItems.AddItem(dictItem.Value, dictItem.Key); i++; } } public Dictionary GetPlcAddress() { Dictionary dict = new Dictionary(); dict.Add(0, _channelDev + ".LinkRate"); dict.Add(1, _channelDev + ".Start"); dict.Add(2, _channelDev + ".ScrewL"); dict.Add(3, _channelDev + ".ScrewR"); dict.Add(4, _channelDev + ".RivetL"); dict.Add(5, _channelDev + ".RivetR"); dict.Add(6, _channelDev + ".IrIs"); //dict.Add(7, _channelDev + ".caseNo"); //dict.Add(8, _channelDev + ".NutL"); //dict.Add(9, _channelDev + ".NutR"); return dict; } private string GetOpcName(DataRow row) { return $"{row["ChannelName"].ToString()}.{row["DevName"].ToString()}.{row["LableName"].ToString()}"; } private void OpcGroup1_DataChange(int TransactionID, int NumItems, ref Array ClientHandles, ref Array ItemValues, ref Array Qualities, ref Array TimeStamps) { try { if (_linkDev == false) return; for (int i = 1; i <= NumItems; i++) { int handle = Convert.ToInt32(ClientHandles.GetValue(i).ToString().Trim()); string itemValue = ItemValues.GetValue(i).ToString(); string address = opcItemm1[(handle)].ItemID; if (!string.IsNullOrEmpty(_lineRowID)) { if (address.Contains("ScrewL")) { Function2.UpdateLineCount("LeftScrew1=" + itemValue, _lineRowID); } else if (address.Contains("ScrewR")) { Function2.UpdateLineCount("RightScrew1=" + itemValue, _lineRowID); } else if (address.Contains("RivetL")) { Function2.UpdateLineCount("LeftRivet1=" + itemValue, _lineRowID); } else if (address.Contains("RivetR")) { Function2.UpdateLineCount("RightRivet1=" + itemValue, _lineRowID); } else if (address.Contains("IrIs")) { Function2.UpdateLineCount("IrIs=" + itemValue, _lineRowID); } //else if (address.Contains("NutL")) //{ // Function2.UpdateLineCount("LeftNut=" + itemValue, _lineRowID); //} //else if (address.Contains("NutR")) //{ // Function2.UpdateLineCount("RightNut=" + itemValue, _lineRowID); //} } } } catch (Exception ex) { //MyLogger.Write("设备返回数据发生异常,错误原因:" + ex.Message); LogHelper.WriteLog("设备返回数据发生异常,错误原因:" + ex.Message); ShowMessage("设备返回数据发生异常,错误原因:" + ex.Message, false); } } /// /// 创建服务 /// /// private void CreateServer() { try { opcServer = new OPCServer(); } catch (Exception ex) { throw new Exception("创建OpcServer时发生异常,异常信息:" + ex.Message); } } /// /// 连接到服务器 /// /// /// /// private bool ConnectServer() { try { opcServer.Connect("Kepware.KEPServerEX.V6", ""); ShowLinkResult(true, true); } catch (Exception ex) { ShowLinkResult(false, true); //ShowScanResult(false); LogHelper.WriteLog($"设备连接异常,异常原因:" + ex.Message); throw new Exception($"设备连接异常"); } return true; } /// /// 设置组的属性 /// /// /// private void SetGroupProperty(OPCGroup opcGroup, int updateRate) { opcGroup.IsActive = true; opcGroup.DeadBand = 0; opcGroup.UpdateRate = updateRate; opcGroup.IsSubscribed = true; } private void ShowLinkResult(bool isSuccess, bool isWriteLog) { if (ShowLinkInfo != null) { ShowLinkInfo(isSuccess, isWriteLog); } } } }