S7 <> PC über Ethernet

joker76

Level-1
Beiträge
48
Reaktionspunkte
2
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo,

für eine Projektarbeit haben wir uns gedacht, daß wie eine S7-Steuerung an ein PC über Ethernet verbinden.

Am PC wollten wir dann, die Prozessdaten mit einem PHP-Skript in eine SQL-Datenbank schreiben, und diese auch als Html-Seite im Intranet zur Verfügung stellen.


Hat einer sowas ähnliches schon realisiert ?
SPS und Ethernet CP haben wir, was brauchen wir aber PC-seitig ?

Danke
 
Libnodave

Hallo,

für unsere Schulprojekt haben wir uns für Libnodave entschieden.

Nun stehe ich noch vor ein paar Verständnisprobleme.

Werde die einzelnen Programme hintereinander mit entsprechender Parametrierung aufgerufen?

Oder muss ich ein C-Programm schreiben, in welchenm die
C-Quelldateien eingebunden werden ?

Unser Ziel ist es, aus einem Datenbaustein über Ethernet ein Bereich von 64 Integerwerte auszulesen, um diese dann in eine Datei zu schreiben.


Um jede Hilfe wäre ich Dankbar. :cry:
 
Re: Libnodave

joker76 schrieb:
Hallo,

für unsere Schulprojekt haben wir uns für Libnodave entschieden.
Am Anfang mancher Bedienungsanleitung wird dem Benutzer su seiner Wahl gratuliert...
Nun stehe ich noch vor ein paar Verständnisprobleme.

Werde die einzelnen Programme hintereinander mit entsprechender Parametrierung aufgerufen?
Die verschiedenen Programme sind dazu gedacht, verschiedene Übertragungsverfahren (MPI; PPI, Ethernet mit CP, Ethernet mit IBH Link) zu testen.
Da ihr einen CP habt, ist testISO_TCP das richtige für euch.
Bezüglich der Parameter: Ruft es ohne jedes Argument auf einer Kommandozeile (DOS-Box) auf. Es sagt dann, was es versteht.
Die beiliegenden Programme sind nur zum Test gedacht und sind nicht wirklich nützlich.
Sie haben zum Beispiel keine Parameter, um ihnen gezielt mitzutelen, was sie aus der SPS lesen sollen.
Libnodave an sich ist eine Bibliothek. Das heißt, sie enthält ein paar spezielle Funktionen zum Einbau in eigene Programme.
Oder muss ich ein C-Programm schreiben, in welchenm die
C-Quelldateien eingebunden werden ?
Du mußt keins von beiden. Statt C kannst du auch Pascal benutzen. Von den Dateien mußt du die header Dateien nodave.h und setport.h in dein Programm einbinden, wenn du in C programmierst.
Bei Pascal (oder Delphi) must du nodave.pas benutzen (mit uses nodave.pas).
Beim linken mußt du angeben, daß die Bibliothek libnodave als dynamische Bibliothek eingebunden werden soll. Auf windows ist dazu die Datei libnodave.lib erforderlich, die mitgeliefert wird.
Dies führt dazu, daß dein Programm später beim start Windows (oder Linux?) auffordert, die Bibliothek libnodave zu laden, worauf ihre Funktionen deinem Programm zur Verfügung stehen.
Unser Ziel ist es, aus einem Datenbaustein über Ethernet ein Bereich von 64 Integerwerte auszulesen, um diese dann in eine Datei zu schreiben.
Wenn du dir den code in testISO_TCP.c anschaust, siehst du vielleicht, daß ein entsprechendes Programm durch einige Änderungen daraus erzeugt werden kann:
1. testISO_TCP liest ja schon 64 bytes von DB1. (Zeile 314 ff.). Was, wieviel und woher es liest wird durch die Parameter von daveReadBytes bestimmt.
daveReadBytes(dc, area, DBnummer, start, anzahl, puffer). Die Nummer des DBs müßt ihr anpassen. Weiterhin sind 64 Integer 128 bytes. Ihr müßt also die Anzahl auf 128 setzen.
Wenn Ihr nich ab Datenbyte 0 beginnen wollt, müßt ihr auch die Startadresse ändern.
Schließlich druckt das Testprogramm nur die ersten 2 und den letzten Wert aus.
Ihr könnt in einer Schleife 64 mal daveGetWord(dc) aufrufen. Das holt jedes mal den nächsten Wert als Wort aus dem internen Puffer. Diesen Wert könnt ihr ausdrucken.

