1. Ziel: Wie kann ich mehrere Daten blockweise mittels des CP 343-1 IT & 443-1 IT aus einer Steuerung auslesen und schreiben? 2. Randbedingungen für diese Applikation: Die mit dem IT CP 443-1 IT oder 343-1 IT mitgelieferten Beans wurden bereits in die Entwicklungsumgebung IBM VisualAge 3 importiert und stehen dem Benutzer zur Verfügung. Zu diesem Vorgehen existiert ebenfalls eine detaillierte Anleitung. Als Resultat dieses Imports sollte der Composition Editor von VisualAge sollte in etwa wie folgt aussehen: Bild 1: Composition Editor mit importierten Siemens Beans
3. Erstellen eines Datenbausteins in STEP7 Am Beispiel eines Byte-Array soll gezeigt werden, wie ein ganzer Block an Daten aus der S7-Station geladen, dargestellt, verändert und zurückgeschrieben wird. Erstellen Sie sich zunächst einen Datenbaustein DB4 mit dem SIMATIC Manager, der wie folgt in erstellt wurde und anschließend in die S7-Station übertragen wurde. Bild 2: Erstellter Datenbaustein in STEP7 (DB4) Wie Sie sehen, hat der Datenbaustein eine eigene Struktur mit verschiedenen S7Datentypen und besteht nicht aus einem reinen Byte-Array. Das Wissen über den Aufbau des Datenbausteins ist für die Darstellung und das (sinnvolle) Ändern der Daten wichtig! In der folgenden Abbildung sehen Sie den DB4 in Form des Byte-Arrays, wie es im JavaCode benutzt und verarbeitet wird: Bild 3: Erstellter Datenbaustein im Byte Array
4. Erstellen eines Applets in VisualAge Legen Sie in gewohnter Weise mit VisualAge ein neues Applet an und nennen es BlockReadWrite. Gestalten Sie dabei in etwa folgendes Aussehen Ihrer Darstellung: Bild 4: Anordnung des Applets Verwenden Sie zur Erstellung folgende Beans: 1. S7Cp 2. S7Device 3. S7Variable Diese Beans erhalten Sie aus der Beansammlung Ihres IT CP Wechseln Sie nun zu den AWT Beans und verwenden: 1. 5 Stück TextField (TextField1 TextField5) 2. 5 Stück Label (Label1 Label5) 3. 2 Stück Button (Button1 Button2) und beschriften diese nach obigem Bild. Bild 5: Verwenden von AWT Beans
Parametrieren Sie nun Ihren IT-CP und Ihr Device-Bean mit den entsprechenden Werten für Ihre Anlage. Z.B. S7CP Host: 192.168.147.10 und S7Device Rack 0 & Slot 2 Stellen Sie für den ANY-Zeiger (Adresse in S7Variable) folgende Parameter ein: 1. Unter Wiederholfaktor geben Sie an, wieviel Bytes (wir haben als Datentyp BYTE eingstellt) Sie auslesen möchten. In unserem Fall sind dies 32 Bytes, was der kompletten Länge des Datenbausteins entspricht. 2. Unter Teilbereich steht die Datenbaustein Nummer 3. Unter Byteadresse steht hier Null, da wir vom nullten Byte an auf dendb4 zugreifen möchten. Bild 6: Parametrierung des ANY-Zeigers Sichern Sie das Applet, indem Sie im Menü Bean den Befehl Bean sichern ausführen. Dadurch wird sichergestellt, dass die im weiteren Verlauf des Beispiels benötigten Methoden von VisualAge erzeugt werden und später bei Bedarf zur Verfügung stehen. Anmerkung: Anstatt einen kompletten DB zu übertragen, könnten Sie auch nur einen Ausschnitt bearbeiten, indem Sie beispielsweise von Byteadresse 4 an auf die folgenden 8 Bytes zugreifen (Wiederholfaktor wäre dann 8; die Byteadresse wäre dann 4). 5. Verknüpfungen erstellen Legen Sie zunächst die Verbindungen zwischen S7CP, S7Device und S7Variable an: Verbindung 1: Von S7CP (PropertyChange) nach S7Device (PropertyChange) Verbindung 2: Von S7Device (PropertyChange) nach S7Variable (PropertyChange) Weiterhin müssen noch folgende Verknüpfungen hergestellt werden: 1. Verbinden Sie das Ereignis actionperformed des Read -Buttons mit der Methode processget() der S7Variable. 2. Verbinden Sie das Ereignis actionperformed des Write -Buttons über Ereignis zu Code mit der Arbeitsfläche (einzufügender Code siehe unten). 3. Verbinden Sie das Ereignis propertychange der S7Variable über Ereignis zu Code mit der Arbeitsfläche (einzufügender Code siehe unten). Der folgende gesamte Quelltext kann für eine einfachere Reproduktion in eine Textdatei z.b. Source_4_Code.txt kopiert werden. Sie können dann einfach Teile aus der geöffneten Datei kopieren und in Ihr Applet als Source Code per Copy & Paste, wie im Video gezeigt, einfügen.
zu 2.: Fügen Sie folgenden Code in die Methode ein: (Beachten Sie bitte, dass Ihre TextFields evtl. andere Bezeichnungen haben! Passen Sie den Code bitte entsprechend an.) ------------------------------------------------------------------ String text; int itmp; long ltmp; int[] myarray = new int[32]; //length of DB4 // Word1 itmp = Integer.valueOf(getTextField1().getText()).intValue(); myarray[0] = (itmp & 0xFF00) >>> 8; myarray[1] = itmp & 0x00FF; // Word2 itmp = Integer.valueOf(getTextField2().getText()).intValue(); myarray[2] = (itmp & 0xFF00) >>> 8; myarray[3] = itmp & 0x00FF; // DWord1 ltmp = Long.valueOf(getTextField3().getText()).longValue(); myarray[4] = (int)((ltmp & 0xFF000000) >>> 24); myarray[5] = (int)((ltmp & 0x00FF0000) >>> 16); myarray[6] = (int)((ltmp & 0x0000FF00) >>> 8); myarray[7] = (int)(ltmp & 0x000000FF); // Time of day ltmp = Long.valueOf(getTextField4().getText()).longValue(); myarray[8] = (int)((ltmp & 0xFF000000) >>> 24); myarray[9] = (int)((ltmp & 0x00FF0000) >>> 16); myarray[10] = (int)((ltmp & 0x0000FF00) >>> 8); myarray[11] = (int)(ltmp & 0x000000FF); // Text text = gettextfield5().gettext(); myarray[12] = 18; // max length of this S7 String if (text.length() > myarray[12]) { // String to large myarray[13] = myarray[12]; // cut string } else { myarray[13] = text.length(); //current used length } for (int i=0;i<myarray[13];i++) { myarray[14+i] = text.charat(i); } gets7variable1().setvalue(myarray); zu 3.: Fügen Sie folgenden Code in die Methode ein:(beachten Sie bitte, dass Ihre TextFields evtl. andere Bezeichnungen haben! Passen Sie den Code bitte entsprechend an.) ------------------------------------------------------------------ int[] myarray = (int[]) evt.getnewvalue(); int word1, word2; long dword1, tod; char[] text = new char[myarray[13]]; //used length of the S7-String word1 = (myarray[0]<<8) + (myarray[1]); word2 = (myarray[2]<<8) + (myarray[3]); dword1 = (myarray[4]<<24) + (myarray[5]<<16) + (myarray[6]<<8) + (myarray[7]); tod = (myarray[8]<<24) + (myarray[9]<<16) + (myarray[10]<<8) + (myarray[11]); for (int i=0; i<myarray[13]; i++) { text[i] = (char)myarray[14+i]; } gettextfield1().settext( +word1); gettextfield2().settext( +word2); gettextfield3().settext( +dword1); gettextfield4().settext( +tod); gettextfield5().settext( +text); ------------------------------------------------------------------
Sie sollten zum Schluss etwa folgendes Ergebnis in Ihrem Composition Editor sehen: Bild 7: Vollständiges Applet in VisualAge 6. Testen der Applikation Wenn Sie Ihr Applet nun testen, beachten Sie bitte, dass Sie in jedem Textfeld einen gültigen Wert eingegeben haben müssen, bevor Sie den Write -Button betätigen. Das Schreiben von Daten bewirkt übrigens implizit, dass die Daten anschließend wieder ausgelesen und angezeigt werden. Versuchen Sie einmal im Feld Text eine Zeichenkette länger als 18 Zeichen einzugeben. Die Zeichen werden, nachdem Sie den Button betätigt haben, abgeschnitten und der verkürzte String wird angezeigt. Zusatzinformationen: Der beigefügte Videofilm 05_Array.avi zeigt Ihnen den oben beschriebenen Vorgang nochmals zum besseren Verständnis Weiterhin steht Ihnen ein importierbares Repository Array.dat als lauffähiges Beispiel zur Verfügung.