Read PLC variable declaration

Task

All the information about the variables is to be read from the PLC (symbol upload).

Description

The cmdReadSymbols_Click() event function is called by clicking the button on the form. The AdsReadSymbolInfo() method supplies the number of variables (symbols) and the length of the data in which the symbols are stored. The parameter bNext must be set to FALSE the first time the AdsEnumSymbols() method is called. This results in all the information about the first symbol being read. For every subsequent call, bNext is set to TRUE. In the FOR loop, AdsEnumSymbols() is called as many times as there are symbols in the PLC.

Visual Basic 6 program

Option Explicit

'--- wird beim Starten des Programms aufgerufen ---
Private Sub Form_Load()
    '--- Exception freigeben ---
    AdsOcx1.EnableErrorHandling = True
    '--- Anzeigeliste- und Felder löschen ---
    lstSymbols.Clear
    lblSymbols.Caption = "Symbols: "
End Sub

'--- wird durch den Bediener aufgerufen ---
Private Sub cmdReadSymbols_Click()
    Dim nSymbolsAvailable As Long
    Dim cbBufSizeNeeded As Long
    Dim strSymbolName As String
    Dim strComment As String
    Dim nSymbolType As Long
    Dim cbSymbolSize As Long
    Dim nIndexOffset As Long
    Dim nIndexGroup As Long
    Dim intIndex As Long
    
    '--- Anzeigeliste löschen ---
    lstSymbols.Clear

    Call AdsOcx1.AdsReadSymbolInfo(nSymbolsAvailable, cbBufSizeNeeded)
    lblSymbols.Caption = "Symbols: " & nSymbolsAvailable
    
    '--- erstes Symbol laden und anzeigen ---
    Call AdsOcx1.AdsEnumSymbols(strSymbolName, nSymbolType, cbSymbolSize, _
                strComment, nIndexGroup, nIndexOffset, False)
    lstSymbols.AddItem ("0" & vbTab & Format(strSymbolName, "!@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@") & vbTab & _
            GetSymbolType(nSymbolType) & vbTab & cbSymbolSize & vbTab & strComment & vbTab & _
            "0x" & Hex(nIndexGroup) & vbTab & "0x" & Hex(nIndexOffset))

    '--- die restlichen Symbole laden und anzeigen ---
    For intIndex = 1 To nSymbolsAvailable - 1
    Call AdsOcx1.AdsEnumSymbols(strSymbolName, nSymbolType, cbSymbolSize, _
                    strComment, nIndexGroup, nIndexOffset, True)
    lstSymbols.AddItem (intIndex & vbTab & Format(strSymbolName, "!@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@") & vbTab & _
                GetSymbolType(nSymbolType) & vbTab & cbSymbolSize & vbTab & strComment & vbTab & _
                "0x" & Hex(nIndexGroup) & vbTab & "0x" & Hex(nIndexOffset))
    Next intIndex
End Sub

Private Function GetSymbolType(VarType As ADSDATATYPEID) As String
    Select Case VarType
    Case ADST_BIT:     GetSymbolType = "BIT"
    Case ADST_INT8:    GetSymbolType = "INT8"
    Case ADST_INT16:   GetSymbolType = "INT16"
    Case ADST_INT32:   GetSymbolType = "INT32"
    Case ADST_INT64:   GetSymbolType = "INT64"
    Case ADST_UINT8:   GetSymbolType = "UINT8"
    Case ADST_UINT16:  GetSymbolType = "UINT16"
    Case ADST_UINT32:  GetSymbolType = "UINT32"
    Case ADST_UINT64:  GetSymbolType = "UINT64"
    Case ADST_REAL32:  GetSymbolType = "REAL32"
    Case ADST_REAL64:  GetSymbolType = "REAL64"
    Case ADST_REAL80:  GetSymbolType = "REAL80"
    Case ADST_BIGTYPE: GetSymbolType = "BIGTYPE"
    Case ADST_VOID:    GetSymbolType = "VOID"
    End Select
