Applikationsbeschreibung y 06/2014 Qt/C++ Beispiel einer ... · Inhaltsverzeichnis Qt/C...

19
http://support.automation.siemens.com/WW/view/de/90278134 Applikationsbeschreibung 06/2014 Qt/C++ Beispiel einer Client- Server Applikation SINUMERIK 840D sl

Transcript of Applikationsbeschreibung y 06/2014 Qt/C++ Beispiel einer ... · Inhaltsverzeichnis Qt/C...

Page 1: Applikationsbeschreibung y 06/2014 Qt/C++ Beispiel einer ... · Inhaltsverzeichnis Qt/C Client-Server-Applikation Beitrags-ID: 90278134, V1.0, 06/2014 3 ¤S i e m e n s A G 2 0 1

http://support.automation.siemens.com/WW/view/de/90278134

Applikationsbeschreibung 06/2014

Qt/C++ Beispiel einer Client-Server ApplikationSINUMERIK 840D sl

Page 2: Applikationsbeschreibung y 06/2014 Qt/C++ Beispiel einer ... · Inhaltsverzeichnis Qt/C Client-Server-Applikation Beitrags-ID: 90278134, V1.0, 06/2014 3 ¤S i e m e n s A G 2 0 1

Gewährleistung und Haftung

Qt/C Client-Server-ApplikationBeitrags-ID: 90278134, V1.0, 06/2014 2

Siem

ens

AG20

14Al

lrig

hts

rese

rved

Gewährleistung und Haftung

Hinweis Die Applikationsbeispiele sind unverbindlich und erheben keinen Anspruch aufVollständigkeit hinsichtlich Konfiguration und Ausstattung sowie jeglicherEventualitäten. Die Applikationsbeispiele stellen keine kundenspezifischenLösungen dar, sondern sollen lediglich Hilfestellung bieten bei typischenAufgabenstellungen. Sie sind für den sachgemäßen Betrieb der beschriebenenProdukte selbst verantwortlich. Diese Applikationsbeispiele entheben Sie nichtder Verpflichtung zu sicherem Umgang bei Anwendung, Installation, Betrieb undWartung. Durch Nutzung dieser Applikationsbeispiele erkennen Sie an, dass wirüber die beschriebene Haftungsregelung hinaus nicht für etwaige Schädenhaftbar gemacht werden können. Wir behalten uns das Recht vor, Änderungenan diesen Applikationsbeispielen jederzeit ohne Ankündigung durchzuführen. BeiAbweichungen zwischen den Vorschlägen in diesem Applikationsbeispiel undanderen Siemens Publikationen, wie z.B. Katalogen, hat der Inhalt der anderenDokumentation Vorrang.

Für die in diesem Dokument enthaltenen Informationen übernehmen wir keineGewähr.Unsere Haftung, gleich aus welchem Rechtsgrund, für durch die Verwendung derin 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, dergroben Fahrlässigkeit, wegen der Verletzung des Lebens, des Körpers oder derGesundheit, wegen einer Übernahme der Garantie für die Beschaffenheit einerSache, wegen des arglistigen Verschweigens eines Mangels oder wegenVerletzung wesentlicher Vertragspflichten zwingend gehaftet wird. Der Schadens-ersatz wegen Verletzung wesentlicher Vertragspflichten ist jedoch auf denvertragstypischen, vorhersehbaren Schaden begrenzt, soweit nicht Vorsatz odergrobe Fahrlässigkeit vorliegt oder wegen der Verletzung des Lebens, des Körpersoder der Gesundheit zwingend gehaftet wird. Eine Änderung der Beweislast zuIhrem Nachteil ist hiermit nicht verbunden.Weitergabe oder Vervielfältigung dieser Applikationsbeispiele oder Auszügedaraus sind nicht gestattet, soweit nicht ausdrücklich von Siemens Industry Sectorzugestanden.

Security-hinweise

Siemens bietet Produkte und Lösungen mit Industrial Security-Funktionen an,die den sicheren Betrieb von Anlagen, Lösungen, Maschinen, Geräten und/oderNetzwerken unterstützen. Sie sind wichtige Komponenten in einemganzheitlichen Industrial Security-Konzept. Die Produkte und Lösungen vonSiemens werden unter diesem Gesichtspunkt ständig weiterentwickelt. Siemensempfiehlt, sich unbedingt regelmäßig über Produkt-Updates zu informieren.

Für den sicheren Betrieb von Produkten und Lösungen von Siemens ist eserforderlich, geeignete Schutzmaßnahmen (z. B. Zellenschutzkonzept) zuergreifen und jede Komponente in ein ganzheitliches Industrial Security-Konzeptzu integrieren, das dem aktuellen Stand der Technik entspricht. Dabei sind aucheingesetzte Produkte von anderen Herstellern zu berücksichtigen.Weitergehende Informationen über Industrial Security finden Sie unterhttp://www.siemens.com/industrialsecurity.

Um stets über Produkt-Updates informiert zu sein, melden Sie sich für unserenproduktspezifischen Newsletter an. Weitere Informationen hierzu finden Sieunter http://support.automation.siemens.com.

