Ereignisgesteuertes Lesen

Aufgabe

In der SPS befinden sich 7 globale Variablen. Jede SPS-Variable ist von einem anderen Datentyp. Die Werte der Variablen sollen auf möglichst effektive Weise ausgelesen und der Wert mit Zeitstempel auf einer Form in Visual Basic dargestellt  werden.

Beschreibung

In dem Load-Ereignis der Form wird mit der Methode AdsReadVarConnectEx() eine Verbindung zu jeder SPS-Variablen hergestellt. Der Handle dieser Verbindung wird in einen globalen Array abgelegt.
Der zweite Parameter der Methode AdsReadVarConnectEx() gibt die Art des Datenaustausches an. Hier wurde ADSTRANS_SERVERONCHA gewählt. Dadurch wird der Wert der SPS-Variable nur dann übertragen, wenn dieser sich in der SPS geändert hat (siehe Datentyp ADSOCXTRANSMODE). Über den dritten Parameter wird angegeben das alle 100ms die SPS überprüft, ob sich die entsprechende Variable geändert hat.

Bei einer Änderung der SPS-Variablen wird das Ereignis AdsReadConnectUpdateEx() aufgerufen. Als Parameter wird der Zeitstempel, der Handle, der Wert und eine Referenz auf das Control, in dem der Wert angezeigt werden soll übergeben.
In dem Unload-Ereignis werden die Verbindungen mit der Methode AdsDisconnectEx() wieder aufgelöst. Dieses sollten Sie unbedingt beachten, da jede Verbindung, die mit AdsReadVarConnectEx() hergestellt wurde, Ressourcen verbraucht.
Setzen Sie außerdem die CycleTime auf angemessene Werte, da zu viele Schreib / Leseoperationen das System so stark auslasten kann, dass die Bedieneroberfläche stark verlangsamt wird.

Visual Basic 6 Programm

Option Explicit

Dim hConnect(0 to 6) As Long

Private Sub Form_Load()
    Dim nErr As Long
    
    nErr = AdsOcx1.AdsReadVarConnectEx(".PLCVarBoolean", ADSTRANS_SERVERONCHA, 100, hConnect(0), lblBoolean)
    If (nErr > 0) Then Call MsgBox("Error AdsReadVarConnectEx -> .PLCVarBoolean: " & nErr)

    nErr = AdsOcx1.AdsReadVarConnectEx(".PLCVarInteger", ADSTRANS_SERVERONCHA, 100, hConnect(1), lblInteger)
    If (nErr > 0) Then Call MsgBox("Error AdsReadVarConnectEx -> .PLCVarInteger: " & nErr)

    nErr = AdsOcx1.AdsReadVarConnectEx(".PLCVarLong", ADSTRANS_SERVERONCHA, 100, hConnect(2), lblLong)
    If (nErr > 0) Then Call MsgBox("Error AdsReadVarConnectEx -> .PLCVarLong: " & nErr)

    nErr = AdsOcx1.AdsReadVarConnectEx(".PLCVarDouble", ADSTRANS_SERVERONCHA, 100, hConnect(3), lblDouble)
    If (nErr > 0) Then Call MsgBox("Error AdsReadVarConnectEx -> .PLCVarDouble: " & nErr)
 
    nErr = AdsOcx1.AdsReadVarConnectEx(".PLCVarSingle", ADSTRANS_SERVERONCHA, 100, hConnect(4), lblSingle)
    If (nErr > 0) Then Call MsgBox("Error AdsReadVarConnectEx -> .PLCVarSingle: " & nErr)

    nErr = AdsOcx1.AdsReadVarConnectEx(".PLCVarString", ADSTRANS_SERVERONCHA, 100, hConnect(5), lblString)
    If (nErr > 0) Then Call MsgBox("Error AdsReadVarConnectEx -> .PLCVarString: " & nErr)
 
    nErr = AdsOcx1.AdsReadVarConnectEx(".PLCVarByte", ADSTRANS_SERVERONCHA, 100, hConnect(6), lblByte)
    If (nErr > 0) Then Call MsgBox("Error AdsReadVarConnectEx -> .PLCVarByte: " & nErr)
End Sub

Private Sub AdsOcx1_AdsReadConnectUpdateEx(ByVal dateTime As Date,
                       ByVal nMs As Long,
                       ByVal hConnect As Long,
                       ByVal data As Variant,
                       Optional ByVal hUser As Variant)
    hUser.Caption = ("Date Time: " & dateTime & "," & nMs & "  Data: " & data)
End Sub

Private Sub Form_Unload(Cancel As Integer)
    Dim nIndex As Long
    For nIndex = 0 To 6
    Call AdsOcx1.AdsDisconnectEx(hConnect(nIndex))
    Next
End Sub

SPS-Programm

VAR_GLOBAL
    PLCVarBoolean : BOOL;
    PLCVarInteger       : INT;
    PLCVarLong  : DINT;
    PLCVarDouble    : LREAL;
    PLCVarSingle    : REAL;
    PLCVarString    : STRING(10);
    PLCVarByte  : BYTE;
END_VAR

PROGRAM MAIN
VAR
    ;
END_VAR

Sprache / IDE

Beispielprogramm auspacken

Visual Basic 6

ADS-OCX Sample03.exe