Starthilfe für Libnodave + USB Adapter für Visualisierung

EduardLucas

Level-1
Beiträge
6
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo alle zusammen,

Ich wollte ja schon lange einmal mit Libnodave anfangen, nun ist es endlich soweit, und die ersten startschwierigkeiten sind auch schon aufgetreten:

Vorhandener USB-MPI Adapter 6ES7-972-0CB20-0AX0
CPU: CPU 313C
Ständig mit der SPS verbundener WinXP Prof. Rechner für die Datenübertragung / Speicherung

Ziel:
Die SPS in 10 - 30 sekunden Abständen pollen sämtliche EW-AW-DB ´s holen und in MySQL Bank / Textdateien schreiben

Basierend auf diesen Puffer Dateien eine Visualisierung per PHP für Fernwartung
(Der PHP Part steht schon komplett:))

Ich hoffe das ihr mich etwas unterstützen könnt :D!!!!
 
Zuviel Werbung?
-> Hier kostenlos registrieren
ich sehe dein problem nicht
Wenn auf dem WinXP-PC nicht zufällig Step7 oder SimaticNET drauf ist, dann dürfte das Problem wohl hier liegen:

Vorhandener USB-MPI Adapter 6ES7-972-0CB20-0AX0
AFAIK werden USB-Adapter auf Windows-PCs nur per S7Onlinx.dll unterstützt, und dafür muß die entsprechende Software von Siemens installiert sein.


Gruß Axel
 
--

Hallo,

Erstmal grosses Dankeschön für die Schnelle Unterstützung, nachdem ich jetzt auf dem Rechner Step7 installiert habe, brauche etwas starthilfe für die parametrierung/programmierung.

Das heist im Klartext, wie muss ich ein Testprogramm für USB-Parametrieren, um nur einmal Daten von der SPS auslesen zu können (hab leider immer nur beispiele für com gefunden)

Und wie geht es weiter: Wie würde ein C Programmcode schnipsel aussehen in dem ich werte von libnodave in eine integer variable lade.

mfg michael
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Das heist im Klartext, wie muss ich ein Testprogramm für USB-Parametrieren, um nur einmal Daten von der SPS auslesen zu können (hab leider immer nur beispiele für com gefunden)

Und wie geht es weiter: Wie würde ein C Programmcode schnipsel aussehen in dem ich werte von libnodave in eine integer variable lade.
Schau Dir mal die testS7online.c an, da sollten die Antworten auf Deine Fragen drin stehen. In der Systemsteuerung mußt Du übrigens bei der PG/PC-Schnittstelle einen Zuganspunkt für den Zugriff über den USB-Adapter einstellen. Das ist dann der Zugangspunkt, den Du bei der testS7online.exe verwenden mußt.


Gruß Axel
 
In der Systemsteuerung mußt Du übrigens bei der PG/PC-Schnittstelle einen Zuganspunkt für den Zugriff über den USB-Adapter einstellen. Das ist dann der Zugangspunkt, den Du bei der testS7online.exe verwenden mußt.
Du kannst auch S7ONLINE als Namen des Zugangspunktes verwenden. Das ist derjenige, den Step7 benutzt. Nachteil: Step7 und Libnodave können nicht auf verschiedene Adapter und SPS zugreifen. Vorteil: Du kannst mit Step7 probieren, ob Zugangspunkt und Verbindunpsparameter funktionieren.
Warnung: Step7 und Libnodave nicht gleichzeitig auführen, geht gar nicht oder meistens nicht.
 
Es klappt, zum Teil!

Hallo,

Also die Starthilfe hat ja schon mal Prima geklappt.
Sehe ich das richtig das ich nur den inhalt meines db´s nicht bekomme weil das testprogramm versucht 2 kb auf einmal zu lesen, und das meine 313 cpu nicht verkraftet?
db7_cut.jpg


Deswegen habe ich mich auch gleich versucht ein programm zu schreiben, leider bisher ohne erfolg :confused:
Nachdem ich am anfang mit dem include der header datei gekämpft, und nun erfolgreich das mit dem #define bccwin auch endlich mal kapiert habe,
komme ich mit der Programmierung nicht weiter.

D.h. wie fange ich an, wo muss ich welche variablen deklarieren, welche sachen müssen wie aufgerufen werden?
Ich habe schon probiert aus dem tests7online.c etwas für mich passendes herauszufischen, aber man merkt halt doch das ich in sachen c erst anfänger bin.
Falls ihr also ein Anfängerprogrammierbeispiel zum DB auslesen habt, nur her damit!

mfg michi
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
Die Option many ist nur dazu da, um die Funktion daveReadManyBytes() zu testen, die lange Datenblöcke automatisch durch mehrere Aufrufe von daveReadbytes() liest. Schau in den Quelltext wieviele Bytes es sein sollen und leg einen entsprechend langen DB7 an. Wenn die CPU die Länge nicht unterstützt, merkst du es beim anlegen.
Ok, ich guck ja schon für dich, 2000 sind es...
 
