TXT und Java

Alles rund um TX(T) und RoboPro, mit ft-Hard- und Software
Computing using original ft hard- and software
Forumsregeln
Bitte beachte die Forumsregeln!
Antworten
sjost
Beiträge: 82
Registriert: 16 Nov 2010, 17:42

TXT und Java

Beitrag von sjost » 29 Sep 2015, 18:30

Hallo zusammen,

Ich versuche, für den TXT eine Java Anwendung zu schreiben, die sich vom PC aus über USB mit dem TXT verbindet. Grundlage dafür ist die bekannte Dokumentation von ft:
http://www.fischertechnik.de/ResourceIm ... ?raid=8757

Leider komme ich an einem Punkt nicht weiter:
- Socket-Verbindung auf Port 65000 wird erfolgreich geöffnet
- Der Befehl 'ftIF2013CommandId_QueryStatus' wird auf den Socket geschrieben, samt abschließendem 'flush()'.
- Anschließend versucht das Programm, dem Socket irgendeine Antwort (ftIF2013Response_QueryStatus) vom TXT zu entlocken. Leider erfolglos, es kommt einfach nix zurück. Der TXT ist wie ein schwarzes Loch :cry:

Ich glaube zumindest, mich an die Doku gehalten zu haben. Da C- und Phyton-Anwendungen offensichtlich erfolgreich laufen, mache ich wohl etwas falsch.

Vielleicht kann mir einer von Euch auf die Sprünge helfen? Hat jemand schon mal eine Verbindung mit Java geschafft? Gibt es da vielleicht Besonderheiten zu beachten???

Ich freue mich über jeden Hinweis!
Gruß, Stefan

Wolfi
Beiträge: 33
Registriert: 22 Nov 2014, 15:19
Wohnort: Mosbach / Baden

Re: TXT und Java

Beitrag von Wolfi » 03 Okt 2015, 16:02

Hallo Stefan,

die Dokumentation ist in großen Teilen nur eine Einführung, wesentliche Datenstrukturen der IP-Telegramme müssen aus dem C++-Quellcode abgeleitet werden.

Zwar kein Java, aber da evtl. doch hilfreich hier meine ersten Gehversuche als MATLAB-Code für MATLAB_R2015B auf OSX 10.10.5 :

% establish TCP/IP communication to TXT
hdFtTXT = tcpclient('192.168.7.2',65000);

%QueryStatus
write (hdFtTXT, uint32(hex2dec('dc21219a')));
data = read (hdFtTXT,24);

sQueryStatus = sprintf('%x', data (4),data(3),data(2),data(1));
if not( strcmp(sQueryStatus, 'bac9723e'))
sQuery= 'Query not ok'
end
sName = char(data(5:20))
sVersion = sprintf('%x', data (24),data(23),data(22),data(21))


%start ONLINE mode

buffer = zeros(1,17,'uint32');
buffer(1)=(uint32(hex2dec('163ff61d')));

write (hdFtTXT, buffer);
data = read (hdFtTXT,4);

sQueryStatus = sprintf('%x', data (4),data(3),data(2),data(1));
if not( strcmp(sQueryStatus , 'ca689f75'))
sQuery= 'ONLINE MODE not ok'
end

pause(10)

%stop ONLINE mode

write (hdFtTXT, uint32(hex2dec('9be5082c')));
data = read (hdFtTXT,4);

sQueryStatus = sprintf('%x', data (4),data(3),data(2),data(1));
if strcmp(sQueryStatus , 'fbf60d2')
sQuery= 'ONLINE MODE stopped'
end


delete (hdFtTXT);
clear hdFtTXT;

Der Code funktioniert soweit, aber erst nachdem Sende- und Empfangslängen genau angegeben waren.
Beim Auswerten der Empfangsdaten muss gemäß "LittleEndian" dekodiert werden, für die Sendedaten passt es offenbar auch so.
Wichtig hier ist u.a. die Ergänzung des Telegramms "Start Online Mode" mit 16 zusätzlichen unit32-Datenwörten. Diesen Hinweis kann man nur aus dem C++-Code ableiten.

Beste Grüße
Christian

Antworten