393 lines
		
	
	
		
			14 KiB
		
	
	
	
		
			C#
		
	
	
	
		
		
			
		
	
	
			393 lines
		
	
	
		
			14 KiB
		
	
	
	
		
			C#
		
	
	
	
|  | using System; | |||
|  | using System.Collections.Generic; | |||
|  | using System.ComponentModel; | |||
|  | using System.Data; | |||
|  | using System.Drawing; | |||
|  | using System.Linq; | |||
|  | using System.Text; | |||
|  | using System.Windows.Forms; | |||
|  | using OPCAutomation; | |||
|  | namespace epickHost | |||
|  | { | |||
|  |     public partial class OPCForm : Form | |||
|  |     { | |||
|  |         string computerName = "LAPTOP-KVQJES02";   | |||
|  |         OPCAutomation.OPCServer opcServer; | |||
|  |         OPCBrowser opcBrowser;        | |||
|  |         OPCGroups opcGroups; | |||
|  |         OPCGroup  opcGroupMoreBoxesW , opcGroupBarcodeR,opcGroupTerminalW; | |||
|  |         List<string> lstMoreBoxesItems = new List<string>() ; | |||
|  |         List<string> lstBarcodeItems = new List<string>(); | |||
|  |         List<string> lstTerminalItems = new List<string>(); | |||
|  |         int transactionId=1; | |||
|  |         Array serverHandlesMOreBox, serverHandlesBarcode, serverHandleTerminal; | |||
|  |         Array errors; | |||
|  |         int cancelId; | |||
|  |         Dictionary<string,string> varDic = new Dictionary<string,string>() ; | |||
|  |         Dictionary<int, Dictionary<string, string>> varTransactionDics = new Dictionary<int, Dictionary<string, string>>(); | |||
|  |           | |||
|  |         public OPCForm() | |||
|  |         { | |||
|  |             InitializeComponent(); | |||
|  |             opcServer = new OPCAutomation.OPCServer(); | |||
|  |             object serverList = opcServer.GetOPCServers(computerName); | |||
|  |             foreach (var item in (Array)serverList) | |||
|  |             { | |||
|  |                 if (!listServers.Items.Contains(item)) | |||
|  |                 { | |||
|  |                     listServers.Items.Add(item); | |||
|  |                 } | |||
|  |             } | |||
|  | 
 | |||
|  |            | |||
|  |         } | |||
|  |        | |||
|  | 
 | |||
|  |         private void btnConnect_Click(object sender, EventArgs e) | |||
|  |         { | |||
|  |             try | |||
|  |             { | |||
|  |                 opcServer.Connect(listServers.SelectedItem.ToString(), computerName); | |||
|  |                 showInfo("连接成功");  | |||
|  |                 initialGroups(); | |||
|  |             }catch(Exception ex) | |||
|  |             { | |||
|  |                 showInfo(ex.Message); | |||
|  |             } | |||
|  |         } | |||
|  |           | |||
|  |         private void initialGroups() | |||
|  |         { | |||
|  |             opcBrowser = opcServer.CreateBrowser(); | |||
|  |             opcBrowser.ShowBranches(); | |||
|  |             opcBrowser.ShowLeafs(true); | |||
|  |             opcGroups = opcServer.OPCGroups; | |||
|  | 
 | |||
|  |             opcGroupMoreBoxesW = opcGroups.Add("NeedMoreBoxes"); | |||
|  |             opcGroupMoreBoxesW.IsActive=true; | |||
|  |             opcGroupMoreBoxesW.IsSubscribed = true; | |||
|  |             opcGroupMoreBoxesW.UpdateRate = 200; | |||
|  |             opcGroupMoreBoxesW.AsyncCancelComplete += OpcGroupMoreBoxesW_AsyncCancelComplete;   | |||
|  |             opcGroupMoreBoxesW.AsyncReadComplete += OpcGroupMoreBoxesW_AsyncReadComplete; ; | |||
|  |             opcGroupMoreBoxesW.AsyncWriteComplete += OpcGroupMoreBoxesW_AsyncWriteComplete; | |||
|  | 
 | |||
|  | 
 | |||
|  |             opcGroupBarcodeR = opcGroups.Add("readBoxBarcode"); | |||
|  |             opcGroupBarcodeR.IsActive = true; | |||
|  |             opcGroupBarcodeR.IsSubscribed = true; | |||
|  |             opcGroupBarcodeR.UpdateRate = 200; | |||
|  |             opcGroupBarcodeR.AsyncCancelComplete += OpcGroupBoxBarcodeR_AsyncCancelComplete;   | |||
|  |             opcGroupBarcodeR.AsyncReadComplete += OpcGroupBoxBarcodeR_AsyncReadComplete; | |||
|  |             opcGroupBarcodeR.AsyncWriteComplete += OpcGroupBoxBarcodeR_AsyncWriteComplete; | |||
|  | 
 | |||
|  | 
 | |||
|  |             opcGroupTerminalW = opcGroups.Add("writeTerminial"); | |||
|  |             opcGroupTerminalW.IsActive = true; | |||
|  |             opcGroupTerminalW.IsSubscribed = true; | |||
|  |             opcGroupTerminalW.UpdateRate = 200; | |||
|  |             opcGroupTerminalW.AsyncCancelComplete += OpcGroupBoxTerminalW_AsyncCancelComplete;   | |||
|  |             opcGroupTerminalW.AsyncReadComplete += OpcGroupBoxTerminalW_AsyncReadComplete;  | |||
|  |             opcGroupTerminalW.AsyncWriteComplete += OpcGroupBoxTerminalW_AsyncWriteComplete;   | |||
|  | 
 | |||
|  |             listItems.Items.Clear(); | |||
|  |             foreach (var item in opcBrowser) | |||
|  |             { | |||
|  |                if(item.ToString().Contains("ModbusRtu")) | |||
|  |                 listItems.Items.Add(item); | |||
|  |             } | |||
|  |             | |||
|  |                  | |||
|  |         } | |||
|  | 
 | |||
|  |         private void OpcGroupBoxTerminalW_AsyncWriteComplete(int TransactionID, int NumItems, ref Array ClientHandles, ref Array Errors) | |||
|  |         { | |||
|  |             lbTerminal.Text = String.Format(" transactionId:{0},numItems:{1}", TransactionID, NumItems); | |||
|  |         } | |||
|  | 
 | |||
|  |         private void OpcGroupBoxTerminalW_AsyncReadComplete(int TransactionID, int NumItems, ref Array ClientHandles, ref Array ItemValues, ref Array Qualities, ref Array TimeStamps, ref Array Errors) | |||
|  |         { | |||
|  |             throw new NotImplementedException(); | |||
|  |         } | |||
|  | 
 | |||
|  |         private void OpcGroupBoxTerminalW_AsyncCancelComplete(int CancelID) | |||
|  |         { | |||
|  |             throw new NotImplementedException(); | |||
|  |         } | |||
|  | 
 | |||
|  |         private void OpcGroupMoreBoxesW_AsyncWriteComplete(int TransactionID, int NumItems, ref Array ClientHandles, ref Array Errors) | |||
|  |         { | |||
|  |             lbMoreBoxes.Text = String.Format(" transactionId:{0},numItems:{1}", TransactionID, NumItems); | |||
|  |         } | |||
|  | 
 | |||
|  |         private void OpcGroupMoreBoxesW_AsyncReadComplete(int TransactionID, int NumItems, ref Array ClientHandles, ref Array ItemValues, ref Array Qualities, ref Array TimeStamps, ref Array Errors) | |||
|  |         { | |||
|  |            // throw new NotImplementedException(); | |||
|  |         } | |||
|  | 
 | |||
|  |         private void OpcGroupMoreBoxesW_AsyncCancelComplete(int CancelID) | |||
|  |         { | |||
|  |             throw new NotImplementedException(); | |||
|  |         } | |||
|  | 
 | |||
|  |         private void OpcGroupBoxBarcodeR_AsyncWriteComplete(int TransactionID, int NumItems, ref Array ClientHandles, ref Array Errors) | |||
|  |         { | |||
|  |             lbBarcode.Text = String.Format(" transactionId:{0},numItems:{1}", TransactionID, NumItems); | |||
|  |         } | |||
|  | 
 | |||
|  |         private void OpcGroupBoxBarcodeR_AsyncReadComplete(int TransactionID, int NumItems, ref Array ClientHandles, ref Array ItemValues, ref Array Qualities, ref Array TimeStamps, ref Array Errors) | |||
|  |         { | |||
|  |             varDic = new Dictionary<string, string>(); | |||
|  |             showInfo("读取结束"); | |||
|  |             StringBuilder sb = new StringBuilder(); | |||
|  |             sb.Append(TransactionID + " -> "); | |||
|  |             for (int i = 1; i <= NumItems; i++) | |||
|  |             { | |||
|  |                 int index = Convert.ToInt32(ClientHandles.GetValue(i)) - 0; | |||
|  |                 string item = lstBarcodeItems[index]; | |||
|  |                 string value = ItemValues.GetValue(i).ToString(); | |||
|  |                 sb.Append(item).Append(":").Append(value).Append("; "); | |||
|  |                 varDic[item] = value; | |||
|  |             } | |||
|  |             varTransactionDics[TransactionID] = varDic; | |||
|  |             showResult(sb.ToString()); | |||
|  |             lbBarcode.Text = sb.ToString(); | |||
|  |             setBoxTerminal(TransactionID); | |||
|  | 
 | |||
|  |         } | |||
|  | 
 | |||
|  |         private void setBoxTerminal(int transactionID) | |||
|  |         { | |||
|  |             Dictionary<string, string> varDic = new Dictionary<string, string>(); | |||
|  |             varDic = varTransactionDics[transactionId]; | |||
|  |               | |||
|  |             foreach (string item in varDic.Values) | |||
|  |             { | |||
|  |                 //TO process wms function  | |||
|  |                 int barcode = Convert.ToInt32(item); | |||
|  |                 string firstTerminal = "02"; //货区 | |||
|  |                 string secondTerminal= "04";//复核 | |||
|  |                 string plcTerminal = barcode + firstTerminal + secondTerminal; | |||
|  |                 asyncWriteTerminal(plcTerminal); | |||
|  |             } | |||
|  |         } | |||
|  | 
 | |||
|  |         private void asyncWriteTerminal(string terminal) | |||
|  |         { | |||
|  |             putItems(lstTerminalItems, opcGroupTerminalW,ref serverHandleTerminal); | |||
|  |             cnt = 0; | |||
|  |             Array newValues = new object[] { 0, terminal }; | |||
|  | 
 | |||
|  |             opcGroupTerminalW.AsyncWrite(lstTerminalItems.Count, serverHandleTerminal, newValues, out errors, ++transactionId, out cancelId); | |||
|  |         } | |||
|  | 
 | |||
|  |         private void OpcGroupBoxBarcodeR_AsyncCancelComplete(int CancelID) | |||
|  |         { | |||
|  |             throw new NotImplementedException(); | |||
|  |         } | |||
|  | 
 | |||
|  |         private void showResult(string v) | |||
|  |         { | |||
|  |             lbResult.Text = v; | |||
|  |         } | |||
|  | 
 | |||
|  |         private void OpcGroup_AsyncCancelComplete(int CancelID) | |||
|  |         { | |||
|  |             throw new NotImplementedException(); | |||
|  |         } | |||
|  | 
 | |||
|  |         void showInfo(string msg) | |||
|  |         { | |||
|  |             lbMsg.Text = msg; | |||
|  |         } | |||
|  |              | |||
|  |          | |||
|  |         private void btnAddItems_Click(object sender, EventArgs e) | |||
|  |         { | |||
|  | 
 | |||
|  |             if (!lstMoreBoxesItems.Contains(listItems.SelectedItem.ToString())){ | |||
|  |                 lstMoreBoxesItems.Add(listItems.SelectedItem.ToString()); | |||
|  |                 listMoreBoxes.Items.Add((string)listItems.SelectedItem.ToString()); | |||
|  |             } | |||
|  |              | |||
|  |         } | |||
|  | 
 | |||
|  |         private void btnRead_Click(object sender, EventArgs e) | |||
|  |         { | |||
|  |             timer1.Interval = 300; | |||
|  |             timer1.Tick += Timer1_Tick; | |||
|  |           //  timer1.Enabled = !timer1.Enabled; | |||
|  |             btnWriteMoreBoxes.Text = timer1.Enabled ? "停止读取" : "开始读取"; | |||
|  | 
 | |||
|  |            // asyncReadMOreBoxes(); | |||
|  | 
 | |||
|  |               | |||
|  |         } | |||
|  | 
 | |||
|  |         int cnt; | |||
|  |         private void Timer1_Tick(object sender, EventArgs e) | |||
|  |         { | |||
|  |             //asyncReadMOreBoxes(); | |||
|  |            // lbCycle.Text = "执行次数:" + (++cnt); | |||
|  |         } | |||
|  |              | |||
|  |         void putItemsMoreBoxes() | |||
|  |         { | |||
|  |             varDic.Clear(); | |||
|  |             List<string> opcItemIds = new List<string>(); | |||
|  |             List<int> clientHandles = new List<int>(); | |||
|  |             List<int> values = new List<int>();     | |||
|  |              | |||
|  | 
 | |||
|  |             opcItemIds.Add(""); | |||
|  |             clientHandles.Add(0); | |||
|  | 
 | |||
|  |             foreach(var item in lstBarcodeItems) | |||
|  |             { | |||
|  |                 opcItemIds.Add(item.ToString()); | |||
|  |                 clientHandles.Add(lstBarcodeItems.IndexOf(item)+0); | |||
|  |                 varDic[item.ToString()] = null; | |||
|  |                   | |||
|  |             } | |||
|  |            // varTransactionDics[transactionId] = varDic; | |||
|  |             Array items = opcItemIds.ToArray(); | |||
|  |             Array clienthandels =clientHandles.ToArray(); | |||
|  | 
 | |||
|  |             opcGroupBarcodeR.OPCItems.AddItems(lstBarcodeItems.Count,ref items, ref clienthandels, out serverHandlesMOreBox,out errors); | |||
|  |         } | |||
|  |         void putItems(List<string> listItems,OPCGroup oPCGroup, ref Array serverHandles) | |||
|  |         { | |||
|  |           //  varDic=new Dictionary<string, string>(); | |||
|  |             List<string> opcItemIds = new List<string>(); | |||
|  |             List<int> clientHandles = new List<int>(); | |||
|  |             List<int> values = new List<int>(); | |||
|  | 
 | |||
|  | 
 | |||
|  |             opcItemIds.Add(""); | |||
|  |             clientHandles.Add(0); | |||
|  | 
 | |||
|  |             foreach (var item in listItems) | |||
|  |             { | |||
|  |                 opcItemIds.Add(item.ToString()); | |||
|  |                 clientHandles.Add(listItems.IndexOf(item) + 0); | |||
|  |            //     varDic[item.ToString()] = null; | |||
|  | 
 | |||
|  |             } | |||
|  |             // varTransactionDics[transactionId] = varDic; | |||
|  |             Array items = opcItemIds.ToArray(); | |||
|  |             Array clienthandels = clientHandles.ToArray(); | |||
|  | 
 | |||
|  |             oPCGroup.OPCItems.AddItems(listItems.Count, ref items, ref clienthandels, out serverHandles, out errors); | |||
|  |         } | |||
|  | 
 | |||
|  |         void asyncReadMOreBoxes() | |||
|  |         { | |||
|  |             putItems(lstMoreBoxesItems, opcGroupMoreBoxesW,ref serverHandlesMOreBox); | |||
|  |             varTransactionDics[++transactionId] = varDic; | |||
|  |             opcGroupMoreBoxesW.AsyncRead(lstMoreBoxesItems.Count, serverHandlesMOreBox, out errors, transactionId, out cancelId); | |||
|  |             | |||
|  | 
 | |||
|  |         } | |||
|  | 
 | |||
|  |         private void btnWrite_Click(object sender, EventArgs e) | |||
|  |         { | |||
|  |              | |||
|  |         } | |||
|  | 
 | |||
|  |         void ayncWriteMoreBoxes() | |||
|  |         { | |||
|  |             putItems(lstMoreBoxesItems, opcGroupMoreBoxesW, ref serverHandlesMOreBox);  | |||
|  |             cnt = 0; | |||
|  |             Array newValues = new object[] { 0, chkBoxMoreboxes.Checked?1:0}; | |||
|  |           //  varTransactionDics[++transactionId] = varDic; | |||
|  |             opcGroupMoreBoxesW.AsyncWrite(lstMoreBoxesItems.Count, serverHandlesMOreBox, newValues, out errors, ++transactionId, out cancelId); | |||
|  |         } | |||
|  | 
 | |||
|  | 
 | |||
|  |         private void OpcGroup_AsyncWriteComplete(int TransactionID, int NumItems, ref Array ClientHandles, ref Array Errors) | |||
|  |         { | |||
|  |             showInfo("write completed"); | |||
|  |         } | |||
|  | 
 | |||
|  |         private void btnBarcode_Click(object sender, EventArgs e) | |||
|  |         { | |||
|  | 
 | |||
|  |             if (!lstBarcodeItems.Contains(listItems.SelectedItem.ToString())) | |||
|  |             { | |||
|  |                 lstBarcodeItems.Add(listItems.SelectedItem.ToString()); | |||
|  |                 listBoxBarcode.Items.Add((string)listItems.SelectedItem.ToString()); | |||
|  |             } | |||
|  | 
 | |||
|  |         } | |||
|  | 
 | |||
|  |         private void btnTerminal_Click(object sender, EventArgs e) | |||
|  |         { | |||
|  |             if (!this.lstTerminalItems.Contains(listItems.SelectedItem.ToString())) | |||
|  |             { | |||
|  |                 lstTerminalItems.Add(listItems.SelectedItem.ToString()); | |||
|  |                 listBoxTerminal.Items.Add((string)listItems.SelectedItem.ToString()); | |||
|  |             } | |||
|  |         } | |||
|  | 
 | |||
|  |         private void btnWriteMoreBoxes_Click(object sender, EventArgs e) | |||
|  |         { | |||
|  |             ayncWriteMoreBoxes(); | |||
|  |         } | |||
|  | 
 | |||
|  |         private void btnWriteTerminal_Click(object sender, EventArgs e) | |||
|  |         { | |||
|  |             asyncWriteTerminal(txtTerminal.Text); | |||
|  |         } | |||
|  | 
 | |||
|  |         private void btnReadBarcode_Click(object sender, EventArgs e) | |||
|  |         { | |||
|  |             asyncReadBarcodes(); | |||
|  |         } | |||
|  | 
 | |||
|  |         private void asyncReadBarcodes() | |||
|  |         { | |||
|  |             putItems(lstBarcodeItems, opcGroupBarcodeR, ref serverHandlesBarcode);  | |||
|  |             //varTransactionDics[++transactionId] = varDic; | |||
|  |             opcGroupBarcodeR.AsyncRead(lstBarcodeItems.Count, serverHandlesBarcode, out errors, ++transactionId, out cancelId); | |||
|  |            | |||
|  |         } | |||
|  | 
 | |||
|  |         private void OpcGroup_AsyncReadComplete(int TransactionID, int NumItems, ref Array ClientHandles, ref Array ItemValues, ref Array Qualities, ref Array TimeStamps, ref Array Errors) | |||
|  |         { | |||
|  |             showInfo("读取结束"); | |||
|  |             StringBuilder sb = new StringBuilder(); | |||
|  |             sb.Append(TransactionID + " -> "); | |||
|  |             for (int i = 1; i <= NumItems; i++) | |||
|  |             { | |||
|  |                 int index = Convert.ToInt32(ClientHandles.GetValue(i)) - 0; | |||
|  |                 string item = lstMoreBoxesItems[index]; | |||
|  |                 string value = ItemValues.GetValue(i).ToString(); | |||
|  |                 sb.Append(item).Append(":").Append(value).Append("; "); | |||
|  |                 varDic[item] = value; | |||
|  |             } | |||
|  |             varTransactionDics[TransactionID] = varDic; | |||
|  |             showResult(sb.ToString()); | |||
|  |            // processWmsFunctions(TransactionID); | |||
|  | 
 | |||
|  | 
 | |||
|  |         } | |||
|  |          | |||
|  |         /// <summary> | |||
|  |         /// 读取到周转箱条码 | |||
|  |         /// 请求WMS,分配周转箱巷道任务,返回分配的弹出口,并写入plc | |||
|  |         /// </summary> | |||
|  |         /// <param name="transactionID"></param> | |||
|  |      | |||
|  |         private void needMoreBoxes(int transactionID) | |||
|  |         { | |||
|  |             //分配巷道任务给周转箱,并写入plc,plc将其弹出到对应货区的缓冲区  | |||
|  |             //系统分配波次任务,按货区顺序注册周转箱,并分别弹出到货区的缓冲区 | |||
|  | 
 | |||
|  | 
 | |||
|  | 
 | |||
|  | 
 | |||
|  | 
 | |||
|  | 
 | |||
|  |         } | |||
|  |     } | |||
|  | } |