Von dem Testprogramm könnt ihr danach alles streichen, was nicht nötig ist. Das meiste ist für euch nicht nötig.

Das entstandene Programm schreibt euch nun die 64 Werte hintereinander auf den Bildschirm. Um in eine Datei zu schreiben, ruft ihr nun einfach.
meinprog >meinedatei auf.
Statt auf den Bildschirm zu schreiben, schreibt es nun in die neu erstellte Datei meinedatei.

Auch in PHP kann man das ganz leicht einbinden: PHP kennt einen Befehl (habe den Namen gerade nicht parat), um ein externes Programm auszuführen. Die Ausgabe dieses Programmes steht danach in einem PHP-array und kann in die HTML-Seite eingebaut werden.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hi,

ich bräuchte noch einmal Starthilfe,

ich habe nun unter Visual Studio die C-Quellen importiert.
nodave.h und setport.h als Header-Dateien und testiso_TCP.

Nun bekomme ich beim Kompilieren ein Fehlermeldung :

-> fatal error C1189: #Fehler : Fill in what you need for your OS or API.<-

Welche Anweisung muss ich den jetzt bearbeiten ?
Ich bekomme irgendwie nicht weiter .... :cry:
 
joker76 schrieb:
Hi,

ich habe nun unter Visual Studio die C-Quellen importiert.
nodave.h und setport.h als Header-Dateien und testiso_TCP.
nodave.h brauchst du immer, setport.h für serielle Verbindungen, openSocket.h für Ethernet Verbindungen. Du brauchst also openSocket,h
Nun bekomme ich beim Kompilieren ein Fehlermeldung :
-> fatal error C1189: #Fehler : Fill in what you need for your OS or API.<-
Du must die Compilerdirektiven BCCWIiN und LITTLEENDIAN definieren, z.B. so:

#define BCCWIN
#define LITTLEENDIAN
#include nodave.h
#include openSocket.h

Für verschiedene Betriebssysteme enthält nodave.h kleine Teile in mehreren Varianten.
Diese Direktiven dienen dazu, die Variante auszuwählen.
 
Hallo,

ich habe die Define-Anweisungen in meinem Programm ergänzt und bekomme folgende Fehlermeldung.

error C2006: #include: Dateinamen erwartet, aber 'identifier' gefunden

Es sieht so aus, als ob die Header-Datei nodave.h einen Dateinamen erwartet.

Wie kann ich den ein Dateinamen als Argument einer Header-Datei mitgeben ?
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Sorry, es muß heißen:

#define BCCWIN
#define LITTLEENDIAN
#include "nodave.h"
#include "openSocket.h"

Ich habe zwar die Anführungszeichen vergessen, aber generell solltet ihr die Syntax von #include kennen, bevor ihr euch an so ein Projekt macht.
Schon in einem einfachen Programm wie HelloWorld.c (könnt ihr sicher in fast jedem Lehrbuch und im Internet finden) wird ein #include vorkommen:

#include <stdio.h>
Hier steht der Name nich in Anführungszeichen, sondern in spitzen Klammern:
Der Unterschied:
Bei #include <datei.h> wird datei.h in den vom Compiler-Hersteller vorgegebenen Verzeichnissen gesucht, bei #include "datei.h" im momentanen Arbeitsverzeichnis.

Ich möchte euch nochmal auffordern, zunächst einmal das Testprogramm testISO_TCP.c als Vorlage zu nehmen. Dort habt ihr für eigentlich alles ein Vorbild.
Allerdings fehlen die beiden Zeilen:
#define BCCWIN
#define LITTLEENDIAN
Sie sind dadurch ersetzt, daß im Makefile.Mak dem Compiler die Definitionen:
-DBCCWIN -DLITTLEENDIAN
mit der Kommandozeile übergeben werden. Beide Wege gehen. Der mit der Kommandozeile ist aber einfacher, wenn die Definitionen nicht immer gelten: Man braucht den Quelltext nicht zu ändern, sondern nur eine andere Kommandozeile.
So können die Programme unverändert unter Linux übersetzt werden, wobei in de Kommandozeile steht: -DLINUX -DLITTLEENDIAN

