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.
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.

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
Trigger | Descrizione |
---|---|
16#00000100 | OID: Codifica OID in frame SNMP. |
16#10000000 | Lg: Log dati di esecuzione. |
16#40000000 | Er: Errori di esecuzione. |
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]