SNMPManager, sends a SNMP message

List

Questa pagina fa parte del Manuale Programmazione IEC 61131-3. Vai all indice.

Il Simple Network Management Protocol (SNMP) è un protocollo di rete senza connessione che utilizzando connessioni UDP sulle porte 161 e 162, consente di semplificare la configurazione, gestione e supervisione (monitoring) di apparati collegati in una rete. Questo blocco funzione da eseguire in task Back, gestisce il protocollo SNMP agendo come Manager.

In Community occorre definire l’indirizzo della stringa di definizione della comunità accettata dall’Agent. Attivando Enable viene inviato all’Agent con indirizzo Address sulla porta Port il messaggio SNMP di tipo PDUType con OID definito. Eseguito l’invio e ricevuta la risposta dall’Agent viene attivata l’uscita Done. Per inviare un nuovo pacchetto occorre disabilitare e poi riabilitare il FB.

Se il messaggio è di lettura, al termine, nella variabile indicata sarà trasferito il valore della variabile acquisita dall’Agent. Se il messaggio è di scrittura, al termine il valore della variabile definita sarà stato trasferito nell’Agent.

Information Circle

Blocco funzione

CODESYS: Non disponibile

LogicLab: eLLabSNMPLib

Descrizione

Enable (BOOL) Comando invio richiesta SNMP.
SpyOn (BOOL) Se attivo permette di spiare il funzionamento del FB (Vedi articolo).
File (eFILEP) Terminale di I/O (Stream) ritornato dalla funzione di apertura risorsa.
Version (SNMP_VERSION) Versione pacchetto SNMP (Vedi Definizione). Attualmente è gestito solo SNMP versione 1.
Community (@STRING) Indirizzo allocazione stringa definizione Community.
Timeout (TIME) Timeout esecuzione query SNMP (S).
PDUType (SNMP_PDU) Tipo di query SNMP da inviare (Vedi definizione).
OID (@STRING) Indirizzo stringa definizione Object Identifier.
VType (SNMP_VT) Tipo variabile ricevuta/da inviare (Vedi definizione).
VAddress (PVOID) Indirizzo allocazione variabile ricevuta/da inviare.
VLength (UDINT) Lunghezza variabile ricevuta/da inviare.
Delay (TIME) Tempo pausa di ritardo invio richiesta SNMP.
Fault (BOOL) Attivo per un loop di programma se errore esecuzione.
ECode (SNMP_ERROR) Riporta l’eventuale codice di errore ricevuto (Vedi definizione).
EIndex (UDINT) Quando ECode è diverso da zero, contiene un indice che specifica quale oggetto ha generato l’errore.
Errors (UDINT) Numero di errori.
Packets (UDINT) Numero di pacchetti SNMP inviati.
Connect (BOOL) Comando di connessione al server, su attivazione occorre gestire la connessione.
Done (BOOL) Esecuzione comando terminata.
Ok (BOOL) Attiva per un loop di programma se comando eseguito correttamente.
ETime (TIME) Tempo esecuzione comando.

Immagine FB SNMPManager

Trigger di spy

Se SpyOn attivo è possibile utilizzare utilizzare la console di spionaggio per verificare il funzionamento della FB. Sono previsti vari livelli di triggers.

Livelli di trigger
TriggerDescrizione
16#00000100OID: Codifica OID in frame SNMP.
16#10000000Lg: Log dati di esecuzione.
16#40000000Er: Errori di esecuzione.

Esempi

Come utilizzare gli esempi.

ST_SNMPManager: Vengono eseguite due richieste SNMP verso un Agent su localhost (127.0.0.1), è possibile testarne il funzionamento eseguendolo su di un sistema dove è in esecuzione il programma dimostrativo del FB SNMPAgent. Viene eseguita ciclicamente una richiesta SNMP_PDU#GETRQ di un variabile SNMP_VT#INTEGER dall’agent ed il valore letto viene trasferito in Value. Value viene poi incrementato e tramite una richiesta SNMP_PDU#SETRQ inviato all’agent. In questo modo visualizzando il valore della variabile si vedrà il suo incremento nel tempo

