首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用C#从OPC Server读取OPC值

使用C#从OPC Server读取OPC值
EN

Stack Overflow用户
提问于 2018-02-01 15:22:52
回答 2查看 3.6K关注 0票数 0

我有一个OPC-DA服务器,SCADA软件将变量和它的值写入其中,所以我希望使用C#同步读取它们。我已经写了我的算法,但我不能读取变量。代码创建一个订阅,或者可以创建一个组实例,在其中写入自己的变量和值,但我不希望这样。我只需要从OPC服务器读取这些值。

我已经在OPC服务器之间建立了连接,但我还没有到达将变量写入OPC服务器的变量。

问题在哪里,我不能意识到。你能给我一个解决方案吗?

我的代码:

代码语言:javascript
复制
class OpcFunctions
{
    Opc.Da.Server Server = null;
    OpcCom.Factory Factory = new OpcCom.Factory();
    Opc.Da.Item[] Items;
    Opc.Da.Subscription Group;
    Opc.IRequest myReq;
    Opc.Da.WriteCompleteEventHandler WriteEventHandler;
    Opc.Da.ReadCompleteEventHandler ReadEventHandler;



    public void GetOpcServers(TreeView OpcServerTreeList, ListBox OpcConnectionUrlListBox)
    {
        try
        {
            OpcCom.ServerEnumerator myServerEnumerator = new OpcCom.ServerEnumerator();
            Opc.Server[] Servers = myServerEnumerator.GetAvailableServers(Opc.Specification.COM_DA_20);
            ListServers(Servers,OpcServerTreeList,OpcConnectionUrlListBox);
        }

        catch(Exception ex)
        {
            MessageBox.Show(ex.Message);
        }
    }

    private void ListServers(Opc.Server[] OpcServerList , TreeView OpcServerTreeList, ListBox OpcConnectionUrlListBox)
    {
        try
        {
            OpcServerTreeList.Nodes.Clear();
            OpcConnectionUrlListBox.Items.Clear();

            foreach(Opc.Server myServer in OpcServerList)
            {
                TreeNode myTreeNode = new TreeNode(myServer.Name);
                myTreeNode.Nodes.Add(myServer.Url.HostName + ":" + myServer.Url.Path + ":" + myServer.Url.Port);
                myTreeNode.Nodes.Add(myServer.Url.ToString());
                myTreeNode.Nodes.Add(myServer.IsConnected.ToString());
                OpcServerTreeList.Nodes.Add(myTreeNode);
                OpcConnectionUrlListBox.Items.Add(myServer.Url.ToString());
            }
        }

        catch(Exception ex)
        {
            MessageBox.Show(ex.Message);
        }
    }

    public bool ConnectOpcServer(string OpcUrl)
    {
        Opc.URL Url = new Opc.URL(OpcUrl);
        Server = new Opc.Da.Server(Factory, null);

        try
        {
            Server.Connect(Url, new Opc.ConnectData(new System.Net.NetworkCredential()));

            Opc.Da.SubscriptionState GroupState = new Opc.Da.SubscriptionState();
            GroupState.Name = "Group1";
            GroupState.Active = true;

            Group = (Opc.Da.Subscription)Server.CreateSubscription(GroupState);
            Group.DataChanged += new Opc.Da.DataChangedEventHandler(GroupDataChanged);

            Items = Group.AddItems(Items);

            ReadEventHandler = new Opc.Da.ReadCompleteEventHandler(ReadCompleteCallback);

            Group.Read(Group.Items, 123, ReadCompleteCallback, out myReq);
        }

        catch(Exception ex)
        {
            MessageBox.Show(ex.Message);
            return false;
        }

        return true;
    }

    void GroupDataChanged(object subscriptionHandle, object requestHandle, Opc.Da.ItemValueResult[] values)
    {
        uint order = 1;
        foreach (Opc.Da.ItemValueResult chitem in values)
        {
            myWriteLogList(order, chitem.Timestamp, chitem.ItemName, chitem.Value.ToString(), chitem.Quality.ToString());
            ++order;
        }
    }

    void myWriteLogList(uint order, DateTime timestamp, string name, string value, string signalquality)
    {
        SettingsUI.OpcExplorer.dataGridViewOpcExplorer.BeginInvoke((MethodInvoker)delegate
        {
            SettingsUI.OpcExplorer.dataGridViewOpcExplorer.Rows.Add(null,order,timestamp,name,value,signalquality);
        });
    }

    void ReadCompleteCallback(object clientHandle, Opc.Da.ItemValueResult[] results)
    {
        uint order = 1;
        foreach (Opc.Da.ItemValueResult readResult in results)
        {
            myWriteLogList(order, readResult.Timestamp, readResult.ItemName, readResult.Value.ToString(), readResult.Quality.ToString());
            ++order;
        }
    }
}
EN

回答 2

Stack Overflow用户

发布于 2018-11-01 17:31:35

您的“项目”为空!

示例:

Opc.Da.Item[]项=新的Opc.Da.Item1;

items =新的Opc.Da.Item();

items.ItemName = "PlcGroup.Items.value";

票数 0
EN

Stack Overflow用户

发布于 2020-11-21 16:40:14

尝试从服务器读取...添加项目并阅读

var result=Server.read(items); For(i=0;i<result.length;i++) { Console.writeln(result[i].value); }

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48557349

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档