# B&R: Umfangr. C-Programm einbinden



## Epimetheus (16 November 2009)

Hallo zusammen

Ich kenne mich nur sehr wenig mit einer B&R Steuerung bzw. dem B&R Automation Studio aus und bin bei meiner Bachelorarbeit auf ein Problem gestoßen. Und zwar habe ich einen Regler in C-Code vorliegen.
Dieser besteht aus mehr als 10 *.h und etwa 5 *.c Dateien und insgesamt über 7000 Zeilen Code mit entsprechend vielen Variablen.

Jetzt würde ich gerne diesen Regler als Funktion oder Funktionsbaustein ins Automation Studio einbinden.

Die erste und wichtigste Frage: Ist das überhaupt möglich? Denn in diesem C-Code werden wild Variablen und Zeiger deklariert und was ich bisher gesehen habe ist, dass jede Variable im Automation Studio in einer Variablen Liste eingetragen werden muss. 

Also die Steuerungshardware muss das ja können (x86 Prozessor 400Mhz etc.), aber lässt das Studio diese dynamische Speicheradressierung und allokierung zu?
Sprich: Es ist unmöglich (und unsinnig) alle Variablen die im C-Code benutzt werden händisch in die Steuerung einzutragen. Kann der Code trotzdem eingebunden werden?

Würde mich über eine Antwort freuen 
Grüße
Epimetheus


----------



## witkatz (16 November 2009)

Hallo Epimetheus,

Portierung con C-Code ins TwinCAT hab ich schon mal gemacht. In ST kann man fast genauso frei programmieren wie in C, mit Pointern und Speicherzugriffen. Nur dynamische Speicherverwaltung gibt es nicht, aber man kommt auch ohne aus, wenn man muss. 

Ausserdem gibt es für TwinCAT zahlreiche Tool-Librarys mit universellen und spezialisierten Regler-, Filter- und Hilfs-Bausteinen. Sowohl kommerziell (z.B. von Beckhoff) als auch Open Source. Das erlaubt effizientes Programmieren von Reglerstrukturen.

Soviel zur Info, falls du auf die Idee kommst deine Aufgabe in TwinCAT oder CodeSys zu lösen (wo du schon in dieses Forum gepostet hast).

Gruß,
witkatz


----------



## gravieren (16 November 2009)

Hi

Benötigst du "NUR" einen PID-Regler.


Falls ja, hier mit ST-Quellcode.

www.oscat.de


Ich hoffe deine Steuerung kann ST


----------



## Epimetheus (16 November 2009)

Sorry...wollte eigentlich in "Sonstige Steuerungen" posten. Geht ja um B&R und Automation Studio. TwinCat hab ich noch nie gehört. Mal googlen 
danke

PS: Sehe schon. Ist für Beckhoff Steuerung...war auch zu erwarten wenn ich ins falsche Forum poste^^
Mit PID komme ich nicht weiter. Ist ein Fuzzy Regler...


----------



## doelckenbeck (16 November 2009)

Epimetheus schrieb:


> Sorry...wollte eigentlich in "Sonstige Steuerungen" posten. Geht ja um B&R und Automation Studio. TwinCat hab ich noch nie gehört. Mal googlen
> danke
> 
> PS: Sehe schon. Ist für Beckhoff Steuerung...war auch zu erwarten wenn ich ins falsche Forum poste^^
> Mit PID komme ich nicht weiter. Ist ein Fuzzy Regler...



Hallo, hab eine ganz ähnliche Aufgabe. Ich will eine Modbus TCP Bilbiothek, in C geschrieben, in ein Automation Studio Programm einbinden. Ist zwar nicht so groß wie dein Programm, hat ein paar *.c und *.h Dateien und ca. 1000 Zeilen Code, aber es wäre trotzdem toll zu erfahren wie du vorgehst.
Ich werd mich morgen an die Arbeit machen und werd mich melden, wenn ich was rausfinde!


----------



## Epimetheus (17 November 2009)

Super. Werd mich auch melden wenn ich was weiß.