ST_SNMPSTEDataRead: Vengono eseguite due richieste SNMP verso un dispositivo STE2 acquisendo il valore delle due sonde.

LogicLab (Ptp137, ST_SNMPManager)
PROGRAM ST_SNMPManager
VAR
    IDx : USINT; (* Query index *)
    Value : DINT; (* Variable value *)
    UDPClient : SysUDPClient; (* UDP client *)
    SNMPMng : SNMPManager; (* SNMP manager *)
END_VAR

// *****************************************************************************
// PROGRAM "ST_SNMPManager"
// *****************************************************************************
// A simple SNMP manager that makes SNMP queries.
// -----------------------------------------------------------------------------

    // -------------------------------------------------------------------------
    // INITIALIZATION
    // -------------------------------------------------------------------------
    // Program initialization.

    IF (SysFirstLoop) THEN

        // Set UDP client parameters.

        UDPClient.PeerAdd:=ADR('127.0.0.1'); //Peer address
        UDPClient.PeerPort:=161; //Peer port
        UDPClient.LocalAdd:=ADR('0.0.0.0'); //Local address
        UDPClient.LocalPort:=0; //Local port
        UDPClient.FlushTm:=50; //Flush time (mS)
        UDPClient.LifeTm:=30; //Life time (S)
        UDPClient.RxSize:=256; //Rx buffer size
        UDPClient.TxSize:=256; //Tx buffer size

        // Set SNMP manager parameters.

        SNMPMng.SpyOn:=TRUE; //Spy command
        SNMPMng.Version:=SNMP_VERSION#SNMPv1; //Community
        SNMPMng.Community:=ADR('public'); //Community
        SNMPMng.Delay:=T#2s; //Execution delay
        SNMPMng.Timeout:=T#5s; //Execution timeout (S)
    END_IF;

    // -------------------------------------------------------------------------
    // SNMP MANAGER
    // -------------------------------------------------------------------------
    // SNMP manager.

    UDPClient(Connect:=SNMPMng.Connect); //UDP server management
    SNMPMng(File:=UDPClient.File); //SNMP manager

    // -------------------------------------------------------------------------
    // SNMP MANAGER
    // -------------------------------------------------------------------------
    // Check if the answer from Agent has been received and manage it.

    CASE (IDx) OF

        // ---------------------------------------------------------------------
        // This query reads the variable value from the agent.

        0:
        SNMPMng.PDUType:=SNMP_PDU#GETRQ; //PDU type
        SNMPMng.VType:=SNMP_VT#INTEGER; //Variable type
        SNMPMng.VLength:=SIZEOF(Value); //Variable length
        SNMPMng.VAddress:=ADR(Value); //Variable address
        SNMPMng.OID:=ADR('1.3.6.1.4.1.36955.1'); //OID
        SNMPMng.Enable:=TRUE; //FB enable
        IF NOT(SNMPMng.Done) THEN RETURN; END_IF;
        SNMPMng.Enable:=FALSE; //FB enable
        
        Value:=Value+1; //Variable value
        IDx:=IDx+1; //Query index

        // ---------------------------------------------------------------------
        // This query writes the variable value to the agent.

        1:
        SNMPMng.PDUType:=SNMP_PDU#SETRQ; //PDU type
        SNMPMng.VType:=SNMP_VT#INTEGER; //Variable type
        SNMPMng.VLength:=SIZEOF(Value); //Variable length
        SNMPMng.VAddress:=ADR(Value); //Variable address
        SNMPMng.OID:=ADR('1.3.6.1.4.1.36955.1'); //OID
        SNMPMng.Enable:=TRUE; //FB enable
        IF NOT(SNMPMng.Done) THEN RETURN; END_IF;
        SNMPMng.Enable:=FALSE; //FB enable
        IDx:=0; //Query index
    END_CASE;

