ldj/epickHost/OPC.cs

393 lines
14 KiB
C#
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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