Wäre praktisch wenn ein Moderator den Thread verschieben könnte...


----------



## doelckenbeck (17 November 2009)

So, hab schon das erste Problem!
In meiner C- Datei werden folgende Dateien includiert:
#include <sys/socket.h>
#include <sys/ioctl.h>
#include <netinet/in.h>
#include <netinet/ip.h>
#include <netinet/tcp.h>
#include <arpa/inet.h>
Jetzt weiß ich nicht genau wo ich die her bekommen. Ich vermute ja, dass ich die irgendwie durch Bibliotheken aus dem Automation Studio ersetzen muss. Hab da leider noch nicht so viel Ahnung von.


----------



## Epimetheus (17 November 2009)

Habe folgendes in der Hilfe gefunden:


```
Mit den Makros _LOCAL und _GLOBAL können Sie lokale und globale 
Variablen definieren. Sie müssen jedoch darauf achten, 
dass diese Variablen als globale C-Variablen deklariert werden, 
d.h. außerhalb von Funktionen.
[U]Richtige Definition:[/U]
[COLOR=blue]#include[/COLOR] [COLOR=magenta]<bur/plc.h>[/COLOR]
[COLOR=blue]int[/COLOR] _LOCAL Variable_1;
[COLOR=blue]int[/COLOR] _GLOBAL Variable_2;
[COLOR=blue]void[/COLOR] _CYCLIC test( [COLOR=blue]void[/COLOR] )
{        [COLOR=darkgreen]/* Zyklischer Teil des C-Objektes */[/COLOR]}
```
 
Ich lese daraus: Variablen MÜSSEN über die Makros eingebunden werden. Für mich kommt das leider nicht in Frage, da mein Code automatisch von MatLab erzeugt wird. Bei jeder Änderung im Modell wären auch die Änderungen im Code weg. Aber für diejenigen die auch MatLab RTW Code in eine B&R Steuerung einbinden wollen: Es gibt dafür ne Toolbox von B&R. Aus dem Modell wird automatisch ein FUB gebaut. Total praktisch...nur hab ich das leider nicht *argh*

Grüße


----------



## doelckenbeck (18 November 2009)

Wie wird das mit den Headerdateien gemacht? Müssen die gegen die von B&R ausgetauscht werden, oder kann ich die einfach von irgendwo in den Projektordner kopieren und dann einbinden?


----------



## Epimetheus (18 November 2009)

Du kannst die Header Dateien nehmen, die extern zu deinem TCP Kram gehören. Schau mal in der B&R Hilfe unter Library einfügen nach und da dann nach Funktion oder Funktionsbaustein einfügen. Da sind kleine Beispiele aufgeführt. Zu einem FUB kannst du beliebig viele externe Header Dateien hinzufügen. Aber wie gesagt: In Header Dateien werden häufig auch Variablen deklariert. Aber Variablen müssen anscheinend mit _local oder _global kenntlich gemacht werden.

Aber ich weiß nicht wie das praktisch aussieht. Vielleicht können die Header gleich bleiben, aber spätestens in der .c Datei, in der sich das Hauptprogramm befindet, musst du die Variablen alle für die B&R Steuerung kenntlich machen und aus den Funktionen rausschreiben und vor die Funktionen setzen. Ich hab das aufgegeben. Programmier das jetzt selber in einer abgespackten Version


----------



## RobiHerb (18 November 2009)

*Externe Variablen*



doelckenbeck schrieb:


> Wie wird das mit den Headerdateien gemacht? Müssen die gegen die von B&R ausgetauscht werden, oder kann ich die einfach von irgendwo in den Projektordner kopieren und dann einbinden?



Ich denke, die _GLOBAL etc. Bezeichner sind Macro Anweisungen im Preprozessor und werden aufgelöst in "extern dllexport", würde mich auch einmal interessieren, falls möglich, die Header per PN an meine Adresse senden oder falls nicht möglich, eMail Adresse angeben.


----------



## doelckenbeck (20 November 2009)