Habt ihr keinen Betreuer für die Projektarbeit, der euch so was erklärt? Nicht, daß es mir zuviel wäre, aber ich fürchte, wenn ihr jede Woche eine Frage dieser Art habt, wird die Sache ca. 2 Jahre dauern...
 
Hallo,

das mit den Include Einweisungen hatte ich schon versucht in der geklammerten Form zu schreiben. Nur bekommen ich dann ein anderen Fehler.

Nee, aber mein Problem ist, wir haben 1,5 Jahre halbherzig "C" gelernt und sind dann auf Java umgestiegen, so daß ich ein bischen auf C- raus bin.

Desweiteren hat mich mein "Betreuer" am Dienstag im Stich gelassen, und meinte ich sollte in der Hilfsdatei suchen.

Unser Hauptmerkmal liegt bei unseren Projekt auf Folgenden Punkt:

1. Wir wollen beweisen das mit Open-Source Software eine Kommunikation
zu einer Siemens-Steuerung möglich ist, ohne auf teuere Lizenzsoftware
zurückgreifen zu müssen.

2. Wir wollen beweisen das Open-Source Software Plattform unabhängig arbeiten kann, und nicht wie die teure Lizenzsoftware hauptsächlich für
Windows geschrieben ist.

3. Wollen wir eine Wartungssoftware schreiben, die auf "Lampp" oder "Wampp" basiert und auf einen handelsüblichen Rechner läuft.

4. Die Wartungssoftware soll den Betreiber ermöglichen, alle Informationen einer Anlage (Ventile etc.) auf Verschleiss (in unseren Fall Schaltspiele unsere Ventile) zu entnehmen.



Desweiteren wollte ich mich bei dir noch ganz herzlich für die präzisen und schnellen Anworten bedanken.
Solche Grundlegenden Anworten hätte ich mir eigentlich von meinem Betreuer gewünscht. :cry:
 
joker76 schrieb:
Hallo,
das mit den Include Einweisungen hatte ich schon versucht in der geklammerten Form zu schreiben. Nur bekommen ich dann ein anderen Fehler.
Welchen? Und warum geklammert (also <nodave.h>)? Dann müßte nodave.h im Standard-Includeverzeichnis des Compilers stehen.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hi,

ich bin das ganze mal Schrittweise angegangen und habe nach und nach die Headerdateien in mein Projekt importiert. Und vom der C-Datei Schritt für Schritt die einzelnen Funktionen.

Der erste Fehler (Warnung) ist die nicht benutzte, aber Definierte Variabel "c", in der Funktion "wait".
Kann man ja ausklammern oder löschen.

Der letzte Schritt war das Einfügen der Main, bis dahin hatte ich keine Fehlermeldungen beim kompilieren.

Nun kommt eine Fehlermeldung:

-> error C2440: '=' : 'int' kann nicht in 'void *' konvertiert werden

an dieser Stelle:

" fds.rfd=openSocket(102, argv[adrPos]);"

>Die Konvertierung eines ganzzahligen Typs in einen Zeigertyp erfordert ein reinterpret_cast-Operator oder eine Typumwandlung im C- oder Funktionsformat<

Das letzte ist wieder eine Warnung:

"warning C4244: 'argument' : Konvertierung von 'double' in 'float', moeglicher Datenverlust"


an dieser Stelle:

"d=toPLCfloat(d+1.1);"


