Winforms按钮单击mousedown / mouseup

时间:2015-09-30 16:08:20

标签: vb.net winforms plc

我在别人的应用程序中遇到了一些我自己熟悉的奇怪事情:点击一个按钮开始或停止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,只需要点击一下。 出于好奇,我尝试了点击事件:

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

当plc以答案回应时,变量state_isOn设置为true或false。

我不明白两件事:

  1. 为什么第一个代码段有效?在第一次单击时,它会打开,在下一次单击时它会关闭。据我所知,这两个事件都是连续调用的:首先是mouseDown,然后是mouseUp。因此,Plc应该始终打开,但我也可以将其关闭。

  2. 为什么我自己的想法不起作用?这不合逻辑吗?!

  3. 我还没有尝试检查MouseClick事件。那么也许我自己的想法会起作用,但仍有问题,为什么第一个代码确实起作用。

    编辑:

    我想出了另一件事: 考虑第一个片段,它最初是如何完成的(工作):我在代码中放了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 - 事件,它也不起作用。 我觉得plc的代码有问题,前作者想出了这个mousebuttonup / down hack以某种方式让它工作,而不是修复plc。这可能吗?

1 个答案:

答案 0 :(得分:0)

要使用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循环中。