Status vom Router und der SPS erkennen/verändern

Aufgabe

Das ADS-OCX bietet Möglichkeiten, Statusänderungen vom TwinCAT-Router und den ADS-Geräten abzufangen. Dazu stehen die Ereignisse AdsRouterRemove(), AdsRouterShutdown(), AdsRouterStart(), AdsServerStateChanged() und AdsServerSymChanged() zur Verfügung.

Beschreibung

Wird beim Stoppen des TwinCAT-Routers das Ereignis AdsRouterShutdown() aufgerufen, so kann das betreffende Programm entsprechend darauf reagieren. Beim Starten des TwinCAT-Router wird das Ereignis AdsRouterStart() aufgerufen, in dem dann z. B. mit der Methode AdsReadVarConnectEx() die Verbindungen zu den ADS-Variablen wieder hergestellt werden kann. Wird in der Systemsteuerung von Windows NT/2000/XP der TwinCAT-Router komplett aus dem Betriebssystem entfernt, so wird das Ereignis AdsRouterRemove() aufgerufen.
Neben Statusänderungen des TwinCAT-Routers können auch Zustandsänderungen in ADS-Geräten abgefangen werden. Besondere Bedeutung hat dieses bei der SPS. Durch das Ereignis AdsServerStateChanged()  kann festgestellt werden, ob die SPS gestartet oder gestoppt wurde. Mit dem Ereignis AdsServerSymChanged() werden Änderungen an der Symboltabelle mitgeteilt. Dieses geschieht z. B. wenn das SPS-Programm komplett neu übersetzt wird und anschließend in die SPS übertragen wird.

So wie der Status eines ADS-Gerätes abgefragt werden kann, so kann dieser auch geändert werden. Die Methode AdsSyncWriteControlReq() bietet diese Möglichkeit. Die SPS kann die ADS-Zustände STOP und RUN annehmen. Durch ein Check-Button in dem unteren Beispiel-Programm, kann der Bediener zwischen diesen beiden Zuständen umschalten.

Bei jeder Statusänderung des TwinCAT-Routers erfolgt ein entsprechender Eintrag in die Listbox.

Achtung: Wird eine Änderung der Symboltabelle erkannt, so kann es sein das eine Variable, die mit AdsReadVarConnectEx() angesprochen wird, gelöscht oder umbenannt  wurde. Beim Auftreten des Ereignisses AdsServerSymChanged() sollten alle Connects und Handles gelöscht und anschließend neu angelegt werden.

Visual Basic 6 Programm

Option Explicit

'--- wird beim Starten aufgerufen ---
Private Sub Form_Load()
    Call lstEvent.Clear
    AdsOcx1.EnableErrorHandling = True
End Sub

'--- wird aufgerufen, wenn sich der Status des ADS-Gerätes ändert ---
Private Sub AdsOcx1_AdsServerStateChanged(ByVal nAdsState As ADSOCXLib.ADSSTATE, ByVal nDeviceState As Long)
    Select Case nAdsState
    Case ADSSTATE_INVALID:      lstEvent.AddItem ("PLC invalid")
    Case ADSSTATE_IDLE:     lstEvent.AddItem ("PLC idle")
    Case ADSSTATE_RESET:    lstEvent.AddItem ("PLC reset")
    Case ADSSTATE_INIT:     lstEvent.AddItem ("PLC init")
    Case ADSSTATE_START:    lstEvent.AddItem ("PLC start")
    Case ADSSTATE_RUN:      lstEvent.AddItem ("PLC run")
                    chkRunStop.Value = 1
    Case ADSSTATE_STOP:     lstEvent.AddItem ("PLC stop")
                    chkRunStop.Value = 0
    Case ADSSTATE_SAVECFG:      lstEvent.AddItem ("PLC savecfg")
    Case ADSSTATE_LOADCFG:      lstEvent.AddItem ("PLC loadcfg")
    Case ADSSTATE_POWERFAILURE: lstEvent.AddItem ("PLC powerfailure")
    Case ADSSTATE_POWERGOOD:    lstEvent.AddItem ("PLC powergood")
    Case ADSSTATE_ERROR:    lstEvent.AddItem ("PLC error")
    End Select
End Sub

'--- wird bei Änderung der Symboltabelle aufgerufen ---
Private Sub AdsOcx1_AdsServerSymChanged()
    lstEvent.AddItem ("PLC symbol changed")
End Sub

'--- wird beim Entfernen des TwinCAT-Routers aufgerufen ---
Private Sub AdsOcx1_AdsRouterRemove()
    lstEvent.AddItem ("TwinCAT-Router remove")
End Sub

'--- wird beim Stoppen des TwinCAT-Routers aufgerufen ---
Private Sub AdsOcx1_AdsRouterShutdown()
    lstEvent.AddItem ("TwinCAT-Router shutdown")
End Sub

'--- wird beim Starten des TwinCAT-Routers aufgerufen ---
Private Sub AdsOcx1_AdsRouterStart()
    lstEvent.AddItem ("TwinCAT-Router start")
End Sub

'--- wird vom Bediener aufgerufen ---
Private Sub chkRunStop_Click()
    Dim nState As ADSOCXLib.ADSSTATE
    Dim nRet As Integer
    nState = IIf(chkRunStop.Value = 0, ADSSTATE_STOP, ADSSTATE_RUN)
    Call AdsOcx1.AdsSyncWriteControlReq(nState, 0&, 0&, nRet)
End Sub

Sprache / IDE

Beispielprogramm auspacken

Visual Basic 6

ADS-OCX Sample05.exe