Page 3: Applikationsbeschreibung y 06/2014 Qt/C++ Beispiel einer ... · Inhaltsverzeichnis Qt/C Client-Server-Applikation Beitrags-ID: 90278134, V1.0, 06/2014 3 ¤S i e m e n s A G 2 0 1

Inhaltsverzeichnis

Qt/C Client-Server-ApplikationBeitrags-ID: 90278134, V1.0, 06/2014 3

Siem

ens

AG20

14Al

lrig

hts

rese

rved

InhaltsverzeichnisGewährleistung und Haftung ...................................................................................... 2

1 Client-Server-Struktur ....................................................................................... 4

1.1 Aufgaben und Einsatzmöglichkeiten .................................................... 41.2 Beispiel einer Client-Server Architektur ............................................... 41.3 Software-Komponenten........................................................................ 61.3.1 Verwendete Komponenten ................................................................... 6

2 Ausarbeitung der Server-Applikation .............................................................. 7

2.1 Projekteinstellungen ............................................................................. 72.2 NcPlcServer ......................................................................................... 82.3 Hotlink................................................................................................. 122.4 Ausgabe der Datei und Bibliothek-Erstellung .................................... 15

3 Einbinden der Server-Applikation in einen Client ........................................ 16

3.1 Vorbereitung ....................................................................................... 163.1.1 Projekt anlegen .................................................................................. 163.1.2 Server-Dateien in Projektordner kopieren .......................................... 163.1.3 NcPlcServer.h in Projekt einfügen ..................................................... 163.1.4 Header-Datei der Form mit NcPlcServer.h und NcPlcServer.lib

verlinken ............................................................................................. 163.2 Durchführung ...................................................................................... 183.2.1 Hotlink auf Variable in Konstruktor einrichten .................................... 183.2.2 Hotlink ansprechen ............................................................................. 183.2.3 Client vom Server lösen und Hotlink trennen ..................................... 183.2.4 Ergebnis ............................................................................................. 18

4 Ansprechpartner .............................................................................................. 19

5 Historie.............................................................................................................. 19

Page 4: Applikationsbeschreibung y 06/2014 Qt/C++ Beispiel einer ... · Inhaltsverzeichnis Qt/C Client-Server-Applikation Beitrags-ID: 90278134, V1.0, 06/2014 3 ¤S i e m e n s A G 2 0 1

1 Client-Server-Struktur

Qt/C Client-Server-ApplikationBeitrags-ID: 90278134, V1.0, 06/2014 4

Siem

ens

AG20

14Al

lrig

hts

rese

rved

1 Client-Server-Struktur1.1 Aufgaben und Einsatzmöglichkeiten

Eine Client-Server-Architektur dient dazu Anfragen aus der Eingabe des HMI(Client) über eine Server-Applikation zu verwalten und geordnet zu bearbeiten.Mehrere Clients treten beispielsweise bei mehrkanaligen Maschinen auf. Ein Kanal(HMI) dient der Bearbeitung eines Werkstücks, der zweite Kanal steuert auf einerseparaten HMI ein Hintergrundmagazin zur Werkzeugsortierung.

Gründe für eine Client-Server-Applikation sind folgende: Der Server regelt die Kommunikation zwischen Clients und NC-, PLC-, sowie

Antriebs- und Maschinendaten Eine geordnete Struktur erleichtert den HMI-Service (insb. bei verschiedenen

Maschinenreihen). Bei Zugriff mehrerer Clients auf ein Datum, erfolgt die Abarbeitung

nacheinander. Somit können Fehlzugriffe vermieden werden. Durch Einbau bestimmter Funktionen, z.B. eines Log-Service, kann der Server

Rückschlüsse auf Fehlverhalten der Software geben Der Server könnte beim HMI-Hochlauf gestartet werden und bereits wertvolle

Informationen für seine Clients im Vorfeld bereitstellen Der Server kann so konfiguriert werden, dass er den Maschinenbautyp und die

Maschinenreihe erkennt und die relevanten HMI-Daten bereitstellt. DerHersteller muss nur ein HMI-Projekt aufspielen und erhält dadurch Vorteile imAbbau der Komplexität.

Bei komplexen Maschinen, z.B. mit Roboterbeladung, kann der Server dieKommunikation zum Roboter und Koordination der Beladung derWerkzeugmaschine steuern.

