Я делаю OPC-клиент, который использует "использование OPCAutomation dll".
Я пытаюсь записать в машину, которая является сервером OPC, но я не знаю, как это сделать.
В данный момент я могу читать значения с OPC-сервера, но не могу записать в него
Я читал о двух инструкциях AsyncWrite и SyncWrite. Я пытался заполнить аргументы, но я не могу заставить его работать.
Было бы здорово, если бы вы могли мне помочь
.
,
,
,
,
,
.
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;
using CWDataServer;
namespace DomaileOPC
{
public partial class FrmMain : Form
{
OPCServer ObjOPCServer;
OPCGroups ObjOPCGroups;
OPCGroup ServidorOPC;
string OPCServerName;
//Array ClientHandlesGlobal;
//Array ItemValuesGlobal;
//Array error;
//int TransactionIDGlobal;
//int NumItemsGlobal;
public FrmMain()
{
try
{
InitializeComponent();
OPCServerName = "View.OpcServer.1";
ObjOPCServer = new OPCServer();
ObjOPCServer.Connect(OPCServerName, "");
ObjOPCGroups = ObjOPCServer.OPCGroups;
ServidorOPC = ObjOPCGroups.Add("Alarms");
ServidorOPC.OPCItems.AddItem(@"123.123.123.123\bAirPressureAlarm", 1);//1
ServidorOPC.OPCItems.AddItem(@"123.123.123.123\bAlarmPresent", 2);//2
ServidorOPC.OPCItems.AddItem(@"123.123.123.123\rPressureSetpointLbs", 3);//3
ServidorOPC.OPCItems.AddItem(@"123.123.123.123\rRecipeStepPressureKgOPCDisplay", 4);//4 \rRecipeStepPressureKgOPCDisplay
ServidorOPC.OPCItems.AddItem(@"123.123.123.123\rRecipeStepSpeed", 5);//5
ServidorOPC.OPCItems.AddItem(@"123.123.123.123\intCurrentStep", 6);//6
ServidorOPC.UpdateRate = 10;
ServidorOPC.IsActive = true;
ServidorOPC.IsSubscribed = true;
ServidorOPC.DataChange += new DIOPCGroupEvent_DataChangeEventHandler(ObjOPCGroup_DataChange);
}
catch (Exception e)
{
MessageBox.Show(e.ToString());
}
}
public void ObjOPCGroup_DataChange(int TransactionID, int NumItems, ref Array ClientHandles, ref Array ItemValues, ref Array Qualities, ref Array TimeStamps)
{
//ClientHandlesGlobal = ClientHandles;
//ItemValuesGlobal = ItemValues;
//TransactionIDGlobal = TransactionID;
//NumItemsGlobal = NumItems;
for (int i = 1; i <= NumItems; i++)
{
int valor=Convert.ToInt32(ClientHandles.GetValue(i));
switch (valor){
case 1:
string value=ItemValues.GetValue(i).ToString();
txtPressureAl.Text = value;
break;
case 2:
string value1=ItemValues.GetValue(i).ToString();//Alarm: 1 when alarm present, 0 means no alarm
txtAlarmP.Text = value1;
break;
case 3:
string value2=ItemValues.GetValue(i).ToString();//Integer variable value of pounds of force to apply to fixture.
txtFixPressure.Text = value2;
break;
case 4:
string value3=(ItemValues.GetValue(i)).ToString();//This is a real representing the setpoint pressure in Kg.
txtKgPressure.Text = value3;
break;
case 5:
string value4 = ItemValues.GetValue(i).ToString();// speed
txtSpeedDisplay.Text = value4;
break;
case 6:
string value5 = ItemValues.GetValue(i).ToString();//This is a real representing the setpoint pressure in Kg.
txtCurrentStep.Text = value5;
break;
}
}
}
private void btnWriteOPC_Click(object sender, EventArgs e)
{
}
}
}