libnodave und AVR von Atmel, kann man beides verheiraten?

poppycock

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

eins vorweg: Mein Technikerprojekt ist abgeschlossen und wurde schon von den Lehrern bewertet.
Als Visu habe ich mir etwas in VB.net und libnodave zusammengebaut und läuft auch echt problemlos!

Jetzt habe ich Urlaub und im Moment auch keinen Schulstress, darum möchte ich nun versuchen libnodave auf einem ATMega8 oder größer zum Laufen zu bringen.
Die Sprache C werde ich nach den Ferien intensiv bekommen, jedoch ist mir schon einiges vertraut, da ich für mein Projekt Mikrocontroller in ANSI-C programmiert habe.

Als Schnittstellenumsetzer soll ein ausgedienter RS232/MPI-Adapter verwendet werden. Demnach muss der ATMega nur RS232 beherrschen.

Mein Problem liegt darin, dass libnodave eine dll benötigt, die ich nicht auf den AVR dynamisch verlinken kann, da auf dem µC kein OS laufen soll.

Hat jemand schon mal probeweise versucht libnodave auf einem AVR lauffähig zu machen?
Ich werde mir mal die Sache nochmals annehmen, denn Zottel hat mir vor längerer Zeit mal kurz geholfen, jedoch aber nicht mit Quellcodes.
Aus Zeitmangel kam das Thema in die unterste Schublade und nun bin ich wieder daran interessiert.

Gruß,
poppycock
 
Warum LibNodave?

Hallo poppycock,

warum willst Du per LibNodave mit dem ATMega kommunizieren? Dann müßtest Du
auf dem ATMega das nicht offengelegte S7-Protokoll als Server implementieren.
Denke Dir doch ein eigenes Protokoll aus oder implementiere ein dokumentiertes
Standard-Protokoll wie RK512 oder besser Modbus-Slave.

Gruß
Harald
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo!

warum willst Du per LibNodave mit dem ATMega kommunizieren? Dann müßtest Du
auf dem ATMega das nicht offengelegte S7-Protokoll als Server implementieren.
Das nicht offengelegte S7-Protokoll muss ich doch gar nicht kennen, libnodave macht doch brav seinen Dienst.

Denke Dir doch ein eigenes Protokoll aus oder implementiere ein dokumentiertes
Standard-Protokoll wie RK512 oder besser Modbus-Slave.
In meinem Projekt bin ich den Weg über RS485 (nicht PB) gegangen, funktioniert super! Die Kommunikation mit den AVR-Teilnehmern hat ein selbstprogrammierter Baustein in der CPU übernommen.

Mein Vorhaben:
Der AVR-Master soll mit dem MPI-Adapter an die S7 angeschlossen werden.
An dem Master hängen Slaves, die vom Master abgefragt werden.
Hat der Master die benötigten Daten, soll dieser mittels UART die Daten über den MPI-Adapter an die CPU weitergeben.

Wenn du aber meinst, dass das nicht so sinnvoll ist, wie wäre dann der Weg über TCP/IP?
Ein CP343-1 ist vorhanden, ein Switch auch, jedoch kein Mikrocontroller mit Ethernetschnittstelle.
Bei diesem Weg weiß ich jedoch nicht, wie ich der CPU die Daten übermitteln kann. Ist das genau so wie eine Kommunikation mit RS232?

So könnte ich wohl auf libnodave verzichten, aber dann ist mir unklar, wie man eine Verbindung zwischen Ethernet-AVR und CP343-1 aufbaut.

Gruß,
poppycock
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo.

ich denke es soll vom ATMega aus auf eine S7 zugegrifffen werden.
Ja, das ist richtig, und zwar über den MPI-Umweg!
Man müsste doch "nur" die Quellcodes für C auf einem ATMega lauffähig machen.
Den Rest kann man doch vorerst über Makros realisieren, quasi:

if antwort(Teilnehmer_a)
{
libnodave_uart(Daten,Teilnehmer_a);
}

Gruß,
poppycock
 
Mein Vorhaben:
Der AVR-Master soll mit dem MPI-Adapter an die S7 angeschlossen werden.
An dem Master hängen Slaves, die vom Master abgefragt werden.
Hat der Master die benötigten Daten, soll dieser mittels UART die Daten über den MPI-Adapter an die CPU weitergeben.
OK, das habe ich so nicht aus Deinem Eröffnungsbeitrag 'rausgelesen.
Ich hab' da leider was falsches hineininterpretiert.

Wenn du aber meinst, dass das nicht so sinnvoll ist, wie wäre dann der Weg über TCP/IP?
Mein Vorschlag beruhte auf einer Fehlinterpretation Deines Vorhabens.