1.2 Beispiel einer Client-Server ArchitekturNachfolgend soll der Aufbau einer Client-Server Struktur erklärt werden. Dabei seidie Funktion auf den Aufruf eines Hotlinks zu einer NC-Variablen beschränkt.Analog zu dieser Struktur können noch weitere Funktionen wie z.B. ein Log-Service eingebunden werden. Das Programm ist auf der PCU-Lösung derSINUMERIK ablauffähig.Die Ausarbeitung in Visual Studio 2008 verlangt das Erzeugen einer eigenen .dllDatei (dynamische Bibliothek) für die Server-Applikation. In dieser .dll Datei wird inder unten aufgeführten Lösung die Erzeugung, Verwaltung und das Entferneneines oder mehrerer Hotlinks, sowie das Hinzufügen und Entfernen von Clientsgezielt geregelt. Im jeweiligen Client-Projekt muss die Bibliothek der Server-Applikation zusätzlich eingebunden werden, damit eine Kommunikation stattfindenkann.Je mehr Aufgaben eine eigene HMI erfüllen muss, desto wichtiger wird die Server-Applikation, da übergeordnete Funktionen und eine Verwaltung an Wichtigkeitgewinnen. Im aktuellen Beispiel findet die Abfragung einer NC-Variablen statt (Abb.2-1). Dies geschieht ausgehend vom Client_1 über die Server-Applikation mittelsQt-eigenen Signal/Slot-Verfahren (gelber Pfeil). Die Server-Applikation hält übereinen Hotlink Verbindung zum SlQCap-Service. Wenn sich der Wert der NC-Variable ändert, erhält der Client_1 eine Rückmeldung des veränderten Wertsmittels Signal/Slot. Dies gilt ebenfalls für alle weiteren Clients.

Page 5: Applikationsbeschreibung y 06/2014 Qt/C++ Beispiel einer ... · Inhaltsverzeichnis Qt/C Client-Server-Applikation Beitrags-ID: 90278134, V1.0, 06/2014 3 ¤S i e m e n s A G 2 0 1

1 Client-Server-Struktur

Qt/C Client-Server-ApplikationBeitrags-ID: 90278134, V1.0, 06/2014 5

Siem

ens

AG20

14Al

lrig

hts

rese

rved

SchemaDie folgende Abbildung zeigt das Prinzip einer Client-Server Architektur alsBeispiel zum Datenhandling der SINUMERIK.Abbildung 2-1 Prinzip der Client-Server Architektur

Vorausgesetzte KenntnisseFolgende Kenntnisse werden vorausgesetzt:

Programmiersprache C++ Programmierhandbuch zu SINUMERIK 840D sl 07/2012, SW 4.5 SP1 SINUMERIK Operate Programmierpaket für Qt/C++ Entwicklungsumgebung Qt

Page 6: Applikationsbeschreibung y 06/2014 Qt/C++ Beispiel einer ... · Inhaltsverzeichnis Qt/C Client-Server-Applikation Beitrags-ID: 90278134, V1.0, 06/2014 3 ¤S i e m e n s A G 2 0 1

1 Client-Server-Struktur

Qt/C Client-Server-ApplikationBeitrags-ID: 90278134, V1.0, 06/2014 6

Siem

ens

AG20

14Al

lrig

hts

rese

rved

1.3 Software-Komponenten

1.3.1 Verwendete Komponenten

Die Applikation wurde mit den nachfolgenden Komponenten erstellt:

Beispieldateien und ProjekteDie folgende Liste enthält alle Dateien und Projekte, die in diesem Beispielverwendet werden.

Komponente Anzahl Bestellnummer Hinweis

Visual Studio 2008Version9.0.21022.8 RTM

1 - Extern

Qt-Lizenz derFirma digia

1 - Extern

SINUMERIK 840DSL SINUMERIKINTEGRATECREATE MYHMI/3GL SOFTWAREVERSION 4.5 SP1

1 6FC5861-1YC41-1YA0

Erstellungs-Lizenz

SINUMERIK 840DSL SINUMERIKINTEGRATE RUNMYHMI / 3GL

1 6FC5800-0AP60-0YB0

RunTime-Lizenz

Page 7: Applikationsbeschreibung y 06/2014 Qt/C++ Beispiel einer ... · Inhaltsverzeichnis Qt/C Client-Server-Applikation Beitrags-ID: 90278134, V1.0, 06/2014 3 ¤S i e m e n s A G 2 0 1

2 Ausarbeitung der Server-Applikation

Qt/C Client-Server-ApplikationBeitrags-ID: 90278134, V1.0, 06/2014 7

Siem

ens

AG20

14Al

lrig

hts

rese

rved

2 Ausarbeitung der Server-ApplikationZunächst muss der Code der Server-Applikation geschrieben werden. Da imaktuellen Beispiel ein Hotlink per SlQCap-Service verwendet wird, sind zweiImplementierungsdateien (Quellcode-Dateien) empfehlenswert:

„NcPlcServer.cpp“– Verbindung zum Client wird geregelt– Vorbereitungen für einen Hotlink-Zugriff werden getroffen

„Hotlink.cpp“– Automatische Erstellung und Hochzählung des Hotlinks

2.1 Projekteinstellungen

Das Öffnen eines Win32-Projekts, der Anwendungstyp ist „Windows Anwendung“mit zusätzlicher Option „leeres Projekt“. Das Win32-Projekt wird mit Visual Studio2008 geöffnet. Die Projekteigenschaften haben folgende Einstellungen:

