dan64100 Inserito: 30 novembre 2014 Segnala Share Inserito: 30 novembre 2014 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 ) 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 More sharing options...
drugo66 Inserita: 1 dicembre 2014 Segnala Share Inserita: 1 dicembre 2014 Grande come sempre Link al commento Condividi su altri siti More sharing options...
Giuseppe Signorella Inserita: 1 dicembre 2014 Segnala Share Inserita: 1 dicembre 2014 Mi accodo hai complimenti di Drugo66 Link al commento Condividi su altri siti More sharing options...
willy.Ibanez Inserita: 2 dicembre 2014 Segnala Share Inserita: 2 dicembre 2014 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 > 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 More sharing options...
dan64100 Inserita: 2 dicembre 2014 Autore Segnala Share Inserita: 2 dicembre 2014 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 non è che .net mi faccia impazzire, ma mi adeguo ai tempi.... Saluti Link al commento Condividi su altri siti More sharing options...
willy.Ibanez Inserita: 2 dicembre 2014 Segnala Share Inserita: 2 dicembre 2014 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 More sharing options...
rossiroberto Inserita: 11 dicembre 2014 Segnala Share Inserita: 11 dicembre 2014 Ottimo Lavoro!! Grazie! Link al commento Condividi su altri siti More sharing options...
Messaggi consigliati
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 accountAccedi
Hai già un account? Accedi qui.
Accedi ora