Italian Chi mi aiuta nel wrappare questo codice ?

coslad

Well-Known Member
Licensed User
Buonasera a tutti .

Lavoro nel campo dell'automazione , in questo ambiente esistono dei dispositivi (plc) della Siemens della serie S7 , esiste un libreria per la comunicazione con questo dispositivo , si chiama libnodave , la libreria e' comprensiva di soprgenti ed esempi per i vari compilatori (VB6,.net,Android) .
Piu' di qualche utente B4A ha gia' wrappato questa libreria ma al momento nessuno ha voluto condividerla.

Ho pensato di farlo da me , il problema ? non l'ho mai fatto e di Java non conosco quasi nulla .
In pratica ci sono 8 file java che costituiscono la libreria :

DataIsoTCP.java
PLCinterface.java
Nodave.java
PDU.java
Result.java
ResultSet.java
TCPConnection.java
S7Connection.java

quello che io ho fatto è di aggiungere nel file "nodave.java" questo codice :

B4X:
import anywheresoftware.b4a.BA;
import anywheresoftware.b4a.BA.ActivityObject;
import anywheresoftware.b4a.BA.DependsOn;
import anywheresoftware.b4a.BA.Permissions;
import anywheresoftware.b4a.BA.ShortName;
import anywheresoftware.b4a.BA.Version;
 
@Version(1)
@Permissions(values={"android.permission.INTERNET"})
@ShortName("Nodave")
e negli altri file , questo :

B4X:
import anywheresoftware.b4a.BA;
import anywheresoftware.b4a.BA.ActivityObject;
import anywheresoftware.b4a.BA.DependsOn;
import anywheresoftware.b4a.BA.Permissions;
import anywheresoftware.b4a.BA.ShortName;
import anywheresoftware.b4a.BA.Version;
 
@ShortName("Nodave")
ho dato in pasto il tutto al tool di Erel (simple library compiler )

viene eseguito il processo con un warning :

B4X:
No ShortName annotation found for class: S7Connection.Semaphore
come se nel file "S7Connection.java" dovessi mettere un altro @ShortName , ma non so dove .

Non so neanche se quello che ho scritto nei file java è corretto.

Potreste aiutarmi , ve ne sarei grato , sono disposto anche a pagare per imparare come fare .
Allego i file java , eventualmente esiste anche un progetto eclipse di esempio che ingloba tutti i file java della libreria .

Grazie a tutti
 

Attachments

LucaMs

Expert
Licensed User
Guarda, dato che esiste un progetto Java per Eclipse, ti conviene seguire l'esempio nel vecchio video di Erel per creare le librerie (anche se so che il tool che Erel ha preparato dovrebbe evitare proprio questo procedimento).

Ne so poco anch'io, ma è ovvio che dovrai aggiungere al progetto Java le librerie b4a.

 

coslad

Well-Known Member
Licensed User
Grazie Luca della risposta .

In effetti il tool serve proprio per non usare eclipse , ma in ogni caso il problema è lo stesso , nel senso che sia l'esempio allegato al tool che al video si riferiscono ad una libreria di un solo file java , mentre con piu' file java non e' specificato come ci si comporta , nel senso che : gli import vanno inseriti in ogni file ? e gli @ShortName , sono gli stessi per ogni file o cambiano ?

Grazie
 

Spinter

Active Member
Licensed User
da
@ShortName("Nodave")
a
@BA.ShortName("Nodave")

guarda ne sto scrivendo una ma come te faccio molta fatica non so se ti conviene perdere del tempo.se uno non ti aiuta è un casino!
 

coslad

Well-Known Member
Licensed User
Peccato però avere questo handicap, b4a è un grande compilatore ma è castrante non poter utilizzare a pieno tutto ciò che esiste già per Android a meno di non trovare qualche anima pia che si carichi del problema. Tornando alla libreria come già scritto sono disposto a ripagare chi vorrà sistemare per me la libreria, ovviamente spiegandomi come si fa, la conoscenza non ha prezzo .
 

coslad

Well-Known Member
Licensed User
Grazie Spinter stasera quando torno gli do un occhiata, ti faccio sapere
 

coslad

Well-Known Member
Licensed User
OK Spinter , ho visto le modifiche che hai apportato , ho messo del mio ed ho compilato , pare che tutto sia ok tranne che mi porta due warning che non capisco dove siano , il risultato della compilazione e' :

B4X:
[-docletpath, c:\SimpleLibraryCompiler]
[-bootclasspath, C:\Android\android-sdk\platforms\android-8\android.jar]
[-classpath, C:\Programmi\Anywhere Software\Basic4android\Basic4android.exe\../libraries\B4AShared.jar;C:\Programmi\Anywhere Software\Basic4android\Basic4android.exe\../libraries\Core.jar;]
[-sourcepath, src]
[-b4atarget, C:\Librerie\livnodave.xml]
[-b4aignore, org,com.android,com.example,com.hoho]
Ignoring: [org, com.android, com.example, com.hoho]
starting....
Working with class: nodave.DataIsoTCP
Working with class: nodave.Nodave
Working with class: nodave.PDU
Working with class: nodave.PLCinterface
Working with class: nodave.Result
Working with class: nodave.ResultSet
Working with class: nodave.S7Connection
Working with class: nodave.S7Connection.Semaphore
Working with class: nodave.TCPConnection
finish: C:\Librerie\livnodave.xml
2 warnings
inoltre non capisco perché hai usato @BA.ShortName e non @ShortName , Erel nell'esempio del tool ha usato @ShortName, ma se funziona chi se ne frega !!

