【问题标题】:Using Multiple Timers in VB.Net在 VB.Net 中使用多个计时器
【发布时间】:2015-08-29 13:02:54
【问题描述】:

我想在 Visual Studio 2012 中使用多个计时器从 PLC(可编程逻辑控制器,电子产品)中的多个寄存器读取数据。当我只使用一个计时器来读取一个寄存器时,我得到了正确的数据,但是当我想读取另一个寄存器时,没有正确显示接收到的数据(它从 0 波动到实际值)。我使用朋友的图书馆来实现这一目标。所以我不知道图书馆.. 代码如下:

Imports Communication

Public Class Form1
    Dim plc As PLCEthernetReadWrite

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        plc = New PLCEthernetReadWrite("192.168.1.5")
        Timer1.Start()
        Timer2.Start()
    End Sub

    Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick
        Label1.Text = plc.ReadWord("404507") 'Where 404507 is register no.
        Label4.Text = Val(Label1.Text) / 100
    End Sub

    Private Sub Timer2_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer2.Tick
        Label1.Text = plc.ReadWord("002071") 'Where 002071 is register no.
        Label4.Text = Val(Label1.Text) / 100
    End Sub
End Class

如果我只使用一个计时器(timer1 或 timer2),那么我会得到正确的值。但我想显示来自多个寄存器的多个值。

【问题讨论】:

  • 为什么你不能将代码从一个计时器移动到另一个并同时读取两者?
  • 嗯,没有理由假设您没有得到实际价值。简单 PLC 的一个常见问题是主机接口与逻辑扫描不同步。所以你会观察到中间值。如果时间有点偏,那么你会看到别的东西。使用电话,打电话给任何了解“PLCEthernetReadWrite”的程序员。

标签: .net vb.net visual-studio visual-studio-2012


【解决方案1】:

我怀疑存在线程问题。尽量避免同时调用 plc.ReadWord。

    Private plcLock As New Object

    Private Function GetPlcValue(plc As PLCEthernetReadWrite, word As String) As String
        SyncLock plcLock
            Return plc.ReadWord(word)
        End SyncLock
    End Function

    Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick
        Label1.Text = GetPlcValue(plc, "404507") 'Where 404507 is register no.
        Label4.Text = Val(Label1.Text) / 100
    End Sub

    Private Sub Timer2_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer2.Tick
        Label1.Text = GetPlcValue(plc, "002071") 'Where 002071 is register no.
        Label4.Text = Val(Label1.Text) / 100
    End Sub

【讨论】:

    【解决方案2】:

    感谢您的帮助。我想通了,问题出在时间上。我将计时器间隔从 100 毫秒增加到 200 毫秒,一切正常。然后我添加了第三个 plc.ReadWord 程序再次开始出现异常。然后我再次将计时器间隔增加到 300 毫秒,一切都运行良好。谢谢。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-03-26
      • 2014-02-09
      • 2018-06-08
      • 1970-01-01
      • 2013-09-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多