Vai al contenuto
PLC Forum


Moka7 Per Android


Messaggi consigliati

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


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

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

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

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

Nel momento in cui verranno aggiunte nuove funzioni a Snap7 verranno riportate in Moka7 ;)

Ciao

Davide

Link al commento
Condividi su altri siti

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: da lad
Link al commento
Condividi su altri siti

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

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: da lad
Link al commento
Condividi su altri siti

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

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