Konfigurationseigenschaften Allgemein Ausgabeverzeichnis.\Debug\outputKonfigurationseigenschaften Allgemein Zwischenverzeichnis.\DebugKonfigurationseigenschaften Projektstandards KonfigurationstypDynamische Bibliothek (.dll)Konfigurationseigenschaften Debugging Befehl(frei lassen)Konfigurationseigenschaften Linker Allgemein ZusätzlicheBibliothekenverzeichnisse"$(HMI_SL_PP_SUBST)$(HMI_SL_PP_CONFIGTYPE_DEBUG)\siemens\sinumerik\hmi\osal\ace\lib";"$(HMI_SL_PP_SUBST)$(HMI_SL_PP_CONFIGTYPE_DEBUG)\siemens\sinumerik\hmi\osal\qt\lib";"$(HMI_SL_PP_SUBST)$(HMI_SL_PP_CONFIGTYPE_DEBUG)\lib"Konfigurationseigenschaften Linker Eingabe ZusätzlicheAbhängigkeiten$(LIBQT_CORE_RELEASE) $(LIBQT_GUI_RELEASE)$(LIBQT_XML_RELEASE) slgfw.lib slgfwwidget.lib slcap.lib sltrc.libslmd.lib sltrp.lib slhmiutilitieslib.lib slaesvcadapter.libslfsfilesvcadapter.lib sltraceadapter.lib slarchiveadapter.libKonfigurationseigenschaften Linker Erweitert Importbibliothek.\Debug\output\$(ProjectName).libKonfigurationseigenschaften C/C++ Allgemein ZusätzlicheIncludeverzeichnisse:"$(HMI_SL_PP_SUBST)include";"$(HMI_SL_PP_SUBST)gui\include";"$(HMI_SL_PP_SUBST)$(HMI_SL_PP_CONFIGTYPE_DEBUG)\siemens\sinumerik\hmi\osal\qt\include";"$(HMI_SL_PP_SUBST)$(HMI_SL_PP_CONFIGTYPE_DEBUG)\siemens\sinumerik\hmi\osal\qt\include\qt";"$(HMI_SL_PP_SUBST)$(HMI_SL_PP_CONFIGTYPE_DEBUG)\siemens\sinumerik\hmi\osal\ace";"$(HMI_SL_PP_SUBST)$(HMI_SL_PP_CON

Page 8: Applikationsbeschreibung y 06/2014 Qt/C++ Beispiel einer ... · Inhaltsverzeichnis Qt/C Client-Server-Applikation Beitrags-ID: 90278134, V1.0, 06/2014 3 ¤S i e m e n s A G 2 0 1

2 Ausarbeitung der Server-Applikation

Qt/C Client-Server-ApplikationBeitrags-ID: 90278134, V1.0, 06/2014 8

Siem

ens

AG20

14Al

lrig

hts

rese

rved

FIGTYPE_DEBUG)\siemens\sinumerik\hmi\osal\ace\TAO";.\generatedfilesKonfigurationseigenschaften C/C++ PräprozessorWIN32;_DEBUG;_WINDOWS;_USRDLL;NCPLCSERVER_EXPORTS

Nach dem Hinzufügen der Header-Dateien müssen folgendeKonfigurationseigenschaften getroffen werden:

Konfigurationseigenschaften Benutzerdef. Buidschritt AllgemeinBefehlszeile"$(HMI_SL_PP_SUBST)$(HMI_SL_PP_CONFIGTYPE_DEBUG)\siemens\sinumerik\hmi\osal\qt\bin\moc.exe" "$(InputPath)" -o"$(InputDir)generatedfiles/moc_$(InputName).cpp"Konfigurationseigenschaften Benutzerdef. Buidschritt AllgemeinBeschreibungMOCing $(InputFileName)...Konfigurationseigenschaften Benutzerdef. Buidschritt AllgemeinAusgaben".\GeneratedFiles\moc_$(InputName).cpp"

2.2 NcPlcServer

Die Aufgaben des NcPlcServer sind: Clients auf Anfrage zum Server hinzufügen Zählen der Client-Anzahl Client-Verbindung zum Server-Objekt herstellen

– Erzeugen des Server-Objekt, falls noch nicht vorhanden– Trennen der Verbindung, falls kein Client mehr vorhanden

Verwaltung der Hotlink-Anfragen

Nachfolgend werden das Header-Datei des NcPlcServer und dieImplementierungs-Datei beschrieben.

//__________________________________________________________________// NcPlcServer.h --> Beschreibung der Headerdatei//__________________________________________________________________

#ifndef _H_NCPLCSERVER_INCLUDED#define _H_NCPLCSERVER_INCLUDED

#include <QtCore/QObject>#include <QtCore/QMap>#include "qlist.h"#include "slqcap.h"#include "Hotlink.h" // Spätere eigene Klasse Hotlink einbinden

// Erzeugen einer .lib zur späteren einfacheren Einbindung in Client#ifdef NCPLCSERVER_EXPORTS

#define NCPLCSERVER_API __declspec(dllexport)#else

#define NCPLCSERVER_API __declspec(dllimport)

Page 9: Applikationsbeschreibung y 06/2014 Qt/C++ Beispiel einer ... · Inhaltsverzeichnis Qt/C Client-Server-Applikation Beitrags-ID: 90278134, V1.0, 06/2014 3 ¤S i e m e n s A G 2 0 1

