我是一个三菱PLC与“廉价手工”人机界面,我们建立在ViualBasic。
我需要跟踪我的VisualBasic人机界面中的PLC内存中的布尔变量的值,我们通过使用OPC服务器来实现这一点。这一步没有重大并发症。
接下来,我必须在SQL数据库中写入该变量的状态,当该变量更改其状态时,如下所示:
If MyVar Changes from 0 to 1 Then
Write "True" in SQL (1 entry)
End If
If MyVar Changes from 1 to 0 Then
Write "False" in SQL (1 entry)
End If我的问题是,我不知道如何在不不断轮询变量的情况下捕捉变量状态的变化。这意味着我不断地将条目添加到SQL数据库中,但我只需要每个变量状态变化一个条目。
发布于 2021-02-17 23:02:40
您可以创建一个类来跟踪布尔值:
Public Class BooleanWithEvent
Private _value As Boolean
Public Event ValueChanged(sender As Object, e As EventArgs)
Public Property Value
Get
Return _value
End Get
Set(value)
If _value <> value Then
_value = value
RaiseEvent ValueChanged(Me, EventArgs.Empty)
End If
End Set
End Property
End Class可以创建该类的实例并添加事件处理程序:
Public WithEvents MyBoolean As New BooleanWithEvent
Private Sub MyBoolean_ValueChanged(sender As Object, e As EventArgs) Handles MyBoolean.ValueChanged
Select Case MyBoolean.Value
Case True
' Write "True" in SQL (1 entry)
Case False
' Write "False" in SQL (1 entry)
End Select
End Sub编辑
一个更详细的版本,它跟踪无限的值并触发单个事件:
Public Class BooleanValuesWithEvent
Private _values As New Dictionary(Of Integer, Boolean)
''' <summary>
''' Occurs when a value has changed.
''' </summary>
''' <param name="index"></param>
Public Event ValueChanged(index As Integer)
''' <summary>
''' Gets or sets a default value.
''' </summary>
Public Property DefaultValue As Boolean = False
''' <summary>
''' Gets or sets a value.
''' </summary>
''' <param name="index"></param>
Public Property Value(index As Integer) As Boolean
Get
If _values.ContainsKey(index) Then
Return _values.Item(index)
Else
Return DefaultValue
End If
End Get
Set(value As Boolean)
If _values.ContainsKey(index) Then
If _values.Item(index) <> value Then
_values.Item(index) = value
RaiseEvent ValueChanged(index)
End If
Else
_values.Add(index, value)
RaiseEvent ValueChanged(index)
End If
End Set
End Property
End Class发布于 2021-02-21 11:07:52
大多数工业协议都是通过请求响应系统来工作的,知道变量已经改变的唯一方法是通过不断的轮询。
还有其他通过发布-订阅方法工作的协议,使用它们,您可以在每次变量更改时接收更新,而不必进行轮询。支持此系统的两个协议是MQTT (通过代理)和OPC UA订阅。
我不知道您使用的OPC服务器是否是UA,如果它支持订阅,也许您应该检查一下。
https://stackoverflow.com/questions/66249103
复制相似问题