Trotzdem finde ich den alternativen Weg über Ethernet besser.
1. Ich schätze, das ist leichter zu programmieren, als LibNodave für den AVR umzusetzen, auch wenn der C-Quelltext
vorliegt. Zumindest die Socket-Dienste mußt Du so oder so selber implementieren.
2. Du wärst nicht mehr auf die Zielplattform S7 festgenagelt und könntest den AVR-Master auch mit anderen Geräten
und Steuerungen koppeln.

Bei diesem Weg weiß ich jedoch nicht, wie ich der CPU die Daten übermitteln kann. Ist das genau so wie eine Kommunikation mit RS232?
Wenn erst einmal die Verbindung zur S7 aufgebaut ist, dann ist der eigentliche Datenaustausch nicht komplizierter
als eine RS232-Kommunikation. Allerdings geht das Daten-Empfangen der S7 nicht ohne deren Zutun. In der Ziel-SPS
muß der Daten-Empfang programmiert werden. (Bei LibNodave müßte in der S7 nichts programmiert werden.)

Um der S7 die Auswertung der Empfangsdaten einfacher zu machen, würde ich zyklisch ein Telegramm fester Länge mit
den Daten von den Slaves senden. Eventuell noch ein kleines "Verwaltungs-Protokoll" in die Telegramme legen, falls
ein einziges Telegramm mit dem festen Aufbau für Dein Vorhaben nicht geeignet ist.
Für den S7-Programmierer ist es einfacher, wenn die Telegramme alle die gleiche Länge haben.

Der TCP-Verbindungsaufbau ist relativ einfach, ich würde aber der SPS den aktiven Verbindungsaufbau überlassen:
http://de.wikipedia.org/wiki/Transmission_Control_Protocol
Wenn Du nur Einweg-Daten zur SPS übertragen willst, wäre auch das einfache UDP-Protokoll geeignet:
http://de.wikipedia.org/wiki/User_Datagram_Protocol
Was in der S7-SPS zu tun ist siehe hier (besonders den Abschnitt Vergleich Protokolle):
Linkliste SIMATIC-Kommunikation über Ethernet

Dein Projekt klingt übrigens sehr interessant. Hut ab!
Und wenn ich das AVR-NET-IO - Fertigmodul von Pollin sehe, da bekomme ich fast Lust, mich selber mal mit den
modernen Mikrokontrollern zu beschäftigen. Von dem ATMega habe ich bis jetzt so gut wie null Ahnung.

Gruß
Harald
 
Avr

Und ist in der libnodave nicht schon irgendwas für den AVR ausgelegt??

Zumindest gibt es AVR als Compilerschalter in der nodave.h und nodave.c...
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Ah...

Ah so....

Aber welche DLL braucht den Libnodave? Man müsste sich halt eine Version von setport schreiben, welche irgenwie die avr schnitstelle benutzt und vielleicht noch was an den seriellen verbindungen anpassen, oder? Die ganze TCP/IP geschichte kann man ja weglassen...
 
Hallo.

@PN/DP:
Danke für die Links, die sind sehr informativ!
Was meinst du mit "Der Compiler ist nicht das Problem ..."?
Bin ich das Problem oder die dll? :cry:
Man müsste die Befehle aus der dll rausschreiben und "statisch" einbinden.

@Jochen Kühner:
Könntest du mir dabei helfen?
Ich brauche nur die MPI-Schnittstelle (original Siemens MPI-Adapter).
Es wird die libnodave.dll benötigt.

OK, das habe ich so nicht aus Deinem Eröffnungsbeitrag 'rausgelesen.
Ich hab' da leider was falsches hineininterpretiert.
Macht nichts, bin doch auch für jeden Denkanstoß dankbar!

Allerdings geht das Daten-Empfangen der S7 nicht ohne deren Zutun. In der Ziel-SPS
muß der Daten-Empfang programmiert werden. (Bei LibNodave müßte in der S7 nichts programmiert werden.)
Jetzt, nachdem ich eine Nacht darüber geschlafen habe, möchte ich doch nicht in die Hardwarekonfig der S7 eingreifen.
Es soll nach dem Motto: "Anstöpseln und freuen" funktionieren.
Eine Kommunikation ist nur mit einer S7 vorgesehen.
Es ist weder eine Schulaufgabe noch eine betriebliche. Ich interessiere mich halt dafür, wie die Daten von A nach B geschoben werden können.
Der Weg, wie das passiert, ist im Grunde egal. Dabei muss man aber Vor- und Nachteile der Wege beachten.
Habe halt gedacht, wenn ein PC diesen libnodave-MPI-Datenaustausch hinbekommt, könnte doch auch ein AVR eingesetzt werden.