2 Ausarbeitung der Server-Applikation

Qt/C Client-Server-ApplikationBeitrags-ID: 90278134, V1.0, 06/2014 9

Siem

ens

AG20

14Al

lrig

hts

rese

rved

#endif

class NCPLCSERVER_API NcPlcServer : public QObject{ Q_OBJECT

public:

// Folgende Deklarationen sind für Client/Server//______________________________________________________________

//Verbindung zum Server erstellen/schließenstatic NcPlcServer* connectToServer(QString sClientName);static void disconnectFromServer(QString sClientName);

// Folgende Deklarationen sind für dynamische Hotlinks//______________________________________________________________

//Funktionen zum Verbinden/Erstellen eines Hotlinks Hotlink* attachToHotlink(QString sAddress);

void detachFromHotlink(Hotlink* p_hotlink);

//Liste aller Hotlink Objekte QList<Hotlink*> listHotlinkObjects;

// Folgende Deklarationen sind für Client/Server//______________________________________________________________private:

// Methoden zum Entfernen und Hinzufügen von Clientsvoid addClient(QString sClient);void removeClient(QString sClient);

// Variablenstatic NcPlcServer* p_serverObject;static long clientReferenceCounter;

// Liste aller Clients QList<QString> listClients;

};

#endif _H_NCPLCSERVER_INCLUDED

//____________________________________________________________________________//____________________________________________________________________________//____________________________________________________________________________

//__________________________________________________________________// NcPlcServer.cpp --> Beschreibung der Implementierungsdatei//__________________________________________________________________#include "NcPlcServer.h"

// Zeiger auf das Server ObjektNcPlcServer* NcPlcServer::p_serverObject = 0;

// Zähle Verbindungen Clientslong NcPlcServer::clientReferenceCounter = 0;

// Von Client Verbindung zum Server Objekt erstellen// bzw. Server-Objekt erzeugen falls nicht vorhanden//__________________________________________________NcPlcServer* NcPlcServer::connectToServer(QString sClientName){

Page 10: Applikationsbeschreibung y 06/2014 Qt/C++ Beispiel einer ... · Inhaltsverzeichnis Qt/C Client-Server-Applikation Beitrags-ID: 90278134, V1.0, 06/2014 3 ¤S i e m e n s A G 2 0 1

2 Ausarbeitung der Server-Applikation

Qt/C Client-Server-ApplikationBeitrags-ID: 90278134, V1.0, 06/2014 10

Siem

ens

AG20

14Al

lrig

hts

rese

rved

// Wenn noch kein Server Objekt existiertif ( 0 == p_serverObject )

{// Erstelle neues Server Objektp_serverObject = new NcPlcServer();

}

// Wenn Server Obekt existiertif ( p_serverObject )

{// Namen des neuen Clienten hinzufügenp_serverObject->addClient(sClientName);

}

// Referenz der Clients erhöhen clientReferenceCounter++;

return p_serverObject;}

// Verbindung zum Server trennen//__________________________________________________void NcPlcServer::disconnectFromServer(QString sClientName){

// Wenn noch Clients mit dem Server verbunden sindif ( 0 < clientReferenceCounter )

{// Wenn Server Objekt noch existiert, Client trennenif ( p_serverObject )

p_serverObject->removeClient(sClientName);

// Referenz der Clients dekrementierenclientReferenceCounter--;

// Wenn kein Client mehr vorhandenif ( 0 == clientReferenceCounter ){

// Server Objekt zerstörendelete p_serverObject;

} }}

// Neuen Client in Liste einfügen//__________________________________________________void NcPlcServer::addClient(QString sClient){

// Neuen Client an Ende der Liste hängen listClients.append(sClient);}

// Client aus Liste entfernen//__________________________________________________void NcPlcServer::removeClient(QString sClient){

// Index des Clients suchen und aus Liste entfernen listClients.removeAt(listClients.indexOf(sClient));}

// Hotlink erstellen bzw. an Hotlink anhängen//__________________________________________________Hotlink* NcPlcServer::attachToHotlink(QString sAddress){

// Status der Verbindung wird zurück gegeben

Page 11: Applikationsbeschreibung y 06/2014 Qt/C++ Beispiel einer ... · Inhaltsverzeichnis Qt/C Client-Server-Applikation Beitrags-ID: 90278134, V1.0, 06/2014 3 ¤S i e m e n s A G 2 0 1

2 Ausarbeitung der Server-Applikation

Qt/C Client-Server-ApplikationBeitrags-ID: 90278134, V1.0, 06/2014 11

Siem

ens

AG20

14Al

lrig

hts

rese

rved

bool bStatus = false;// Hilfsvariable, ob Hotlink bereits bestehtbool bAlreadyAttached = false;

// Iterator über die Liste der Hotlinks QList<Hotlink*>::iterator it;

// Über die Liste der Hotlinks iterierenfor (it = listHotlinkObjects.begin(); it != listHotlinkObjects.end(); it++)

