Applikation zur Kommunikation

Werbung
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
Herunterladen