Um der S7 die Auswertung der Empfangsdaten einfacher zu machen, würde ich zyklisch ein Telegramm fester Länge mit den Daten von den Slaves senden. Eventuell noch ein kleines "Verwaltungs-Protokoll" in die Telegramme legen, falls ein einziges Telegramm mit dem festen Aufbau für Dein Vorhaben nicht geeignet ist.
Für den S7-Programmierer ist es einfacher, wenn die Telegramme alle die gleiche Länge haben.
Das stimmt! Habe ich selber gemerkt und musste im SPS-Programm eine Art "Verwaltungsprotokoll" (ist aber sehr einfach gehalten) entwickeln.

Dein Projekt klingt übrigens sehr interessant. Hut ab!
Danke! Weiter unten beschreibe ich den Datenaustausch in meiner Projektarbeit.

Da könnt Ich noch diesen Thread empfehlen:
http://www.mikrocontroller.net/topic/106174
Dort gehts zwar um einen pprofibus Slave an der S7 CPU, aber so kann man ja auch daten austauschen.
Danke für den Link, werde mir das Thema reinziehen.
Zu beachten ist aber, dass ich dann die PB-Schnittstelle nicht auf "highspeed" laufen lassen kann, wenn die AVR-Slaves "nur" mit 19,2k senden.
Hier im Forum gibt es auch einen sehr guten Thread, der das Thema "Profibusteilnehmer selber bauen" behandelt.

Und ist in der libnodave nicht schon irgendwas für den AVR ausgelegt??
Zumindest gibt es AVR als Compilerschalter in der nodave.h und nodave.c...
Habe ich eine veraltete libnodave-Version?
Ich finde den Compilerschalter nicht. Außerdem habe ich mit diesen Schaltern noch nichts gemacht.
Muss man da etwas einstellen? Ich hatte mal probiert den Source im AVR-Studio zu kompilieren, da kam aber die Meldung, dass das OS nicht bekannt sei.

------------------------------

Nun aber zu der Datenübertragung in meiner Projektarbeit...
Die Arbeit wurde zwar schon bewertet, aber ich kenne das Ergebnis noch nicht.
Allerdings gingen bei den Lehrern alle Daumen nach oben, von daher kann ich wohl mit mindestens einer 3 rechnen! ;)
Darum kann ich noch nicht das Gesamtergebnis mitteilen, will ja auch nicht, dass ich Konkurrenz aus meiner Klasse bekomme! :ROFLMAO:
Anbei ist ein handgezeichneter Schaltplan, der den AVR mit der Beschaltung für die Kommunikation zeigt.
In meinem Projekt verwende ich keinen Stromsensor mehr, aber die Beschaltung habe ich für jeden Slave übernommen.
Die AVR-Slaves arbeiten als RS485-Teilnehmer, an der S7 hängt aber ein CP340 (RS232).
Darum musste ich einen RS232/RS485-Umsetzer selber bauen. Funktioniert ohne Probleme.
Da der Umsetzer relativ einfach gehalten wurde und die Datenleitungen nicht umschalten, musste ich darauf das Protokoll anpassen.
Schlimm ist die Anpassung nicht, die kommt mir sogar entgegen:
Die S7 spricht den ersten Teilnehmer an und sendet ein a auf den Bus.
Das a wird wegen der fehlenden Umschaltung der Datenleitung sofort an die S7 zurückgegeben.
Wenn nun der Teilnehmer a antwortet, sendet dieser seine Busadresse 'a' mit Daten in 'ASCII' und einem Stopzeichen '#'.
In der SPS liegt dann z.B. folgendes vor: aa1023#
Die S7 prüft das erste gesendete Zeichen mit dem zweiten. Stimmen diese überein, wird der Wert ab dritter Stelle bis zur Raute übernommen und in einen DB als Integer gespeichert.
Sollte, nachdem das erste Zeichen empfangen wurde, innerhalb von 20ms keine Antwort vom angesprochenen Busteilnehmer erfolgen, wird der nächte Busteilnehmer angesprochen.
Somit kann ich prüfen, ob der angesprochene Slave antwortet oder dieser gar ganz fehlt.
Der Master ist einzig und allein der CP340.

Gruß,
poppycock
 

Anhänge

  • Slave.JPG
    Slave.JPG
    100,8 KB · Aufrufe: 37
@Jochen Kühner:
Könntest du mir dabei helfen?
Ich brauche nur die MPI-Schnittstelle (original Siemens MPI-Adapter).
Es wird die libnodave.dll benötigt.