Sehe ich das richtig das ich nur den inhalt meines db´s nicht bekomme weil das testprogramm versucht 2 kb auf einmal zu lesen, und das meine 313 cpu nicht verkraftet?

Also das mit den 2000 bytes konnte ich s.o. schon noch herausfinden.

Das ganze bringt mir aber von der Seite her noch nicht viel mehr, da ich eine schlichte konsolenanwendung brauche die mir über die s7online.dll einen bestimmten inhalt eines db´s ausliest.

Ich hab es auch schon öfters mit einem Beispiel probiert das, denke ich, von Axel stammen müsste:

_daveOSserialType fds;
daveInterface * di;
daveConnection * dc;
int res;
fds.rfd=setPort('COM1', '38400', 'O');
fds.wfd=fds.rfd;
if (fds.rfd > 0) {
di = daveNewInterface(fds, "IF1", 1, daveProtoMPI, daveSpeed187k);
daveSetTimeout(di,5000000);
if (daveInitAdapter(di) == 0) {
dc = daveNewConnection(di, 2, 0, 3);
if (daveConnectPLC(dc) == 0) {
if (daveReadBytes(dc, daveDB, 1, 0, 2, NULL) == 0) {
res = daveGetS16(dc);
}
}
}
}

allerdings bekomme ich beim kompilieren folgende fehlermeldungen:

fds.rfd=setPort('COM1', '38400', 'O');
^^
Zu viele Zeichen in der Konstante "setPort": Bezeichner wurde nicht gefunden

(Ja ich weis das diese beispiel für den zugriff über die serielle schnittstelle gedacht ist, und ich eigentlich über die s7online draufkommen will) aber man nimmt was man kriegen kann

mfg michi
 
Ich habe keine Lust, anderer Leute Code zu lesen. Auf Anhieb sehe ich aber keine includes, wie soll dein Compiler also setport kennen?
Für eine Konsolenanwendung brauchst du doch nur an testS7online.c ein paar Kleinigkeiten zu verändern. ICH compiliere das mit gnu make und Microsoft C++ unter Linux und Wine, MAKEFILE.VC.WINE. Es sind aber auch Makefiles und Batchdateien für Windoof da.
Wer es mit der IDE machen will, muß selbst wissen, wie das geht, ich habe keine.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Ich hab es auch schon öfters mit einem Beispiel probiert das, denke ich, von Axel stammen müsste:
Von mir stammt nur das, was für Delphi und Lazarus gemacht ist. Der ganze Rest ist Zottels geniales Werk ... :cool:

Code:
_daveOSserialType fds;
daveInterface * di;
daveConnection * dc;
int res;
fds.rfd=setPort('COM1', '38400', 'O');
...
allerdings bekomme ich beim kompilieren folgende fehlermeldungen:

fds.rfd=setPort('COM1', '38400', 'O');
^^
Zu viele Zeichen in der Konstante "setPort": Bezeichner wurde nicht gefunden
Da der Compiler daveInterface und daveConnection kennt, hast Du den Include für die nodave.h wohl drin, aber der für die setport.h fehlt wohl, und daher findet der Compiler wohl eine falsche, aber gleichlautende Funktion in der Standardbibliothek.

Zottel mag mich korrigieren, aber AFAIK brauchst Du setPort für die Kommunikation per s7online überhaupt nicht. Das richtige Beispiel dafür findest Du auch nicht in der testMPI.c, sondern in der testS7online.c (hatte ich bereits erwähnt ... :rolleyes:).


Gruß Axel
 
Hallo

wieso das ich nun auf das einfache c beispiel umgestiegen bin und nicht einfach die tests7online.c neu kompiliere?
Weil ich die Dinger einfach nicht durch meinen Compiler bringe:confused:
Ich kann gerne die Fehlermeldungen hier posten wenn sie gewünscht sind, denn ich würd schon lieber mit der s7online version weitermachen.
Ich habe es eben hier weiterversucht da ich hier mittlerweile nur noch 1 Fehlermeldung anstatt 12 erhalte.


Also hier nochmal den verw. Code:

#define BCCWIN
#include "nodave.h"
#include "setport.h"
#include <stdio.h>

int main(){
_daveOSserialType fds;
daveInterface * di;
daveConnection * dc;
int res;
fds.rfd=setPort('COM1',38400,'o');
fds.wfd=fds.rfd;
if (fds.rfd > 0) {
di = daveNewInterface(fds, "IF1", 1, daveProtoMPI, daveSpeed187k);
daveSetTimeout(di,5000000);
if (daveInitAdapter(di) == 0) {
dc = daveNewConnection(di, 2, 0, 3);
if (daveConnectPLC(dc) == 0) {
if (daveReadBytes(dc, daveDB, 1, 0, 2, NULL) == 0) {
res = daveGetS16(dc);
}
}
}
}

}