End Function

PLC program

PROGRAM MAIN
VAR
    REAL32_1 AT %MB0 : REAL;  (* 1 *)
    REAL32_2 AT %MB4 : REAL;  (* 2 *)
    REAL32_3 AT %MB8 : REAL;  (* 3 *)
    REAL32_4 AT %MB12: REAL;  (* 4 *)
    REAL32_5 AT %MB16: REAL;  (* 5 *)

    REAL64_1 AT %MB20 : LREAL;  (* 6 *)
    REAL64_2 AT %MB28 : LREAL;  (* 7 *)
    REAL64_3 AT %MB36 : LREAL;  (* 8 *)
    REAL64_4 AT %MB44 : LREAL;  (* 9 *)
    REAL64_5 AT %MB52 : LREAL;  (* 10 *)

    INT32_1 AT %MB60 : DINT;  (* 11 *)
    INT32_2 AT %MB64 : DINT;  (* 12 *)
    INT32_3 AT %MB68 : DINT;  (* 13 *)
    INT32_4 AT %MB72 : DINT;  (* 14 *)
    INT32_5 AT %MB76 : DINT;  (* 15 *)

    UINT32_1 AT %MB80 : UDINT;  (* 16 *)
    UINT32_2 AT %MB84 : UDINT;  (* 17 *)
    UINT32_3 AT %MB88 : UDINT;  (* 18 *)
    UINT32_4 AT %MB92 : UDINT;  (* 19 *)
    UINT32_5 AT %MB96 : UDINT;  (* 20 *)

    INT16_1 AT %MB100 : INT;  (* 21 *)
    INT16_2 AT %MB102 : INT;  (* 22 *)
    INT16_3 AT %MB104 : INT;  (* 23 *)
    INT16_4 AT %MB106 : INT;  (* 24 *)
    INT16_5 AT %MB108 : INT;  (* 25 *)

    UINT16_1 AT %MB110 : UINT;  (* 26 *)
    UINT16_2 AT %MB112 : UINT;  (* 27 *)
    UINT16_3 AT %MB114 : UINT;  (* 28 *)
    UINT16_4 AT %MB116 : UINT;  (* 29 *)
    UINT16_5 AT %MB118 : UINT;  (* 30 *)

    INT8_1 AT %MB120 : SINT;  (* 31 *)
    INT8_2 AT %MB121 : SINT;  (* 32 *)
    INT8_3 AT %MB122 : SINT;  (* 33 *)
    INT8_4 AT %MB123 : SINT;  (* 34 *)
    INT8_5 AT %MB124 : SINT;  (* 35 *)

    UINT8_1 AT %MB125 : USINT;  (* 36 *)
    UINT8_2 AT %MB126 : USINT;  (* 37 *)
    UINT8_3 AT %MB128 : USINT;  (* 38 *)
    UINT8_4 AT %MB129 : USINT;  (* 39 *)
    UINT8_5 AT %MB130 : USINT;  (* 40 *)

    BOOL_1 AT %MX131.0 : BOOL;  (* 41 *)
    BOOL_2 AT %MX131.1 : BOOL;  (* 42 *)
    BOOL_3 AT %MX131.2 : BOOL;  (* 43 *)
    BOOL_4 AT %MX131.3 : BOOL;  (* 44 *)
    BOOL_5 AT %MX131.4 : BOOL;  (* 45 *)

    ARRAY_1 : ARRAY[1 .. 10] OF SINT; (* 46 *)
    ARRAY_2 : ARRAY[1 .. 10] OF INT;  (* 47 *)
    ARRAY_3 : ARRAY[1 .. 10] OF DINT; (* 48 *)
    ARRAY_4 : ARRAY[1 .. 10] OF LREAL;(* 49 *)
    ARRAY_5 : ARRAY[1 .. 10] OF BOOL; (* 50 *)
END_VAR

Language / IDE

Unpack sample program

Visual Basic 6

ADS-OCX Sample04.exe