【问题标题】:Reading in C# items from an OPC Server从 OPC 服务器读取 C# 项
【发布时间】:2015-03-02 14:34:03
【问题描述】:

我每 10 秒从 OPC 服务器 KepServer V5 读取 OPC 项目到一个文件,但它每 10 秒读取两次!!。 (我不想每 10 秒读 2 次,但只能读 1 次!)

这是我的代码。

OPCController 类:

    public void AddItems(string plcPath)
    {

        if (server.IsConnected || group.Active)
        {
            try
            {
                Opc.Da.Item[] items = new Opc.Da.Item[3];
                items[0] = new Opc.Da.Item();
                items[0].ItemName = “PLC1.Value1″;
                items[1] = new Opc.Da.Item();
                items[1].ItemName = “PLC1.Value2″;
                items[2] = new Opc.Da.Item();
                items[2].ItemName = “PLC1.Value3″;

                group.AddItems(items);
            }
            catch (Exception e)
            {
                MessageBox.Show("Tags not read.");
            }
        }

    }

    public void ReadItems()
    {
        Opc.IRequest req;
        group.Read(group.Items, 123, new Opc.Da.ReadCompleteEventHandler(ReadCompleteCallback), out req);
        Console.ReadLine();
    }


static void ReadCompleteCallback( object clientHandle, Opc.Da.    ItemValueResult[] results)
{
Console.WriteLine( "Read complete" );
DateTime dataTimeNow = DateTime.Now;
foreach (Opc.Da.ItemValueResult readResult in results)
{
Console.WriteLine( "\Timestamp{0}\tValue:{1}" , (dataTimeNow.ToString("")), readResult.Value);
}
Console.WriteLine();
}

表单类:

private void startRead_btn_Click(object sender, EventArgs e)
    {
            int setTimerInterval = (int)this.numSetTimer.Value;
            timer1.Enabled = true;
            timer1.Interval = (setTimerInterval) * (1000);
            timer1.Tick += new EventHandler(timer1_Tick);
            timer1.Start();
            startRead_btn.Enabled = false;
            endRead_btn.Enabled = true;
    }

 private void timer1_Tick(object sender, EventArgs e)
    {
        opcController.ReadItems();
    }

输出文件:

TimeStamp: 3/2/2015 3:10:15 PM Value: 12159
TimeStamp: 3/2/2015 3:10:15 PM Value: 12162

TimeStamp: 3/2/2015 3:10:25 PM Value: 12168
TimeStamp: 3/2/2015 3:10:25 PM Value: 12169

TimeStamp: 3/2/2015 3:10:35 PM Value: 12177
TimeStamp: 3/2/2015 3:10:35 PM Value: 12178

【问题讨论】:

  • 你好,我正在研究如何从 C# 连接到 Kepware OPC,你能把你的源代码发给我吗?

标签: c# opc


【解决方案1】:

您实际上已经添加了两次相同的组:

try
{
    //...

    items = group.AddItems(items);     //you add them HERE

    group.AddItems(items);             //and HERE
}

通过将每个对象添加两次,它们将在一个刷新周期内从服务器读取两次。

删除任一行,它应该只读取一次。

【讨论】:

  • 我正在调试代码,它两次传递了“timer1_tick”方法。很奇怪。
  • 你验证过你的定时器的时间间隔吗?变量setTimerInterval..的值是多少??
【解决方案2】:

您只能获得 2 个项目的读取结果! 您的控制台正在写入它读取的每个项目,它只读取 2 您确定您发布的代码是生成输出的代码吗?

将 ReadResult.ItemName 作为另一个字符串输出放在你的 console.Writeline 方法中 - 你会看到情况就是这样。

foreach (Opc.Da.ItemValueResult readResult in results)
{
Console.WriteLine( "\Timestamp{0}\tValue:{1}" , (dataTimeNow.ToString("")), readResult.Value);
}

另外附注:

try{ ...

   group.AddItems(items);
            }
            catch (Exception e)
            {
                MessageBox.Show("Tags not read."); 
}

您只是将项目添加到组中,没有 READ 方法。错误应该是别的东西。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-02-08
    • 2022-10-21
    • 2017-03-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多