Q: Ich moechte auslesen, ob meine CPU in RUN oder STOP ist. Gibt es dafuer eine
Funktion?
A: Nein, keine spezialisierte. Verwende bei S7-300/400 daveReadSZL, um die SZL
Systemzustandslisten
zu lesen. Step7 macht das auch so. Informationen ueber IDs und Indizes findest
du in der Siemens
Dokumentation. Der Zustand aller CPU-LEDs ist in ID 25 (19hex), index 0.
Bei der S7-200 befindet sich diese Information irgendwo in den Systemdaten.
Q: Ich versuche, Libnodave mit einem Debugger nachzuvollziehen. Ich brauche Hilfe?
A: Es gibt kaum einen Grund, Libnodave mit einem Debugger zu untersuchen, ausser du
vermutest eine
der fogenden Sachen:
- Speicherprobleme (memory leaks)
- Bereichsueberschreitungen (range overflows) bei Zahlen oder Array-Indizes.
- Probleme bei der Uebergabe von Parametern an Bibliotheksfunktionen
Im letzteren Fall uebersetze besser Libnodave neu, nachdem du das
Kommentarzeichen vor
#define DEBUG_CALLS in nodave.c entfernt hast.
Um Probleme mit SPS und Adaptern zu finden, ist die Debug-Ausgabe der weit
bessere Weg.
Sie zeigt dir alles, was von und zu SPS/Adapter gesendet und empfangen wird und
sie
zeigt dir das, was wichtig ist, anstatt es aus Speicher und Registern
herauszufinden.
Q: Kannst du mir eine Dokumentation ueber die S7-Kommunikation oder das MPI-
Protokoll geben?
A: Nein, kann ich nicht. Was ich darueber weiss, stammt aus "reverse engineering".
Das
bedeutet, eine Menge Pakete mitzuschreiben, versuchen, einen Sinn
hineinzuinterpretieren
und sie mit eigenem Code nachzubilden. Wenn in Libnodave Dinge Namen haben, so
geben diese
meine gegenwaertige Hypothese wieder. Ich koennte versuchen, Dokumentation zu
schreiben, aber
die wuerde immer einen Schritt hinter dem Code hinterherhinken: Der Code kann an
der gegebenen
Hardware, also an der Realitaet, getestet werden, die Dokumentation nicht. Und
der Code ist
recht gut dokumentiert...
Q: Warum exportierst du alle diese Strukturen, wenn du sagst, man braucht sie fuer
keinerlei
Anwendung?
A: Sie sind nicht ganz bedeutungslos. Es sind auch eine Menge Funktionen dabei, die
"Zwischenschritte" duechfhren un normalerweise fr den Endanwender von keinem
Nutzen sind.
Dennoch werden sie aus der .dll exportiert.
- Das ist alles verfuegbar - im Sinne von Open Source - fueer diejenigen, die
eigene
Experimente machen wollen. Es mag ja Moeglichkeiten gebn, an die ich nicht
gedacht habe.
- Wenigstens einmal konnte ich einem Benutzer helfen, eine neue Funktion
(daveForce200) zu
implementiern. Er mute nur ca. 20 Zeilen in sein Programm einfuegen, die zum
groessten Teil
solche Zwischenschritte beim Zusammenstellen eines Pakets und zur Analyse der
Antwort
aufriefen, wie z.B. _daveAddData.
...
#define BCCWIN // if you work on windows
#include nodave.h // or nodavesimple.h, but NEVER both
#include setport.h // if your code works with serial connections
#include openSocket.h // if your code works with TCP/IP
...
Q: Ich versuche, libnodave aus dem Quellcode zu kompilieren. Es gibt Probleme.
A: - Du brauchst Libnodave nicht selbst zu kompilieren. Du wrdest das mit anderen
DLLs (Windows)
oderr .sos (gemeinsam genutzte Bibliotheken unter Linux) auch nicht machen.
Normalerweise
linkt man solche Bibliotheken dynamisch zum eigenen Code.
- Nichtsdestotrotz steht dir der Quellcode zur Verfuegunge und du moechtes ihn
oder nur die
benoetigten Teile rekompilieren usw..
- Du solltest wissen, dass die S7 die Motorola- (big endian, hchstwertiges byte
zuerst)
Byteanordnung (endianness) verwendet, waehrend Intel-Prozessoren Intel-
Byteanordnung
(little endian, niederwertigstes Byte zuerst). Auf Intel- und aehnlichen
Maschinen
muss Libnodave Mehbyte-Werte umsortieren. Dies geschieht mittels der
Funktionen daveGetS2(),
daveGetU2(), daveGetFloat() usw.. Der Code zur Konvertierung wird nur
mitkompiliert
wenn du DAVE_LITTLE_ENDIAN definierst. Ansonsten wird "big endian"
vorausgesetzt.
- Beachte, dass ich die publizierten Versionen von Libnodave mit gcc (fuer
Linux) und MSVC++
(fuer windows) kompiliere. Dazu verwende ich das Skript buildall um Linux und
Windows
Release-Versionen und Testprogramme auf einem Linux-Rechner zu erzeugen.
Buildall benutzt
seinerseits das make von Linux mit MAKEFILE.VC.WINE um den MSVC++-Compiler
fuer die
Windows-Versionen aufzurufen. Es gibt auch ein MAKEFILE.VC das auf einem
Windows-System
mittels nmake dasselbe leisten sollte, aber es koennte nicht auf dem neuesten
Stand sein :-(
Wenn du Zweifel hast, welche Compileroptionen oder Quelldateien noetig sind,
schau in
MAKEFILE.VC.WINE nach!
Q: Ich habe Probleme, auf Eingaenge zu schreiben. Koennen Sie mir hefen?
A: Zunaechst gibt es zwei Typen von "Eingaengen": 1. Periphere Adressen. Das ist
das, was Sie
mit daveP ansprechen, oder, in einen SPS-Programm, mittels L PEW <adresse>.
Zugriffe auf
diese Adressen sind echte Schreib- oder Lesezugriffe auf die Hardware und es
gibt keine
Moeglichkeit, die Hardware von Eingaengen zu schreiben.
2. Prozessabbild der Ein- und Ausgaenge. Das ist was Programmierer von Siemens-
SPS
normalerweise als Ein- und Ausgaenge ansprechen, wie bei:
L EW <Adresse>
or
U E 2.5
Zugriffe auf diese Adressen sprechen NICHT die Hardware sondern einen speziellen
Speicherbereich
an. Der Zustand der Eingaenge wird in jedem Zyklus in diesen Speicherbereich
kopiert, bevor
das Anwenderprogramm ausgefhrt wird. Wenn Sie mittels daveInputs dorthin
schreiben, werden die
Werte vor dem naechsten Zyklus ueberschrieben.
Ob Ihr SPS-Programm oder Ihre Libnodave-Anwendung die geschriebenen Werte
"sehen" wird, ist
ein zeitlicher Wettlauf.
Q: Kann das ("atomares" Schreiben auf 3 Bits) mit daveWriteBits() erreicht werden
oder muss
ich mehrere Variablen mit einer PDU schreiben?
A: Es kann NICHT mit daveWriteBits() erreicht werden, jedenfalls mit den CPUs die
ich kenne. Ob
das I know. Whether Schreiben mehrerer Variablen mit einer PDU atomar ist, weiss
ich nicht.
Wenn Sie das SPS-Programm verndern koennen, denke ich das Beste waere, die 3
Bits in ein Byte
zu packen, dessen andere Bits nicht gebraucht werden.