Applikation zur Kommunikation Konvertierung von S7-Variablentypen in JavaProgrammen Applikation Gewährleistung, Haftung und Support S7-Konvertierung Copyright © Siemens AG 2006 All rights reserved 22698628_S7Types_DOKU_V11_d.doc Hinweis Beitrags-ID: 22698628 Die Applikationsbeispiele sind unverbindlich und erheben keinen Anspruch auf Vollständigkeit hinsichtlich Konfiguration und Ausstattung sowie jeglicher Eventualitäten. Die Applikationsbeispiele stellen keine kundenspezifische Lösungen dar, sondern sollen lediglich Hilfestellung bieten bei typischen Aufgabenstellungen. Sie sind für den sachgemäßen Betrieb der beschriebenen Produkte selbst verantwortlich. Diese Applikationsbeispiele entheben Sie nicht der Verpflichtung zu sicherem Umgang bei Anwendung, Installation, Betrieb und Wartung. Durch Nutzung dieser Applikationsbeispiele erkennen Sie an, dass Siemens über die beschriebene Haftungsregelung hinaus nicht für etwaige Schäden haftbar gemacht werden kann. Wir behalten uns das Recht vor, Änderungen an diesen Applikationsbeispielen jederzeit ohne Ankündigung durchzuführen. Bei Abweichungen zwischen den Vorschlägen in diesen Applikationsbeispiel und anderen Siemens Publikationen, wie z.B. Katalogen, hat der Inhalt der anderen Dokumentation Vorrang. Gewährleistung, Haftung und Support Für die in diesem Dokument enthaltenen Informationen übernehmen wir keine Gewähr. Unsere Haftung, gleich aus welchem Rechtsgrund, für durch die Verwendung der in diesem Applikationsbeispiel beschriebenen Beispiele, Hinweise, Programme, Projektierungs- und Leistungsdaten usw. verursachte Schäden ist ausgeschlossen, soweit nicht z.B. nach dem Produkthaftungsgesetz in Fällen des Vorsatzes, der grober Fahrlässigkeit, wegen der Verletzung des Lebens, des Körpers oder der Gesundheit, wegen einer Übernahme der Garantie für die Beschaffenheit einer Sache, wegen des arglistigen Verschweigens eines Mangels oder wegen Verletzung wesentlicher Vertragspflichten zwingend gehaftet wird. Der Schadensersatz wegen Verletzung wesentlicher Vertragspflichten ist jedoch auf den vertragstypischen, vorhersehbaren Schaden begrenzt, soweit nicht Vorsatz oder grobe Fahrlässigkeit vorliegt oder wegen der Verletzung des Lebens, des Körpers oder der Gesundheit zwingend gehaftet wird. Eine Änderung der Beweislast zu Ihrem Nachteil ist hiermit nicht verbunden. Copyright© 2006 Siemens A&D. Weitergabe oder Vervielfältigung dieser Applikationsbeispiele oder Auszüge daraus sind nicht gestattet, soweit nicht ausdrücklich von Siemens A&D zugestanden. Bei Fragen zu diesem Beitrag wenden Sie sich bitte über folgende E-MailAdresse an uns: mailto:[email protected] Version - 1.1 Ausgabe 01.03.2006 2/44 Vorwort S7-Konvertierung Beitrags-ID: 22698628 Vorwort Ziel der Applikation In diesem Dokument wird Ihnen gezeigt, wie Sie S7-Datentypen in die entsprechenden Java-Typen konvertieren müssen, um Programme mit der S7-Beans Bibliothek des IT-CPs zu erstellen. Abgrenzung Diese Applikation enthält keine • Grundlagen zur Funktionalität der IT- Kommunikationsprozessoren • Grundlagenvermittlung zur Programmiersprache Java Grundlegende Kenntnisse über diese Themen werden voraus gesetzt. Nähere Informationen finden Sie in den entsprechenden Manuals. Auf den Service/Support Seiten von A&D sind unter Applikation&Tools einige detaillierte Applikationen mit Code rund um die Funktionalitäten des IT-CPs entstanden. Dort sind die Prinzipien und Mechanismen ausführlich behandelt. Copyright © Siemens AG 2006 All rights reserved 22698628_S7Types_DOKU_V11_d.doc Hinweis Aufbau des Dokuments Die Dokumentation der vorliegenden Applikation ist in folgende Hauptteile gegliedert. Teil Beschreibung Applikationsbeschreibung Hier erfahren Sie alles, um sich einen Überblick zu verschaffen. Sie lernen die verwendeten Komponentenkennen. Funktionsprinzipien, und Programmstrukturen Hier wird auf die detaillierten Funktionsabläufe der beteiligten Hard- und Softwarekomponenten, die Lösungsstrukturen und wo sinnvoll auf die konkrete Implementierung dieser Applikation eingegangen. Anhang Hier finden Sie weiter führende Informationen, wie z. B. Literaturangaben, Glossare etc.. Referenz zum Automation and Drives Service & Support Dieser Beitrag stammt aus dem Internet Applikationsportal des Automation and Drives Service & Support. Durch den folgenden Link gelangen Sie direkt zur Downloadseite dieses Dokuments. http://support.automation.siemens.com/WW/view/de/22698628 Version - 1.1 Ausgabe 01.03.2006 3/44 Vorwort S7-Konvertierung Beitrags-ID: 22698628 Inhaltsverzeichnis Inhaltsverzeichnis......................................................................................................... 4 Applikationsbeschreibung........................................................................................... 6 1 Automatisierungsaufgabe ............................................................................. 6 2 Automatisierungslösung ............................................................................... 8 Copyright © Siemens AG 2006 All rights reserved 22698628_S7Types_DOKU_V11_d.doc Funktionsprinzipien und Programmstrukturen ......................................................... 9 3 Grundlegendes zum Gebrauch der S7-Beans ............................................. 9 4 Ein kurzes Java-Beispielprogramm ............................................................ 12 5 5.1 5.1.1 5.1.2 5.1.3 5.1.4 5.1.5 5.1.6 5.2 5.3 5.3.1 5.3.2 5.3.3 5.3.4 5.3.5 5.3.6 5.3.7 5.3.8 5.3.9 5.3.10 5.3.11 5.3.12 5.3.13 5.3.14 5.3.15 5.3.16 5.4 Konvertierungsroutinen S7 Variablen <-> Java Variablen........................ 15 Der S7 Anypointer .......................................................................................... 15 Beschreibung: dataType................................................................................. 16 Beschreibung: repFactor ................................................................................ 17 Beschreibung: memArea ................................................................................ 17 Beschreibung:subArea ................................................................................... 18 Beschreibung: byteAddress............................................................................ 18 Beschreibung: bitAdress................................................................................. 18 Gegenüberstellung von S7-Typen und Java-Typen ....................................... 18 Anzeigen von S7 Variablen mit einem Wiederholfaktor 1............................... 19 Anzeigen einer BOOL-Variablen .................................................................... 19 Anzeigen einer BYTE-Variablen ..................................................................... 19 Anzeigen einer CHAR-Variablen .................................................................... 19 Anzeigen einer WORD-Variablen ................................................................... 20 Anzeigen einer INT-Variablen......................................................................... 20 Anzeigen einer DWORD-Variablen ................................................................ 20 Anzeigen einer DINT-Variablen ...................................................................... 20 Anzeigen einer REAL-Variablen ..................................................................... 21 Anzeigen einer DATE-Variablen..................................................................... 21 Anzeigen einer TIME_OF_DAY-Variablen ..................................................... 23 Anzeigen einer TIME-Variablen...................................................................... 25 Anzeigen einer S5TIME-Variablen ................................................................. 26 Anzeigen einer DATE_AND_TIME-Variablen................................................. 27 Anzeigen einer STRING-Variablen................................................................. 29 Anzeigen eines COUNTER ............................................................................ 29 Anzeigen eines TIMER ................................................................................... 29 Anzeigen von S7 Variablen mit einem Wiederholfaktor größer 1 vom dataType 2 (BYTE) .................................................................................................... 31 Anzeigen einer BOOL-Variablen .................................................................... 32 Anzeigen einer BYTE-Variablen ..................................................................... 32 Anzeigen einer CHAR-Variablen .................................................................... 32 5.4.1 5.4.2 5.4.3 Version - 1.1 Ausgabe 01.03.2006 4/44 Vorwort S7-Konvertierung 5.4.4 5.4.5 5.4.6 5.4.7 5.4.8 5.4.9 5.4.10 5.4.11 5.4.12 5.4.13 5.4.14 Beitrags-ID: 22698628 Anzeigen einer WORD-Variablen ................................................................... 33 Anzeigen einer INT-Variablen......................................................................... 33 Anzeigen einer DWORD-Variablen ................................................................ 33 Anzeigen einer DINT-Variablen ...................................................................... 34 Anzeigen einer REAL-Variablen ..................................................................... 34 Anzeigen einer DATE-Variablen..................................................................... 34 Anzeigen einer TIME_OF_DAY-Variablen ..................................................... 36 Anzeigen einer TIME-Variablen...................................................................... 38 Anzeigen einer S5TIME-Variablen ................................................................. 39 Anzeigen einer DATE_AND_TIME-Variablen................................................. 41 Anzeigen einer STRING-Variablen................................................................. 43 Copyright © Siemens AG 2006 All rights reserved 22698628_S7Types_DOKU_V11_d.doc Anhang und Literaturhinweise .................................................................................. 44 6 6.1 6.2 Literaturhinweise .......................................................................................... 44 Literaturangaben............................................................................................. 44 Internet-Link-Angaben .................................................................................... 44 Version - 1.1 Ausgabe 01.03.2006 5/44 Applikationsbeschreibung Automatisierungsaufgabe S7-Konvertierung Beitrags-ID: 22698628 Applikationsbeschreibung Inhalt Hier verschaffen Sie sich einen Überblick über die Applikation zur Konvertierung von S7- Variablentypen in Java. Sie lernen die Aufgabenstellung kennen und nach welchen Vorschriften die Umwandlung erfolgt. 1 Automatisierungsaufgabe Beschreibung der Automatisierungsaufgabe Copyright © Siemens AG 2006 All rights reserved 22698628_S7Types_DOKU_V11_d.doc Die SIMATIC IT-CPs bieten dem Anwender die Möglichkeit über die S7API-Beans aus einer Java-Applikation oder einem Java-Applet direkt auf die Daten einer S7-CPU zuzugreifen. Dies kann plattformunabhängig aus einem Web-Browser heraus über ein Internet/ Intranet erfolgen. Die Rohdaten, die aus der S7-CPU in der Java-Applikation ankommen, müssen in der Regel in die entsprechenden Java-Typen konvertiert werden, um weiter verarbeitet zu werden (z.B. für eine Anzeige). Der Anwender muss die entsprechenden S7-Typen im Java-Code konvertieren. Dazu ist ein detailliertes Wissen um den Aufbau der S7-Typen notwendig. Hinweis Version - 1.1 Zugrunde liegende S7-API-Beans Version: V2.5.3 Ausgabe 01.03.2006 6/44 Applikationsbeschreibung Automatisierungsaufgabe S7-Konvertierung Beitrags-ID: 22698628 Überblick über die Automatisierungsaufgabe Folgendes Bild zeigt ihnen die Struktur der Aufgabe. Abbildung 1-1 Java Anwendung Darstellung Java-Typen Java-Typ Konvertierung Konvertierung S7 Format Empfang Copyright © Siemens AG 2006 All rights reserved 22698628_S7Types_DOKU_V11_d.doc Rohdaten S7Anypointer S7Merker- Bereich Speicherbereiche E/A- Bereich mit S7-Variablen DB- Bereich (BOOL, INT, DINT, WORD, DWORD, S7TIME, S7DATE, DB10.DBB8 etc.) CPU Version - 1.1 Ausgabe 01.03.2006 CP 7/44 Applikationsbeschreibung Automatisierungslösung S7-Konvertierung 2 Beitrags-ID: 22698628 Automatisierungslösung Übersicht In den folgenden Kapiteln dieses Dokuments erläutern wir Ihnen die JavaKonvertierungsvorschriften für alle relevanten S7-Datentypen in jeweils einem Java-Codefragment. Als Basisbeispiel zu den Konvertierungsroutinen liegt ein kurzes Borland JBuilder Projekt bei, das alle Schritte einmal komplett darstellt. Beispieldateien und Projekte Die folgende Liste enthält alle Dateien und Projekte, die in diesem Beispiel verwendet werden. Tabelle 2-1 Copyright © Siemens AG 2006 All rights reserved 22698628_S7Types_DOKU_V11_d.doc Komponente Version - 1.1 Hinweis 22698628_S7Types_CODE_v11.zip Diese gepackte Datei enthält alle Codefragmente zu den Konvertierungen als ASCII Texte und den Code des Beispielprogramms. 22698628_S7Types_DOKU_v11_d.pdf Dieses Dokument. Ausgabe 01.03.2006 8/44 Funktionsprinzipien und Programmstrukturen Grundlegendes zum Gebrauch der S7-Beans S7-Konvertierung Beitrags-ID: 22698628 Funktionsprinzipien und Programmstrukturen Inhalt Hier wird auf die detaillierten Funktionsabläufe der beteiligten Programmkomponenten und die Lösungsstrukturen eingegangen. 3 Grundlegendes zum Gebrauch der S7-Beans Einleitung Grundlage für die Erstellung eines Java-Applets ist die Progammbibliothek die mit den IT-CPs ausgeliefert werden. Diese S7-Beans API sorgt für die Kommunikation zwischen dem Java- Applet und dem S7-Server auf den ITCPs. Copyright © Siemens AG 2006 All rights reserved 22698628_S7Types_DOKU_V11_d.doc Grundlegendes zu S7-Beans Beans sind Java-Komponenten, die eine gekapselte Funktionalität haben und über offen gelegte Methoden gesteuert werden können. Im Lieferumfang der IT-CPs sind eine Reihe von Beans, die die Kommunikation mit der CP/ CPU regeln. Alle S7-Komponenten (visuelle und nicht-visuelle) sind in „Jar“Archivdateien enthalten. • s7api.jar -> alle Geräte-Klassen der S7BeansAPI • s7gui.jar-> alle visuellen Komponenten • s7util.jar-> Hilfsklassen • s7applet.jar -> vorgefertigte Applets Version - 1.1 Ausgabe 01.03.2006 9/44 Funktionsprinzipien und Programmstrukturen Grundlegendes zum Gebrauch der S7-Beans S7-Konvertierung Beitrags-ID: 22698628 Verkettung der Beans Das folgende Diagramm stellt die Funktionalität und die Wirkungskette der Java- Beans den realen SIMATIC Komponenten gegenüber. Tabelle 3-1 Gegenüberstellung HW<->S7-Beans Komponenten in der SIMATIC Java-Beans Repräsentant CP 343-1 IT SF LINK RX/TX RUN STOP IP-Adresse (142.120.5.51) Das Bean S7CP stellt den Repräsentanten des IT-CPs dar. Über dieses wird der gesamte Protokollverkehr zur Anlage hin abgewickelt. S7CP S7CP RUN-P RUN CPU315-2 DP BUSF y Rack/Slot (0,2) STOP MRES x 2 3 4 S7Device S7Device Merker-Bereich E/A-Bereich Das S7Device ist der Repräsentant einer S7CPU auf der Anlage. Lese oder Schreib anforderung BATF DC5V FRCE RUN STOP benachrichtigt SIEMENS SF benachrichtigt Copyright © Siemens AG 2006 All rights reserved 22698628_S7Types_DOKU_V11_d.doc x 2 3 4 Lese oder Schreib anforderung SIMATIC NET Adressierbare Speicherbereiche Kommentar DB - Bereich DB10.DBW0 Adresse (S7AnyPointer) S7Variable S7Variable Die S7Variable repräsentiert den Wert einer S7-Adresse. benachrichtigt AusgabeAusgabekomponente komponente Optionale Verknüpfung Jedes Bean in der obigen Kette kapselt die Eigenschaften seines realen Repräsentanten auf der SIMATIC Hardware/Software-Ebene. So wie z.B. die S7-CPU und die S7-Kommunikationsmechanismen über den Rückwand-Bus miteinander verknüpft sind, so müssen auch die S7-Beans auf der Client-Seite miteinander verknüpft werden. Dies geschieht über Methoden der einzelnen Beans-Klassen. Über den in Java standardisierten Benachrichtigungsmechanismus der „PropertyChange“-Methoden der einzelnen Objekte benachrichtigt jedes Objekt seine mit ihm verknüpften Objekte, falls eine Änderung stattgefunden hat. Version - 1.1 Ausgabe 01.03.2006 10/44 Funktionsprinzipien und Programmstrukturen Grundlegendes zum Gebrauch der S7-Beans S7-Konvertierung Beitrags-ID: 22698628 Ablaufbeispiel Copyright © Siemens AG 2006 All rights reserved 22698628_S7Types_DOKU_V11_d.doc Tabelle 3-2 Version - 1.1 Schritt Beschreibung 1 Das S7Variable-Objekt fordert neue Werte von seinem parametrierten Adressbereich (z.B. <DB10.DBW0>). 2 Die Anforderung wird an das S7Device-Objekt weitergeleitet, mit dem die S7Variable verknüpft ist. 3 Diese Anforderung gelangt an das S7CP-Objekt, mit dem das S7Device verknüpft ist. 4 Dieses Objekt generiert das TCP/ IP-Telegramm an den entsprechenden IT-CP. 5 Über die S7-CPU wird das Datum <DB10.DBW0> über S7Kommunikation wieder an den IT-CP zurückgeschickt und gelangt über ein TCP/IP Telegramm zurück zum S7CP-Objekt. 6 Das S7CP-Objekt benachrichtigt nun das zugehörige S7Device-Objekt und dieses wiederum das zugehörige S7Variablen-Objekt. In der standardisierten PropertyChange“-Methode kann nun auf den Wert der Variablen <DB10. DBW0> zugegriffen werden und evtl. an ein Ausgabe-Control weitergeleitet werden. Ausgabe 01.03.2006 11/44 Funktionsprinzipien und Programmstrukturen Ein kurzes Java-Beispielprogramm S7-Konvertierung 4 Beitrags-ID: 22698628 Ein kurzes Java-Beispielprogramm Einleitung Der folgende Code Auszug zeigt ein Java-Programm, das alle 2 sek. Das Merkerbyte 0 aus dem Speicher der S7-CPU holt und anzeigt. Die Kerncodezeilen, die sich mit der Adressierung und Konvertierung beschäftigen sind farblich markiert. Diese Codezeilen 1 und 4 werden beispielhaft in den folgenden Kapiteln durch alle möglichen S7-Typen ersetzt. Java-Code Der folgende Code ist im File 22698628_S7Types_CODE_v11.zip enthalten Copyright © Siemens AG 2006 All rights reserved 22698628_S7Types_DOKU_V11_d.doc package pt2test1; import java.awt.*; import java.awt.event.*; import java.applet.*; import javax.swing.*; import de.siemens.simaticnet.itcp.api.*; import java.beans.*; import com.borland.jbcl.layout.*; import de.siemens.simaticnet.itcp.util.*; /** * <p>Überschrift: </p> * <p>Beschreibung: </p> * <p>Copyright: Copyright (c) 2002</p> * <p>Organisation: Siemens AG ZN Augsburg S14</p> * @author Arno Ruhlnad * @version 1.0 */ public class VarLesen1 extends JApplet { boolean isStandalone = false; JPanel jPanel1 = new JPanel(); S7CP s7CP1 = new S7CP(); S7Device s7Device1 = new S7Device(); S7Variable s7Variable1 = new S7Variable(); CLTimer cLTimer1 = new CLTimer(); JTextField jTextField1 = new JTextField(); GridBagLayout gridBagLayout1 = new GridBagLayout(); //Parameterwert holen public String getParameter(String key, String def) { return isStandalone ? System.getProperty(key, def) : (getParameter(key) != null ? getParameter(key) : def); } //Das Applet konstruieren public VarLesen1() { } //Das Applet initialisieren public void init() { try { jbInit(); } catch(Exception e) { e.printStackTrace(); Version - 1.1 Ausgabe 01.03.2006 12/44 Funktionsprinzipien und Programmstrukturen Ein kurzes Java-Beispielprogramm Copyright © Siemens AG 2006 All rights reserved 22698628_S7Types_DOKU_V11_d.doc S7-Konvertierung Beitrags-ID: 22698628 } } //Initialisierung der Komponenten private void jbInit() throws Exception { this.setSize(new Dimension(400,300)); jPanel1.setLayout(gridBagLayout1); cLTimer1.setDelay(2000); cLTimer1.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(ActionEvent e) { cLTimer1_actionPerformed(e); } }); s7CP1.setHostString(new de.siemens.simaticnet.itcp.api.HostString ("141.73.167.87:80")); s7CP1.addPropertyChangeListener(new java.beans.PropertyChangeListener() { public void propertyChange(PropertyChangeEvent e) { s7CP1_propertyChange(e); } }); s7Device1.setSlot(4); s7Device1.addPropertyChangeListener(new java.beans.PropertyChangeListener() { public void propertyChange(PropertyChangeEvent e) { s7Device1_propertyChange(e); } }); s7Variable1.setS7Anypointer(new de.siemens.simaticnet.itcp.api.S7Anypointer((int)2, (int)1, (int)131, (int)0, (int)0, (int)0)); 1 s7Variable1.addPropertyChangeListener(new java.beans.PropertyChangeListener() { public void propertyChange(PropertyChangeEvent e) { s7Variable1_propertyChange(e); } }); jTextField1.setText("jTextField1"); this.getContentPane().add(jPanel1, BorderLayout.CENTER); jPanel1.add(jTextField1, new GridBagConstraints(0, 0, 1, 1, 1.0, 0.0 ,GridBagConstraints.WEST, GridBagConstraints.HORIZONTAL, new Insets(140, 128, 139, 132), 77, 0)); S7Api.setDebugLevel(0); S7Api.setLocale("de", "DE"); } //Das Applet starten public void start() { cLTimer1.start(); } //Das Applet anhalten public void stop() { cLTimer1.stop(); } //Das Applet löschen public void destroy() { cLTimer1.stop(); S7Api.terminate(); } //Applet-Information holen public String getAppletInfo() { return "Applet-Information"; } //Parameter-Infos holen public String[][] getParameterInfo() { return null; } Version - 1.1 Ausgabe 01.03.2006 13/44 Funktionsprinzipien und Programmstrukturen Ein kurzes Java-Beispielprogramm S7-Konvertierung Beitrags-ID: 22698628 void s7CP1_propertyChange(PropertyChangeEvent e) { s7Device1.getS7Device().propertyChange(e); } void s7Device1_propertyChange(PropertyChangeEvent e) { s7Variable1.propertyChange(e); 3 } 4 void s7Variable1_propertyChange(PropertyChangeEvent e) { //dataType 2= BYTE byte ag = ((Integer)e.getNewValue()).byteValue(); jTextField1.setText(ag + ""); } 2 void cLTimer1_actionPerformed(ActionEvent e) { s7Variable1.processGet(); } Copyright © Siemens AG 2006 All rights reserved 22698628_S7Types_DOKU_V11_d.doc } Beschreibung Die prinzipielle Vorgehensweise beim Zugriff auf die S7- Variable ist durch folgende Wirkungskette vorgegeben. Tabelle 4-1 Programm abschnitt 1 2 3 4 Beschreibung Der Variablen s7Variable1 muss über Ihre Methode setS7Anypointer die Adresse der S7-Variablen in der CPU mitgeteilt werden. Der Timer feuert alle 2 Sekunden und ruft die Methode cLTimer1_actionPerformed auf. Hier muss die Methode processGet() des Objekt s7Variable1 aufgerufen werden. Dies bewirkt einen Anstoß der Prozedur eine Variable von der CPU anzufordern. Sobald die Variable im s7Device1 Objekt angekommen ist, feuert dieses ein propertyChange Event. In der Methode wird die Nachricht an die s7Variable1 weitergeleitet. Im Parameter e (PropertyChangeEvent) der Methode s7Variable1_propertyChange sind nun unformatiert die Rohdaten aus der S7-CPU enthalten. Über Typecasting des Rohobjekts ag wird die Byteinformation ausgelesen und in einem Textcontrol angezeigt In den folgenden Kapiteln zeigen wir die Vorgehensweise die verschiedenen S7-Typen im Java-Programm zu konvertieren. Version - 1.1 Ausgabe 01.03.2006 14/44 Funktionsprinzipien und Programmstrukturen Konvertierungsroutinen S7 Variablen <-> Java Variablen S7-Konvertierung 5 Beitrags-ID: 22698628 Konvertierungsroutinen S7 Variablen <-> Java Variablen Hier erfahren Sie… mehr über die Konvertierung von S7Variablen in Java-Typen. Sie erhalten einen Überblick über den Aufbau des S7Anypointers und der Anzeige verschiedener S7-Typen in Java. 5.1 Der S7 Anypointer Einleitung Alle angeforderten Variablen werden im Javaprogramm auf S7Anypointer abgebildet. Der S7Anypointer ist eine Zusammensetzung aus mehreren Parameter, die die Variable in Adresse und Typ beschreiben. Copyright © Siemens AG 2006 All rights reserved 22698628_S7Types_DOKU_V11_d.doc Aufbau des S7Anypointers Der S7Anypointer zeichnet sich durch folgenden Aufbau aus: public S7Anypointer(int dataType, int repFactor, int memArea, int subArea, int byteAddress, int bitAddress) Bedeutung der Parameter Nachfolgende Tabelle gibt eine kleine Übersicht über die Bedeutung der Parameter. Tabelle 5-1 Bedeutung der S7Anypointer Parameter Parameter Bedeutung dataType Datentyp der Variablen repFactor Wiederholungsfaktor memArea Speicherbereich in der S7CPU subArea Datenbausteinnummer byteAddress Byte-Adresse der Variablen bitAddress Bit- Adresse der Variablen Die einzelnen Parameter werden in den folgenden Kapitel näher beschrieben. Version - 1.1 Ausgabe 01.03.2006 15/44 Funktionsprinzipien und Programmstrukturen Konvertierungsroutinen S7 Variablen <-> Java Variablen S7-Konvertierung 5.1.1 Beitrags-ID: 22698628 Beschreibung: dataType Tabelle 5-2 Liste dataType Copyright © Siemens AG 2006 All rights reserved 22698628_S7Types_DOKU_V11_d.doc Bean Variable Version - 1.1 Hex Dez Datentyp Beschreibung b#16#00 0 NIL Nullpointer S7_BOOL b#16#01 1 BOOL Bits S7_BYTE b#16#02 2 BYTE Bytes (8 Bits) B#16#00 >B#16#FF S7_CHAR b#16#03 3 CHAR Zeichen (8 Bits) S7_WORD b#16#04 4 WORD Wörter (16 Bits) W#16#0000 > W#16#FFFF S7_INT b#16#05 5 INT Ganzzahlen (16 Bits) –32768 > +32767 S7_DWOR D b#16#06 6 DWORD Wörter (32 Bits) DW#16#00000000 > DW#16#FFFFFFFF S7_DINT b#16#07 7 DINT Ganzzahlen (32 Bits) L#-2147483648 > L#+2147483647 S7_REAL b#16#08 8 REAL Gleitpunktzahlen (32 Bits) +1.175495e-38 >+3.402823e+38 -1.175495e-38 > 3.402823e+38 S7_DATE b#16#09 9 DATE Datum D#1990-01-01>D#2168-12-31 S7_TIMEO FDAY b#16#0A 10 TIME_OF_ DAY (TOD) Uhrzeit TOD#00:00:00.000 > TOD#23:59:59.999 S7_TIME b#16#0B 11 TIME Zeit T#+24d20h31m23s647ms > T#-24d20h31m23s647ms S7_S5TIM E b#16#0C 12 S5TIME Datentyp S5TIME S5T#10ms > S5T#2h46m30s S7_DATEA NDTIME b#16#0E 14 DATA_AND _TIME Datum und Zeit (64 Bits) S7_STRIN G b#16#13 19 STRING Zeichenkette max 254 Zeichen 1.Byte Länge gesamt 2.Byte Länge tatsächlich S7_COUNT ER b#16#1C 28 COUNTER Nummer des Zählers S7_TIMER b#16#1D 29 TIMER Nummer der Zeit Ausgabe 01.03.2006 16/44 Funktionsprinzipien und Programmstrukturen Konvertierungsroutinen S7 Variablen <-> Java Variablen S7-Konvertierung 5.1.2 Beitrags-ID: 22698628 Beschreibung: repFactor Anzahl der Wiederholungen. Die Anzahl bezieht sich auf den im dataType angegebenen Wert. Die Gesamtlänge darf dabei eine Maximale Länge nicht überschreiten. Es gilt: S7-400: 400Byte (schreiben oder lesen). S7-300: 210 Byte (lesen) 164 Byte (schreiben) S7-200: 222 Byte (lesen) 212 Byte (schreiben) ! Achtung 5.1.3 Beschreibung: memArea Gibt den Bereich in der S7 CPU an, aus dem gelesen oder in den geschrieben werden soll. Copyright © Siemens AG 2006 All rights reserved 22698628_S7Types_DOKU_V11_d.doc Tabelle 5-3 Liste memArea Hinweis Version - 1.1 Bean Variable Hex Dez Datentyp Beschreibung MEM_AREA_E W#16#81 129 E Speicherbereich der Eingänge MEM_AREA_A W#16#82 130 A Speicherbereich der Ausgänge MEM_AREA_M W#16#83 131 M Speicherbereich der Merker MEM_AREA_D B W#16#84 132 DB Datenbaustein MEM_AREA_DI W#16#85 133 DI Instanz-Datenbaustein MEM_AREA_L W#16#86 134 L Lokaldaten (L-Stack) MEM_AREA_V W#16#87 135 V Vorherige Lokaldaten MEM_AREA_S 7_COUNTER W#16#1C 28 COUNTER Zähler MEM_AREA_S 7_TIMER W#16#1D 29 TIMER Zeiten MEM_AREA_S F W#16#5 5 SM Sondermerker (nur S7 200) Die durchgestrichenen Speicherbereiche lassen sich nicht in der S7Anypointer Methode adressieren. Ausgabe 01.03.2006 17/44 Funktionsprinzipien und Programmstrukturen Konvertierungsroutinen S7 Variablen <-> Java Variablen S7-Konvertierung 5.1.4 Beitrags-ID: 22698628 Beschreibung:subArea Nur von Bedeutung wenn als memArea der Datenbaustein gewählt ist. Dann erfolgt im subArea die Angabe der DB – Nummer. 5.1.5 Beschreibung: byteAddress Angabe der Byte – Adresse beim memArea E / A / M / DB. Angabe des Zählers oder des Timers. 5.1.6 Beschreibung: bitAdress Die bitAddress ist nur von Bedeutung beim dataType BOOL, und gibt die Bit – Nummer zwischen 0 und 7 an. Copyright © Siemens AG 2006 All rights reserved 22698628_S7Types_DOKU_V11_d.doc 5.2 Gegenüberstellung von S7-Typen und Java-Typen Die S7–Typen unterscheiden sich in der Regel von den entsprechenden Java–Typen im Wertebereich. Um hier Problemen mit Vorzeichen, etc vorzubeugen, werden die Typen wie in der folgenden Tabelle dargestellt abgebildet. Bei Verwendung von Arrays (Wiederholfaktor (n) > 1) werden in Java die sogenannten ”elementaren” Datentypen verwendet. Ein solches Array (z.B. int[]) wird dann von Java auch als Objekt betrachtet, was bei den einfachen Datentypen sonst nicht der Fall ist. Dies ist für uns insbesondere wichtig für die Übergabeparameter, z.B. bei setValue() von S7Variable. Tabelle 5-4 Gegenüberstellung S7-TypÅÆJava-Typ S7-Typ Version - 1.1 Java-Typ Java-Array BOOL Boolean - BYTE Integer int[] CHAR Character char[] WORD Integer int[] INT Integer int[] DWORD Long long[] DINT Long long[] REAL Float float[] DATE Integer int[] Time Of Day Long long[] TIME Long long[] S5TIME byte[2] byte[n*2] Date And Time byte[8] byte[n*8] STRING String - COUNTER byte[2] byte[n*2] TIMER byte[2] byte[n*2] Ausgabe 01.03.2006 18/44 Funktionsprinzipien und Programmstrukturen Konvertierungsroutinen S7 Variablen <-> Java Variablen S7-Konvertierung ! Beitrags-ID: 22698628 Ein Array vom Typ BOOL und STRING kann nicht gebildet werden. Achtung 5.3 Anzeigen von S7 Variablen mit einem Wiederholfaktor 1 Die folgenden Unterkapitel zeigen exemplarisch die Anzeige von verschiedenen S7-Typen mit einem Wiederholfaktor 1. Alle Codefragmente sind als ASCII-Files komprimiert in 22698628_S7Types_CODE_v11.zip enthalten. 5.3.1 Anzeigen einer BOOL-Variablen Copyright © Siemens AG 2006 All rights reserved 22698628_S7Types_DOKU_V11_d.doc ... s7Variable1.setS7Anypointer(new de.siemens.simaticnet.itcp.api.S7Anypointer((int)1, (int)1, (int)131, (int)0, (int)0, (int)0)); ... void s7Variable1_propertyChange(PropertyChangeEvent e) { //dataType 1 BOOL Boolean ag = (Boolean)e.getNewValue(); jTextField1.setText(ag + ""); } Codedatei: 5-3-1_Bool.txt 5.3.2 Anzeigen einer BYTE-Variablen ... s7Variable1.setS7Anypointer(new de.siemens.simaticnet.itcp.api.S7Anypointer((int)2, (int)1, (int)131, (int)0, (int)0, (int)0)); ... void s7Variable1_propertyChange(PropertyChangeEvent e) { //dataType 2 BYTE byte ag = ((Integer)e.getNewValue()).byteValue(); jTextField1.setText(ag + ""); } Codedatei:5-3-2_Byte.txt 5.3.3 Anzeigen einer CHAR-Variablen ... s7Variable1.setS7Anypointer(new de.siemens.simaticnet.itcp.api.S7Anypointer((int)3, (int)1, (int)131, (int)0, (int)0, (int)0)); ... void s7Variable1_propertyChange(PropertyChangeEvent e) { //dataType 3 CHAR Character ag = (Character)e.getNewValue(); jTextField1.setText(ag + ""); } Codedatei:5-3-3_Char.txt Version - 1.1 Ausgabe 01.03.2006 19/44 Funktionsprinzipien und Programmstrukturen Konvertierungsroutinen S7 Variablen <-> Java Variablen S7-Konvertierung 5.3.4 Beitrags-ID: 22698628 Anzeigen einer WORD-Variablen ... s7Variable1.setS7Anypointer(new de.siemens.simaticnet.itcp.api.S7Anypointer((int)4, (int)1, (int)131, (int)0, (int)0, (int)0)); ... void s7Variable1_propertyChange(PropertyChangeEvent e) { //dataType 4 WORD short ag = ((Integer)e.getNewValue()).shortValue(); jTextField1.setText((Integer).toHexString(ag & 0x0000FFFF).toUpperCase() + ""); } Codedatei:5-3-4_Word.txt 5.3.5 Anzeigen einer INT-Variablen Copyright © Siemens AG 2006 All rights reserved 22698628_S7Types_DOKU_V11_d.doc ... s7Variable1.setS7Anypointer(new de.siemens.simaticnet.itcp.api.S7Anypointer((int)5, (int)1, (int)131, (int)0, (int)0, (int)0)); ... void s7Variable1_propertyChange(PropertyChangeEvent e) { //dataType 5 INT short ag = ((Integer)e.getNewValue()).shortValue(); jTextField1.setText(ag + ""); } Codedatei:5-3-5_Int.txt 5.3.6 Anzeigen einer DWORD-Variablen ... s7Variable1.setS7Anypointer(new de.siemens.simaticnet.itcp.api.S7Anypointer((int)6, (int)1, (int)131, (int)0, (int)0, (int)0)); ... void s7Variable1_propertyChange(PropertyChangeEvent e) { //dataType 6 DWORD Long ag = (Long)e.getNewValue(); jTextField1.setText(Integer.toHexString(ag.intValue()).toUpperCase() + ""); } Codedatei:5-3-6_DWord.txt 5.3.7 Anzeigen einer DINT-Variablen ... s7Variable1.setS7Anypointer(new de.siemens.simaticnet.itcp.api.S7Anypointer((int)7, (int)1, (int)131, (int)0, (int)0, (int)0)); ... void s7Variable1_propertyChange(PropertyChangeEvent e) { //dataType 7 DINT Long ag = (Long)e.getNewValue(); jTextField1.setText(ag + ""); } Codedatei:5-3-7_DInt.txt Version - 1.1 Ausgabe 01.03.2006 20/44 Funktionsprinzipien und Programmstrukturen Konvertierungsroutinen S7 Variablen <-> Java Variablen S7-Konvertierung 5.3.8 Beitrags-ID: 22698628 Anzeigen einer REAL-Variablen ... s7Variable1.setS7Anypointer(new de.siemens.simaticnet.itcp.api.S7Anypointer((int)8, (int)1, (int)131, (int)0, (int)0, (int)0)); ... void s7Variable1_propertyChange(PropertyChangeEvent e) { //dataType 8 REAL Float ag = (Float)e.getNewValue(); jTextField1.setText(ag + ""); } Codedatei:5-3-8_Real.txt Copyright © Siemens AG 2006 All rights reserved 22698628_S7Types_DOKU_V11_d.doc 5.3.9 Anzeigen einer DATE-Variablen ... s7Variable1.setS7Anypointer(new de.siemens.simaticnet.itcp.api.S7Anypointer((int)9, (int)1, (int)131, (int)0, (int)0, (int)0)); ... void s7Variable1_propertyChange(PropertyChangeEvent e) { //dataType 9 DATE boolean neg = false; int dStart = 1990, pJahr = 0, jahr = 0, rTag = 0, tag = 0, pMonat = 0, februar = 0, monat = 0 ; String retval = ""; short ag = ((Integer)e.getNewValue()).shortValue(); //Umladen des AG Werts rTag = ag; if (rTag < 0) rTag = rTag + 65536; //Jahr berechnen for (pJahr = 0; pJahr < 300; pJahr++) { if ( (((dStart + pJahr) % 4) == 0) && (((dStart + pJahr) % 100) != 0) || (((dStart + pJahr) % 400) == 0)) { if ( (rTag - 366) < 0) { neg = true; break; } else { rTag = rTag - 366; } } else { if ( (rTag - 365) < 0) { neg = true; break; } else { rTag = rTag - 365; } } } //Jahr eintragen jahr = pJahr + dStart; //Anzahl Tage für Februar if ((((dStart + pJahr) % 4) == 0) && (((dStart + pJahr) % 100) != 0) || (((dStart + pJahr) % 400) == 0)) { februar = 29; } else { februar = 28; } Version - 1.1 Ausgabe 01.03.2006 21/44 Funktionsprinzipien und Programmstrukturen Konvertierungsroutinen S7 Variablen <-> Java Variablen S7-Konvertierung Beitrags-ID: 22698628 Copyright © Siemens AG 2006 All rights reserved 22698628_S7Types_DOKU_V11_d.doc //Monat berechnen neg = false; for (pMonat = 1; pMonat < 12; pMonat++) { switch (pMonat) { case 1: case 3: case 5: case 7: case 8: case 10: case 12: if ((rTag - 31) < 0) { neg = true; } else { rTag = rTag - 31; } break; case 2: if ((rTag - februar) < 0) { neg = true; } else { rTag = rTag - februar; } break; case 4: case 6: case 9: case 11: if ((rTag - 30) < 0) { neg = true; } else { rTag = rTag - 30; } break; } if (neg) break; } monat = pMonat; tag = rTag + 1; retval = "" + jahr + "-"; if (monat > 9) retval = retval + monat + "-"; else retval = retval + "0" + monat + "-"; if (tag > 9) retval = retval + tag; else retval = retval + "0" + tag; jTextField1.setText(retval); } Codedatei:5-3-9_Date.txt Version - 1.1 Ausgabe 01.03.2006 22/44 Funktionsprinzipien und Programmstrukturen Konvertierungsroutinen S7 Variablen <-> Java Variablen S7-Konvertierung 5.3.10 Beitrags-ID: 22698628 Anzeigen einer TIME_OF_DAY-Variablen Copyright © Siemens AG 2006 All rights reserved 22698628_S7Types_DOKU_V11_d.doc ... s7Variable1.setS7Anypointer(new de.siemens.simaticnet.itcp.api.S7Anypointer((int)10, (int)1, (int)131, (int)0, (int)0, (int)0)); ... void s7Variable1_propertyChange(PropertyChangeEvent e) { //dataType 10 Time Of Day Long ag = (Long)e.getNewValue(); // Vorbelegung für TIME int tag = 0, stunde = 0, minute = 0, sekunde = 0, msekunde = 0; //Vorbelegung für Tage; Stunden; Minuten; Sekunden und mSekunden int tagCon = 86400000; int stundeCon = 3600000; int minuteCon = 60000; int sekundeCon = 1000; //Vorbelegung auf postiven Werten boolean neg = false; //Löschen des Strings String time_St = ""; //Übergabewert von Bytearray nach Integer wandeln int iv = ag.intValue(); //Abfragen ob Übergabewert negativ ist if (iv < 0){ //Übergabewert wenn negativ nach positiv wandeln iv = iv * -1; neg = true; } //Berechnen der Tage tag = iv / tagCon; iv = iv % tagCon; //Berechnen der Stunden stunde = iv / stundeCon; iv = iv % stundeCon; //Berechnen der Minuten minute = iv / minuteCon; iv = iv % minuteCon; //Berechnen der Sekunden sekunde = iv / sekundeCon; //Rest sind mSekunden msekunde = iv % sekundeCon; //Ausgaben Vorbesetzen time_St = time_St + ""; //Vorzeichen eintragen if (neg == true){ time_St = time_St + " -"; } if (stunde == 0) { time_St = time_St + "00:"; } else { if (stunde > 9) { time_St = time_St + stunde + ":"; } else { time_St = time_St + "0" + stunde + ":"; } } if (minute == 0) { time_St = time_St + "00:"; } Version - 1.1 Ausgabe 01.03.2006 23/44 Funktionsprinzipien und Programmstrukturen Konvertierungsroutinen S7 Variablen <-> Java Variablen S7-Konvertierung Beitrags-ID: 22698628 Copyright © Siemens AG 2006 All rights reserved 22698628_S7Types_DOKU_V11_d.doc else { if (minute > 9) { time_St = time_St + minute + ":"; } else { time_St = time_St + "0" + minute + ":"; } } if (sekunde == 0) { time_St = time_St + "00:"; } else { if (sekunde > 9) { time_St = time_St + sekunde + ":"; } else { time_St = time_St + "0" + sekunde + ":"; } } if (msekunde == 0) { time_St = time_St + "000"; } else { if (msekunde > 99) { time_St = time_St + msekunde; } else { if (msekunde > 9) { time_St = time_St + "0" + msekunde; } else { time_St = time_St + "00" + msekunde; } } } //Umgewandelten Wert zurückgeben jTextField1.setText(time_St); } Codedatei:5_3-10_Time_Of_Day.txt Version - 1.1 Ausgabe 01.03.2006 24/44 Funktionsprinzipien und Programmstrukturen Konvertierungsroutinen S7 Variablen <-> Java Variablen S7-Konvertierung 5.3.11 Beitrags-ID: 22698628 Anzeigen einer TIME-Variablen Copyright © Siemens AG 2006 All rights reserved 22698628_S7Types_DOKU_V11_d.doc ... s7Variable1.setS7Anypointer(new de.siemens.simaticnet.itcp.api.S7Anypointer((int)11, (int)1, (int)131, (int)0, (int)0, (int)0)); ... void s7Variable1_propertyChange(PropertyChangeEvent e) { //dataType 11 Time Long ag = (Long)e.getNewValue(); // Vorbelegung für TIME int tag = 0, stunde = 0, minute = 0, sekunde = 0, msekunde = 0; //Vorbelegung für Tage; Stunden; Minuten; Sekunden und mSekunden int tagCon = 86400000; int stundeCon = 3600000; int minuteCon = 60000; int sekundeCon = 1000; //Vorbelegung auf postiven Werten boolean neg = false; //Löschen des Strings String time_St = ""; //Übergabewert von Bytearray nach Integer wandeln int iv = ag.intValue(); //Abfragen ob Übergabewert negativ ist if (iv < 0){ //Übergabewert wenn negativ nach positiv wandeln iv = iv * -1; neg = true;} //Berechnen der Tage tag = iv / tagCon; iv = iv % tagCon; //Berechnen der Stunden stunde = iv / stundeCon; iv = iv % stundeCon; //Berechnen der Minuten minute = iv / minuteCon; iv = iv % minuteCon; //Berechnen der Sekunden sekunde = iv / sekundeCon; //Rest sind mSekunden msekunde = iv % sekundeCon; //Ausgaben Vorbesetzen time_St = time_St + ""; //Vorzeichen eintragen if (neg == true){ time_St = time_St + " -";} if (tag > 0){ time_St = time_St + tag + "d"; } if (stunde > 0){ time_St = time_St + stunde + "h"; } if (minute > 0){ time_St = time_St + minute + "m"; } if (sekunde > 0){ time_St = time_St + sekunde + "s"; } if (msekunde > 0){ time_St = time_St + msekunde + "ms"; } if (time_St == ""){ time_St = time_St +"0ms"; } //Umgewandelten Wert zurückgeben jTextField1.setText(time_St + ""); Version - 1.1 Ausgabe 01.03.2006 25/44 Funktionsprinzipien und Programmstrukturen Konvertierungsroutinen S7 Variablen <-> Java Variablen S7-Konvertierung Beitrags-ID: 22698628 } Codedatei:5-3-11_Time.txt 5.3.12 Anzeigen einer S5TIME-Variablen Copyright © Siemens AG 2006 All rights reserved 22698628_S7Types_DOKU_V11_d.doc ... s7Variable1.setS7Anypointer(new de.siemens.simaticnet.itcp.api.S7Anypointer((int)12, (int)1, (int)131, (int)0, (int)0, (int)0)); ... void s7Variable1_propertyChange(PropertyChangeEvent e) { //dataType 12 S5Time Object ag = e.getNewValue(); String retval = ""; short s5t1 = 0; int s5t_Wert = 0, s5t_Faktor = 0, s5t_Zeit = 0, tag = 0, stunde = 0, minute = 0, sekunde = 0, msekunde = 0; //Vorbelegung für Tage; Stunden; Minuten; Sekunden und mSekunden int tagCon = 86400000; int stundeCon = 3600000; int minuteCon = 60000; int sekundeCon = 1000; //Wert aus dem Puffer lesen s5t1 |= ((byte[])ag)[0] <<8; s5t1 |= (((byte[])ag)[1] < 0) ? ((byte[])ag)[1] + 0x100 : ((byte[])ag)[1]; //Faktor für S5 Timer ermitteln s5t_Faktor = (s5t1 & 0xf000) >> 12; //Zeitwert ermitteln BCD Zahl s5t_Wert = (((s5t1 & 0x0f00) >> 8) * 100) + (((s5t1 & 0x00f0) >> 4) * 10) + (s5t1 & 0x000f); //Faktor einrechnen auf ms für Anzeige switch (s5t_Faktor) { case 0 : s5t_Zeit = s5t_Wert * 10; break; case 1 : s5t_Zeit = s5t_Wert * 100; break; case 2 : s5t_Zeit = s5t_Wert * 1000; break; case 3 : s5t_Zeit = s5t_Wert * 10000; break; }; //Berechnen der Stunden stunde = s5t_Zeit / stundeCon; s5t_Zeit = s5t_Zeit % stundeCon; //Berechnen der Minuten minute = s5t_Zeit / minuteCon; s5t_Zeit = s5t_Zeit % minuteCon; //Berechnen der Sekunden sekunde = s5t_Zeit / sekundeCon; //Rest sind mSekunden msekunde = s5t_Zeit % sekundeCon; //Ausgaben Vorbesetzen retval = retval + ""; //Vorzeichen eintragen if (stunde > 0){ retval = retval + stunde + "h";} if (minute > 0){ retval = retval + minute + "m";} if (sekunde > 0){ retval = retval + sekunde + "s"; } if (msekunde >0){ retval = retval + msekunde + "ms"; } Version - 1.1 Ausgabe 01.03.2006 26/44 Funktionsprinzipien und Programmstrukturen Konvertierungsroutinen S7 Variablen <-> Java Variablen S7-Konvertierung Beitrags-ID: 22698628 if (retval == ""){ retval = retval +"0ms";} jTextField1.setText(retval + ""); } Codedatei:5-3-12_S5Time.txt 5.3.13 Anzeigen einer DATE_AND_TIME-Variablen Copyright © Siemens AG 2006 All rights reserved 22698628_S7Types_DOKU_V11_d.doc ... s7Variable1.setS7Anypointer(new de.siemens.simaticnet.itcp.api.S7Anypointer((int)14, (int)1, (int)131, (int)0, (int)0, (int)0)); ... void s7Variable1_propertyChange(PropertyChangeEvent e) { //dataType 14 Date And Time Object ag = e.getNewValue(); byte b1 = 0; String b3 = ""; int[] dat = new int[8]; int jahr = 0, monat = 0, tag = 0, stunde = 0, minute = msekunde = 0, wochentag = 0; //Werte aus Puffer laden dat[0] = ((byte[])ag)[0]; dat[1] = ((byte[])ag)[1]; dat[2] = ((byte[])ag)[2]; dat[3] = ((byte[])ag)[3]; dat[4] = ((byte[])ag)[4]; dat[5] = ((byte[])ag)[5]; dat[6] = ((byte[])ag)[6]; dat[7] = ((byte[])ag)[7]; //BCD Umwandlung und Aufteilung jahr = ((((dat[0] & 0xf0) >> 4) * 10) + (dat[0] & monat = ((((dat[1] & 0xf0) >> 4) * 10) + (dat[1] & tag = ((((dat[2] & 0xf0) >> 4) * 10) + (dat[2] & stunde = ((((dat[3] & 0xf0) >> 4) * 10) + (dat[3] & minute = ((((dat[4] & 0xf0) >> 4) * 10) + (dat[4] & sekunde = ((((dat[5] & 0xf0) >> 4) * 10) + (dat[5] & msekunde = ((((dat[6] & 0xf0) >> 4) * 100) + ((dat[6] + ((dat[7] & 0xf0) >> 4)); //alternatiev Wochentag ausmaskieren wochentag = dat[7] & 0xf; //String zusammenstellen b3 = ""; if (jahr > 89) { b3 = b3 + "19" + jahr + "-"; } else { if (jahr < 10) { b3 = b3 + "200" + jahr + "-"; } else { b3 = b3 + "20" + jahr + "-"; } } if (monat < 10) { b3 = b3 + "0" + monat + "-"; } else { b3 = b3 + monat + "-"; Version - 1.1 Ausgabe 01.03.2006 0, sekunde = 0, 0xf)); 0xf)); 0xf)); 0xf)); 0xf)); 0xf)); & 0xf) * 10) 27/44 Funktionsprinzipien und Programmstrukturen Konvertierungsroutinen S7 Variablen <-> Java Variablen Copyright © Siemens AG 2006 All rights reserved 22698628_S7Types_DOKU_V11_d.doc S7-Konvertierung Beitrags-ID: 22698628 } if (tag < 10) { b3 = b3 + "0" + tag + " "; } else { b3 = b3 + tag + " ; } if (stunde < 10) { b3 = b3 + "0" + stunde + ":"; } else { b3 = b3 + stunde + ":"; } if (minute < 10) { b3 = b3 + "0" + minute + ":"; } else { b3 = b3 + minute + ":"; } if (sekunde < 10) { b3 = b3 + "0" + sekunde + "."; } else { b3 = b3 + sekunde + "."; } if (msekunde < 10) { b3 = b3 + "00" + msekunde + " "; } else { if (msekunde < 100) { b3 = b3 + "0" + msekunde + " "; } else { b3 = b3 + msekunde + " "; } } switch (wochentag) { case 1: b3 = b3 + "Sonntag"; break; case 2: b3 = b3 + "Montag"; break; case 3: b3 = b3 + "Dienstag"; break; case 4: b3 = b3 + "Mittwoch"; break; case 5: b3 = b3 + "Donnerstag"; break; case 6: b3 = b3 + "Freitag"; break; case 7: b3 = b3 + "Samstag"; break; Version - 1.1 Ausgabe 01.03.2006 28/44 Funktionsprinzipien und Programmstrukturen Konvertierungsroutinen S7 Variablen <-> Java Variablen S7-Konvertierung Beitrags-ID: 22698628 default: b3 = b3; } jTextField1.setText(b3 + ""); } Codedatei:5-3-13_Date_And_Time.txt 5.3.14 Anzeigen einer STRING-Variablen ... s7Variable1.setS7Anypointer(new de.siemens.simaticnet.itcp.api.S7Anypointer((int)19, (int)50, (int)131, (int)0, (int)0, (int)0)); ... void s7Variable1_propertyChange(PropertyChangeEvent e) { //dataType 19 STring String ag = (e.getNewValue()).toString(); jTextField1.setText(ag); } Copyright © Siemens AG 2006 All rights reserved 22698628_S7Types_DOKU_V11_d.doc Codedatei:5-3-14_String.txt 5.3.15 Anzeigen eines COUNTER ... s7Variable1.setS7Anypointer(new de.siemens.simaticnet.itcp.api.S7Anypointer((int)28, (int)1, (int)28, (int)0, (int)0, (int)0)); ... void s7Variable1_propertyChange(PropertyChangeEvent e) { //dataType 28 COUNTER Object ag = e.getNewValue(); String anzeige = ""; short s5z1 = 0; int s5z_Wert = 0; //Wert aus dem Puffer lesen s5z1 |= ((byte[])ag)[0] <<8; s5z1 |= (((byte[])ag)[1] < 0) ? ((byte[])ag)[1] + 0x100 :((byte[])ag)[1]; //Zählerwert ermitteln BCD Zahl s5z_Wert = (((s5z1 & 0x0f00) >> 8) * 100) + (((s5z1 & 0x00f0) >> 4) * 10) + (s5z1 & 0x000f); anzeige = ((short) s5z_Wert) + ""; anzeige = new StringBuffer(anzeige).insert(0, "").toString(); jTextField1.setText(anzeige); } Codedatei:5-3-15_Counter.txt 5.3.16 Anzeigen eines TIMER s7Variable1.setS7Anypointer(new de.siemens.simaticnet.itcp.api.S7Anypointer((int)29, (int)1, (int)29, (int)0, (int)0, (int)0)); ... void s7Variable1_propertyChange(PropertyChangeEvent e) { //dataType 29 TIMER Object ag = e.getNewValue(); String retval = ""; short s5t1 = 0; Version - 1.1 Ausgabe 01.03.2006 29/44 Funktionsprinzipien und Programmstrukturen Konvertierungsroutinen S7 Variablen <-> Java Variablen S7-Konvertierung Beitrags-ID: 22698628 Copyright © Siemens AG 2006 All rights reserved 22698628_S7Types_DOKU_V11_d.doc int s5t_Wert = 0, s5t_Faktor = 0, s5t_Zeit = 0, tag = 0, stunde = 0, minute = 0, sekunde = 0, msekunde = 0; //Vorbelegung für Tage; Stunden; Minuten; Sekunden und mSekunden int tagCon = 86400000; int stundeCon = 3600000; int minuteCon = 60000; int sekundeCon = 1000; //Wert aus dem Puffer lesen s5t1 |= ((byte[])ag)[0] <<8; s5t1 |= (((byte[])ag)[1] < 0) ? ((byte[])ag)[1] + 0x100 : ((byte[])ag)[1]; //Faktor für S5 Timer ermitteln s5t_Faktor = (s5t1 & 0xf000) >> 12; //Zeitwert ermitteln BCD Zahl s5t_Wert = (((s5t1 & 0x0f00) >> 8) * 100) + (((s5t1 & 0x00f0) >> 4) * 10) + (s5t1 & 0x000f); //Faktor einrechnen auf ms für Anzeige switch (s5t_Faktor) { case 0 : s5t_Zeit = s5t_Wert * 10; break; case 1 : s5t_Zeit = s5t_Wert * 100; break; case 2 : s5t_Zeit = s5t_Wert * 1000; break; case 3 : s5t_Zeit = s5t_Wert * 10000; break; }; //Berechnen der Stunden stunde = s5t_Zeit / stundeCon; s5t_Zeit = s5t_Zeit % stundeCon; //Berechnen der Minuten minute = s5t_Zeit / minuteCon; s5t_Zeit = s5t_Zeit % minuteCon; //Berechnen der Sekunden sekunde = s5t_Zeit / sekundeCon; //Rest sind mSekunden msekunde = s5t_Zeit % sekundeCon; //Ausgaben Vorbesetzen retval = retval + ""; //Vorzeichen eintragen if (stunde > 0){ retval = retval + stunde + "h"; } if (minute > 0){ retval = retval + minute + "m"; } if (sekunde > 0){ retval = retval + sekunde + "s"; } if (msekunde > 0){ retval = retval + msekunde + "ms"; } if (retval.equals("")) retval = retval + "0ms"; jTextField1.setText(retval); } Codedatei:5-3-16_Timer.txt Version - 1.1 Ausgabe 01.03.2006 30/44 Funktionsprinzipien und Programmstrukturen Konvertierungsroutinen S7 Variablen <-> Java Variablen S7-Konvertierung 5.4 Beitrags-ID: 22698628 Anzeigen von S7 Variablen mit einem Wiederholfaktor größer 1 vom dataType 2 (BYTE) Die folgenden Kapitel zeigen exemplarisch die Anzeige von verschiedenen S7-Typen mit einem Wiederholfaktor größer 1. Arrays werden hier grundsätzlich als Array of Byte im S7Anypointer abgebildet und werden in Java als Array of Int (int[]) gecastet. Tabelle 5-5 Copyright © Siemens AG 2006 All rights reserved 22698628_S7Types_DOKU_V11_d.doc S7-Typ Java-Typ Java-Array BOOL Boolean - BYTE Integer int[] CHAR Character char[] WORD Integer int[] INT Integer int[] DWORD Long long[] DINT Long long[] REAL Float float[] DATE Integer int[] Time Of Day Long long[] TIME Long long[] S5TIME byte[2] byte[n*2] Date And Time byte[8] byte[n*8] STRING String - COUNTER byte[2] byte[n*2] TIMER byte[2] byte[n*2] Alle Codefragmente dieses Kapitels sind wieder als ASCII-Files komprimiert in 22698628_S7Types_CODE_v11.zip enthalten. Version - 1.1 Ausgabe 01.03.2006 31/44 Funktionsprinzipien und Programmstrukturen Konvertierungsroutinen S7 Variablen <-> Java Variablen S7-Konvertierung 5.4.1 Beitrags-ID: 22698628 Anzeigen einer BOOL-Variablen Anfordern von 150 Bytes ab MB0 ... s7Variable1.setS7Anypointer(new de.siemens.simaticnet.itcp.api.S7Anypointer((int)2, (int)150, (int)131, (int)0, (int)0, (int)0)); ... Anzeige eines BOOL-Wertes void s7Variable1_propertyChange(PropertyChangeEvent e) { // BOOL Object ag = e.getNewValue(); int offset = 0; int offsetBit = 0; //Wertebereich 0 .. 7 boolean ret = (((((int[])ag)[offset] >> offsetBit) & 0x1) == 0) ? false : true; jTextField1.setText(ret + ""); } Copyright © Siemens AG 2006 All rights reserved 22698628_S7Types_DOKU_V11_d.doc Codedatei:5-4-1_Bool.txt 5.4.2 Anzeigen einer BYTE-Variablen Anfordern von 150 Bytes ab MB0 ... s7Variable1.setS7Anypointer(new de.siemens.simaticnet.itcp.api.S7Anypointer((int)2, (int)150, (int)131, (int)0, (int)0, (int)0)); ... Anzeige eines BYTE-Wertes void s7Variable1_propertyChange(PropertyChangeEvent e) { // BYTE Object ag = e.getNewValue(); int offset = 0; byte ret = (byte) ((int[])ag)[offset]; jTextField1.setText(ret + ""); } Codedatei:5-4-2_Byte.txt 5.4.3 Anzeigen einer CHAR-Variablen Anfordern von 150 Bytes ab MB0 ... s7Variable1.setS7Anypointer(new de.siemens.simaticnet.itcp.api.S7Anypointer((int)2, (int)150, (int)131, (int)0, (int)0, (int)0)); ... Anzeige eines CHAR-Wertes void s7Variable1_propertyChange(PropertyChangeEvent e) { // CHAR Object ag = e.getNewValue(); int offset = 0; char ret = (char) ((int[])ag)[offset]; jTextField1.setText(ret + ""); } Version - 1.1 Ausgabe 01.03.2006 32/44 Funktionsprinzipien und Programmstrukturen Konvertierungsroutinen S7 Variablen <-> Java Variablen S7-Konvertierung Beitrags-ID: 22698628 Codedatei:5-4-3_Char.txt 5.4.4 Anzeigen einer WORD-Variablen Anfordern von 150 Bytes ab MB0 ... s7Variable1.setS7Anypointer(new de.siemens.simaticnet.itcp.api.S7Anypointer((int)2, (int)150, (int)131, (int)0, (int)0, (int)0)); ... Anzeige eines WORD-Wertes Copyright © Siemens AG 2006 All rights reserved 22698628_S7Types_DOKU_V11_d.doc void s7Variable1_propertyChange(PropertyChangeEvent e) { // WORD Object ag = e.getNewValue(); int offset = 3; int ret = ((int[])ag)[offset] <<8; ret |= ((int[])ag)[offset + 1]; jTextField1.setText(Integer.toHexString(ret & 0x0000FFFF).toUpperCase() + ""); } Codedatei:5-4-4_Word.txt 5.4.5 Anzeigen einer INT-Variablen Anfordern von 150 Bytes ab MB0 ... s7Variable1.setS7Anypointer(new de.siemens.simaticnet.itcp.api.S7Anypointer((int)2, (int)150, (int)131, (int)0, (int)0, (int)0)); ... Anzeige eines INT-Wertes void s7Variable1_propertyChange(PropertyChangeEvent e) { // INT Object ag = e.getNewValue(); int offset = 0; int ret = ((int[])ag)[offset] <<8; ret |= ((int[])ag)[offset + 1]; jTextField1.setText((short)ret + ""); } Vorzeichenrichtiges Shift ! Codedatei:5-4-5_Int.txt 5.4.6 Anzeigen einer DWORD-Variablen Anfordern von 150 Bytes ab MB0 ... s7Variable1.setS7Anypointer(new de.siemens.simaticnet.itcp.api.S7Anypointer((int)2, (int)150, (int)131, (int)0, (int)0, (int)0)); ... Anzeige eines DWORD-Wertes void s7Variable1_propertyChange(PropertyChangeEvent e) { // DWORD Object ag = e.getNewValue(); int offset = 0; int ret = ((int[])ag)[offset] <<24; Version - 1.1 Ausgabe 01.03.2006 33/44 Funktionsprinzipien und Programmstrukturen Konvertierungsroutinen S7 Variablen <-> Java Variablen S7-Konvertierung Beitrags-ID: 22698628 ret |= ((int[])ag)[offset + 1] <<16; ret |= ((int[])ag)[offset + 2] <<8; ret |= ((int[])ag)[offset + 3]; jTextField1.setText(Integer.toHexString(ret).toUpperCase() + ""); } Codedatei:5-4-6_DWord.txt 5.4.7 Anzeigen einer DINT-Variablen Anfordern von 150 Bytes ab MB0 ... s7Variable1.setS7Anypointer(new de.siemens.simaticnet.itcp.api.S7Anypointer((int)2, (int)150, (int)131, (int)0, (int)0, (int)0)); ... Copyright © Siemens AG 2006 All rights reserved 22698628_S7Types_DOKU_V11_d.doc Anzeige eines DINT-Wertes void s7Variable1_propertyChange(PropertyChangeEvent e) { // DINT Object ag = e.getNewValue(); int offset = 0; int ret = ((int[])ag)[offset] <<24; ret |= ((int[])ag)[offset + 1] <<16; ret |= ((int[])ag)[offset + 2] <<8; ret |= ((int[])ag)[offset + 3]; jTextField1.setText(ret + ""); } Codedatei:5-4-7_DInt.txt 5.4.8 Anzeigen einer REAL-Variablen Anfordern von 150 Bytes ab MB0 ... s7Variable1.setS7Anypointer(new de.siemens.simaticnet.itcp.api.S7Anypointer((int)2, (int)150, (int)131, (int)0, (int)0, (int)0)); ... Anzeige eines REAL-Wertes void s7Variable1_propertyChange(PropertyChangeEvent e) { // REAL Object ag = e.getNewValue(); int offset = 0; int ret = ((int[])ag)[offset] <<24; ret |= ((int[])ag)[offset + 1] <<16; ret |= ((int[])ag)[offset + 2] <<8; ret |= ((int[])ag)[offset + 3]; jTextField1.setText(Float.intBitsToFloat(ret) + ""); } Codedatei:5-4-8_Real.txt 5.4.9 Anzeigen einer DATE-Variablen Anfordern von 150 Bytes ab MB0 ... s7Variable1.setS7Anypointer(new de.siemens.simaticnet.itcp.api.S7Anypointer((int)2, (int)150, (int)131, (int)0, (int)0, (int)0)); Version - 1.1 Ausgabe 01.03.2006 34/44 Funktionsprinzipien und Programmstrukturen Konvertierungsroutinen S7 Variablen <-> Java Variablen S7-Konvertierung Beitrags-ID: 22698628 ... Copyright © Siemens AG 2006 All rights reserved 22698628_S7Types_DOKU_V11_d.doc Anzeige eines DATE-Wertes void s7Variable1_propertyChange(PropertyChangeEvent e) { // DATE Object ag = e.getNewValue(); int offset = 0; int ret = ((int[])ag)[offset] <<8; ret |= ((int[])ag)[offset + 1]; boolean neg = false; int dStart = 1990, pJahr = 0, jahr = 0, rTag = 0, tag = 0, pMonat = 0, februar = 0, monat = 0 ; String retval = ""; short wert = (short)ret; //Umladen des AG Werts rTag = wert; if (rTag < 0) rTag = rTag + 65536; //Jahr berechnen for (pJahr = 0; pJahr < 300; pJahr++) { if ( (((dStart + pJahr) % 4) == 0) && (((dStart + pJahr) % 100) != 0) || (((dStart + pJahr) % 400) == 0)) { if ( (rTag - 366) < 0) { neg = true; break; } else { rTag = rTag - 366; } } else { if ( (rTag - 365) < 0) { neg = true; break; } else { rTag = rTag - 365; } } } //Jahr eintragen jahr = pJahr + dStart; //Anzahl Tage für Februar if ((((dStart + pJahr) % 4) == 0) && (((dStart + pJahr) % 100) != 0) || (((dStart + pJahr) % 400) == 0)) { februar = 29; } else { februar = 28; } //Monat berechnen neg = false; for (pMonat = 1; pMonat < 12; pMonat++) { switch (pMonat) { case 1: case 3: case 5: case 7: case 8: case 10: case 12: if ((rTag - 31) < 0) { neg = true; } else { rTag = rTag - 31; } break; case 2: Version - 1.1 Ausgabe 01.03.2006 35/44 Funktionsprinzipien und Programmstrukturen Konvertierungsroutinen S7 Variablen <-> Java Variablen S7-Konvertierung Beitrags-ID: 22698628 if ((rTag - februar) < 0) { neg = true; } else { rTag = rTag - februar; } break; case 4: case 6: case 9: case 11: if ((rTag - 30) < 0) { neg = true; } else { rTag = rTag - 30; } break; Copyright © Siemens AG 2006 All rights reserved 22698628_S7Types_DOKU_V11_d.doc } if (neg) break; } monat = pMonat; tag = rTag + 1; retval = "" + jahr + "-"; if (monat > 9) retval = retval + monat + "-"; else retval = retval + "0" + monat + "-"; if (tag > 9) retval = retval + tag; else retval = retval + "0" + tag; jTextField1.setText(retval); } Codedatei:5-4-9_Date.txt 5.4.10 Anzeigen einer TIME_OF_DAY-Variablen Anfordern von 150 Bytes ab MB0 ... s7Variable1.setS7Anypointer(new de.siemens.simaticnet.itcp.api.S7Anypointer((int)2, (int)150, (int)131, (int)0, (int)0, (int)0)); ... Anzeige eines TIME_OF_DAY-Wertes void s7Variable1_propertyChange(PropertyChangeEvent e) { // Time Of Day Object ag = e.getNewValue(); int offset = 0; int ret = ((int[])ag)[offset] <<24; ret |= ((int[])ag)[offset + 1] <<16; ret |= ((int[])ag)[offset + 2] <<8; ret |= ((int[])ag)[offset + 3]; // Vorbelegung für TIME int tag = 0, stunde = 0, minute = 0, sekunde = 0, msekunde = 0; //Vorbelegung für Tage; Stunden; Minuten; Sekunden und mSekunden int tagCon = 86400000; int stundeCon = 3600000; int minuteCon = 60000; int sekundeCon = 1000; //Vorbelegung auf postiven Werten boolean neg = false; //Löschen des Strings Version - 1.1 Ausgabe 01.03.2006 36/44 Funktionsprinzipien und Programmstrukturen Konvertierungsroutinen S7 Variablen <-> Java Variablen Copyright © Siemens AG 2006 All rights reserved 22698628_S7Types_DOKU_V11_d.doc S7-Konvertierung Beitrags-ID: 22698628 String time_St = ""; //Übergabewert von Bytearray nach Integer wandeln int iv = ret; //Abfragen ob Übergabewert negativ ist if (iv < 0){ //Übergabewert wenn negativ nach positiv wandeln iv = iv * -1; neg = true; } //Berechnen der Tage tag = iv / tagCon; iv = iv % tagCon; //Berechnen der Stunden stunde = iv / stundeCon; iv = iv % stundeCon; //Berechnen der Minuten minute = iv / minuteCon; iv = iv % minuteCon; //Berechnen der Sekunden sekunde = iv / sekundeCon; //Rest sind mSekunden msekunde = iv % sekundeCon; //Ausgaben Vorbesetzen time_St = time_St + ""; //Vorzeichen eintragen if (neg == true){ time_St = time_St + " -"; } if (stunde == 0) { time_St = time_St + "00:"; } else { if (stunde > 9) { time_St = time_St + stunde + ":"; } else { time_St = time_St + "0" + stunde + ":"; } } if (minute == 0) { time_St = time_St + "00:"; } else { if (minute > 9) { time_St = time_St + minute + ":"; } else { time_St = time_St + "0" + minute + ":"; } } if (sekunde == 0) { time_St = time_St + "00:"; } else { if (sekunde > 9) { time_St = time_St + sekunde + ":"; } else Version - 1.1 Ausgabe 01.03.2006 37/44 Funktionsprinzipien und Programmstrukturen Konvertierungsroutinen S7 Variablen <-> Java Variablen S7-Konvertierung Beitrags-ID: 22698628 { time_St = time_St + "0" + sekunde + ":"; Copyright © Siemens AG 2006 All rights reserved 22698628_S7Types_DOKU_V11_d.doc } } if (msekunde == 0) { time_St = time_St + "000"; } else { if (msekunde > 99) { time_St = time_St + msekunde; } else { if (msekunde > 9) { time_St = time_St + "0" + msekunde; } else { time_St = time_St + "00" + msekunde; } } } //Umgewandelten Wert zurückgeben jTextField1.setText(time_St + ""); } Codedatei:5-4-10_Time_Of_Day.txt 5.4.11 Anzeigen einer TIME-Variablen Anfordern von 150 Bytes ab MB0 ... s7Variable1.setS7Anypointer(new de.siemens.simaticnet.itcp.api.S7Anypointer((int)2, (int)150, (int)131, (int)0, (int)0, (int)0)); ... Anzeigen eines TIME-Wertes void s7Variable1_propertyChange(PropertyChangeEvent e) { // Time Object ag = e.getNewValue(); int offset = 0; int ret = ((int[])ag)[offset] <<24; ret |= ((int[])ag)[offset + 1] <<16; ret |= ((int[])ag)[offset + 2] <<8; ret |= ((int[])ag)[offset + 3]; // Vorbelegung für TIME int tag = 0, stunde = 0, minute = 0, sekunde = 0, msekunde = 0; //Vorbelegung für Tage; Stunden; Minuten; Sekunden und mSekunden int tagCon = 86400000; int stundeCon = 3600000; int minuteCon = 60000; int sekundeCon = 1000; //Vorbelegung auf postiven Werten boolean neg = false; //Löschen des Strings String time_St = ""; //Übergabewert von Bytearray nach Integer wandeln int iv = ret; //Abfragen ob Übergabewert negativ ist if (iv < 0){ //Übergabewert wenn negativ nach positiv wandeln Version - 1.1 Ausgabe 01.03.2006 38/44 Funktionsprinzipien und Programmstrukturen Konvertierungsroutinen S7 Variablen <-> Java Variablen S7-Konvertierung Beitrags-ID: 22698628 iv = iv * -1; neg = true; Copyright © Siemens AG 2006 All rights reserved 22698628_S7Types_DOKU_V11_d.doc } //Berechnen der Tage tag = iv / tagCon; iv = iv % tagCon; //Berechnen der Stunden stunde = iv / stundeCon; iv = iv % stundeCon; //Berechnen der Minuten minute = iv / minuteCon; iv = iv % minuteCon; //Berechnen der Sekunden sekunde = iv / sekundeCon; //Rest sind mSekunden msekunde = iv % sekundeCon; //Ausgaben Vorbesetzen time_St = time_St + ""; //Vorzeichen eintragen if (neg == true){ time_St = time_St + " -"; } if (tag > 0){ time_St = time_St + tag + "d"; } if (stunde > 0){ time_St = time_St + stunde + "h"; } if (minute > 0){ time_St = time_St + minute + "m"; } if (sekunde > 0){ time_St = time_St + sekunde + "s"; } if (msekunde > 0){ time_St = time_St + msekunde + "ms"; } if (time_St == ""){ time_St = time_St +"0ms"; } //Umgewandelten Wert zurückgeben jTextField1.setText(time_St + ""); } Codedatei:5-4-11_Time.txt 5.4.12 Anzeigen einer S5TIME-Variablen Anfordern von 150 Bytes ab MB0 ... s7Variable1.setS7Anypointer(new de.siemens.simaticnet.itcp.api.S7Anypointer((int)2, (int)150, (int)131, (int)0, (int)0, (int)0)); ... Anzeige eines S5TIME-Wertes void s7Variable1_propertyChange(PropertyChangeEvent e) { // S5Time Object ag = e.getNewValue(); int offset = 0; String retval = ""; short s5t1 = 0; int s5t_Wert = 0, s5t_Faktor = 0, s5t_Zeit = 0, tag = 0, stunde = 0, minute = 0, sekunde = 0, msekunde = 0; //Vorbelegung für Tage; Stunden; Minuten; Sekunden und mSekunden Version - 1.1 Ausgabe 01.03.2006 39/44 Funktionsprinzipien und Programmstrukturen Konvertierungsroutinen S7 Variablen <-> Java Variablen S7-Konvertierung Beitrags-ID: 22698628 Copyright © Siemens AG 2006 All rights reserved 22698628_S7Types_DOKU_V11_d.doc int tagCon = 86400000; int stundeCon = 3600000; int minuteCon = 60000; int sekundeCon = 1000; //Wert aus dem Puffer lesen s5t1 |= ((int[])ag)[offset] <<8; s5t1 |= ((int[])ag)[offset + 1]; //Faktor für S5 Timer ermitteln s5t_Faktor = (s5t1 & 0xf000) >> 12; //Zeitwert ermitteln BCD Zahl s5t_Wert = (((s5t1 & 0x0f00) >> 8) * 100) + (((s5t1 & 0x00f0) >> 4) * 10) + (s5t1 & 0x000f); //Faktor einrechnen auf ms für Anzeige switch (s5t_Faktor) { case 0 : s5t_Zeit = s5t_Wert * 10; break; case 1 : s5t_Zeit = s5t_Wert * 100; break; case 2 : s5t_Zeit = s5t_Wert * 1000; break; case 3 : s5t_Zeit = s5t_Wert * 10000; break; }; //Berechnen der Stunden stunde = s5t_Zeit / stundeCon; s5t_Zeit = s5t_Zeit % stundeCon; //Berechnen der Minuten minute = s5t_Zeit / minuteCon; s5t_Zeit = s5t_Zeit % minuteCon; //Berechnen der Sekunden sekunde = s5t_Zeit / sekundeCon; //Rest sind mSekunden msekunde = s5t_Zeit % sekundeCon; //Ausgaben Vorbesetzen retval = retval + ""; //Vorzeichen eintragen if (stunde > 0){ retval = retval + stunde + "h"; } if (minute > 0){ retval = retval + minute + "m"; } if (sekunde > 0){ retval = retval + sekunde + "s"; } if (msekunde > 0){ retval = retval + msekunde + "ms"; } if (retval == ""){ retval = retval +"0ms"; } jTextField1.setText(retval + ""); } Codedatei:5-4-12_S5Time.txt Version - 1.1 Ausgabe 01.03.2006 40/44 Funktionsprinzipien und Programmstrukturen Konvertierungsroutinen S7 Variablen <-> Java Variablen S7-Konvertierung 5.4.13 Beitrags-ID: 22698628 Anzeigen einer DATE_AND_TIME-Variablen Anfordern von 150 Bytes ab MB0 ... s7Variable1.setS7Anypointer(new de.siemens.simaticnet.itcp.api.S7Anypointer((int)2, (int)150, (int)131, (int)0, (int)0, (int)0)); ... Copyright © Siemens AG 2006 All rights reserved 22698628_S7Types_DOKU_V11_d.doc Anzeige eines DATE_AND_TIME_Wertes void s7Variable1_propertyChange(PropertyChangeEvent e) { // Date And Time Object ag = e.getNewValue(); int offset = 0; byte b1 = 0; String b3 = ""; int[] dat = new int[8]; int jahr = 0, monat = 0, tag = 0, stunde = 0, minute = msekunde = 0, wochentag = 0; //Werte aus Puffer laden dat[0] = ((int[])ag)[offset]; dat[1] = ((int[])ag)[offset + 1]; dat[2] = ((int[])ag)[offset + 2]; dat[3] = ((int[])ag)[offset + 3]; dat[4] = ((int[])ag)[offset + 4]; dat[5] = ((int[])ag)[offset + 5]; dat[6] = ((int[])ag)[offset + 6]; dat[7] = ((int[])ag)[offset + 7]; //BCD Umwandlung und Aufteilung jahr = ((((dat[0] & 0xf0) >> 4) * 10) + (dat[0] & monat = ((((dat[1] & 0xf0) >> 4) * 10) + (dat[1] & tag = ((((dat[2] & 0xf0) >> 4) * 10) + (dat[2] & stunde = ((((dat[3] & 0xf0) >> 4) * 10) + (dat[3] & minute = ((((dat[4] & 0xf0) >> 4) * 10) + (dat[4] & sekunde = ((((dat[5] & 0xf0) >> 4) * 10) + (dat[5] & msekunde = ((((dat[6] & 0xf0) >> 4) * 100) + ((dat[6] + ((dat[7] & 0xf0) >> 4)); //alternatiev Wochentag ausmaskieren wochentag = dat[7] & 0xf; //String zusammenstellen b3 = ""; if (jahr > 89) { b3 = b3 + "19" + jahr + "-"; } else { if (jahr < 10) { b3 = b3 + "200" + jahr + "-"; } else { b3 = b3 + "20" + jahr + "-"; } } if (monat < 10) { b3 = b3 + "0" + monat + "-"; } else { b3 = b3 + monat + "-"; } if (tag < 10) { b3 = b3 + "0" + tag + " "; Version - 1.1 Ausgabe 01.03.2006 0, sekunde = 0, 0xf)); 0xf)); 0xf)); 0xf)); 0xf)); 0xf)); & 0xf) * 10) 41/44 Funktionsprinzipien und Programmstrukturen Konvertierungsroutinen S7 Variablen <-> Java Variablen Copyright © Siemens AG 2006 All rights reserved 22698628_S7Types_DOKU_V11_d.doc S7-Konvertierung Beitrags-ID: 22698628 } else { b3 = b3 + tag + " "; } if (stunde < 10) { b3 = b3 + "0" + stunde + ":"; } else { b3 = b3 + stunde + ":"; } if (minute < 10) { b3 = b3 + "0" + minute + ":"; } else { b3 = b3 + minute + ":"; } if (sekunde < 10) { b3 = b3 + "0" + sekunde + "."; } else { b3 = b3 + sekunde + "."; } if (msekunde < 10) { b3 = b3 + "00" + msekunde + " "; } else { if (msekunde < 100) { b3 = b3 + "0" + msekunde + " "; } else { b3 = b3 + msekunde + " "; } } switch (wochentag) { case 1: b3 = b3 + "Sonntag"; break; case 2: b3 = b3 + "Montag"; break; case 3: b3 = b3 + "Dienstag"; break; case 4: b3 = b3 + "Mittwoch"; break; case 5: b3 = b3 + "Donnerstag"; break; case 6: b3 = b3 + "Freitag"; break; case 7: b3 = b3 + "Samstag"; break; default: b3 = b3; Version - 1.1 Ausgabe 01.03.2006 42/44 Funktionsprinzipien und Programmstrukturen Konvertierungsroutinen S7 Variablen <-> Java Variablen S7-Konvertierung Beitrags-ID: 22698628 } jTextField1.setText(b3 + ""); } Codedatei:5-4-13_Date_And_Time.txt 5.4.14 Anzeigen einer STRING-Variablen Anfordern von 150 Bytes ab MB0 ... s7Variable1.setS7Anypointer(new de.siemens.simaticnet.itcp.api.S7Anypointer((int)2, (int)150, (int)131, (int)0, (int)0, (int)0)); ... Copyright © Siemens AG 2006 All rights reserved 22698628_S7Types_DOKU_V11_d.doc Anzeige eines STRING_Wertes void s7Variable1_propertyChange(PropertyChangeEvent e) { // String Object ag = e.getNewValue(); int offset = 0; byte b1 = 0; String ret = ""; //Max Länge des Strings laden int gesamt = ((int[])ag)[offset]; //Füllmenge des Strings laden int gefuellt = ((int[])ag)[offset + 1]; //Puffer mit Füllmenge einrichten char[] b2 = new char[gefuellt]; for (int i = 0; i < gefuellt; i++) { b2[i] = (char) (byte) ((int[])ag)[offset + 2 + i]; } //String aus den Chars erzeugen ret = new String(b2); jTextField1.setText(ret); } Codedatei:5-4-14_String.txt Version - 1.1 Ausgabe 01.03.2006 43/44 Anhang und Literaturhinweise Literaturhinweise S7-Konvertierung Beitrags-ID: 22698628 Anhang und Literaturhinweise 6 Literaturhinweise 6.1 Literaturangaben Diese Liste ist keinesfalls vollständig und spiegelt nur eine Auswahl an geeigneter Literatur wieder. Tabelle 6-1 Themengebiet Copyright © Siemens AG 2006 All rights reserved 22698628_S7Types_DOKU_V11_d.doc 1 6.2 STEP7 Titel Automatisieren mit STEP7 in AWL und SCL Hans Berger Publicis MCD Verlag ISBN 3-89578-113-4 Internet-Link-Angaben Themengebiet Version - 1.1 Titel \1\ Referenz auf den Beitrag http://support.automation.siemens.com/WW/view/de/22 698628 \2\ Siemens A&D Customer Support http://support.automation.siemens.com Ausgabe 01.03.2006 44/44