Vai al contenuto
PLC Forum


Snap7 E .net, Lettura Variabili Tipizzate


Messaggi consigliati

Ho aggiunto nel wrapper .net la classe S7 che permette di gestire le variabili tipizzate.

Il wrapper Snap7 per .net non fa uso di puntatori per evitare "unsafe code", tutte le letture e scritture vengono fatte utilizzando un array di byte.

Questo ne generalizza l'utilizzo ma rende fastidioso (soprattutto per chi è alle prime armi) la gestione delle variabili tipizzate (interi, word, real ecc..). Oltretutto il formato delle variabili del PLC è big-endian e quello del PC è little-endian, quindi bisogna ruotare i byte.

La nuova classe statica (quindi non dovete instanziarla) permette, assegnato un array di byte, di inserire ed estrarre le variabili in formato S7 a partire da tipi nativi .net:

  • BOOL (byte.bit) mappati su bool.
  • INT (interi a 16 bit) mappati su Int16
  • DINT (doppi interi a 32 bit) mappati su Int32
  • WORD (interi senza segno a 16 bit) mappati su UInt16
  • DWORD (doppia word a 32 bit) mappati su UInt32
  • REAL (reale a 32 bit) mappato su float.
  • DATE_AND_TIME (data/ora siemens) mappati su DateTime

Esempio 1 :

Se dobbiamo acquisire il reale a DB1.DBD6, dopo aver letto il nostro byte[] Buffer, chiamiamo MyFloat=S7.GetRealAt(Buffer, 6);

Analogamente, per scriverlo : S7.SetRealAt(Buffer, 6, MyFloat);

Esempio 2 :

In DB1 a partire da DBB 18 c'è il timestamp di produzione di un pezzo (la data e ora) che vogliamo leggere in DT. Usiamo (dopo aver creato DT) DT = S7.GetDateTimeAt(Buffer, 18);

Ho seguito la filosofia .net utilizzando una classe statica (tipo System.Convert) piuttosto che inserire i metodi nel client, in questo modo è possibile utilizzare le funzioni anche con il Server ed il Partner.

Fatemi sapere cosa ne pensate e se manca o è opportuno modificare qualcosa ;)

A seguire modificherò anche i wrapper C/C++ (usando le procedure di drugo66 :thumb_yello:) e Pascal.

Buon divertimento

Davide

p.s.

Ovviamente snap7.dll non va ricompilata mentre snap7.net.dll si

snap7.net.zip

Link al commento
Condividi su altri siti


Buongiorno Davide!

Ho provato la GetRealAt e va benissimo, in 2 righe di codice al posto delle 50 che avevo tentato io, ce la scrittura di un Single sul plc. Il concetto è chiaro: leggo una doppia word, la converto con la tua funzione e ottengo il valore float.

public Single ReadFloat(int DBNumber, int DDWNumber)
{
byte[] mybuffer = new byte[sizeof(int)];
DBRead(DBNumber, DDWNumber, sizeof(int), mybuffer);
return S7.GetRealAt(mybuffer, 0);
}

All'incontrario la stessa cosa, 2 righe di codice per sostituire le altre 100 che ti avevo fatto vedere >:o

public void WriteFloat(int DBNumber, int DDWNumber, Single value)
{
byte[] mybuffer = new byte[sizeof(int)];
S7.SetRealAt(mybuffer,0, value);
DBWrite(DBNumber, DDWNumber, sizeof(int), mybuffer);
}

Sei un VERO GURU !!!!

Ancora un grazie infinite !!!!!!!!!

Link al commento
Condividi su altri siti

Ho solo una consiglio, come alternativa, a quello che hai scritto.

Con le tue funzioni, se hai da trasferire un blocco contenente molte variabili tipo una ricetta o un record di risultati di produzione, devi effettuare una transazione per ogni variabile.

E' sicuramente un approccio più portabile ed è indipendente dalla posizione delle variabili in memoria, ma così facendo introduci l'overhead del job di trasmissione.

Se sei "scannato" con i tempi, puoi leggere tutta l'area che ti serve in un array (in questo caso però le variabili devono essere tutte contenute nell'area) e poi estrarle con S7.GetXXXAt() specificandone l'offset.

Considera, per una CPU con ethernet integrata, circa 5 ms ogni 200 bytes.

Sinceramente sono di "madrelingua" Pascal :smile: non è che .net mi faccia impazzire, ma mi adeguo ai tempi....

Saluti

Link al commento
Condividi su altri siti

Allora siamo sulla stessa onda! Io sono nato in C e poi, 30 anni fa, chiesta la cittadinanza Pascal (Delphi Borland) e da 3 mesi mi sono dovuto adeguare a .net per via delle compatibilità con il resto del mondo delle perisferiche :-(

Grazie del Consiglio. Scriverò alcuni override per blocchi grossi ma raramente uso i real.

salutoni

Link al commento
Condividi su altri siti

  • 2 weeks later...

Crea un account o accedi per commentare

Devi essere un utente per poter lasciare un commento

Crea un account

Registrati per un nuovo account nella nostra comunità. è facile!

Registra un nuovo account

Accedi

Hai già un account? Accedi qui.

Accedi ora
×
×
  • Crea nuovo/a...