ldj/epickHost/OPC.cs

393 lines
14 KiB
C#
Raw Normal View History

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