Prima della settimana prossima non andrò in cantiere e non potro' provare la libreria , speriamo bene.

Al momento mille grazie ... vi terro' informati .
 

Spinter

Active Member
Licensed User
SBAGLIAVO IO SE NON IMPORTI ALLORA DEVI SCRIVERE BA.ECC SCUSA
import
anywheresoftware.b4a.BA.ShortName;
@ShortName("Nodave")

sto cercando l'errore ho già notato una cosa nelle referenze ci sono il core di BJ questa libreria la usavo per Bj ti posto quella giusta!
 

Spinter

Active Member
Licensed User
allora l'ho aggiustata un po' !
i 2 warnings non riesco a trovarli!

il problema No ShortName annotation found for class: S7Connection.Semaphore e alla riga 301 circa io ho provato a mettere
@ShortName("Semaphore") ma non penso sia giusto! il problema è che ci sono due classi,dovresti cercare un po!
 

Attachments

coslad

Well-Known Member
Licensed User
quello del S7Connection.Semaphore l' ho risolto, in pratica nello stesso file java ci sono due differenti classi, è bastato scrivere subito prima la dichiarazione della classe Semaphore la riga @ShortName("Semaphore") , in effetti non si capisce il motivo dei due warning, mi sa che qui ci vorrebbe Erel
 

coslad

Well-Known Member
Licensed User
Ciao a tutti ,
ho iniziato a fare delle prova ma appena compilato il primo test mi si genera questo errore in corrispondenza della riga :

B4X:
Public datatcp As DataIsoTCP
B4X:
Public datatcp As DataIsoTCP
javac 1.7.0_67
src\b4a\nodavetest\main.java:340: error: constructor DataIsoTCP in class DataIsoTCP cannot be applied to given types;
_datatcp = new nodave.DataIsoTCP();
           ^
  required: String
  found: no arguments
  reason: actual and formal argument lists differ in length
1 error
il costrutto della classe DataIsoTCP è :

B4X:
public class DataIsoTCP {
    public static boolean Connection = false;
    public static int i, j;
    public static long a, b, c;
    public static float d, e, f;
    public static char buf[];
    public static byte buf1[];
    public static PLCinterface di;
    public static TCPConnection dc;
    public static Socket sock;
    public static int slot;
    public static byte[] by;
    public static String IP;
 
    // IP 192.168.1.101
    DataIsoTCP(String host) {
        IP = host;
        // Nodave.Debug=Nodave.DEBUG_ALL;
        buf = new char[Nodave.OrderCodeSize];
        buf1 = new byte[Nodave.PartnerListSize];
        try {
            sock = new Socket(host, 102);
        } catch (IOException e) {
            System.out.println(e);
        }
    }
 
    public static void StartConnection() {
        Connection = false;
        OutputStream oStream = null;
        InputStream iStream = null;
        slot = 2;
 
        if (sock != null) {
            try {
                oStream = sock.getOutputStream();
            } catch (IOException e) {
            }
            try {
                iStream = sock.getInputStream();
            } catch (IOException e) {
            }
            di = new PLCinterface(oStream, iStream, "IF1", 0,
                    Nodave.PROTOCOL_ISOTCP);
 
            dc = new TCPConnection(di, 0, slot);
            int res = dc.connectPLC();
            if (0 == res) {
                Connection = true;
                System.out.println("Connection OK ");
            } else {
                System.out.println("No connection");
            }
        }
    }
 
    public static void StopConnection() {
        if (Connection == true) {
            Connection = false;
            dc.disconnectPLC();
            di.disconnectAdapter();
        }
    }
 
    // read 4 bytes from MD 100
    public static long ReadData() {
        dc.readBytes(Nodave.FLAGS, 0, 100, 4, null);
        a = dc.getU32();
        return (long) a;
    }
 
    // write 4 bytes to MD 100
    public static void WriteData(long a) {
        by = Nodave.bswap_32(a);
        dc.writeBytes(Nodave.FLAGS, 0, 100, 4, by);
    }
 
    public static void ConnectIsoTcp(String adres) {
 
        Nodave.Debug = Nodave.DEBUG_ALL
                ^ (Nodave.DEBUG_IFACE | Nodave.DEBUG_SPECIALCHARS);
 
        DataIsoTCP tp = new DataIsoTCP(adres);
        tp.StartConnection();
    }
 
}

siccome la cosa si stà complicando chiederò aiuto nella sezione specifica della creazione delle librerie così non rischio di andare off topic
 

coslad

Well-Known Member
Licensed User
Vi aggiorno sulla situazione , ho abbandonato l'idea di wrappare la libreria Nodave perchè troppo complicato per i miei livelli di conoscenza di java e sono passato alla libreria snap7 ( http://snap7.sourceforge.net/ ) che fa piu' o meno le stesse cose ma che e' scritta da un italiano (di bari) .
L'operazione di wrappatura e' stata facilissima e in un attimo sto provando le funzioni che pare vadano alla grande, noi italiani siamo piu' forti !!!
 

coslad

Well-Known Member
Licensed User
Si appena avrò un po' di tempo preparo un bel progetto di esempio..... Quello che manca spesso nelle librerie è proprio un esempio su come usarle. Inoltre il grande Davide, autore del codice sorgente ha creato una documentazione completa e molto esaustiva che allegherò .
 
Top