{// Wenn Pfad bereits besteht folgende Anweisungif ( 0 == QString::compare((*it)->getAddress(),

sAddress.toUpper()) ){

// Hilfsvariablen setzenbAlreadyAttached = true;bStatus = true;// Referenz erhöhen(*it)->incrementReferenceCounter();// Schleife verlassenbreak;

} }

// Wenn Hotlink noch nicht bestehtif ( !bAlreadyAttached )

{// Neues Hotlink ObjektHotlink* p_hotlink = new Hotlink();// Hotlink auf Pfad erstellenbStatus = p_hotlink->createHotlink(sAddress);// Referenz erhöhenp_hotlink->incrementReferenceCounter();// Neues Hotlink Objekt an Liste anhängenlistHotlinkObjects.append(p_hotlink);// Referenz auf neues Hotlink Objekt zurück gebenreturn p_hotlink;

}

// Referenz auf bestehendes Hotlink Objekt zurück gebenreturn *it;

}

// Hotlink zerstören bzw. von Hotlink abhängen//__________________________________________________void NcPlcServer::detachFromHotlink(Hotlink* p_hotlink){

// Referenz verringern, wenn 0...if ( (p_hotlink)->decrementReferenceCounter() )

{//...dann Hotlink entfernenlistHotlinkObjects.removeAt(listHotlinkObjects.indexOf(p_hotlink));

}}

Page 12: Applikationsbeschreibung y 06/2014 Qt/C++ Beispiel einer ... · Inhaltsverzeichnis Qt/C Client-Server-Applikation Beitrags-ID: 90278134, V1.0, 06/2014 3 ¤S i e m e n s A G 2 0 1

2 Ausarbeitung der Server-Applikation

Qt/C Client-Server-ApplikationBeitrags-ID: 90278134, V1.0, 06/2014 12

Siem

ens

AG20

14Al

lrig

hts

rese

rved

2.3 Hotlink

Die Aufgaben des Hotlinks sind: Erstellung einer Hotlink-Verbindung per SlQCap-Service Hochzählen der Hotlinks Weiterleitung der Ergebnisse an die Interessenten

Nachfolgend werden das Header-Datei und die Implementierungs-Dateibeschrieben.

//__________________________________________________________________// Hotlink.h --> Beschreibung der Headerdatei//__________________________________________________________________#ifndef _H_HOTLINK_INCLUDED#define _H_HOTLINK_INCLUDED

#include <QtCore/QObject>#include <QtCore/QMap>#include "qlist.h"#include "slqcap.h"

class Hotlink : public QObject{ Q_OBJECT

public:

// c'tor & d'tor Hotlink(void); ~Hotlink(void);

// Methode zum Hotlink erstellenbool createHotlink(QString sAddress);

// Getter für Pfad des Maschinendatums QString getAddress();

// Methoden zum Bearbeiten der Referenzvoid incrementReferenceCounter();bool decrementReferenceCounter();

private:

// Cap Server Objekte zur Kommunikation SlQCap m_capServerHotlink; SlQCapHandle m_capHandleHotlink;

// Name des Objekts, bzw. der Pfad// z.B. /Channel/Parameter/R[U1,1]

QString m_sAddress;

// Variable um die Zugriffe zu zählenint m_iReferenceCounter;

signals:

// Daten zu Clients weiterleitenvoid hotlinkSignal(QVariant vValue);

private slots:

Page 13: Applikationsbeschreibung y 06/2014 Qt/C++ Beispiel einer ... · Inhaltsverzeichnis Qt/C Client-Server-Applikation Beitrags-ID: 90278134, V1.0, 06/2014 3 ¤S i e m e n s A G 2 0 1

2 Ausarbeitung der Server-Applikation

Qt/C Client-Server-ApplikationBeitrags-ID: 90278134, V1.0, 06/2014 13

Siem

ens

AG20

14Al

lrig

hts

rese

rved

// Daten von Cap Servervoid receiveCapDataSlot(SlCapErrorEnum, const QVariant&, constSlCapSupplementInfoType&);

};

#endif //_H_HOTLINK_INCLUDED

//__________________________________________________________________// Hotlink.h --> Beschreibung der Implementierungsdatei//__________________________________________________________________#include "Hotlink.h"

// Konstruktor//__________________________________________________Hotlink::Hotlink(void){

// Referenz wird auf null gesetzt m_iReferenceCounter= 0;}

// Destruktor//__________________________________________________Hotlink::~Hotlink(void){}

// Hotlink zum Cap Server erstellen//__________________________________________________bool Hotlink::createHotlink(QString sAddress){

// Pfad zur Adresse speichern m_sAddress = sAddress.toUpper();

// Statusvariablebool bStatus = false;

// Signal/Slot-Verbindung zu Cap Server erstellen bStatus = QObject::connect(&m_capServerHotlink,

SIGNAL(adviseData(SlCapErrorEnum, const QVariant&, constSlCapSupplementInfoType&)),this,SLOT(receiveCapDataSlot(SlCapErrorEnum, const QVariant&,const SlCapSupplementInfoType&)));

//Wenn Verbindung erfolgreich...if(true == bStatus)

