Änderungen an der Symboltabelle ereignisgesteuert erkennen

ADS-Geräte, die Symbolnamen unterstützen (SPS, NC, ...), legen die Symbolnamen in eine interne Tabelle ab. Dabei wird jedem Symbol ein Handle zugeordnet. Das Symbolhandle wird benötigt, um auf die Variablen zugreifen zu können. Ändert sich die Symboltabelle, z.B. weil ein neues SPS-Programm in die Steuerung geschrieben wird, so müssen auch die Handles neu ermittelt werden. Wie Änderungen an der Symboltabelle erkannt werden können, zeigt das folgende Beispiel.

Beispielprogramm 'Änderungen an der Symboltabelle ereignisgesteuert erkennen' entpacken: sample11.zip

 

import de.beckhoff.jni.AdsConstants;
import de.beckhoff.jni.JNILong;
import de.beckhoff.jni.tcads.AdsCallDllFunction;
import de.beckhoff.jni.tcads.AdsCallbackObject;
import de.beckhoff.jni.tcads.AdsNotificationAttrib;
import de.beckhoff.jni.tcads.AmsAddr;

public class Main {

    public static void main(String[] args) {
    long err = 0;
    AmsAddr addr = new AmsAddr();

    try {
        // Open communication        
        AdsCallDllFunction.adsPortOpen();
        err = AdsCallDllFunction.getLocalAddress(addr);
        addr.setPort(AdsCallDllFunction.AMSPORT_R0_PLC_RTS1);

        if (err != 0) {
        System.out.println("Error: Open communication: 0x"
            + Long.toHexString(err));
        } else {
        System.out.println("Success: Open communication!");
        } 
        
        JNILong notification = new JNILong();

        AdsNotificationAttrib attr = new AdsNotificationAttrib();
        attr.setCbLength(1);
        attr.setNTransMode(AdsConstants.ADSTRANS_SERVERONCHA);
        attr.setNMaxDelay(5000000);
        attr.setNCycleTime(5000000);

        // Create and add listener
        AdsListener listener = new AdsListener();
        AdsCallbackObject callObject = new AdsCallbackObject();
        callObject.addListenerCallbackAdsState(listener);

        AdsCallDllFunction.adsSyncAddDeviceNotificationReq(addr,
            AdsCallDllFunction.ADSIGRP_SYM_VERSION,     // IndexGroup
            0,          // IndexOffset
            attr,       // The defined AdsNotificationAttrib object
            0,          // Choose arbitrary number
            notification);
        if (err != 0) { 
        System.out.println("Error: Add notification: 0x"
            + Long.toHexString(err)); 
        }

        // Read as long as user does not press return
        System.out.println("Press enter to continue..\n");
        System.in.read();

        // Delete notificationHandle
        err = AdsCallDllFunction.adsSyncDelDeviceNotificationReq(
            addr, 
            notification);
        
        if (err != 0) { 
        System.out.println("Error: Remove notification: 0x"
            + Long.toHexString(err)); 
        }

        // Delete listener
        callObject.removeListenerCallbackAdsState(listener);

        //Close communication
        err = AdsCallDllFunction.adsPortClose();
        if (err != 0) { 
        System.out.println("Error: Close Communication: 0x"
            + Long.toHexString(err)); 
        }

    } catch (Exception ex) {
        System.out.println(ex.getMessage());
    }
    }
}


Implementierung des CallbackListenerAdsState Interface:

import de.beckhoff.jni.tcads.AdsNotificationHeader;
import de.beckhoff.jni.tcads.AmsAddr;
import de.beckhoff.jni.tcads.CallbackListenerAdsState;

public class AdsListener implements CallbackListenerAdsState {
    // Callback function
    @Override
    public void onEvent(AmsAddr addr,
            AdsNotificationHeader notification,
            long user) {

    System.out.println("Symboltabelle hat sich geaendert!");
    }
}