preprozessor direktiven auf B&R

Hannes

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

ich hab jetzt probiert, in meinem C- Code auf einem B&R PP41 preprozessor- direktiven einzubauen aber leider mag das der Kompiler nicht,
weiß jemand wie ich das machen kann, dass nur bestimmter Code compiliert wird?
Ich möchte eben nur den if- zweig oder den else- Zweig kompilieren:
(sg4 == 1) ? anzahl = rxbuffer[5] + rxbuffer[4]*256 : memcpy(&start, rxbuffer[4], 2);

Vielen Dank!!

lg
Hannes
 
Der C-Compiler unterstützt soweit ich weiß keine preprocessor-options. Mach doch einfach über ein #define (das unterstützen die komischerweise) eine Variable die du je nachdem Umänderst.

Dann compiliert er zwar beides, aber arbeitet nur den einen Strang ab.

MFG

Markus
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
Re:

Hallo Hannes,
schau Dir mal meine Antwort an in 'B&R SG3 auf SG4'
(http://www.sps-forum.de/showthread.php?t=13993&page=2).
Der Kompiler kompilert den source code der im task steht, mehr nicht.
Wir wollen doch wohl nicht in WINDOWS Traeumen denken, oder ????
Sonst holst Du Dir all den Mist in ein Runtime System den Du von
Windoof kennst. Moechtest Du das auf einer Maschine oder Einheit
wo es villeicht auch noch um die Sicherheit des Bedieners geht.
Zitat Bill Gates:
"es wird niemals ein Betriebssytem geben das mehr als 640 KB Speicher noetig hat"
Der dachte auch kompilieren ist sooo einfach *grins.
Ich denke nicht. Also versuche sauber zu denken. Alles was der
Kompiler vermurksen kann tut er auch. Eigene Erfahrungen....
Schau Dir mal die Lib Funktionen an. Dann kommst Du darauf wie
einfach das Problem zu loesen ist.
 
Zitat >Schau Dir mal die Lib Funktionen an. Dann kommst Du darauf wie
einfach das Problem zu loesen ist.<

Was meinst du damit? kannd ir da nicht ganz folgen und ich dnek mir auch, wenn Preprozessor- Direktiven unterstützt werden, dass dient ja auch dem Platz sparen, da das abzuarbeitende Programm kleiner wird und man mehrere Programme auf einer SPS laufen lassen kann.

lg
 
Re:

Hallo Hannes,

wenn Preprozessor- Direktiven unterstützt werden, dass dient ja auch dem Platz sparen, da das abzuarbeitende Programm kleiner wird und man mehrere Programme auf einer SPS laufen lassen kann.

lg

Definitiv NEIN. Die CPU PP220 hat genung Performance um damit eine ganze Raumstation zu steueren. Gewusst wie und mit welchen Bordmitteln.

switch (step) sagt Dir etwas.
Ok dann frage mit Hilfe der Lib die TargetType ab (sg3 oder sg4)
zwei mal
if target_type == sg3
{
blabla source code
}
else if target_type == sg4
{
blabla source code
}

Der blabla source code ist der fuer Dein sg4 oder sg3 System.
Innerhalb dieses codes arbeitest Du mit switch Anweisung.

Das ganze Programm, besser der ganze task sollte keine 10K gross
sein, incl. aller Abfragen und der Kontrolle.

Gruss,

Mike
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Ja, so hab ichs jetzt eh gemacht, ich wollte halt nur Platz sparen mit den Direktiven aber es ist so auch ok,

Vielen Dank für deine Tipps!!!!

lg
Hannes
 
Hallo nochmal,

ich muss euch bzw. auch mich korrigieren,
PreprozesseoDirektiven sind auf der B&R SPS definitiv möglich mit

#ifdef
#else
#endif

Mein Problem war, dass ich #endif vergessen habe.

Also Preprozessor verwenden, dann werden die Programme deutlich kleiner, ich habs schon ausprobiert

lg
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo Hannes,
natürlich werden PrePro-Anweisungen unterstützt, im Hintergrund verrichtet niemand anderer als ein stinknormaler GNU Compiler seine Arbeit (zumindestens bei C-Sourcen).

Also Preprozessor verwenden, dann werden die Programme deutlich kleiner, ich habs schon ausprobiert.

Das kommt auf den Anwendungsfall an, #ifdef #else #endif setze ich mittlerweile recht selten ein (ausgenommen in Headerfiles). Früher benutzte ich sie für meine Libraries. Damals hatte ich ein gemeinsames Projekt für beide Zielplattformen. Da mit der Zeit dies aber ziemlich unübersichtlich wurde (mit kräftiger Hilfe von B&R :sb7:), trennte ich diese auf (mittlerweile gibts ja ne dritte Zielplattform namens SGC :???:). Gemeinsamer Code kommt in eine gemeinsame Datei, plattformabhängiger jeweils in eine eigene.

Betreff der Grösse von Programmen
a) mach ich mir keinen Kopf da ich erst einmal bei einer CP470 (so ziemlich die schwachbrüstigste CPU von B&R) in Bedrängnis gekommen bin.
b) werfe ich eher,wenn überhaupt, auf die Ausführungszeit ein Auge (Stichwort Profiler)

Das einzige Argument das mir, betreff der Grösse, im Moment einfällt wäre die Downloadzeit wenn ich seriell mit der CPU verbunden bin.

Obwohl ich mir jetzt nicht ganz sicher bin ob dir das bei deinem Vorhaben helfen kann, aber hast du schon mal die Schemas näher betrachtet? Ich hatte mal ein Projekt bei dem ich diese recht nützlich einsetzen konnte.

Grüsse, harrylask
 
Hallo Hannes,
mit Schemas (im Menü Projekt) kannst du Zustände von de/aktivierten Objekten speichern die du später wieder laden kannst.
Ich nutzte es bei einem Projekt mit verschiedenen Busanbindungen, ich glaube aber nicht das es bei verschiedenen CPU Typen funktioniert!

Grüsse, harrylask
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo (Drücke übrigens auch dem LASK die DAUMEN, hat die meisten und besten Fans),

Meinst du sowas wie REFLECTION in der OO Programmierung (Bin mom. mehr in Java zuhause und verbinde Steuerungen mit Java),
Bei der REFELCTION werden die Objekte ja auch konsisten gespeichert und können zu einem anderen Zeitpunkt wieder geladen werden.

lg
 
Hallo Hannes,
nö, nö, so weit sind wir noch lange nicht. Bei den Objekten von denen ich sprach handelt es sich um Hardwaremodule bzw. Softwaremodule!

Grüsse, harrylask
 
Zurück
Oben