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将其弹出到对应货区的缓冲区
|
||
//系统分配波次任务,按货区顺序注册周转箱,并分别弹出到货区的缓冲区
|
||
|
||
|
||
|
||
|
||
|
||
|
||
}
|
||
}
|
||
}
|