{//...Handler und Pfad zuweisenSlCapErrorEnum eError = m_capServerHotlink.advise(sAddress,m_capHandleHotlink);

// Wenn Hotlink fehlschlägt, Verbindung nicht erfolgreichif(SL_CAP_OK != eError)

bStatus = false; }

// Status der Hotlink Verbindung zurück gebenreturn bStatus;

}

// Getter für Pfad des Maschinendatums

Page 14: Applikationsbeschreibung y 06/2014 Qt/C++ Beispiel einer ... · Inhaltsverzeichnis Qt/C Client-Server-Applikation Beitrags-ID: 90278134, V1.0, 06/2014 3 ¤S i e m e n s A G 2 0 1

2 Ausarbeitung der Server-Applikation

Qt/C Client-Server-ApplikationBeitrags-ID: 90278134, V1.0, 06/2014 14

Siem

ens

AG20

14Al

lrig

hts

rese

rved

//__________________________________________________QString Hotlink::getAddress(void){

return m_sAddress;}

// Zugriff Referenz hochzählen//__________________________________________________void Hotlink::incrementReferenceCounter(void){ m_iReferenceCounter++;}

// Zugriff Referenz verkleinern//__________________________________________________bool Hotlink::decrementReferenceCounter(void){

m_iReferenceCounter--;// Referenz darf nie kleiner null seinif(0 >= m_iReferenceCounter)

m_iReferenceCounter = 0;

// Wenn Referenz <= 0 dann Hotlink Objekt löschenif(m_iReferenceCounter == 0)

// return = true -> Objekt löschenreturn true;

// return = false -> Objekt NICHT löschenreturn false;

}

// Slot für Maschinendatum vom Cap Server//__________________________________________________void Hotlink::receiveCapDataSlot(SlCapErrorEnum cError, constQVariant& vData, const SlCapSupplementInfoType& cSuplInfo){

if(SL_CAP_OK == cError)//Daten werden über Hotlink Signal an alle Interessentenweiter geleitetemit hotlinkSignal(vData);

}

Page 15: Applikationsbeschreibung y 06/2014 Qt/C++ Beispiel einer ... · Inhaltsverzeichnis Qt/C Client-Server-Applikation Beitrags-ID: 90278134, V1.0, 06/2014 3 ¤S i e m e n s A G 2 0 1

2 Ausarbeitung der Server-Applikation

Qt/C Client-Server-ApplikationBeitrags-ID: 90278134, V1.0, 06/2014 15

Siem

ens

AG20

14Al

lrig

hts

rese

rved

2.4 Ausgabe der Datei und Bibliothek-ErstellungDie folgenden Schritte müssen durchgeführt werden, um die Ausgabedateieninklusive der Bibliothek zu erhalten:1. Projektmappenkonfiguration auf „Release“ stellen.2. Projekt Neu erstellen. Die moc-Dateien werden erzeugt3. Im Projekt einen neuen Filter „GeneratedFiles“ hinzufügen und die moc-

Dateien als vorhandenes Element einfügen4. Projekt Neu erstellen.Im Projektordner befindet sich nun im Ordner „Debug“ und dem Unterordner„output“ die Dialogprojektierung und .dll des Projekts.

Page 16: Applikationsbeschreibung y 06/2014 Qt/C++ Beispiel einer ... · Inhaltsverzeichnis Qt/C Client-Server-Applikation Beitrags-ID: 90278134, V1.0, 06/2014 3 ¤S i e m e n s A G 2 0 1

3 Einbinden der Server-Applikation in einen Client

Qt/C Client-Server-ApplikationBeitrags-ID: 90278134, V1.0, 06/2014 16

Siem

ens

AG20

14Al

lrig

hts

rese

rved

3 Einbinden der Server-Applikation in einenClient

3.1 Vorbereitung

3.1.1 Projekt anlegen

Im Folgenden wird ein neues HMI-Projekt erzeugt. Die zu treffenden Einstellungensind mit den Einstellungen der Dokumentation zum Programmierpaket„SINUMERIK_Operate_Schnelleinstieg_neuesProjekt.pdf“ identisch. Zusätzlich istfür die Anzeige des Hotlinks ein SlGfwLabel im Konstruktor der Formeinzurichten. In der Header-Datei der Form muss die Klasse des SlGfwLabelaufgerufen und eine Variable erzeugt werden werden.

Header-Datei:#include “SlGfwLabel.h”

private:SlGfwLabel* pItemLabel;

Konstruktor QuellCode-Datei:// Ein neues SlGfwLabel anlegenpItemLabel = new SlGfwLabel(QString::null, this);// Auf eine geeignete Position in der Form verschiebenpItemLabel->setGeometry(100,100,50,20);

3.1.2 Server-Dateien in Projektordner kopieren

Folgende Dateien aus dem Server-Projekt müssen in den Projektordner kopiertwerden:

Hotlink.h NcPlcServer.h NcPlcServer.lib (Name der lib trägt Projektname der Serverapplikation)

Die Datei NcPlcServer.dll muss bei der Implementierung auf die Steuerung in denUnterordner “appl“ kopiert werden.

