fabmatt Inserito: 1 marzo 2015 Segnala Inserito: 1 marzo 2015 Ciao, sto provando questa dll da qualche giorno, ho avuto dei problemi iniziali con la comunicazione, ho modificato la seguente riga "Result = Cli_ConnectTo(Client, "192.168.0.71" + Chr$(0), 0, 2)" con questa "Result = Cli_ConnectTo(Client, "192.168.0.71" + Chr$(0), 0, 0)" , ho modificato l'ultima cifra 2 con uno 0. Poi ho iniziato a leggere dei valori nel DB1, se si legge un byte il programma va bene mentre con le word, doppie word ho dei problemi. Spiego il problema. Se all'interno del DB1 inserisco il valore 0-255 sul pc leggo i stessi valori, se inerisco il valore 256 su plc sul pc leggo il valore 16. valore lato plc lato pc 0000 0001 0000 0000 basffer1 = 1 baffer2 = 0 risultato 10 esadecimale in decimale 16 Il valore giusto dovrebbe essere baffer1 = 01 baffer2 = 00 risultato 01 00 esadecimale in decimale 256. E' possibile leggere i dati a bit, byte, word e doppia word? Grazie.
drugo66 Inserita: 1 marzo 2015 Segnala Inserita: 1 marzo 2015 Ciao, non è un problema della libreria Snap7, ma è Siemens che inverte i byte, sia nelle word che nelle dword, quindi è normale che, superata la lunghezza del byte, ti ritrovi tutto invertito. Non so in basic, ma per il C e C++ Davide (l'autore) ha inserito delle funzioni per swappare i byte nella libreria stessa: altrimenti sarai costretto a scriverti un paio di funzioni in basic per fare altrettanto. Se cerchi nel forum, troverai alcune discussioni in merito.
fabmatt Inserita: 1 marzo 2015 Autore Segnala Inserita: 1 marzo 2015 Ciao, il problema che siemens inverte i byte lo so, ho utilizzato il protocollo Prodave di Siemens anni indietro sempre con VB6, il problema qua è che ogni byte dovrebbe essere composto da 2 cifre cioè 0000 0001 mi deve dare 0 1 i primi 4 bit sono 0000=0 gli altri 4 bit 0001=1 quindi 01 perchè poi quando vado a prendere il secondo byte mi perdo lo 0 del primo byte. 0000 0001 0000 0000 0 1 0 0 Il pc adesso mi legge un byte 1 (0000 0001) il secondo byte 0 (0000 0000) quindi in totale 10 esadecimale =16 decimale. Praticamente il pc dopo il valore 255 invece di darmi 256 mi ricomincia a contare da 16, fino a quando non ritorna il quinto bit del primo byte cioè 0001 0000. Dal valore 0000 0001 0001 0000 i valori sono corretti fino a quando non ritorna la combinazione 0001 0000 0000 0000 e così via.
drugo66 Inserita: 2 marzo 2015 Segnala Inserita: 2 marzo 2015 Scusami, ma mi sono perso (sarà anche l'ora e la giornata sulle spalle); non conosco bene il VB6, ma in C++ ti posso assicurare che non ho avuto nessun problema con l'uso della libreria Snap7; l'unico consiglio che mi viene in mente e che tu provi a postare il pezzo di codice incriminato, così che qualche buon anima che conosca il VB possa aiutarti ...
dan64100 Inserita: 3 marzo 2015 Segnala Inserita: 3 marzo 2015 Ciao, Innanzitutto che PLC stai usando ? I parametri di connessione (Rack e Slot) dipendono dal PLC e/o dalla configurazione hardware, se hai dovuto usare 0,0 stai sicuramente lavorando con un S71200/1500. Da quello che mi hai scritto anche in privato mi sorge il dubbio che tu non abbia scaricato la libreria completa ma forse solo l'update fix, purtroppo SourceForge consiglia il pacchetto più recente. Se è così scarica snap7-full-1.3.0.7z dalla cartella 1.3.0 di http://sourceforge.net/projects/snap7/files/ Troverai molti esempi e soprattutto il manuale nella cartella /doc Detto questo, per VB6 non c'è un wrapper ufficiale, ma solo un'interfaccia minimale che ho scritto con le funzioni più utilizzate. Il vantaggio è che le funzioni Visual Basic hanno lo stesso prototipo di quelle esportate C, per cui puoi fare riferimento alla sintassi che trovi sul manuale per capire quali parametri passare ed il loro significato. Per semplificarti la vita, ti consiglio di iniziare a lavorare con i bytes, nel senso di leggere un blocco di bytes in un array e poi andare ad estrarre da esso le variabili a partire dall'offset in cui si trovano. Quindi Start = Byte di partenza nell'area da leggere (esempio per leggere a partire da DB100.DBW4 Start = 4) WordLen = S7WLByte = 2 Amount = Quantità di bytes da leggere Se hai già lavorato con Prodave conosci il problema big-little endian, in ogni caso quì trovi qualche altra informazione: http://snap7.sourceforge.net/siemens_dataformat.html E poi se hai qualche conoscenza di Pascal/C/C# puoi vedere cosa fanno le classi helper di conversione che ho scritto per i wrappers completi. Fammi sapere
fabmatt Inserita: 3 marzo 2015 Autore Segnala Inserita: 3 marzo 2015 Ciao, sto utilizzando un PLC S71200, sono riuscito a leggere il BYTE della db1 anche con la funzione Cli_ReadArea, l'errore commesso era che inserivo il valore della variabile S7AreaDB come scritto nel manuale, non pensando che era in esadecimale, io lo scrivevo in decimale. Sono riuscito a leggere anche il primo BYTE degli ingressi digitali, poi facendo i dovuti calcoli l'ho diviso a bit. Adesso volevo fare delle prove per poter leggere le WORD dal DB1 e provare a settare le uscite digitali. L'inversione dei BYTE lo sapevo già, ho utilizzato prodave per 2 anni. Appena fatto queste due prove metto il sorgente nel forum, visto che in VB6 non sono riuscito a trova molto materiale.
dan64100 Inserita: 3 marzo 2015 Segnala Inserita: 3 marzo 2015 L'unico esempio VB6 l'ho postato su PlcForum per agevolare qualche affezionato Non credo che troverai molto altro in rete, finora nessuno mi ha chiesto (in circa 2000 fra email e messaggi su SF) esempi in VB6. Purtroppo è in via di estinzione.....
Mrk31 Inserita: 23 ottobre 2015 Segnala Inserita: 23 ottobre 2015 Ciao,potresti uppare di nuovo il wrapper per VB6 che avevi postato un po' di tempo fa? perchè non è più disponibile?
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