首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在VB.Net中使用多个定时器

在VB.Net中使用多个定时器
EN

Stack Overflow用户
提问于 2015-08-29 13:02:54
回答 2查看 1.5K关注 0票数 0

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

代码语言:javascript
复制
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),那么我就得到了适当的值。但是我想从多个寄存器中显示多个值。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-09-01 09:15:46

谢谢你的帮助。我想出来了,问题是时间问题。我把计时器间隔从100毫秒提高到200毫秒,一切正常。然后,我添加了第三个plc.ReadWord,程序再次开始不正常运行。然后,我再次把计时器间隔增加到300毫秒,一切都很正常。谢谢。

票数 0
EN

Stack Overflow用户

发布于 2015-08-31 17:38:43

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

代码语言:javascript
复制
    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
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32286350

复制
相关文章

相似问题

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