Das Protokoll FT1.2
Der Datenaustausch zwischen Power-Line-Modem und JControl-System findet über das standardisierte FT1.2-Protokoll statt (IEC EN60870-5-1). Dieses ist in der Klasse FT1_2
der JControl API bereits implementiert und kann von Anwendungsprogrammen direkt verwendet werden. Das FT1.2-Protokoll sorgt für eine sichere Datenkommunikation, indem automatisch Prüfsummen berechnet und verifiziert werden. Bei Übertragungsfehlern werden die Datenpakete bis zu 3 mal wiederholt.
Das Grundgerüst
Der folgende Quelltext kann als allgemeines Grundgerüst für Anwendungen mit Power-Line-Kommunikation herangezogen werden. Er zeigt, wie die FT1_2
-Klasse initialisiert und ein FT1_2EventListener
installiert wird. Der Listener ist erforderlich, um eingehende Power-Line-Datagramme auf Java-Ebene zu empfangen.
1 | import java.io.IOException; |
2 | |
3 | import jcontrol.comm.FT1_2; |
4 | import jcontrol.comm.FT1_2EventListener; |
5 | import jcontrol.comm.RS232Selector; |
6 | import jcontrol.io.Buzzer; |
7 | |
8 | /** |
9 | * <p>Basic code for power-line communication using the <code>class |
10 | * FT1_2</code>.</p> |
11 | * |
12 | * <p>(C) DOMOLOGIC Home Automation GmbH 2003</p> |
13 | */ |
14 | public class PowerLineExample_Base implements FT1_2EventListener { |
15 | |
16 | /** FT1.2 protocol */ |
17 | static FT1_2 ft12; |
18 | |
19 | /** System buzzer */ |
20 | Buzzer buzzer = new Buzzer(); |
21 | |
22 | /** |
23 | * Init FT1.2 protocol |
24 | */ |
25 | public PowerLineExample_Base() { |
26 | // switch RS232 to power-line modem |
27 | RS232Selector.selectPort(RS232Selector.INTERNAL); |
28 | |
29 | try { |
30 | // instantiate FT1_2 protocol |
31 | ft12 = new FT1_2(); |
32 | // set ourself as the FT1_2EventListener |
33 | ft12.setListener(this); |
34 | } catch (java.io.IOException e) { |
35 | // 2 second error beep |
36 | buzzer.on((short)300, (short)2000); |
37 | // read errorcode to reset error flag |
38 | ft12.errorCode(); |
39 | } |
40 | } |
41 | |
42 | |
43 | /** |
44 | * FT1.2 event listener. This method is called any time |
45 | * a power-line datagram drops in. |
46 | * |
47 | * @see jcontrol.comm.FT1_2EventListener#onIndication(byte[], int) |
48 | */ |
49 | public void onIndication(byte[] udat, int control) { |
50 | try { |
51 | switch(control){ |
52 | case FT1_2.CF_PRM_SEND_UDAT: |
53 | ft12.sendACK(udat); |
54 | break; |
55 | case FT1_2.CF_PRM_REQ_STATUS: |
56 | ft12.sendResponse(null); |
57 | break; |
58 | case FT1_2.CF_PRM_REQ_CLASS1: |
59 | byte[] buf=new byte[10]; |
60 | ft12.sendResponse(buf); |
61 | break; |
62 | } |
63 | } catch(IOException e){} |
64 | } |
65 | |
66 | |
67 | /** |
68 | * Main method. Program execution starts here. |
69 | */ |
70 | public static void main(String[] args) { |
71 | new PowerLineExample_Base(); |
72 | } |
73 | } |
Listing 1: PowerLineExample_Base.java
Zur Initialisierung der FT1.2-Kommunikation genügt die Instantiierung des Konstruktors. Um den RS232-Port des JControl/PLUI mit dem integrierten Power-Line-Modem zu verbinden, muss die Methode selectPort
der Klasse RS232Selector
mit dem Parameter RS232Selector.INTERNAL
aufgerufen werden. Die Methode onIndication()
wird von FT1_2
jedesmal aufgerufen, wenn Daten vom Power-Line-Modem (oder auch BCU, Bus Control Unit) empfangen wurden. Dabei kann es sich um eine der folgenden drei Kommunikationstypen handeln:
-
CF_PRM_SEND_UDAT
: Ein user datagram wurde empfangen. Dieses kann beliebige Daten enthalten, die von einer entfernten Applikation über Power-Line gesendet wurden. Der Empfang solcher UDATs ist der Normalfall und wird für den Austausch von Steuer- und Regelkommandos mit anderen Power-Line-Geräten verwendet. UDATs werden außerdem benutzt, um den Erfolg oder Misserfolg eines Kommunikationsversuchs zu quittieren.
-
CF_PRM_REQ_STATUS
: Dies ist ein FT1.2-Statusrequest. Er sollte durch einen Aufruf der Methode sendResponse(null)
beantwortet werden.
-
CF_PRM_REQ_CLASS1:
: Auch dies ist eine FT1.2-protokollspezifische Anfrage, die hier nicht näher erläutert werden soll. Die korrekte Antwort ist sendResponse(buf)
.