当布尔变量改变他的状态时引发事件

Posted

技术标签:

【中文标题】当布尔变量改变他的状态时引发事件【英文标题】:Raise event when boolean variable change his state 【发布时间】:2021-02-17 19:57:03 【问题描述】:

我正在将 Mitsubshi PLC 与我们在 ViualBasic 中构建的“廉价手工”HMI 通信。

我需要在我的 VisualBasic HMI 的 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 数据库中添加条目,但我只希望每个变量状态更改 1 个条目。

【问题讨论】:

您是否考虑过在另一个成员变量中记录变量的状态,并仅在不同时添加数据库条目? 【参考方案1】:

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

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

【讨论】:

优秀!有用 !!最后一个问题,如果我想对几个变量执行此操作,例如 myboolean 1, 2, 3, ..., n ... 可以以紧凑的方式完成吗?就像只有 1 个触发多个变量的事件......对不起,如果这是一个菜鸟问题,呵呵 是的,你可以修改类来处理数组。【参考方案2】:

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

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

不知道你用的那个OPC服务器是不是UA,是否支持订阅,或许你应该去看看。

【讨论】:

谢谢,我要去研究这个

以上是关于当布尔变量改变他的状态时引发事件的主要内容,如果未能解决你的问题,请参考以下文章

当以太网适配器状态改变 Python 时触发事件

设计模式学习总结(二十三)--状态模式

javascript事件流是啥?都有哪些事件流?

JavaSE--对象克隆

asp.net session过期事件

软考知识点梳理--项目质量控制老七工具之控制图