Dazu die Entsprechende Fehlermeldung:
(die incl. "setport.h" hatte ich vorher auch drin)
1>c:\cworkplace\nodav\nodav\main.cpp(11) : error C2664: 'setPort': Konvertierung des Parameters 1 von 'int' in 'char *' nicht möglich
1> Die Konvertierung eines ganzzahligen Typs in einen Zeigertyp erfordert ein reinterpret_cast-Operator oder eine Typumwandlung im C- oder Funktionsformat

wenn ich die Baudrate noch in hochkommas stelle erhalte ich noch folgenden error zusätzlich:
1>c:\cworkplace\nodav\nodav\main.cpp(11) : error C2015: Zu viele Zeichen in der Konstante

Verwendete Compiler:
Dev C++;Visual Studio 8.0; Visual C++ 2005 Express Edition

mfg michi
 
wieso das ich nun auf das einfache c beispiel umgestiegen bin und nicht einfach die tests7online.c neu kompiliere?
Weil ich die Dinger einfach nicht durch meinen Compiler bringe:confused:
Ich kann gerne die Fehlermeldungen hier posten wenn sie gewünscht sind, denn ich würd schon lieber mit der s7online version weitermachen.
Ich habe es eben hier weiterversucht da ich hier mittlerweile nur noch 1 Fehlermeldung anstatt 12 erhalte.
In Deinem ersten Post steht, daß Du unter WinXP mit einem USB-MPI-Adapter per libnodave mit einer SPS kommunizieren willst. Libnodave unterstützt USB unter WinDoof nicht native. USB kannst Du nur per Umweg über S7online verwenden. Die testMPI.c ist für direkte Kommunikation mit dem MPI-Adapter gemacht, ist also nicht das einfachere Beispiel im Vergleich zu testS7online.c, sondern das Beispiel für ein komplett anderen Kommunikationsweg.

Glaub's mir endlich, selbst wenn Du in der testMPI.c weniger Compilerfehler bekommst, bringt die Dich nicht schneller ans Ziel, weil Du mit der fertigen .exe mit Deiner Hardware unter Windows ganz einfach nichts (nothing, rien, nada, niente) anfangen kannst.

Compilier die testS7online.c, und stell die Fehlermeldungen hier rein, dann haben wir wenigstens 'ne Chance, Dir zu helfen.


Gruß Axel
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Servus,

Ich will euch natürlich nicht die Chance nehmen mir zu helfen:eek: das war so ziemlich das letzte was ich mit meinen fragen hier erreichen will.

Was ich euch natürlich hätte sagen sollen, das ich mir schon länger einen Siemens Com/Mpi Adapter besorgt habe, und auf der com schiene weitermachen werde, aufgrund weniger fehlermeldungen.

So, ich hoffe das ihr mir trotz manchen missverständnissen trotzdem weiterhelfen könnt:rolleyes:

mfg michi
 
Was ich euch natürlich hätte sagen sollen, das ich mir schon länger einen Siemens Com/Mpi Adapter besorgt habe, und auf der com schiene weitermachen werde, aufgrund weniger fehlermeldungen.
Das ändert natürlich einiges ... :rolleyes:

So, ich hoffe das ihr mir trotz manchen missverständnissen trotzdem weiterhelfen könnt:rolleyes:
Dann fangen wir doch gleich mal an: ;)

Code:
fds.rfd=setPort('COM1',38400,'o');
Dazu die Entsprechende Fehlermeldung:
(die incl. "setport.h" hatte ich vorher auch drin)
1>c:\cworkplace\nodav\nodav\main.cpp(11) : error C2664: 'setPort': Konvertierung des Parameters 1 von 'int' in 'char *' nicht möglich
1> Die Konvertierung eines ganzzahligen Typs in einen Zeigertyp erfordert ein reinterpret_cast-Operator oder eine Typumwandlung im C- oder Funktionsformat
Das ist logisch, die Baudrate muß als Zeichenkette übergeben werden, ist in der setPort so definiert.

wenn ich die Baudrate noch in hochkommas stelle erhalte ich noch folgenden error zusätzlich:
1>c:\cworkplace\nodav\nodav\main.cpp(11) : error C2015: Zu viele Zeichen in der Konstante
Die Meldung betrifft die beiden Parameter name und baud der Funktion setPort. Du setzt die Parameter in einfache Hochkommas, aber bei C werden Zeichenketten in Doppelhochkommas gesetzt. Beim Parameter parity wiederum handelt es sich um ein einzelnes Zeichen (char), das wird bei C in einfache Hochkommas gesetzt.


Gruß Axel
 
Zurück
Oben