【发布时间】: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。
我不明白两件事:
为什么第一个代码 sn-p 有效?第一次点击开启,下一次点击关闭。据我所知,这两个事件都是连续调用的:首先是 mouseDown,然后是 mouseUp。所以 PLC 应该一直打开,但我也可以关闭它。
为什么我自己的想法行不通?是不是更合乎逻辑?!
我还没有尝试检查 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 之间的区别),请告诉我,我会取消删除它。