Liegt es vielleicht an meinen Compiler (Microsoft Visual ?


Schönen Gruß
 
joker76 schrieb:
Der erste Fehler (Warnung) ist die nicht benutzte, aber Definierte Variabel "c", in der Funktion "wait".
Kann man ja ausklammern oder löschen.
Kann man ebensogut stehen lasse, Warnungen sind keine Fehler, nur Hinweise des Compiler, daß er da etwas "Ungewöhnliches" gefunden hat. In diesem Fall ist es einfach so:
Die Funktion wait() wurde für LINUX geschrieben. Als sie sich nicht genauso unter Windows verwenden ließ, habe ich mir nicht die Mühe gemacht, das "in Ordnung zu bringen", sondern habe den Code einfach durch #ifdef ausgelassen. Wait() tut auch nichts wichtiges; es wartet einfach auf einen Tastendruck, damit man Zeit hat, die Bildschirmausgabe zu lesen.
-> error C2440: '=' : 'int' kann nicht in 'void *' konvertiert werden
an dieser Stelle:
" fds.rfd=openSocket(102, argv[adrPos]);"
>Die Konvertierung eines ganzzahligen Typs in einen Zeigertyp erfordert ein reinterpret_cast-Operator oder eine Typumwandlung im C- oder Funktionsformat<

Das letzte ist wieder eine Warnung:
Ja das ist ein echter Fehler. Aber er wird eben von BorlandC nicht bemeckert. Grund ist: Unter Linux wird eine Datei oder ein Socket gleichermaßen mit einem file descriptor angesprochen. Unter Windows gibt es dafür 2 verschiedene Datentypen: Ein Datentyp "handle" für Dateien oder "socket" für Sockets (TCP-Verbindungen). Beides soll an dem gleichen Speicherplatz in daveOSserialType abgelegt werden. Der Platz reicht auch (sonst könnte es auch unter BorlandC nicht gehen). Aber die C-Compiler werden immer kritischer bezüglich der Prüfung von Datentypen...
Eine "saubere" Lösung wäre es, eine union der 2 Datentypen zu verwenden. Das kann ich für die nächste Version vorsehen, aber es erfordert eine Neuübersetzung der DLL.
Eine schnelle Lösung sollte folgendes sein:

fds.rfd=(void*)openSocket(102, argv[adrPos]);
"warning C4244: 'argument' : Konvertierung von 'double' in 'float', moeglicher Datenverlust"
an dieser Stelle:
"d=toPLCfloat(d+1.1);"
Wenn du willst, kannst du die Variable d als float statt als double deklarieren.
 
Zottel schrieb:
"warning C4244: 'argument' : Konvertierung von 'double' in 'float', moeglicher Datenverlust"
an dieser Stelle:
"d=toPLCfloat(d+1.1);"
Wenn du willst, kannst du die Variable d als float statt als double deklarieren.
Habe gerade gesehen, daß die Variable bereits float ist. Was hier passiert ist:
Der Compiler kodiert eine Multiplikation der float-Variablen d mit der Konstante 1.1, die er als double auffaßt. Das Ergebnis ist double, daher"Konvertierung 'double' in 'float', moeglicher Datenverlust" Dem kannst du abhelfen, indem du die Konstante als 1.1f schreibst. Dann soltte sie float sein.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hi,

so nun das kleine Problem mit dem Float hatte ich behoben und auch sonst gab es keine Schwierigkeiten.

Nun kann ich zwar mein Projekt kompilieren, bekomme aber beim erstellen der Datei einen Link-Fehler: LNK1136 Ungültige oder beschädigte Datei.


Kann es sein das mein VC6.0 die Borland-DLL nicht versteht ? :cry:


P.S. Ich habe mal versucht mit einen einfachen Link befehl die Datei libnodave.lib zu öffnen. Auch das führte zum Ergebnis das die Datei beschädigt ist.
 
joker76 schrieb:
Hi,

so nun das kleine Problem mit dem Float hatte ich behoben und auch sonst gab es keine Schwierigkeiten.

Nun kann ich zwar mein Projekt kompilieren, bekomme aber beim erstellen der Datei einen Link-Fehler: LNK1136 Ungültige oder beschädigte Datei.


Kann es sein das mein VC6.0 die Borland-DLL nicht versteht ? :cry:
Das habe ich heute schon einmal gelesen,
Linking...
libnodave.lib : fatal error LNK1136: invalid or corrupt file
Error executing link.exe.
(Beitrag von johannlinner von heute auf
http://sourceforge.net/forum/forum.php?thread_id=1266429&forum_id=205657
)
Hier aber mit dem wesentlichen Hinweis auf libnodave.lib.
Insgesamt allerdings zum ersten Mal. Ok, andere Leute haben Delphi genommen...
Ich glaube, es ist kein Problem mit der DLL, eher eines von:
1. VC6.0 versteht die datei libnodave.lib nicht (wahrscheinlich).
2. VC6.0 versteht irgendetwas in nodave.h so, daß es etwas anderes in der .lib oder .dll erwartet als drin ist.
Da kann ich dir jetzt wahrscheinlich nicht helfen. Mein Rat an den anderen Benutzer war:

Im file MAKEFILE.MAK kannst du sehen, daß libnodave.lib erzeugt wird durch:
($BCCPATH)implib libnodave.lib libnodave.dll
"implib" ist ein Werkzeugprogramm. Was es genau tut weiß der Teufel. Ich bin kein Experte für Windows. Vermutlich erzeugt es eine Liste der Funktionsnamen (und der Einsprungadressen?).
Es sollte ein zu VC gehöriges Tool geben, was dasselbe leistet. Damit libnodave.lib neu erzeugen und schauen, was passiert.

Das kanst du auch probieren.
Oder du probierst, die ganze DLL mit VC neu zu erzeugen.
Oder du probierst, nodave.c und openSocketw.c zu Objetdateien zu kompilieren und diese statisch in dein Programm einzubinden
Oder du besorgst dir die Borland-Werkzeuge.
Ansonsten muß du warten, bis sich einer meldet, der es mit VC zum Laufen bekommt und mir sagt, was dazu verändert werden muß.
 
>> Hätten die Borländer denn eine
> Einstelloption die lib so erstellen, daß man sie in VC++ ohne Umwege
> statisch laden kann ? (Für die Zukunft)

Nein, Borland und MS verwenden unterschiedliche Formate für ihre
Bibliotheken (OMF und COFF).
Du könntest dein Makefile im C++ Builder so anpassen, daß lib.exe
automatisch nach dem Erstellen aufgerufen wird.
Eine andere Möglichkeit ist, eine entsprechende Batchdatei zu schreiben und
diese als neues Projekt hinzuzufügen.
Die Batch wird dann automatisch gestartet wenn du 'Alle Projekte neu
erzeugen' auswählst.


Das habe ich bei meiner Suche für eine Lösung gefunden.

Scheinbar liegt es an den beiden unterschiedlichen Kompilern.

Als Lösung ist das dynamische Laden der DLL vorgeschlagen worden, aber ich habe es bis jetzt noch nicht geschaft.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
joker76 schrieb:
>> Hätten die Borländer denn eine
> Einstelloption die lib so erstellen, daß man sie in VC++ ohne Umwege
> statisch laden kann ? (Für die Zukunft)

Nein, Borland und MS verwenden unterschiedliche Formate für ihre
Bibliotheken (OMF und COFF).
Ist mir neu,aber kann wohl sein.
Du könntest dein Makefile im C++ Builder so anpassen, daß lib.exe
automatisch nach dem Erstellen aufgerufen wird.
Ich hätte vermutet, daß es eben lib.exe
Eine andere Möglichkeit ist, eine entsprechende Batchdatei zu schreiben und
diese als neues Projekt hinzuzufügen.
Die Batch wird dann automatisch gestartet wenn du 'Alle Projekte neu
erzeugen' auswählst.
Na ja, was du mit einer Batchdatei tust, kannst du auch von Hand auf der Kommandozeile tun. Kenne leider die MS-Tools nicht.
Das habe ich bei meiner Suche für eine Lösung gefunden.
Scheinbar liegt es an den beiden unterschiedlichen Kompilern.
Als Lösung ist das dynamische Laden der DLL vorgeschlagen worden, aber ich habe es bis jetzt noch nicht geschaft.
Ich hatte es so verstanden, daß eben für das dynamische Laden die .lib-Datei gebraucht wird...
Dynamisches Laden an sich bedeutet, daß der Inhalt von libnodave.dll nicht Bestandteil deines Programms wird. Der Linker sollte die Verweise auf die .dll in dein Programm intergrieren. Beim Start deines Programms wird dann (vom Windows-Programmlader) libnodave.dll in den Speicher geladen und die Verweise durch Sprungbefehle in den Specherbereich ersetzt, wo der Code von libnodave hingeladen wurde.
Mir scheint, daß der Linker eben aus libnodave.lib die Verweise entnehmen soll. Die Frage ist nun, ob lib.exe das Tool ist, was eine Liste der Verweise aus libnodave.dll erstellen kann.
Ansonsten gibt es noch ein freies Tool namens dlltool vom GNU Projekt.
Es gibt
 
joker76 schrieb:
1. Wir wollen beweisen das mit Open-Source Software eine Kommunikation
zu einer Siemens-Steuerung möglich ist, ohne auf teuere Lizenzsoftware
zurückgreifen zu müssen.

2. Wir wollen beweisen das Open-Source Software Plattform unabhängig arbeiten kann, und nicht wie die teure Lizenzsoftware hauptsächlich für
Windows geschrieben ist.

Mahlzeit,

beides ist mit endlichem Aufwand sicher technisch machbar.

Wird in Ihrem Projekt auch die Wirtschaftlichkeit
betrachtet? Die 'teuren' Lizenzkosten sind ja oft nur
ein kleiner Teil am Gesamtprojekt.

Viele Grüße

Gerhard Bäurle

Edit: -h
 
Nun kann ich's nicht lassen:
joker76 schrieb:
1. Wir wollen beweisen das mit Open-Source Software eine Kommunikation
zu einer Siemens-Steuerung möglich ist, ohne auf teuere Lizenzsoftware
zurückgreifen zu müssen.
Das IST bewiesen. Habe ich 2*365*24 Stunden laufen.
2. Wir wollen beweisen das Open-Source Software Plattform unabhängig arbeiten kann, und nicht wie die teure Lizenzsoftware hauptsächlich für
Windows geschrieben ist.
Warum quält ihr euch dann so, etwas, daß auf Linux entwickelt und mit Borlands Tools auf Windows portiert wurde, zuerst unter MSVC zum Laufen zu bringen?
Aber wenn es um die Demonstration a la 1 geht, und ihr wie ihr anderswo geschrieben habt, ihr immer nur einen DB oder einen Bereich daraus lesen wollt, kann ich euch auch das fertige Programm geben (mit BorlandC kompiliert).
deltalogic schrieb:
Mahlzeit,
beides ist mit endlichem Aufwand sicher technisch machbar.
Kostet mich nur 10 Minuten.
Wird ihn Ihrem Projekt auch die Wirtschaftlichkeit
betrachtet? Die 'teuren' Lizenzkosten sind ja oft nur
ein kleiner Teil am Gesamtprojekt.
Die Probleme, die hier bis jetzt behandelt wurden, entstehen durch 3 Teilaspekte:
1. joker76 ist mit seinem Werkzeugkasten unzureichend vertraut. Dies dominierte den Thread über die ersten 2/3 und er würde mit AGLink vermutlich nicht besser darstehen (ok, AgLink braucht keine conditional defines, da es nur für Windows ist. Wenn 64bit-Windows kommt, hat Deltalogic die Wahl, ebenfalls diesen Weg zu gehen oder eine getrennte Version auszuliefern und getrennt zu pflegen).
2. Die Benutzung fremder Bibliotheken bedeutet immer, sich in die entsprechende Programmierschnittstelle einzuarbeiten; das ist bei AgLink nicht anders. Für die Wirtschaftlichkeit bedeutet das, daß man immer die Einarbeitungszeit für das erste Projekt mit ansetzen muß.
3. Nun ist aufgetaucht, daß es eine Inkompatibilität zwischen Borland und MSVC zu geben scheint. Ein versierter C-Programmierer würde einfach die .DLL mit seinem MSVC neu erstellen und mir die nötigen Änderungen zur Verfügung stellen. Dafür wird er sicher nicht mehr als eine Stunde brauchen.
 
Zurück
Oben