1

大家好,我需要一个建议,我正在使用 C# 开发一个桌面应用程序(Winform),我有一个表单,我有一个名为 OPC 的单独类(其他文件)

这是 OPC 类的一些代码

OPC 类

namespace BarCodePrint.Class
{   
public class OPC
{
    public OPCServer ConnectedOPCServer { get; set; }
    public OPCGroups ObjOPCGroup {get; set;}
    public OPCGroup ConnectedOPCGroup { get; set; }
    public int _numItems { get; set; }
    public string _nodeName { get; set; }

    Array _OPCItemIDs;
    Array _ItemServerHandles;
    Array _ItemServerErrors;
    Array _ClientHandles;
    Array _RequestedDataTypes;
    Array _AccessPaths;
    Array _WriteItems;

    public OPC()
    {
        //Code
    }

    public void OPCConnect()
    {
       //Code
    }

    public void OPCDisconnect()
    {
        //Code
    }

    public void AddGroupToOPC()
    {
       //Code
    }

    public void AddItemsToOPC()
    {
        //Code
    }

    public void Write()
    { 
        //Code
    }


    private void ConnectedOPCGroup_DataChange(int TransactionID, int NumItems, ref Array ClientHandles, ref Array ItemValues, ref Array Qualities, ref Array TimeStamps)
    {
        try
        {
            for (int i = 1; i <= NumItems; i++)
            {


                if ((Convert.ToInt32(ClientHandles.GetValue(i)) == 1))
                {
                   //Do something
                }
            }
        }
        catch (Exception exc)
        {
          //HandleException
        }

    }

}
}

ConnectedOPCGroup_DataChange方法每次在设备中更改值时执行,我想做的是当值更改时将该值发送到表单,问题是:我应该使用事件吗?或将我的 OPC 类放在表单的同一个文件中?或者我可以用其他方式吗?

我希望能很好地解释我。

谢谢

4

2 回答 2

3

如果您要询问是使用事件还是直接调用某些东西,这取决于您的用例。事件是广播动作的好方法。如果不止一项需要了解使用事件更改的某些内容,则可以将您的代码解耦。也就是说,如果您只关心告诉另一段代码,那么您也可以这样做。事件在同一个线程上分派,因此无论您是直接调用订阅者还是使用事件分派它,执行代码都在同一个上下文中处理。

我个人喜欢使用事件来防止硬耦合。您的调度员代码不需要知道谁在订阅它。它只是说“嘿,事情发生了,现在你开始工作了”。

事件也很简洁,因为您可以将它们与 Rx 结合起来进行采样和节流,并执行各种其他很酷的事情。

如果你发现你正在添加一堆额外的代码来传播“发生了某事”,你应该使用一个事件。

于 2013-03-14T00:14:28.600 回答
0

从 OPC 服务器获取数据有两种方法:直接读取或使用 DataChange 事件。选择取决于您,不能将其中之一描述为“最佳实践”。如果您的问题只是关于实施,那么我可以告诉您,您在 ConnectedOPCGroup_DataChange 子的末尾缺少“Handles ConnectedGroup.DataChange”。您的 OPCAutomation 库将生成事件,您只需处理它。

为了解决您问题的第二部分,最好将您的 OPC 客户端类与您的主窗体分开。

于 2013-10-02T15:42:10.777 回答