lad Inserito: 11 gennaio 2015 Segnala Share Inserito: 11 gennaio 2015 Buona sera a tutti Ho in mente un progetto, utilizzare la libreria moka7 su android. Per sviluppare su Andoid utilizzo B4A, un potentissimo ambiente di sviluppo che generara codice java. Non dovrebbe essere quindi troppo difficile wrappare la libreria moka in una libreria jar utilizzabile nell ambiente basic4android. Prima però di imbattermi in questo lavoro (hobby) , vi chiedo su qualcuno lo ha già fatto,sarebbe inutile inventare l' acqua calda, ed eventualmente essendo una capra in java, se posso contare sul vostro supporto. L idea sarebbe di mettere su un piccolo server con una scheda tipo banana pi dove è intallabile android, leggere i dati di un s7 e inviarli tramite protocollo mqtt ad altri dispositivi,cosi da creare piccoli scada portatili. Grazie Link al commento Condividi su altri siti More sharing options...
dan64100 Inserita: 12 gennaio 2015 Segnala Share Inserita: 12 gennaio 2015 Ciao, non conosco B4A ma da quello che leggo dal sito è assolutamente possibile utilizzare librerie Java. Google mi dice che ci sono addirittura dei tutorial su YouTube che spiegano come farlo. Il consiglio che ti posso dare è di dividere il lavoro in due parti: 1) Segui un tutorial con una classe di esempio semplice semplice (adatta alla tua conoscenza di Java) che comunque contenga un minimo di metodi per lo scambio dati. 2) Nel momento in cui sei padrone dell'interfacciamento, applichi le stesse tecniche a alle classi di Moka7. Moka7 "di suo" gira in Android senza problemi, esistono già alcune applicazioni (commerciali) che la usano e c'è anche un esempio minimale distribuito. Se riesci nel punto 1) non dovresti avere problemi. Se riesci a mettere su un piccolo demo con B4A magari mi contatti che lo inserisco nella prossima distribuzione, cosicchè qualcun altro può beneficiarne Ciao Davide Link al commento Condividi su altri siti More sharing options...
lad Inserita: 12 gennaio 2015 Autore Segnala Share Inserita: 12 gennaio 2015 Si ho visto il demo dell' applicazione android, ho visto i sorgenti java della del moka e mi sembra abbastanza abbordabile il wrappare la libreria. In questo forum ho letto che gia l utente Adriano71 aveva fatto lo stresso, creando una libreria per b4a di libnodave, solo che non l ha resa publica. Questo week end mi metto al lavoro. In pratica il creatore di b4x ha creato un tool che inserendo i file java opportunamente referenziati, viene creata la libreria jar pronta per essere usata,senza neanche aprire eclipse. Ti ringrazio della tua disponibilità, è un onore sapere che posso contare sul tuo supporto qualora ne abbia necessità. Ciao (ps ho visto che sei di Bari, io di Taranto) Link al commento Condividi su altri siti More sharing options...
lad Inserita: 14 gennaio 2015 Autore Segnala Share Inserita: 14 gennaio 2015 Vi aggiorno , la libreria moka7 e' scritta in maniera fantastica , è bastato un attimo per wrapparla e farla leggere al compilatore di Basic4Android , ho provato un paio di scambio dati ed il tutto va' alla grande. Una domanda , perché snap7 è aggiornata al 2015 e moka7 a giugno 2014 ? In moka7 manca qualcosa ? Grazie Link al commento Condividi su altri siti More sharing options...
dan64100 Inserita: 15 gennaio 2015 Segnala Share Inserita: 15 gennaio 2015 La maggior parte degli aggiornamenti di Snap7 sono stati di supporto verso nuove piattaforme e architetture e miglioramenti nelle funzionalità dei wrappers (i software di interfaccia verso i propri sorgenti). Non sono state implementate nuove funzioni a livello "core" dopo la 1.1.0. Moka7 la usi già direttamente come sorgente Java quindi non ha wrappers, e nasce già multipiattaforma "per definizione", gira in ogni JVM standard che offre supporto Ethernet. Una libreria binaria è più difficile da manutenere, se si vuole che sia un prodotto affidabile deve essere testata con tutte le nuove versioni dei S.O. e dei compilatori. Per Moka7 questa attività la fa direttamente Oracle . Nel momento in cui verranno aggiunte nuove funzioni a Snap7 verranno riportate in Moka7 Ciao Davide Link al commento Condividi su altri siti More sharing options...
lad Inserita: 17 gennaio 2015 Autore Segnala Share Inserita: 17 gennaio 2015 (modificato) Buonasera a tutti avrei alcuni dubbi ma soprattutto non capisco come calcolare il valore amount , mi spiego ; La funzione WriteArea prevede il parametro amount , il cui significato e' : "Amount of words to read" ma dando il comando : WriteArea(s7_constant.S7AreaDB,10,0,1,data) in cui data contiene un valore word caricato cosi' : valore=8795 s7_constant.SetShortAt(data,0,valore) Se amount rimane ad 1 viene scritto solo un byte , cioe' il DB10.DBB0 mentre per far scrivere ambedue i byte bisogna impostare il parametro a 2 cosi : WriteArea(s7_constant.S7AreaDB,10,0,2,data) ma perché ? Grazie Modificato: 17 gennaio 2015 da lad Link al commento Condividi su altri siti More sharing options...
lad Inserita: 17 gennaio 2015 Autore Segnala Share Inserita: 17 gennaio 2015 Nel frattempo ho condiviso sul forum di Basic4Android la libreria adattata : http://www.b4x.com/android/forum/threads/moka7-interfacing-natively-siemens-s7-plcs.49530/ dimmi dove inviare i file , mi sa che qui su plcforum non si possono allegare. PS : A grande sorpresa ho visto che Davide è Tarantino.....come Me !!!! Link al commento Condividi su altri siti More sharing options...
dan64100 Inserita: 19 gennaio 2015 Segnala Share Inserita: 19 gennaio 2015 Con Moka7 puoi leggere/scrivere Timers, Counters o un'area di memoria organizzata a byte. Con il parametro Amount = "quantità" specifichi il numero degli elementi che vai a leggere/scrivere. Se leggi timers o counters, la loro dimensione è prestabilita (2 byte per ogni item). Quando leggi una DB o un'altra area di memoria, Moka7 non sa com'è organizzata a prescindere se usi Get/SetWordAt ecc.. per formattarla, per cui in questo caso Amount specifica il numero di bytes complessivi. In altre parole, se ad esempio leggi/scrivi una struttura composta da un'intero(2), due reali(4x2=8) e un array di 10 bytes(10) Amount = 20. I files puoi inserirli nella sezione up/download mettendo una breve descrizione in italiano, poi io li prendo da lì e li inserisco come demo nella prox. release Ciao Link al commento Condividi su altri siti More sharing options...
lad Inserita: 20 gennaio 2015 Autore Segnala Share Inserita: 20 gennaio 2015 (modificato) Ok grazie ora è tutto chiaro. La libreria, compreso un semplice progetto di esempio, è stata caricata nell'area file manager , il link dovrebbe essere questo : L'unica cosa di cui sento la mancanza è che nelle funzioni della classe S7 non hai inserito la possibilità di gestire gli unsigned , mi spiego meglio , è vero che in java non ho i tipi di variabile word , ma se devo leggere una word che contiene un valore di per esempio 50.000 e uso la funzione GetWordtAt il valore di ritorno è sballato , in quanto appoggi il risultato in una int , al momento ho risolto con questo codice : word_richiesta = Bit.AND(0xffff, valore_letto) , dove però word_richiesta è un long. Magari nella prossima release potrai inserire un GetIntdAt e modificare il GetWordAt restituendo un long Grazie di tutto _ Modificato: 20 gennaio 2015 da lad Link al commento Condividi su altri siti More sharing options...
dan64100 Inserita: 21 gennaio 2015 Segnala Share Inserita: 21 gennaio 2015 C'è qualcosa che mi sfugge. La funzione S7.GetWordAt è definita così: //Returns a 16 bit unsigned value : from 0 to 65535 (2^16-1) public static int GetWordAt(byte[] Buffer, int Pos) Ritorna un valore senza segno compreso fra 0 e 65535 cioè 0..W16#FFFF in un intero a 32 bit. Se io in DB1.DBW8 ho W#16#DAC0 (che corrisponde a 56000) Questo int iValue = S7.GetWordAt(Buffer, 8); System.out.println("word :"+iValue); Mi visualizza correttamente 56000. Analogo discorso per DWord che sono a 32 bit e vengono restituite in un long a 64 bit. La parte alta viene comunque mascherata nelle funzioni per evitare la propagazione del segno. Nota le differenze fra lo short (16 bit con segno) e la word (16 bit senza segno): //Returns a 16 bit unsigned value : from 0 to 65535 (2^16-1) public static int GetWordAt(byte[] Buffer, int Pos) { int hi = (Buffer[Pos] & 0x00FF); // <--MASCHERA LA PARTE ALTA int lo = (Buffer[Pos+1] & 0x00FF); return (hi<<8)+lo; } // Returns a 16 bit signed value : from -32768 to 32767 public static int GetShortAt(byte[] Buffer, int Pos) { int hi = (Buffer[Pos]); // <--PROPAGA IL SEGNO int lo = (Buffer[Pos+1] & 0x00FF); return ((hi<<8)+lo); } Link al commento Condividi su altri siti More sharing options...
lad Inserita: 21 gennaio 2015 Autore Segnala Share Inserita: 21 gennaio 2015 Che dire , come sempre hai ragione ! Come uno stupido ho usato GetShort al posto di Getword e poi ero costretto a mascherare il bit di segno. 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