// [End of file]
LogicLab (Ptp137, ST_SNMPSTEDataRead)
PROGRAM ST_SNMPSTEDataRead
VAR
    IDx : USINT; (* Query index *)
    Value : DINT; (* Variable value *)
    OHumidity : REAL; (* Outside humidity (%) *)
    OTemperature : REAL; (* Outside temperature (°C) *)
    UDPClient : SysUDPClient; (* UDP client *)
    SNMPMng : SNMPManager; (* SNMP manager *)
END_VAR

// *****************************************************************************
// PROGRAM "ST_SNMPSTEDataRead"
// *****************************************************************************
// The program reads the sensor 1 values from a STE2 device. The value is readed
// as an integer and as a string.
// -----------------------------------------------------------------------------

    // -------------------------------------------------------------------------
    // INITIALIZATION
    // -------------------------------------------------------------------------
    // Program initialization.

    IF (SysFirstLoop) THEN

        // Set UDP client parameters.

        UDPClient.PeerAdd:=ADR('192.168.0.223'); //Peer address
        UDPClient.PeerPort:=161; //Peer port
        UDPClient.LocalAdd:=ADR('0.0.0.0'); //Local address
        UDPClient.LocalPort:=0; //Local port
        UDPClient.FlushTm:=50; //Flush time (mS)
        UDPClient.LifeTm:=30; //Life time (S)
        UDPClient.RxSize:=256; //Rx buffer size
        UDPClient.TxSize:=256; //Tx buffer size

        // Set SNMP manager parameters.

        SNMPMng.SpyOn:=TRUE; //Spy command
        SNMPMng.Version:=SNMP_VERSION#SNMPv1; //SNMP version
        SNMPMng.Community:=ADR('public'); //Community
        SNMPMng.Delay:=T#1s; //Execution delay
        SNMPMng.Timeout:=T#5s; //Execution timeout (S)
    END_IF;

    // -------------------------------------------------------------------------
    // SNMP MANAGER
    // -------------------------------------------------------------------------
    // SNMP manager.

    UDPClient(Connect:=SNMPMng.Connect); //UDP server management
    SNMPMng(File:=UDPClient.File); //SNMP manager

    // -------------------------------------------------------------------------
    // QUERY INDEX SELECTION
    // -------------------------------------------------------------------------
    // At every index one value is readed.

    CASE (IDx) OF

        // ---------------------------------------------------------------------
        // This query reads the integer value of sensor 1.

        0:
        SNMPMng.PDUType:=SNMP_PDU#GETRQ; //PDU type
        SNMPMng.VType:=SNMP_VT#INTEGER; //Variable type
        SNMPMng.VLength:=SIZEOF(Value); //Variable length
        SNMPMng.VAddress:=ADR(Value); //Variable address
        SNMPMng.OID:=ADR('1.3.6.1.4.1.21796.4.9.3.1.5.1'); //OID
        SNMPMng.Enable:=TRUE; //FB enable
        IF NOT(SNMPMng.Done) THEN RETURN; END_IF;
        IF (SNMPMng.Ok) THEN OHumidity:=TO_REAL(Value)/10.0; END_IF;
        SNMPMng.Enable:=FALSE; //FB enable
        IDx:=IDx+1; //Query index

        // ---------------------------------------------------------------------
        // This query reads the integer value of sensor 2.

        1:
        SNMPMng.PDUType:=SNMP_PDU#GETRQ; //PDU type
        SNMPMng.VType:=SNMP_VT#INTEGER; //Variable type
        SNMPMng.VLength:=SIZEOF(Value); //Variable length
        SNMPMng.VAddress:=ADR(Value); //Variable address
        SNMPMng.OID:=ADR('1.3.6.1.4.1.21796.4.9.3.1.5.2'); //OID
        SNMPMng.Enable:=TRUE; //FB enable
        IF NOT(SNMPMng.Done) THEN RETURN; END_IF;
        IF (SNMPMng.Ok) THEN OTemperature:=TO_REAL(Value)/10.0; END_IF;
        SNMPMng.Enable:=FALSE; //FB enable
        IDx:=0; //Query index
    END_CASE;

// [End of file]
Was this article helpful?