首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >当布尔变量更改其状态时引发事件

当布尔变量更改其状态时引发事件
EN

Stack Overflow用户
提问于 2021-02-17 19:57:03
回答 2查看 128关注 0票数 1

我是一个三菱PLC与“廉价手工”人机界面,我们建立在ViualBasic。

我需要跟踪我的VisualBasic人机界面中的PLC内存中的布尔变量的值,我们通过使用OPC服务器来实现这一点。这一步没有重大并发症。

接下来,我必须在SQL数据库中写入该变量的状态,当该变量更改其状态时,如下所示:

代码语言:javascript
复制
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数据库中,但我只需要每个变量状态变化一个条目。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2021-02-17 23:02:40

您可以创建一个类来跟踪布尔值:

代码语言:javascript
复制
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

可以创建该类的实例并添加事件处理程序:

代码语言:javascript
复制
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

编辑

一个更详细的版本,它跟踪无限的值并触发单个事件:

代码语言:javascript
复制
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
票数 1
EN

Stack Overflow用户

发布于 2021-02-21 11:07:52

大多数工业协议都是通过请求响应系统来工作的,知道变量已经改变的唯一方法是通过不断的轮询。

还有其他通过发布-订阅方法工作的协议,使用它们,您可以在每次变量更改时接收更新,而不必进行轮询。支持此系统的两个协议是MQTT (通过代理)和OPC UA订阅。

我不知道您使用的OPC服务器是否是UA,如果它支持订阅,也许您应该检查一下。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66249103

复制
相关文章

相似问题

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