首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >单击mousedown/mouseup按钮

单击mousedown/mouseup按钮
EN

Stack Overflow用户
提问于 2015-09-30 16:08:20
回答 1查看 833关注 0票数 0

在别人的应用程序中,我遇到了一些让我自己熟悉的奇怪的事情:一个按钮,在点击时启动或停止一个plc (来自贝克霍夫的TwinCat)这样的按钮:

(请注意:hbool1变量只是一个整数句柄,以便plc知道我想要更改的内部变量:这里:打开/关闭)

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

我不熟悉鼠标/鼠标,只需点击一下就可以了。因此,出于好奇,我尝试了点击事件:

代码语言:javascript
复制
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。所以电脑应该一直开着,但我也可以把它关掉。
  2. 为什么我自己的想法行不通?这不是更符合逻辑吗?!

我没有尝试的是检查MouseClick事件。那么,也许我自己的想法是可行的,但是仍然有一个问题,第一段代码为什么会起作用。

编辑:

我发现了另一件事:考虑第一个片段,它最初是如何完成的(工作):我在代码中放置了两个消息框,并注意到了一种不同的行为:对于消息框,它不再工作了。当我点击按钮时,我只看到显示“关闭”的点,而没有跟随“打开”。虽然这可能与消息框的中断性质有关,但仍然很有趣。

代码语言:javascript
复制
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的代码有问题,而前作者想出了这个鼠标按钮式/下压式的方法来使它正常工作,而不是修复plc。这个是可能的吗?

EN

回答 1

Stack Overflow用户

发布于 2015-10-01 12:37:46

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

代码语言:javascript
复制
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,以确保您不在同一个可编程控制器周期内。

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

https://stackoverflow.com/questions/32870870

复制
相关文章

相似问题

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