3.1.3 NcPlcServer.h in Projekt einfügen

Die Datei NcPlcServer.h muss in das Projekt eingefügt werden:Projektmappe Header Files Hinzufügen Vorhandenes ElementNcPlcServer.h (aus dem gleichen Projektordner).

3.1.4 Header-Datei der Form mit NcPlcServer.h und NcPlcServer.libverlinken

In die Header-Datei der Form muss NcPlcServer.h und NcPlcServer.lib verlinktwerden. Dazu muss in der Definition der Header-Datei des Projekts folgendeshinzugefügt werden:

#include "NcPlcServer.h"//Name der lib trägt Projektname der Server-Applikation#pragma comment (lib,"NcPlcServer.lib")

Page 17: Applikationsbeschreibung y 06/2014 Qt/C++ Beispiel einer ... · Inhaltsverzeichnis Qt/C Client-Server-Applikation Beitrags-ID: 90278134, V1.0, 06/2014 3 ¤S i e m e n s A G 2 0 1

3 Einbinden der Server-Applikation in einen Client

Qt/C Client-Server-ApplikationBeitrags-ID: 90278134, V1.0, 06/2014 17

Siem

ens

AG20

14Al

lrig

hts

rese

rved

Slot für Hotlink, Pointer auf NcPlcServer und Hotlink, sowie Client-Namen erstellenIn der Header-Datei müssen Vorbereitungen für einen Server-Aufruf getroffenwerden.private: NcPlcServer* m_myServer; //Pointer auf NcPlcServer QString m_myName; //Variable für Namen des Clients Hotlink* m_myHotlink; // Pointer auf Hotlink in NcPlcServer

private slots:void hotlinkSlot(QVariant vData); //Slot für Hotlink

Page 18: Applikationsbeschreibung y 06/2014 Qt/C++ Beispiel einer ... · Inhaltsverzeichnis Qt/C Client-Server-Applikation Beitrags-ID: 90278134, V1.0, 06/2014 3 ¤S i e m e n s A G 2 0 1

3 Einbinden der Server-Applikation in einen Client

Qt/C Client-Server-ApplikationBeitrags-ID: 90278134, V1.0, 06/2014 18

Siem

ens

AG20

14Al

lrig

hts

rese

rved

3.2 Durchführung

3.2.1 Hotlink auf Variable in Konstruktor einrichten

Im Konstruktor muss folgender Code hinzugefügt werden. Zunächst wird der Nameder Form als Client-Name gespeichert// Name der Form speichernm_myName = rszName;

Danach wird die Verbindung zum Server erstellt// Verbindung zu Server wird erstelltm_myServer = NcPlcServer::connectToServer(m_myName);

Anschließend wird der Hotlink eingerichtet// Im Moment Hotlink auf R-Parameter 1 im Kanal 1m_myHotlink = m_myServer->attachToHotlink(„/channel/parameter/r[u1,1]“);

// Aufbau der signal/slot Verbindungbool bResult = QObject::connect(m_myHotlink,

SIGNAL(hotlinkSignal(QVariant)),this,SLOT(hotlinkSlot(QVariant)));

3.2.2 Hotlink ansprechen

Im hotlinkSlot das Ergebnis beim Server abholen://Slot um Daten zu empfangen/* NameDerForm muss entsprechend der angelegten Form heißen, hiernur als Beispiel */void NameDerForm::hotlinkSlot(QVariant vData){

pItemLabel->setValue(vData.toString());

}

3.2.3 Client vom Server lösen und Hotlink trennen

Im Destruktor der Form folgenden Code schreiben:// Client vom Server lösenNcPlcServer::disconnectFromServer(m_myName);// Hotlink des Servers lösenm_myServer->detachFromHotlink(m_myHotlink);// Hotlink der Form trennenbool bResult = QObject::disconnect(m_myHotlink,

SIGNAL(hotlinkSignal(QVariant)),this,SLOT(hotlinkSlot(QVariant)));

3.2.4 Ergebnis

Nach Projektmappenerstellung und Implementierung in die SINUMERIK-Umgebung bekommt das SlGfwLabel pItemLabel eine Änderung des R1-Parameters mit und zeigt den Wert an.

Dieses Beispiel ist vereinfacht und stellt nur die grundlegende Architektur einermöglichen Client-Server-Applikation dar.

Page 19: Applikationsbeschreibung y 06/2014 Qt/C++ Beispiel einer ... · Inhaltsverzeichnis Qt/C Client-Server-Applikation Beitrags-ID: 90278134, V1.0, 06/2014 3 ¤S i e m e n s A G 2 0 1

4 Ansprechpartner

Qt/C Client-Server-ApplikationBeitrags-ID: 90278134, V1.0, 06/2014 19

Siem

ens

AG20

14Al

lrig

hts

rese

rved

4 AnsprechpartnerSiemens AGIndustry SectorI DT MC MTS APC2Frauenauracher Straße 80D - 91056 Erlangenmailto: [email protected]

5 Historie

Tabelle 5-1

Version Datum Änderung

V1.0 06/2014 Erste Ausgabe