Как читать значения из OPC
Я пытаюсь прочитать значения с сервера OPC, используя https://duckduckgo.com/?q=Interop.OPCAutomation.dll&ia=qa
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 OPC
{
public partial class Form1 : Form
{
OPCServer ObjOPCServer;
OPCGroups ObjOPCGroups;
OPCGroup ObjOPCGroup;
string OPCServerName;
public Form1()
{
getData();
}
private void getData()
{
try
{
int count = 1;
opcServer.Connect("OPCTechs.SiemensNet30DA", "");
opcGroup = opcServer.OPCGroups.Add("MP");
opcGroup.DataChange += new DIOPCGroupEvent_DataChangeEventHandler(opcGroup_DataChange);
//Get First String
for (int i = 40; i <= 47; i++)
opcGroup.OPCItems.AddItem("D104.B" + i, count++);
//Get Second String
for (int i = 80; i <= 91; i++)
opcGroup.OPCItems.AddItem("D104.B" + i, count++);
//Get Third String
for (int i = 69; i >= 60; i--)
opcGroup.OPCItems.AddItem("D104.B" + i, count++);
//Get Fourth String
for (int i = 200; i <= 224; i++)
opcGroup.OPCItems.AddItem("D104.B" + i, count++);
//Get Fifth String
for (int i = 300; i <= 849; i++)
opcGroup.OPCItems.AddItem("D104.B" + i, count++);
//Get Sixth String
for (int i = 40; i >= 47; i++)
opcGroup.OPCItems.AddItem("D104.B" + i, count++);
opcGroup.OPCItems.DefaultIsActive = true;
opcGroup.UpdateRate = 1000;
opcGroup.IsSubscribed = opcGroup.IsActive;
}
catch (Exception exc)
{
MessageBox.Show(exc.Message, "Alert");
}
}
private void opcGroup_DataChange(int TransactionID, int NumItems, ref Array ClientHandles, ref Array ItemValues, ref Array Qualities, ref Array TimeStamps)
{
try
{
string temp = "";
int count = 1;
for (; count <= 8; count++)
{
int ff = Convert.ToInt32(ClientHandles.GetValue(count));
//if (Convert.ToInt32(ClientHandles.GetValue(count)) == count)
temp += ItemValues.GetValue(count).ToString();
}
Textbox4.Text = temp.ToString();
temp = "";
for (; count <= 12; count++)
{
if (Convert.ToInt32(ClientHandles.GetValue(count)) == count)
temp += ItemValues.GetValue(count).ToString();
}
TextBox3.Text = temp.ToString();
temp = "";
for (; count <= 12; count++)
{
if (Convert.ToInt32(ClientHandles.GetValue(count)) == count)
temp += ItemValues.GetValue(count).ToString();
}
TextBox2.Text = temp.ToString();
temp = "";
}
catch (Exception e)
{
MessageBox.Show(e.Message, "Alert");
}
}
}
}
Этот код не возвращает значения с сервера OPC. Это дает ошибку в этой строке
temp += ItemValues.GetValue(count).ToString();
ошибка
Object reference not set to an instance of an object
1 ответ
Во-первых, проверьте, не является ли ItemValues нулевым. Вероятно, это не так, и проблема, скорее всего, в нулевой ItemValues.GetValue (count), но в любом случае стоит проверить. Вы никогда не знаете, что вернет сервер...
Теперь к фактическому ответу: сначала вы должны проверить соответствующий элемент в Qualities, то есть Qualities.GetValue (count) в вашем подходе. Вероятно, что качество плохое, и, следовательно, значение недопустимо (и, следовательно, может быть нулевой ссылкой). Вам необходимо декодировать битовое поле качества в соответствии с его значением в соответствии со спецификациями OPC, но в упрощенном (и слегка некорректном, но в целом работающем) смысле качества ниже 64 не являются хорошими, и с ними не связано никаких значений данных.