Meldungen über den Router senden/empfangen

Aufgabe

ADS-Geräte können über den TwinCAT-Router Meldungen zu anderen ADS-Geräten schicken. Diese können dort empfangen und ausgewertet werden. Ebenso ist es möglich, Meldungen in den Windows NT/2000/XP Event Logger zu schreiben.
Das folgende Visual Basic-Programm empfängt Meldungen von der SPS und zeigt diese auf dem Bildschirm an. Ebenso kann von dem Visual Basic-Programm aus, Meldungen in den Windows NT/2000/XP Event Logger geschrieben werden.

Beschreibung

Um Meldungen empfangen zu können, muss als erstes mit der Methode AdsEnableLogNotification() ein Filter definiert werden. Hierbei wird der Bereich der Portnummern angegeben, von dessen ADS-Geräten Meldungen empfangen werden sollen. Als zweiten Parameter wird noch die Meldeart angegeben (Fehler, Hinweis oder Warnung). Mit dem OR-Operator können auch mehrere Meldearten kombiniert werden.
Jedesmal wenn eine Meldung von einem ADS-Gerät abgeschickt wurde und die Filterbedingungen erfüllt sind, wird das Ereignis AdsLogNotification() aufgerufen. Über die Parameter kann die Quelle, die Art, der Zeitpunkt und die Meldung an sich ermittelt werden.
Soll eine Meldung mit Hilfe des ADS-OCX abgeschickt werden, so wird hierzu die Methode AdsLogFmtString() benutzt. Der erste Parameter enthält den Meldetyp  (Fehler, Hinweis oder Warnung). Der Meldetext kann bis zu vier Platzhalter für numerische Werte enthalten. Dadurch können z. B. Werte übertragen werden, die erst zur Laufzeit des Programms bekannt sind. Alle Meldungen, die mit dem ADS-OCX abgeschickt werden, werden automatisch in den Event Logger von Windows NT/2000/XP geschrieben.

Von dem Visual Basic-Programm kann der Event Viewer von Windows NT/2000/XP aufgerufen werden. Hiermit lassen sich alle Meldungen betrachten, die im Event Logger enthalten sind. Event Logger und Event Viewer werden mit Windows NT/2000/XP standardmäßig ausgeliefert. Nähere Informationen entnehmen Sie bitte der Windows NT/2000/XP Dokumentation.

Das SPS-Programm setzt zyklisch alle 5 Sekunden ein Hinweis ab. Dieser Hinweis wird zusätzlich noch in den Windows NT/2000/XP Event Logger geschrieben. Die SPS-Funktion ADSLOGDINT() ist in der Dokumentation zur SPS beschrieben.

Hinweis: Alle Meldungen, die über den TwinCAT-Router abgeschickt werden,  können im System Manager online beobachtet werden. Hierzu muss im Menü Ansicht die Logger Ausgabe aktiv sein.

Windows NT/2000/XP beinhaltet API-Funktionen mit denen die gespeicherten Meldungen aus dem Event Logger wieder ausgelesen werden können. Visual Basic hat leider (noch) keine Komponenten, um auf die gespeicherten Meldungen im Event Logger zugreifen zu können. In der Zeitschrift basicopro 6/98 Seite 56ff aus dem Steingräberverlag (http://www.basicpro.de) ist ein Artikel veröffentlicht worden, der die Anwendung der API-Funktionen unter Visual Basic demonstriert.

Anwendung

Bei der Entwicklung und Fehlersuche von Applikationen hat sich diese Möglichkeit als sehr hilfreich erwiesen. So kann z. B. ein SPS-Programm oder ein Visual Basic-Programm bestimmte interne Programmzustände anzeigen (im System Manager) und speichern (Windows NT/2000 Event Logger). Für diese Art der Programmverfolgung ist es nicht notwendig die Entwicklungsumgebung (z. B. auf einem Maschinenrechner) zu installieren.

Achten Sie darauf, dass nicht zu viele Meldungen in kurzer Zeit übertragen werden, da dieses das Gesamtsystem sonst beeinträchtigen könnte. 

Tip: Wollen Sie in Ihrem Programm Meldungen protokollieren (z. B. Störungen einer Maschine), so sollten Sie dafür den TwinCAT-Event Logger benutzen. Dieser ist deutlich leistungsfähiger als der Event Logger von Windows NT/2000/XP und auf die Anforderungen der Automatisierungstechnik abgestimmt.

Visual Basic 6 Programm

Option Explicit

'--- wird beim Starten des Programms aufgerufen ---
Private Sub Form_Load()
    cboMessageType.ListIndex = 0
    AdsOcx1.EnableErrorHandling = True
    '--- Meldungen abfangen ---
    Call AdsOcx1.AdsEnableLogNotification(1, 65535, ADSLOG_MSGTYPE_HINT Or ADSLOG_MSGTYPE_ERROR Or ADSLOG_MSGTYPE_WARN)
End Sub

'--- wird beim eintreffen einer Nachricht vom AdsOCX aufgreufen ---
Private Sub AdsOcx1_AdsLogNotification(ByVal dateTime As Date, ByVal nMs As Long, _
                       ByVal dwMsgCtrl As Long, ByVal nServerPort As Long, _
                       ByVal szDeviceName As String, ByVal szLogMsg As String)
    '--- Meldung anzeigen ---
    lstMessages.AddItem Format(DateValue(dateTime), "!@@@@@@@@@@") & _
            Format(TimeValue(dateTime), "!@@@@@@@@@@@@@@@") & _
            Format(nMs, "000   ") & _
            Format(szDeviceName, "!@@@@@@@@@@") & _
            Format(nServerPort, "00000     ") & _
            szLogMsg
End Sub

'--- Meldung absetzen ---
Private Sub cmdSend_Click()
    Dim Para1 As Long
    Dim Para2 As Double
    Dim Para3 As Integer
    Dim Para4 As Integer
    '--- Parameter setzen ---
    Para1 = CLng(txt1Para.Text)
    Para2 = CDbl(txt2Para.Text)
    Para3 = CInt(txt3Para.Text)
    Para4 = CInt(txt4Para.Text)
    '--- Meldung absetzen ---
    Call AdsOcx1.AdsLogFmtString(cboMessageType.ItemData(cboMessageType.ListIndex), _
                 txtMessage.Text, Para1, Para2, Para3, Para4)
End Sub

'--- Ereignisanzeige von Windows NT/2000 anzeigen ---
Private Sub cmdEventViewer_Click()
    Call Shell("eventvwr.exe", vbNormalFocus)
End Sub

'--- List löschen ---
Private Sub cmdClearList_Click()
    Call lstMessages.Clear
End Sub

SPS Programm

PROGRAM MAIN
VAR
    PLCVarInteger AT %MW0  : INT;
    TP_1  : TP;
    TOGGEL  : BOOL;
    AdsLogResult  : DINT;
END_VAR

TOGGEL := NOT TOGGEL;
TP_1( IN := TOGGEL, PT := t#5s);
IF (TP_1.Q = 0) THEN
    IF (TOGGEL = 0) THEN
    PLCVarInteger := PLCVarInteger + 1;
    AdsLogResult := ADSLOGDINT(ADSLOG_MSGTYPE_HINT OR ADSLOG_MSGTYPE_LOG , 'Message from the PLC: %d', PLCVarInteger);
    END_IF
END_IF

Sprache / IDE

Beispielprogramm auspacken

Visual Basic 6

ADS-OCX Sample06.exe