在别人的应用程序中,我遇到了一些让我自己熟悉的奇怪的事情:一个按钮,在点击时启动或停止一个plc (来自贝克霍夫的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我不熟悉鼠标/鼠标,只需点击一下就可以了。因此,出于好奇,我尝试了点击事件:
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。
我不明白两件事:
我没有尝试的是检查MouseClick事件。那么,也许我自己的想法是可行的,但是仍然有一个问题,第一段代码为什么会起作用。
编辑:
我发现了另一件事:考虑第一个片段,它最初是如何完成的(工作):我在代码中放置了两个消息框,并注意到了一种不同的行为:对于消息框,它不再工作了。当我点击按钮时,我只看到显示“关闭”的点,而没有跟随“打开”。虽然这可能与消息框的中断性质有关,但仍然很有趣。
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。这个是可能的吗?
发布于 2015-10-01 12:37:46
要真正使用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,以确保您不在同一个可编程控制器周期内。
https://stackoverflow.com/questions/32870870
复制相似问题