Hat sich schon erledigt, trotzdem danke! Hab aber noch eine Frage. Befehle wie malloc, free, printf sind nicht möglich. Kann man die irgendwie gegen andere ersetzen?


----------



## gravieren (20 November 2009)

doelckenbeck schrieb:


> Hat sich schon erledigt, trotzdem danke! Hab aber noch eine Frage. Befehle wie malloc, free, printf sind nicht möglich. Kann man die irgendwie gegen andere ersetzen?


 

Ich kenne die Steuerung NICHT, lediglich C/C++  jedoch möglicherweise kann ich helfen.




malloc, free   --> hast du eine Bibliothek für deine Steuerung wie etwa  mem.h  ?

printf --> hast du eine Bibliothek für deine Steuerung wie etwa   stdio.h 
 (Weis zwar nicht wohin dis geschrieben werden kann, möglicherweise in eine Date falls Dateisystem vorhanden)


----------



## doelckenbeck (30 November 2009)

Also, hab eine Bibiothek gefunden mit der ich malloc und free nachbilden kann, die AsMem.h. Fehlt nur noch was für printf, sprintf und exit. Hat jemand eine Idee?


----------



## doelckenbeck (1 Dezember 2009)

So, hab zwar die Bibliothek gefunden, weiß allerdings nicht so recht wie ich die Funktionen verwenden soll und in der Hilfe steht auch nichts. Kennt sich jemand damit aus?


----------



## pjtec (12 Januar 2010)

Hallo,

Gegen malloc hilft memalloc aus der AsMem ;-)

printf und dergleichen werden nicht unterstützt (siehe AS Online Hilfe).
Kenne dein Programm nicht bzw. bin mir nicht sicher, was du mit printf auf einer Steuerung auslösen möchtest? Hat ja kein User Interface?

Bei welchem FUB / bei welcher Funktion stehst du jetzt konkret an?
Welche Hilfe / welches AS verwendest du (kann sein dass ichs in den vorherigen Beiträgen überlesen habe)?

Zu den Variablen: Es können natürlich auch C-interne Variablen verwendet werden, jedoch stehen sie dann der Steuerung (z.B. I/Os) nicht zur Verfügung. Hier muss dann, wie schon erwähnt wurde, _LOCAL und _GLOBAL verwendet werden.

Grüße


----------



## doelckenbeck (13 Januar 2010)

Ich verwende AS 2.5.2.7 und versuche die Modbus- TCP- Kommunikation zwischen einem B&R- Panel mit kleiner Steuerung und einem Multiachscontroller von ELAU herzustellen. Printf wäre schon hilfreich um Fehlerbeldungen auf dem Display anzuzeigen.
Den Malloc- Ersatz hab ich schon drin. Hab die Modbus- TCP- Bibliothek aus dem Internet drin, sie läuft bloß nicht richtig.


----------



## giallo (13 Januar 2010)

hi epimetheus,

schau mal in die Hilfe vom AS unter Inhalt - AutomationSoftware - AutomationStudio - Library Manager - Erstellen einer neuen Bibliothek - Erstellen einer C- Bibliothek
findest du die Vorgangsweise.

Ciao und servus


----------



## doelckenbeck (13 Januar 2010)

Ok, ich hab die libmodbus- Bibliothek. Diese besteht aus einigen *.h- Dateien und ein paar .*c- Dateien. Muss ich diese Dateien extra als C- Bibliothek anlegen, oder kann ich die Dateien die ich benötige auch einfach als zyklisches Objekt im Projekt aufnehmen und zum laufen bringen? Die Variablen sind dann in diesen Dateien deklariert.


----------



## pjtec (13 Januar 2010)

printf geht definitiv nicht, wäre vielleicht schön aber geht halt nicht.
Um Text am Bildschirm auszugeben einfach eine leere Visu hinzufügen und mit der Visapi Funktion VA_Text den Text an die gewünschte Stelle schreiben.

Es können in einen Task mehrere .c und .h Files eingefügt werden.
Bzw. muss dies in diesem Fall sogar gemacht werden weil eben sonst Deklarationen, Funktionen,... abgehen.

Grüße,


----------

