我们开发了一个Java应用程序,该程序使用TwinCat ADS库(DLL)从Beckhoff PLC(CX5120)读取,写入和处理事件。 我们已经成功地在多台计算机上运行了该程序,但是很不幸,我们目前遇到了事件处理突然停止的问题。 这是我们经历的确切场景:
使用具有Java应用程序的另一台PC进行测试,同样的问题。因此,PLC中的某些内容似乎冻结/停止工作。
这是我们设置事件处理的方式:
// Implementation of the CallbackListenerAdsState interface
public class ADSEventController implements CallbackListenerAdsState {
......
// Register itself as listener for the ADS events (in constructor)
callObject = new AdsCallbackObject();
callObject.addListenerCallbackAdsState(this);
....
// Event handling
public void onEvent(AmsAddr addr, AdsNotificationHeader notification, long user) {
log.info("Got ADS event for handle[{}] and with raw data[{}]", user, notification.getData());
......
// Registering notification handles for PLC variables
// If we already assigned a notification, delete it first (while reconnecting)
JNILong notification = new JNILong();
if(var.getNotification() != null) {
notification = var.getNotification();
AdsCallDllFunction.adsSyncDelDeviceNotificationReq(addr,notification);
}
// Specify attributes of the notificationRequest
AdsNotificationAttrib attr = new AdsNotificationAttrib();
attr.setCbLength(var.getSize());
attr.setNTransMode(AdsConstants.ADSTRANS_SERVERONCHA);
attr.setDwChangeFilter(1000); // 0.01 sec
attr.setNMaxDelay(2000); // 0.02 sec
// Create notificationHandle
long err = AdsCallDllFunction.adsSyncAddDeviceNotificationReq(
addr,
AdsCallDllFunction.ADSIGRP_SYM_VALBYHND, // IndexGroup
var.getHandle(), // IndexOffset
attr, // The defined AdsNotificationAttrib object
var.getHandle(), // Choose arbitrary number
notification);
var.setNotification(notification);
if (err != 0) {
log.error("Error: Add notification: 0x{} for var[{}]", Long.toHexString(err), var.getId());
}
答案 0 :(得分:4)
我们设法找到了原因。 当我们注册一个变量时,我们从PLC得到一个句柄(长),在我们的情况下,它在一段时间后意外地开始为负值。 我们还使用此long值作为通知的用户参考,但是,我们发现用户参考在ADS库中是无符号的long。
因此,如果我们将负值设置为例如-1258290964作为adsSyncAddDeviceNotificationReq调用中的“任意数字”,CallbackListenerAdsState onEvent方法的参数“用户”(长整数)获得了我们签名的长用户引用的无符号长表示形式,即3036676332。 在我们的Java应用程序中,我们使用此用户引用通过此句柄将事件匹配到特定的plc变量。由于在我们的示例中,我们预期为-1258290964,但收到了3036676332,因此我们从未处理过任何事件。