我想在Visual 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),那么我就得到了适当的值。但是我想从多个寄存器中显示多个值。
发布于 2015-09-01 09:15:46
谢谢你的帮助。我想出来了,问题是时间问题。我把计时器间隔从100毫秒提高到200毫秒,一切正常。然后,我添加了第三个plc.ReadWord,程序再次开始不正常运行。然后,我再次把计时器间隔增加到300毫秒,一切都很正常。谢谢。
发布于 2015-08-31 17:38:43
我怀疑线程问题正在发生。尽量避免同时调用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 Subhttps://stackoverflow.com/questions/32286350
复制相似问题