【问题标题】:Winforms button click mousedown/mouseupWinforms 按钮单击 mousedown/mouseup
【发布时间】:2015-10-02 02:31:00
【问题描述】:

我在别人的应用程序中遇到了一些我自己熟悉的奇怪的事情:单击时可以启动或停止 plc(来自 Beckhoff 的 TwinCat)的按钮,如下所示:

(只是备注:hbool1 变量只是一个整数句柄,因此 plc 知道我要更改哪个内部变量:此处:打开/关闭)

Private Sub Button1_MouseDown(sender As Object, e As MouseEventArgs) Handles Button1.MouseDown
    'Switch off
    adsClient.WriteAny(hbool1, False)
End Sub

Private Sub Button1_MouseUp(sender As Object, e As MouseEventArgs) Handles Button1.MouseUp
    'Switch on
    adsClient.WriteAny(hbool1, True)
End Sub

我对按钮上的 MouseUp/MouseDowns 并不熟悉,只希望点击一下。 所以出于好奇,我尝试了 Click Event:

Dim state_isOn As Bool

Private Sub Button1_Click(sender As Object, e As MouseEventArgs) Handles Button1.Click        
    If state_isOn Then
      'Switch off
       adsClient.WriteAny(hbool1, False)
    Else        
       'Switch on
       adsClient.WriteAny(hbool1, True)
    End If
End Sub

变量state_isOn 在 PLC 响应时设置为 true 或 false。

我不明白两件事:

  1. 为什么第一个代码 sn-p 有效?第一次点击开启,下一次点击关闭。据我所知,这两个事件都是连续调用的:首先是 mouseDown,然后是 mouseUp。所以 PLC 应该一直打开,但我也可以关闭它。

  2. 为什么我自己的想法行不通?是不是更合乎逻辑?!

我还没有尝试检查 MouseClick 事件。那么也许我自己的想法会奏效,但仍然存在问题,为什么第一个代码确实有效。

编辑:

我想到了另一件事: 考虑第一个 sn-p,它最初是如何完成的(工作):我在代码中放置了 2 个消息框并注意到了不同的行为:使用消息框,它不再工作了。当我单击按钮时,我只显示“关闭”,而没有跟随“打开”。虽然这可能与消息框的中断特性有关,但它仍然很有趣。

Private Sub Button1_MouseDown(sender As Object, e As MouseEventArgs) Handles Button1.MouseDown
    'Switch off
    adsClient.WriteAny(hbool1, False)
    MsgBox("Switch off")
End Sub

Private Sub Button1_MouseUp(sender As Object, e As MouseEventArgs) Handles Button1.MouseUp
    'Switch on
    adsClient.WriteAny(hbool1, True)
    MsgBox("Switch on")
End Sub

另一个注意事项:MouseClick-event 也不起作用。 我觉得 plc 的代码有问题,前作者想出了这个 mousebuttonup/down hack 以某种方式使其工作,而不是修复 plc。这可能吗?

【问题讨论】:

  • 您永远不会更改 state_isOn 变量的值。所以它永远不会做任何不同的事情。
  • @HansPassant 实际上,您不知道这段代码实际上在做什么(OP 声称第二个 sn-p 有效,因此 adsClient.WriteAny 确实修改了 state_isOn;为什么不呢?) .整体行为(Click 工作和MouseDown + MouseUp 不是)当然是不可能的,但发布的信息不完整,因此我们无法确定任何事情(除了 OP 做错了什么并且提供的信息是'还不够)。
  • 嗯,这很冒昧。我实际上知道 Beckhoff 软件的工作原理,我使用过它。您的回答对 OP 没有帮助。
  • @HansPassant 我通过分析发布的代码从一般的角度回答了这个问题(VB.NET 在这种情况下应该如何表现?)。我回答的目的是帮助 OP 了解给定行为在 VB.NET 中的工作方式(MouseDown+MouseUp 和 Click 两次之间的区别);这样她/他可以执行所需的修改以与该包(或任何其他包)进行通信。另一方面,如果您认为这样的知识对 OP 没有用,那么只要我没有使用此软件包的经验,我就无法反驳。
  • 我写了一个通用答案(即,根本不关心与 TwinCat 的通信)来帮助您了解您在 VB.NET 中询问的两种行为之间的区别。正如您在上面的 cmets 中看到的,Hans(他在这个特定的包中很有经验,我不太可能)认为这不是您需要的那种知识;这就是为什么我删除了我的答案。如果认为它可能会有所帮助(这是一个简单的代码,有助于理解 VB.NET 中 MouseDown+MouseUp 和 2xClick 之间的区别),请告诉我,我会取消删除它。

标签: vb.net winforms plc


【解决方案1】:

要真正使用 TcAdsClient 启动或停止 plc,您应该使用可用的 WriteControl 方法,例如:

tcClient.WriteControl(newStateInfo(AdsState.Run,tcClient.ReadState().DeviceState));

tcClient.WriteControl(newStateInfo(AdsState.Stop,tcClient.ReadState().DeviceState));

您可能并没有真正停止 PLC。相反,您只是在 PLC 上写入 BOOL 变量,这恰好改变了 PLC 程序的控制流程。在 PLC 上,通常是正常的编程风格,您将通过 BOOL 变量的上升沿或下降沿触发动作。要创建此边缘,使用 MouseUp/MouseDown 事件非常有意义。但是当您单击太快时,可能无法识别上升沿。如果变量在同一个 PLC 循环中更新为 FALSE 然后 TRUE,就会发生这种情况。您可能应该只使用 ClickEvent 将其设置为 FALSE 并触发一个计时器将变量再次设置为 TRUE,以确保您不在同一个 PLC 周期中。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-10-25
    • 1970-01-01
    • 2011-01-07
    • 2012-08-16
    • 1970-01-01
    • 2012-11-13
    • 1970-01-01
    相关资源
    最近更新 更多