Hab das eigentlich nur mal als Idee gebracht, um auf Reaktionen zu warten ob das so gehen könnte... Hab in letzter Zeit nicht so viel mit den AVRs gemacht, denke nicht das Ich dir da im Moment weiterhelfen kann.

ich denke du musst halt dafür sorgen das was in libnodave in den seriell funktionen mit
di->ifwrite(di, (char*)target, targetSize);
geschrieben wird über die serielle SChnitstelle des AVRs geht.

Und genau so das was mit
i=di->ifread(di, &res,1);
halt vom AVR gelesen wird.

Ich weis nicht ob das alles machbar ist, sind nur Ideeen..

Habe ich eine veraltete libnodave-Version?
Ich finde den Compilerschalter nicht. Außerdem habe ich mit diesen Schaltern noch nichts gemacht.
Muss man da etwas einstellen? Ich hatte mal probiert den Source im AVR-Studio zu kompilieren, da kam aber die Meldung, dass das OS nicht bekannt sei.
So wies aussieht (und Ich den Kommentar von PN/DP richtig verstanden habe) sind die Defines mit AVR nur dafür da wenn auf dem AVR ein OS läuft!
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo Jochen Kühner,

danke für deine Ideen.

Die Hardware kann ich doch schon mal aufbauen.
Habe einen AVR mit zwei UART's, der könnte als intelligenter RS485/RS232-Umsetzer werkeln.
Somit müsste ich NICHT in die bestehenden AVR-Slaves eingreifen und kann alles so lassen, wie es ist.
Das Protokoll in der SPS muss ich dann aber auf den Umsetzer portieren.
Würde dem Umsetzer auch ein Display spendieren, auf dem der Status der Slaves zu sehen ist. Außerdem soll mit dem Display eine Datenbaustein-Einstellung vorgenommen werden können.
Der intelligente Umsetzer kann dann die Daten von den Slaves aufbereiten und in den DB übertragen.

Aufbau des Datenbausteins:
DBW0: Status (welche Teilnehmer aktiv vorhanden sind)
DBW2: Daten Teilnehmer 1 'a'
DBW4: Daten Teilnehmer 2 'b'
...
DBW52: Daten Teilnehmer 26 'z'

Was wäre dann intelligenter, erst alle Daten von den Teilnehmern sammeln und gemeinsam in einen DB schieben oder die Daten der Slaves sofort in einen DB schreiben?

Gruß,
poppycock
 
Also Ich habs jetzt geschaft mit ein paar ifndef libnnodave mit dem avr-gcc zu kompilieren. Ich denke dann müssen vieleicht nur noch stdread und stdwrite so angepasst werden das sie den AVR seriell Port verwenden... Kann da aber für nichts garantieren. Und kann dir auch nicht sagen wie du die funktionen anpassen musst... Aber wenn du willst lad Ich die meine libnodave und die Anweisungen zum kompielieren mal hoch...
 
Hallo Jochen.

Also Ich habs jetzt geschaft mit ein paar ifndef libnnodave mit dem avr-gcc zu kompilieren. Ich denke dann müssen vieleicht nur noch stdread und stdwrite so angepasst werden das sie den AVR seriell Port verwenden... Kann da aber für nichts garantieren. Und kann dir auch nicht sagen wie du die funktionen anpassen musst... Aber wenn du willst lad Ich die meine libnodave und die Anweisungen zum kompielieren mal hoch...

Es wäre super, wenn du deine Version für den AVR hochladen würdest.
Denn um die Software habe ich mich noch nicht gekümmert, werde ich aber bald wieder tun (müssen)!

Vielen Dank schonmal,
poppycock
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo Jochen.



Es wäre super, wenn du deine Version für den AVR hochladen würdest.
Denn um die Software habe ich mich noch nicht gekümmert, werde ich aber bald wieder tun (müssen)!

Vielen Dank schonmal,
poppycock

Also mach heut im laufe des Tages... Aber wie gesagt, Ich weiss nicht ob das dann geht, und du musst auf jeden fall die 2 genannten Funktionen anpassen, da Ich diese nur als leere Funktionen implementiert habe. Und noch was, kompiliert ist das ganze bei mir 116kb groß, aber man kann bestimmt noch ein paar funktionen ausklammern...
 
So hier mal. Kompiliert, aber ob man damit was anfangen kann, kann Ich dir nicht sagen. Du musst den Include Pfad im Makefile noch abpassen! und die 2 Funktionen in nodave.c für serielles senden und empfangen müssen auf jeden fall noch implementiert werden! (Die 2 welche zwischen dem define avr_noos liegen)
 

Anhänge

  • test.zip
    65,7 KB · Aufrufe: 12
Zurück
Oben