Forum: Projekte & Code Software Profibus DP-Slave in C


von Jörg S. (joerg-s)


Angehängte Dateien:

Lesenswert?

Profibus DP-Slave Kommunikation in C
Von Jörg S., Marc H. und Johannes F.

Geschrieben für MSP430F2252. Getestet an Siemens S7 mit 19,200 und 
93,750kBit/s.
Basis war Reengineering der Kommunikation eines DP/DP Kopplers mit einer 
S7 und vor allen das Profibus Handbuch von Prof. Max Felser (ein 
Dankeschön an dieser Stelle).

Die Entwicklung begann mit kompletter Ahnungslosigkeit vom Profibus. Von 
daher ist der Code ständig verändert und erweitert worden und somit 
nicht unbedingt ein Ingenieurs-Glanzstück ;)
Der DP-Slave ist soweit Profibus konform das normale I/O Daten gesendet 
und empfangen werden können, da der Fokus auf diesem Aspekt lag.

von Jörg S. (joerg-s)


Angehängte Dateien:

Lesenswert?

Und noch die h-Datei...

von tbd (Gast)


Lesenswert?

habe gleich ein paar fragen dazu!

1. wie stark ist der uC ausgelastet (flash und performance) > gehts noch 
schneller / ist noch platz für andere applikationen?
2. warum dieser uC (habt ihr einen komerziellen / universitären 
Hintergrund)?
3. wie habt ihr die parametresierung der s7 gemacht?
4. was für treiber habt ihr genommen und wie habt ihr die 
abschlusswiderstände dimensioniert?
5. was für eine applikation habt ihr hiermit realisiert?
6. habt ihr schon bugs gefunden?

danke
tbd

von Mark Z. (noisy-tec)


Lesenswert?

abo

von Jörg S. (joerg-s)


Lesenswert?

>1. wie stark ist der uC ausgelastet (flash und performance) > gehts noch
>schneller / ist noch platz für andere applikationen?
Er muss halt alles empfangen was los ist und erst dann auswerten ob es 
wirklich für ihn ist. Da empfangen und senden interruptgesteuert ist, 
hat der µC viel Zeit was anderes zu machen. Im speziellen Fall wird noch 
ein 2x16 Zeichen Display mit 4 Tasten, IR Empfänger und Temp.Sensor 
(TSic) "nebenbei" behandelt.
Der MSP läuft auf 8Mhz und hat 16kB FLASH und 512B RAM. Der Profibus 
verbraucht glaub ich um die 2kB FLASH und wohl um die 130B RAM. Wobei 
der RAM Verbrauch fast zu 100% aus den Ein- und Ausgangsregistern und 
dem UART Buffer besteht.
Kommunikation geht sicherlich noch schneller, hab ich aber noch nicht 
getestet da die aktuelle Geschwindigkeit erst mal ausreichend ist.

>2. warum dieser uC (habt ihr einen komerziellen / universitären
>Hintergrund)?
Ich habe vor allem beruflich mit dem MSP430 zu tun, hab aber auch schon 
vorher damit privat gearbeitet. Von daher kam nur der MSP in Frage :)
Das Projekt ist privat.

>3. wie habt ihr die parametresierung der s7 gemacht?
Über den Part kann ich wenig sagen, da kennen sich die anderen zwei 
"Mitstreiter" aus. Es muss halt ne GSD Datei für den Slave angelegt 
werden mit der man die Grundparameter festlegt.

>4. was für treiber habt ihr genommen und wie habt ihr die
>abschlusswiderstände dimensioniert?
RS485 Transceiver ist der MAX3485. Abschlusswiderstand ist 120Ohm 
vorgesehen. Halt Standard RS485...

>5. was für eine applikation habt ihr hiermit realisiert?
Hausautomation. Ich denke da wird es dann noch ne komplette 
Projektvorstellung geben, die Entwicklung ist aber noch nicht wirklich 
abgeschlossen.

>6. habt ihr schon bugs gefunden?
Das einzige was mir einfällt ist die MS1/2 Kommunikation. Wenn sowas 
mitläuft geht nix mehr, das wird wohl die nächste Erweiterung sein die 
rein kommt.

von Patrick S. (kof)


Lesenswert?

Auf Seite 23 der von dir benannten Datei von Max Felser 
(http://www.profibus.felser.ch/technik/PROFIBUS_Technik.pdf) ist 
beschrieben,  das die Terminierung im Stecker realisiert wird.

Aber sonst finde ich es wirklich interessant! Die einzige realisierung 
auf einem uC die ich kenne ist diese: 
http://www.htw-dresden.de/fe/labor/mikror/projects/pb_slave/
Diese ist jedoch leider auf ASM geschrieben...

Habt ihr eine Testhardware gebaut oder könnt ihr eine Applikation damit 
als Demo zeigen?

von Patrick S. (kof)


Lesenswert?

Eine Frage habe ich noch!
Handelt es sich um DPV0(zyklisch), DPV1(azyklisch), DPV2(isochron)?

von Jörg S. (joerg-s)


Angehängte Dateien:

Lesenswert?

>das die Terminierung im Stecker realisiert wird
Wenn man so einen Profibus Stecker nutzt... Muss man ja nicht.

>Habt ihr eine Testhardware gebaut oder könnt ihr eine Applikation damit
>als Demo zeigen?
Im Anhnag mal die "SPS-Remote" Einheit. Damit soll man dann in jedem 
Zimmer die Heizung, Rolladen, Wecker usw. steuern. Funktioniert so weit 
schon im Testaufbau.

von Jörg S. (joerg-s)


Angehängte Dateien:

Lesenswert?

>Handelt es sich um DPV0(zyklisch), DPV1(azyklisch), DPV2(isochron)?
DPV0

Im Anhang die nächste Stufe, die SPS-AudioControl zur umschaltung von 
Audio Signalen für die Deckenbeschallung der Räume. Ansonsten gibt's 
dann  noch die Dimmersteuerung. Da hab ich aber gerade kein Bild von.

von Otto (Gast)


Lesenswert?

Hallo Joerg,

starke Sache - zwei Fragen hätte ich:

1. hast Du es auch an einer S7-300 getestet?
2. Wie sieht Dein physikalisches Interface aus?

Gruss Otto

von Jörg S. (joerg-s)


Lesenswert?

>1. hast Du es auch an einer S7-300 getestet?
Wenn ich mich nicht täusche wird das an einer S7-315 CPU betrieben. Was 
anderes wäre nicht ohne weiteres zur Hand.

>2. Wie sieht Dein physikalisches Interface aus?
Also Profibus ist RS485 wenn du das meinst? A, B von Profibus an den 
MAX3485 Transceiver und dann halt auf den UART vom MSP430.

von Otto (Gast)


Lesenswert?

Hallo Joerg,

vielen Dank für die Antwort.

2) zielte darauf ab, ob Du mit einem käuflichen Siemens-Adapter 
arbeitest.

Gruss Otto

von Jörg S. (joerg-s)


Lesenswert?

>2) zielte darauf ab, ob Du mit einem käuflichen Siemens-Adapter arbeitest.
Dann wäre es ja nichts besonderes, oder? ;)

von Otto (Gast)


Lesenswert?

Hallo Jörg,

> Dann wäre es ja nichts besonderes, oder? ;)

ja - schon - aber "nur die halbe Lösung", denn die Adapter gibt es als 
USB oder RS232 auf Profibus und die kosten schon ein paat Euro.

Es ist halt gut zu wissen, dass Du es wirklich mit selbstgestrickter HW 
realisieren konntest......

oft sind es dann die "kleinen Gemeinheiten", weshalb es nicht läuft....

;-)

Gruss Otto

von Patrick S. (kof)


Lesenswert?

Wenn du jetzt noch eine Demo-Software hättest... ach wäre das schön ;)

Ne jetzt mal ganz im ernst! Ich finde es wirklich prima was ihr da auf 
die beine gestellt habt!!!
Aber gerade im bereich Hausautomatisierung denke ich das es andere 
Schnittstellen (CAN/CANopen) gibt die sich im gegensatz zu propritären 
systemen etabliert haben. Das soll euch um gottes willen nicht davon 
abhalten weiter zu machen! So ein ASIC für Profibus ist nämlich super 
teuer.

von Jörg S. (joerg-s)


Lesenswert?

>Wenn du jetzt noch eine Demo-Software hättest...
Du meinst die SPS Software?

von tbd (Gast)


Lesenswert?

kannst du ein beispiel für die GSD datei posten?

mfg
tbd

von Joline (Gast)


Lesenswert?

Hallo Jörg,

prima Projekt. Ja, die GSD-Datei wäre schon ziemlich interessant. Und 
vor allem auch, welche E/A-Konfiguration damit abgedeckt wird.

Vielleicht könntest Du ja bspw. die GSD-Datei von Eurer "SPS-Remote" 
Einheit senden und dazu, welche E/A's ansprechbar sind (evtl. auch einen 
Schaltplan).

Joline

von Jörg S. (joerg-s)


Lesenswert?

>welche E/A's ansprechbar sind
Wie meinst du das? Die E/As werden halt für Sachen wie Raumtemperatur, 
Aussentemperatur, Solltemperatur (Heizung), Weckzeit Wochentag, Weckzeit 
Samstag, Weckzeit Sonntag, Rolladen Steuerung, SPS Uhrzeit und sowas 
"misbraucht". Physikalische I/Os werden zumindest bei der SPS-Remote 
nicht gesetzt.

Marc will dann noch genauer was zu der GSD Datei schreiben.

von Johannes F (Gast)


Angehängte Dateien:

Lesenswert?

hi,
also hier die HW Konf. von unserem test

von Johannes F (Gast)


Lesenswert?

hi, marc habe dir mal die arbeit abgenommen mit der gsd damit deine 
wohnung schneller fertig wird ;-) und wir das ganze mal live testen 
können.
hier ein auszug aus der gsd, etwas spielraum ist da für jeden drin

;==========================================
; Geraetestammdatei fuer SPS-Remote
; SEE-Solutions
; Autor : SEE-Solutions
; Stand : 30.09.2007
;         30.09.2007 V1.0
; =========================================
;
#Profibus_DP
; <Prm-Text-Def-List>
PrmText=1
Text(0)="Extended diagnosis enabled"
Text(1)="Extended diagnosis disabled"
EndPrmText
PrmText=1
Text(0)="Testen an"
Text(1)="Testen aus"
EndPrmText
;
; <Ext-User-Prm-Data-Def-List>
ExtUserPrmData=1 "Diagnose"
Bit(7) 0 0-1
Prm_Text_Ref=1
EndExtUserPrmData
; <Unit-Definition-List>
GSD_Revision        = 1
Vendor_Name         = "SEE-SOLUTIONS"
Model_Name          = "SPS-REMOTE"
Revision            = "1.0"
Ident_Number        = 0x8070
Protocol_Ident      = 0
Station_Type        = 0
FMS_supp            = 0
Hardware_Release    = "A2"
Software_Release    = "B1"
;
9.6_supp            = 1
19.2_supp           = 1
45.45_supp          = 1
93.75_supp          = 1
187.5_supp          = 1
500_supp            = 0
1.5M_supp           = 0
3M_supp             = 0
6M_supp             = 0
12M_supp            = 0
;
MaxTsdr_19.2        = 150
;
Redundancy          = 1
Repeater_Ctrl_Sig   = 2
24V_Pins            = 0
Implementation_Type = "SPC3"
Bitmap_Device="SI8070_N"
Bitmap_SF="SI8070_S"
;
OrderNumber         = "SPS-RMT_V1.0"
Freeze_Mode_supp    = 1
Sync_Mode_supp      = 1
Auto_Baud_supp      = 1
;
Set_Slave_Add_supp  = 0
Min_Slave_Intervall = 3
Modular_Station     = 1
Max_Module          = 16
Max_Input_Len       = 244
Max_Output_Len      = 244
Max_Data_Len        = 256
;
Modul_Offset        = 1
Fail_Safe           = 0
Slave_Family        = 9
Max_Diag_Data_Len   = 11
User_Prm_Data_Len   = 0
Max_User_Prm_Data_Len= 4
Ext_User_Prm_Data_Const(0) = 0x00,0x00,0x00,0x80
Ext_User_Prm_Data_Ref(3) = 1
;
; Unit-Diagnostics:
Unit_Diag_Bit(0)    = "Data Valid 1 = Valid"
Unit_Diag_Bit(1)    = "reserved"
Unit_Diag_Bit(2)    = "reserved"
Unit_Diag_Bit(3)    = "reserved"
Unit_Diag_Bit(4)    = "reserved"
Unit_Diag_Bit(5)    = "reserved"
Unit_Diag_Bit(6)    = "reserved"
Unit_Diag_Bit(7)    = "reserved"
Unit_Diag_Bit(8)    = "Inputs of other DP LBS"
Unit_Diag_Bit(9)    = "Inputs of other DP 2nd LSB"
Unit_Diag_Bit(10)   = "Inputs of other DP 3rd LSB"
Unit_Diag_Bit(11)   = "Inputs of other DP 4th LSB"
Unit_Diag_Bit(12)   = "Inputs of other DP 4th MSB"
Unit_Diag_Bit(13)   = "Inputs of other DP 3rd MSB"
Unit_Diag_Bit(14)   = "Inputs of other DP 2nd MSB"
Unit_Diag_Bit(15)   = "Inputs of other DP MSB"
Unit_Diag_Bit(16)   = "Outputs of other DP LSB"
Unit_Diag_Bit(17)   = "Outputs of other DP 2nd LSB"
Unit_Diag_Bit(18)   = "Outputs of other DP 3rd LSB"
Unit_Diag_Bit(19)   = "Outputs of other DP 4th LSB"
Unit_Diag_Bit(20)   = "Outputs of other DP 4th MSB"
Unit_Diag_Bit(21)   = "Outputs of other DP 3rd MSB"
Unit_Diag_Bit(22)   = "Outputs of other DP 2nd MSB"
Unit_Diag_Bit(23)   = "Outputs of other DP MSB"
Unit_Diag_Bit(24)   = "reserved"
Unit_Diag_Bit(25)   = "Clear-Data Request other DP"
Unit_Diag_Bit(26)   = "Unfreeze Request other DP"
Unit_Diag_Bit(27)   = "Freeze Request other DP"
Unit_Diag_Bit(28)   = "Unsync Request other DP"
Unit_Diag_Bit(29)   = "Sync Request other DP"
Unit_Diag_Bit(30)   = "reserved"
Unit_Diag_Bit(31)   = "reserved"
;
; <Module-Definition-List>
Module = "1 Byte Input" 0x10
1
EndModule
;
Module = "2 Bytes Input" 0x11
2
EndModule
;
Module = "4 Bytes Input" 0x13
3
EndModule
;
Module = "8 Bytes Input" 0x17
4
EndModule
;
Module = "16 Bytes Input" 0x1F
5
EndModule
;
Module = "1 Byte Output" 0x20
6
EndModule
;
Module = "2 Bytes Output" 0x21
7
EndModule
;
Module = "4 Bytes Output" 0x23
8
EndModule
;
Module = "8 Bytes Output " 0x27
9
EndModule
;
Module = "16 Bytes Output" 0x2F
10
EndModule
;
Module = "1 Byte Input consistent" 0x90
11
EndModule
;
Module = "2 Bytes Input consistent" 0x91
12
EndModule
;
Module = "4 Bytes Input consistent" 0x93
13
EndModule
;
Module = "8 Bytes Input consistent" 0x97
14
EndModule
;
Module = "16 Bytes Input consistent" 0x9F
15
EndModule
;
Module = "1 Byte Output consistent" 0xA0
16
EndModule
;
Module = "2 Bytes Output consistent" 0xA1
17
EndModule
;
Module = "4 Bytes Output consistent" 0xA3
18
EndModule
;
Module = "8 Bytes Output consistent" 0xA7
19
EndModule
;
Module = "16 Bytes Output consistent" 0xAF
20
EndModule
;

von Johannes F (Gast)


Lesenswert?

damit des keine diskusionen gibt, ja die "Ident_Number" ist eine vom 
großen S. wir haben diese gsd nur als muster genommen. da es sich um 
kein kommerzielles projet handelt, sondern nur einen privaten test, gibt 
es damit auch keine probleme.

von Joline (Gast)


Lesenswert?

>>welche E/A's ansprechbar sind
>Wie meinst du das? Die E/As werden halt für Sachen wie Raumtemperatur,
>Aussentemperatur, Solltemperatur (Heizung), Weckzeit Wochentag, Weckzeit
>Samstag, Weckzeit Sonntag, Rolladen Steuerung, SPS Uhrzeit und sowas
>"misbraucht". Physikalische I/Os werden zumindest bei der SPS-Remote
>nicht gesetzt.

Naja, auf dem Bild sind u.a. 4 Taster zu sehen. Da könnte man ja auf die 
Idee kommen, dass das Eingänge sind, die an die SPS weitergeleitet 
werden...

Danke für die GSD Datei. Aus der Konfiguration kann ich sehen, dass da 
32 Byte als Ein- und als Ausgang ausgetauscht werden können (im Beispiel 
12..46). Wie kann man nun Daten vom Slave an die SPS senden? Also ich 
meine, ich möchte z.B. Daten senden, die man dann auf EW14 in der SPS 
empfängt? Oder umgedreht, wenn man auf den Ausgang AW16 einen Wert 
schreibt, wie kann man den im Slave empfangen? Kommt da immer ein 
Bytehaufen mit der Länge 32 an, den man selbt auseinander nehmen 
muss/kann?

Joline

von Jörg S. (joerg-s)


Lesenswert?

>Naja, auf dem Bild sind u.a. 4 Taster zu sehen. Da könnte man ja auf die
>Idee kommen, dass das Eingänge sind, die an die SPS weitergeleitet
>werden...
Die Tasten sind nur für die Menü-Steuerung vom Gerät, die SPS bekommt 
davon nichts mit.

>Kommt da immer ein Bytehaufen mit der Länge 32 an, den man selbt
>auseinander nehmen muss/kann?
Genau das, ja.

von Joline (Gast)


Lesenswert?

Danke.

von Joline (Gast)


Lesenswert?

Noch eine Frage zur Hardware:

Da ist am UART des Controllers nur ein RS485-Baustein angeschlossen und 
dieser hängt dann direkt am Profibus, richtig?

Joline

von Jörg S. (joerg-s)


Lesenswert?

>Da ist am UART des Controllers nur ein RS485-Baustein angeschlossen und
>dieser hängt dann direkt am Profibus, richtig?
Genau, alles Standard RS485 Technik.

von Simon K. (simon) Benutzerseite


Lesenswert?

Und nur für Profis ;) Wenn das PROFI im PROFIBUS keine Abkürzung wäre, 
würde ich Lachen ;)

von Thomas (Gast)


Lesenswert?

Hallo Jörg,

gibt es zu Eurem Projekt auch eine zusammenfassende Dokumentation / 
Website?

Gruß,
Thomas

von Jörg S. (joerg-s)


Lesenswert?

>gibt es zu Eurem Projekt auch eine zusammenfassende Dokumentation /
>Website?
Nö :) Gibt aber noch einen kleinen "Schwesterthread" im SPS-Forum:
http://www.sps-forum.de/showthread.php?t=15510

Wie gesagt ist das Projekt ja auch noch nicht abgeschlossen. Von daher 
werden ich auch (vorerst) keine Schaltpläne o.ä. einstellen. Fragen zur 
Hardware dürfen aber natürlich gestellt werden.

von Thomas (Gast)


Lesenswert?

Hallo Jörg,

mensch, deine Schalter-Einbauten find ich Klasse.
Wärst Du bereit hierzu die Schaltpläne & Board (insb. Dimension-Layer), 
sowie Befestigungsmöglichkeiten offen zu legen?
Fänd ich super. Ich bin grad dabei einen Unterputz-Einsatz aufzubauen; 
Funktionsmöglichkeit soll sein: Temperatur, LCD, Dimmer, 1xSchaltkontakt 
(für nächste Steckdose), BUS-Anschluß.

Ich danke Dir sehr

von Jörg S. (joerg-s)


Lesenswert?

>Wärst Du bereit hierzu die Schaltpläne & Board (insb. Dimension-Layer),
>sowie Befestigungsmöglichkeiten offen zu legen?
Das mit den Schaltplänen hatte ich ja schon gesagt.
Bezüglich Befestigungsmöglichkeiten dürfte sich das Problem stellen das 
wir Tragringe von HEWI bzw. Berker verwendet haben die ich bei uns in 
der Firma aus dem Schrott geholt habe und die man wohl sonst nicht im 
freien Handel bekommt. Alternative wäre evt. der Tragring 12700 von 
Gira. Dafür müsste man das Layout aber ändern, von daher würden meine 
Dimensions wohl nicht sonderlich helfen.

von Jörg S. (joerg-s)


Lesenswert?

>Tragring 12700 von Gira.
Berichtigung: Muss 112700 heissen.

von Johannes F (Gast)


Lesenswert?

es gibt noch
gira tragring AMP steckbar 019100 ca.3€
oder einfach eine normale steckdose für 2€ und den rest in den müll ;-)

von Jörg S. (joerg-s)


Lesenswert?

>es gibt noch gira tragring AMP steckbar 019100 ca.3€
>oder einfach eine normale steckdose für 2€ und den rest in den müll ;-)
Da muss man dann aber erst mal schnitzen bis man was brauchbares hat.

von Jörg S. (joerg-s)


Angehängte Dateien:

Lesenswert?

Hier mal die Rückseite der SPS-Remote.
Wie man sehen kann bietet dieser Tragring schön viel Platz für 
rückseitige Bauteile.

Links der RS485 Transceiver, mittig der MSP430 mit 8MHz Resonator, unten 
der 8-polige JTAG Stecker, mittig der 6-polige RS485 Stecker (VCC, 2xA, 
2xB, GND), rechts 3,3V Spannungsregler.

von Mark Z. (noisy-tec)


Lesenswert?

Habt Ihr für die SPS Remote auch eine schöne Verkleidung für die Front 
entwickelt oder bleibt das so pur? Frage wegen der 
Frauen-Design-Akzeptanz.

von Jörg S. (joerg-s)


Lesenswert?

:) Da soll eine Blindabdeckung passend ausgefräst werden.

von Thomas (Gast)


Lesenswert?

Hallo Jörg,

wie kann bei Euch die Slave-Adresse eingestellt werden? Ich habe da 
gesehen, dass das irgendwie aus dem Flash gelesen wird...

Thomas

von Thomas (Gast)


Lesenswert?

Hallo Jörg,

noch eine Frage: Wird die Adresse dezimal oder hexadezimal erwartet?

Thomas

von Jörg S. (joerg-s)


Lesenswert?

>wie kann bei Euch die Slave-Adresse eingestellt werden?
Bei der SPS-Remote wird sie per Menü eingestellt und in's Flash 
gespeichert.
Bei der AudioControl und dem Dimmer hat die Steuereinheit dann 
Dip-Schalter.
Bei Profibus muss beachtet werden das die Adresse nicht größer als 127 
werden darf!

>Wird die Adresse dezimal oder hexadezimal erwartet?
Wo ist der der Unterschied? :) Hex oder Dez. ist ja nur ne 
unterschiedliche Darstellung.

von Johannes F (Gast)


Lesenswert?

hi jörg, im sps-forum hat mir einer geschrieben des es mit mikropascal 
und pic controller fertige kommunikationbausteine gibt, geschrieben in 
pascal für RS485 LCD anzeigen serielle schnittstellen und so. kannst ja 
mal schaun ob man davon etwas übernehmen kannnnnnn.

von Jörg S. (joerg-s)


Lesenswert?

So wie sich das anhört geht's wohl nur darum das es bei PICs 
vorgefertigte Funktionen für UART und Standard-Displays gibt. Brauchen 
wir nicht :)

von Jörg S. (joerg-s)


Angehängte Dateien:

Lesenswert?

Im Anhang der aktuelle Stand.
Da einige Fragen zur Implementierung aufgetaucht sind, hier mal die 
etwas genauere Beschreibung des Code:

Globale Variablen:
char uart_buffer[MAX_BUFFER_SIZE];
Der UART Daten Buffer in den alle Daten die ankommen gespeichert werden.

unsigned int uart_byte_cnt;
Zähler für die Anzahl der Bytes die in uart_buffer[] eingelesen wurden.

unsigned int uart_transmit_cnt;
Zähler für die Anzahl der Bytes die bereits gesendet wurden. Ist nur 
wichtig wenn man die Interrupt Sende-Funktion benutzt.

unsigned char profibus_status;
Aktueller Status der Profibus Schnittstelle.

unsigned char slave_addr;
Wie der Name schon sagt.

unsigned char master_addr;
Könnte man wahrscheinlich auch weg machen, da wird eh immer nur die 
source_add reinkopiert.

unsigned char group;
Bisher auch unnötig da nicht benutzt.

unsigned char data_out_register[OUTPUT_DATA_SIZE];
Hier die Daten reinkopieren die zur SPS sollen (Daten Slave -> SPS).

unsigned char data_in_register [INPUT_DATA_SIZE];
Hier kommen die Daten der SPS rein (Daten SPS -> Slave).

unsigned char Input_Data_size;
Anzahl der Bytes die die SPS senden will.

unsigned char Output_Data_size;
Anzahl der Bytes die die SPS vom Slave erwartet.

Das Konzept der Input- und Output_Data_size muss evt. überdacht werden 
da die SPS wohl Modulabhängig auch mehrere "Blöcke" Ein-und 
Ausgangsdaten senden kann. Da wird aktuell dran geforscht.

unsigned char Vendor_Data_size;
Unbenutzt



Was ist nötig um das ganze zum laufen zu bekommen?
Zur Initialisierung benötigt der Slave erst mal eine Adresse. Sollte 
zwischen 1 und 126 liegen. Im Code kommt sie von der Funktion 
read_slave_addr();
Dann muss man die Zeitsteuerung rein bekommen. Im Code mit Timer A 
erledigt (unten mehr dazu). Grundsätzlich mal die Zeit Tsyn abwarten 
(Zeit ohne UART Kommunikation) und dann alles an Daten einlesen und 
profibus_RX() aufrufen. Die Funktion erledigt eigentlich alles 
automatisch.
Wichtige Stelle ist diese:
1
// Daten von Master einlesen
2
for (cnt = 0; cnt < INPUT_DATA_SIZE; cnt++)
3
{
4
  data_in_register[cnt] = uart_buffer[cnt + 7];
5
}
6
7
// Daten fuer Master in Buffer schreiben
8
for (cnt = 0; cnt < OUTPUT_DATA_SIZE; cnt++)
9
{
10
  uart_buffer[cnt + 7] = data_out_register[cnt];
11
}
Sollte selbsterklärend sein, oder? SPS Daten einlesen, Slave Daten raus.

Die Funktion profibus_send_CMD() macht alles selber, nur die Funktion 
profibus_TX() muss wieder an eure Hardware angepasst werden. Einfach die 
Anzahl length Bytes von *data auf den RS485 schicken, fertig.

Hardware abhängig ist also nur die UART Empfangs- und Sendefunktion so 
wie die Zeitsteurung. Die Auswertung der Daten sollte auf jedem 
Controller laufen. Für einen einfachen Taster oder Schalter/Relais Slave 
kommt man auch komplett ohne Interrupts aus.



Ein Wort zur Zeit-Steuerung:
1) WAIT_SYN: Warten auf Tsyn (Gewisse Zeit ohne UART Kommunikation).
2) Wenn Tsyn erreicht ist auf WAIT_DATA schalten
3) In der Zeit WAIT_DATA alles an UART Daten einlesen und auf GET_DATA 
gehen
4) GET_DATA hat ein Timeout. Wenn eine gewisse Zeit keine weiteren Daten 
über UART rein kommen wird profibus_RX() aufgerufen um die Daten 
auszuwerten
5) Beim senden wird auf SEND_DATA geschaltet
6) Sind alle Daten rausgeschickt, gehen wir wieder auf WAIT_SYN und das 
Spiel beginnt von vorn.

von Jörg S. (joerg-s)


Angehängte Dateien:

Lesenswert?

Und noch die neue h-Datei.

von Thomas (Gast)


Lesenswert?

Hallo Jörg,

was machen die Zeilen:
1
RS485_TX_EN;
und
1
RS485_RX_EN;
wirklich?

Ich kann mir zwar vorstellen, was sie bewirken sollen. Aber da erfolgt 
ja keine Zuweisung und wie ein Funktionsaufruf sieht das auch nicht aus. 
Ich würde ja noch verstehen, wenn diese Flags (?) irgendwie gesetzt 
werden (z.B. =1 oder =true)...

Thomas

P.S. Ich kenne mich nicht so mit dem MSP430 aus...

von Jörg S. (joerg-s)


Lesenswert?

Damit wird der externe RS485 Transceiver von TX auf RX und umgedreht 
umgeschaltet.
1
//////////////////////////////////////////////////////////////////////////
2
/* RS485 Transceiver */
3
//////////////////////////////////////////////////////////////////////////
4
#define RS485_TX_EN           (P3OUT |= PIN6);
5
#define RS485_RX_EN           (P3OUT &=~PIN6);
6
//////////////////////////////////////////////////////////////////////////

von Thomas (Gast)


Lesenswert?

Na, das ging ja schnell. Danke.

von Thomas (Gast)


Lesenswert?

Hallo Jörg,

Was verbirgt sich hinter "SLAVE_DATA"?

(benutzt in:
1
profibus_send_CMD(SD2, SLAVE_DATA, 0, &uart_buffer[7], OUTPUT_DATA_SIZE);
)

von Jörg S. (joerg-s)


Lesenswert?

Ist ein Function Code. Siehe (alte) h-Datei:
1
///////////////////////////////////////////////////////////////////////////
2
// Function Codes
3
///////////////////////////////////////////////////////////////////////////
4
#define REQ_FDL_STATUS        0x49  // SPS: Status Abfrage
5
#define FDL_STATUS_OK         0x00  // SLA: OK
6
//#define SEND_DATA
7
#define SEND_REQ_DATA         0x5D  // SPS: Ausgaenge setzen, Eingaenge lesen
8
#define SEND_REQ_DATA_T       0x7D  // SPS: Ausgaenge setzen, Eingaenge lesen (Toggle)
9
#define SEND_REQ_DATA_FIRST   0x6D  // SPS: Erste Anfrage
10
11
#define SLAVE_DATA            0x08  // SLA: Daten Eingaenge senden
12
///////////////////////////////////////////////////////////////////////////

In der aktuellen Version durch
1
#define DATA_LOW              0x08
ersetzt

von Thomas (Gast)


Lesenswert?

OK, dann passt die Quelle nicht ganz zum Header.  ;o)

Ich werd's mal ersetzen...

Danke.

von Jörg S. (joerg-s)


Lesenswert?

>OK, dann passt die Quelle nicht ganz zum Header.  ;o)
Stimmt, mein Fehler. Gibt seit gestern aber eh wieder ne neue Version :) 
Werde ich im laufe der Woche reinstellen.

von Jörg (Gast)


Lesenswert?

Hallo Jörg,

ich bin gerade dabei, den Code auf einen AVR anzupassen und bin schon 
ziemlich weit. Einzig die praktische Prüfung steht noch aus. ;o)
Vielleicht sollten wir uns mal unterhalten, wie man den Code 
hardwareunabhängig macht und so auf verschiedener Hardware nutzen kann.

Gruß,
Jörg

von Mark (Gast)


Lesenswert?

Bin an einer Implementierung für AVR interessiert, hätte auch die nötige 
Hardware (315-2DP) neben mir am Schreibtisch stehen. Müsste nur den AVR 
daran anschliessen, bzw. den RS485 Bus anbinden.

von Jörg S. (joerg-s)


Lesenswert?

>Vielleicht sollten wir uns mal unterhalten, wie man den Code
>hardwareunabhängig macht und so auf verschiedener Hardware nutzen kann.
Na ja, der Hauptteil (profibus_RX) ist ja schon unabhängig. Was stellst 
du dir da noch vor?

von Jörg (Gast)


Lesenswert?

>Na ja, der Hauptteil (profibus_RX) ist ja schon unabhängig. Was stellst
>du dir da noch vor?

Ich habe die gesamte UART-Kommunikation und alles, was damit zu tun hat, 
ausgelagert. Auch gibt es die Timerfunktion nicht mehr. Das ist bei mir 
eine Funktion profibus_Statusmachine() und diese wird dann extern in 
einem Timer aufgerufen. So was meine ich.

Ich denke, man kann die Logik sehr schön von allen hardwarenahen Dingen 
trennen. Somit hätte man dann eine profibus.c/.h, die in verschiedenen 
Projekten verwendet werden kann und einfach nur Funktionen bereitstellt, 
die von extern aufgerufen werden können.

Jörg

P.S. Ich möchte im Moment nur den geänderten Code hier nicht posten, 
da der völlig ungetestet ist (Er lässt sich nur fehlerfrei kompilieren 
;o) ).

von Jörg S. (joerg-s)


Lesenswert?

Logische Auslagerungen könnte man natürlich machen, all zu viele 
Änderungen werden ich (zumindest beim aktuellen Projekt) vermutlich aber 
nicht machen können. Muss jetzt schon darauf achten das die 
Funktionsaufrufe bzw. Interrupts nicht zu lange dauern.

Aber am besten warten wir mal ab bis du fertig bist und reden dann 
weiter über das Thema :)

von Jörg (Gast)


Lesenswert?

> Gibt seit gestern aber eh wieder ne neue Version :)

Kannst Du sie hier bitte reinstellen. Dann kann ich meine modifizierte 
Variante anpassen. Die könnte ich Dir dann bspw. auch zumailen, damit 
man ab dann evtl. eine gemeinsame Basis hat.

Jörg

von Jörg S. (joerg-s)


Lesenswert?

War die letzten Tage etwas kränklich, von daher hat es noch nicht 
geklappt. Ich denke mal heute abend oder morgen stell ich die neue 
Version rein.... Hauptänderung waren aber eh nur Interrupt Geschichten. 
Für AVR Umbastler wohl nicht sooo interessant.

von Jörg S. (joerg-s)


Angehängte Dateien:

Lesenswert?

So, die aktuelle Version.

Änderungen:
- RX Interrupt optimiert.
- Slave Adresse wird vor Checksummenberechnung überprüft
- TX Interrupt wartet nicht mehr bis letztes Byte gesendet wurde
- Umschaltung von TX auf RX (RS485 Transceiver) jetzt per Timer 
(PROFIBUS_SEND_DATA)
- Timer Interrupt Stop Timer für die Zeit der Verarbeitung
- Interrupt nesting im Timer Interrupt möglich

Alle Änderungen verringern die Verarbeitungszeit für die Profibus 
Schnittstelle und geben anderen Applikationen mehr und schnelleren 
Zugriff auf die CPU.

von Jörg S. (joerg-s)


Angehängte Dateien:

Lesenswert?

Und die h....

von Viviane (Gast)


Lesenswert?

Hallo Jörg,

unterstützt auch das DPV0 die erweiterte Diagnose des Typs "device 
related" - "Status Model" - "Status Message" ?

Wenn ja wie ??

Danke im Vorraus.

Gruß,
Viviane

von Jörg S. (joerg-s)


Lesenswert?

Die Diagnose kann gesendet werden indem man bei der I/O Datenübertragung 
anstatt Data-low
1
profibus_send_CMD(SD2, DATA_LOW, 0, &uart_buffer[7], OUTPUT_DATA_SIZE);
Data-high sendet (Define: DIAGNOSE):
1
profibus_send_CMD(SD2, DIAGNOSE, 0, &uart_buffer[7], OUTPUT_DATA_SIZE);

Das führt dazu das die SPS über den SAP 62->60 die Diagnose Daten 
abholt. Im Status1 Byte muss dann das Bit 0x08 (EXT_DIAG_) gesetzt 
werden
1
uart_buffer[9]  = EXT_DIAG_;                    // Status 1
2
uart_buffer[10] = STATUS_2_DEFAULT;             // Status 2
3
uart_buffer[11] = DIAG_SIZE_OK;                 // Status 3
4
uart_buffer[12] = master_addr - SAP_OFFSET;     // Adresse Master
5
uart_buffer[13] = IDENT_HIGH_BYTE;              // Ident high
6
uart_buffer[14] = IDENT_LOW_BYTE;               // Ident low
7
uart_buffer[15] = 0x05;     // Geraetebezogene Diagnose (Anzahl Bytes)
8
uart_buffer[16] = 0x00;     // Geraetebezogene Diagnose Byte 1
9
uart_buffer[17] = 0x20;
10
uart_buffer[18] = 0x20;
11
uart_buffer[19] = 0x00;
Dann kann man mehr oder weniger beliebig viele Gerätebezogene Diagnose 
Bytes senden. Was die einzelnen Bits bedeuten muss in der GSD Datei 
beschrieben werden.

von Tino (Gast)


Lesenswert?

Hallo Jörg,

ich bin gerade am testen mit einem experimentellen Aufbau.

Nun weiß ich aber nicht so recht, wie denn die Peripherie initialisiert 
werden muß (Basic Clock Modul, TimerA, UART, Interrupts) ?

Vielen Dank im Vorraus.

Gruß Tino

von Jörg S. (joerg-s)


Lesenswert?

>Basic Clock Modul
Bei mir ist SMCLK = 4MHz und MCLK = 8MHz
Im einfachsten Fall mit internem DCO wäre das:
1
  // DCO auf 8MHz stellen
2
  BCSCTL1 = CALBC1_8MHZ;
3
  DCOCTL = CALDCO_8MHZ;
4
5
  BCSCTL2 = DIVS_1;  // SMCLK = DCO/2 = 4MHz, MCLK = DCO = 8MHz

>TimerA
Müsste im Source Code schon alles drin sein (Siehe init_Profibus())

>UART
1
  UCA0CTL0 = UCPEN + UCPAR;     // Parity, Even Parity
2
  UCA0CTL1 = UCSSEL_2;          // Clock = SMCLK = 4MHz
3
//  UCA0BR0  = 0xD0;              // Einstellung fuer 19200
4
//  UCA0BR1  = 0x00;              // Einstellung fuer 19200
5
//  UCA0MCTL = UCBRS_3;           // Modulation für Korrektur fuer 19200
6
  UCA0BR0  = 0x2A;              // Einstellung fuer 93750
7
  UCA0BR1  = 0x00;              // Einstellung fuer 93750
8
  UCA0MCTL = UCBRS_5;           // Modulation für Korrektur fuer 93750

>Interrupts
1
IE2 |= UCA0RXIE;                    // Interrupt UART0 an für RX

von SPS - User (Gast)


Lesenswert?

Hallo Jörg,

wäre es eventuell möglich, dass Du mal den SPS - Code (auch wenn 
offtoppic) hier posten könntest, mit dem Du die gesamte Kommunikatin 
über den Profibus machst. Die Parametrierung ist mir klar.
Geht sich um den AWL Part (Receive-Signal - Datenbank auslesen - 
weiterverarbeiten und wie die Daten dann von der Datenbank aus weiter 
verarbeitet werden.

Gruß

von Jörg S. (joerg-s)


Lesenswert?

Auf die SPS Sachen hab ich keinen Zugriff, da müsste ich erst die 
anderen Fragen...

von mhedder (Gast)


Lesenswert?

@SPS:
Den AWL-Code für die Profibus-Kommunikation kann ich gern bei passender 
Gelegenheit mal rauskopieren und hier posten. Ich denke allerdings 
nicht, dass der wirklich weiter hilft, da er auf die speziellen 
Anforderungen zugeschnitten ist, und unzählige andere FCs aufruft, die 
z.B. für die Normierung, IR-Code-Verarbeitung, usw. zuständig sind.

Prinzipiell besteht so ein SPS-Remote für die SPS aus 35Byte E/A. Diese 
Daten werden in jedem Zyklus aus einem DB auf die Ausgangsbytes 
kopiert...

Kannst Du evtl. deine Frage bzgl. des SPS-Programms ein wenig 
konkretisieren. Vieleicht lässt sich so besser helfen.

Gruß Marc

von SPS - User (Gast)


Lesenswert?

@mhedder:

ich habe folgendes Problem, ich arbeite derzeit mit einer Vipa 313-CPU 
mit RS485 Schnittstelle. Es gibt einige viele tolle Beispiele, aber 
alle, die ich bisher gesehen habe, waren so der Art, ich schick ein paar 
Zeichen zur SPS, die schickt die dann wieder zurück oder schreibt die in 
eine DB. Okay, das hab ich auch schon selbst realisiert.
Was mich derzeit aber interessiert, ist eher folgender Fall:
- ich schicke Daten an die SPS
- Daten werden in einer DB abgelegt - okay bis hier ist alles klar
- danach sollen sie ja so ganz toll ausgewertet werden. nur genau beim 
Auswerten hab ich das Problem.
Zugriff auf einzelne Elemente aus einer Datenbank ist da auch nicht das 
Problem, aber bei der Fehlerbehandlung und der Aufbau der Schleifen 
hakts bei mir. Ich bau mir da meistens irgendwie eine Endlosschleife 
oder so... .
Daher würde mich der Code mal interessieren, mit dem ihr die Daten 
auswertet, um vielleicht so auf meine Probleme aufmerksam zu werden.

Gruß

von mhedder (Gast)


Lesenswert?

Mit DB meinst Du wohl "Datenbank". Bei unserem Projekt, wird die 
gesammte Datenhaltung in "Datenbausteinen" direkt in der SPS gemacht. 
Bei deinem Problem kann ich Dir da nicht wirklich weiterhelfen...
Mir scheint, Du solltest Dich erstmal richtig in die Materie 
SPS-Programmierung einlesen.
Für SPS-Spezifische fragen ist folgendes Forum im Übrigen eine gute 
Adresse:

http://www.sps-forum.de

Gruß Marc

von Frickel Heini (Gast)


Lesenswert?

SPS DB = Datenbaustein ;)

von SPS - User (Gast)


Lesenswert?

@mhedder:
sorry, aber ich weiß schon, wovon ich da rede und ich hab mich auch mehr 
als genug belesen ... .

Also, das alle Daten in Datenbausteinen [DB]vorgehalten werden, ist mir 
klar.
Also nochmal:
- Daten werden vom PC via RS485 an die SPS geschickt
- SPS speichert die gesendeten Daten in einer "Empfangs"DB
- Auslösen eines Interrupts, oder setzen eines Merkers - Daten vorhanden
- danach folgt ein Algorithmus, der eben die empfangen Daten auswerten 
soll
- ich weiß, dass ich folgende Daten anschl. habe:
  - ID des Senders
  - ID des Empfängers
  - Datenblock
Wie wertet ihr diesen Datenblock in der o.g. DB aus?
Dazu fehlt mir einfach mal ein Beispiel da ich daran meistens ziemliche 
Probleme bekomme.

Gruß

von mhedder (Gast)


Lesenswert?

Hallo,

irgendwie verstehe ich Dein Problem nicht wirklich. Also, Du hast die 
Daten in einem DB in der SPS stehen. Dann ist es doch ein Leichtes auf 
die Daten mit einem neuen FC oder FB zuzugreifen und die Daten 
auszuwerten...?

z.B.:

u db1.dbx3.0
= a 0.0 // Wenn Bit 3.0 in DB1 gleich eins, dann A 0.0 High


Wir reden aber immer von Datenbausteinen, oder?
Einmal schreibst Du

"Also, das alle Daten in Datenbausteinen [DB]vorgehalten werden, ist mir 
klar."

und ein anderes Mal

"SPS speichert die gesendeten Daten in einer "Empfangs"DB"

Gruß Marc

von Michael H. (michael-f)


Lesenswert?

Hi,
ich möchte auch einen MSP verwenden um den SPC4 anzusteuern. Hast du die 
Funktionalität für den Zugriff auf die 10 Addressbits selbst 
programmiert oder hast du hierfür eine Bibliothek ? Ist dein MSP430F2252 
für die anbindung eines externen Datenbusses besonders geeignet (Adress 
und Datenbus) ?

Gruß
Michael

von Jörg S. (joerg-s)


Lesenswert?

Da hast du was falsch verstanden. Wir machen ALLES mit dem MSP. Ein SPC4 
o.ä. ist nicht notwendig. Nur ein RS485 Baustein :)
Funktioniert also mit allen MSPs (oder anderen Controllern) die eine 
UART Schnittstelle haben. Der MSP430F2252 ist im prinzip schon etwas 
oversized. Für einfache I/O Sachen geht auch was kleineres.


In den nächsten Tagen wird es übrigens noch ein kleines Update der SW 
geben.

von Jörg S. (joerg-s)


Angehängte Dateien:

Lesenswert?

Die neue Version...

Änderungen:
- Mit defines werden jetzt die diversen Arrays automatisch angelegt und 
initialisiert.
- Zwei neue Arrays: Vendor_Data[] und Diag_Data[]
- Neues Flag: diagnose_status
- read_slave_addr() in get_Address() umbenannt

Über "diagnose_status = TRUE" werden Diagnose Daten automatisch 
übertragen.
Der Datentausch wird durch die defines "automatisiert". Wenn keine Daten 
gesendet, sondern nur empfangen werden, wird automatisch nur noch eine 
Kurzquittung anstatt SD2 Kommando gesendet.

von Stefan (Gast)


Lesenswert?

Mal eine Frage eines nur bedingt mit der Materie vertrauten:

Das Ganze funktioniert doch nur so lange prima, wie allen Nodes die 
Geschwindigkeit des MSP, bzw. der geringeren Busgeschwindigkeit 
ausreicht (?) oder kann man so einen low-speed-Slave auch zusammen mit 
anderen Full-Speed-Slaves in einem 12 MBit Netz einsetzen ?

Stefan

von Jörg S. (joerg-s)


Lesenswert?

Alle müssen die gleiche Busgeschwindigkeit haben, sonst geht nix.

von Stefan (Gast)


Lesenswert?

Hab' ich mir gedacht - wäre ja auch zu genial gewesen.

Vielen Dank und viel Erfolg !

von Alberto C. (Gast)


Lesenswert?

Hallo Joerg-S an Co
 Super arbeit geleistet. Da habe ich ein par Fragen dazu.

1º
   Könnten Sie mir sagen auf wieviele ms der interrupt eingestellt ist?

2º Ist es möglich der code mit der function main() uploaden, es wäre 
nähmlich sehr hilfreich.

Alberto (Spain)

von Jörg S. (joerg-s)


Lesenswert?

>Könnten Sie mir sagen auf wieviele ms der interrupt eingestellt ist?
Timer A?
Das ist variable, je nachdem in welchem Zustand der Profibus gerade ist.

Relevanter Code:
1
//////////////////////////////////////////////////////////////////////////
2
#define TIMEOUT_MAX_SYN_TIME  33 * DELAY_TBIT // 33 TBit = TSYN
3
#define TIMEOUT_MAX_RX_TIME   15 * DELAY_TBIT
4
#define TIMEOUT_MAX_TX_TIME   15 * DELAY_TBIT
5
#define TIMEOUT_MAX_SDR_TIME  15 * DELAY_TBIT // 15 Tbit = TSDR
6
//////////////////////////////////////////////////////////////////////////
7
8
//////////////////////////////////////////////////////////////////////////
9
#define TA_SMCLK_500KHZ       TACTL = MC1 + TASSEL1 + ID_3;
10
#define TA_RUN                TACTL |= MC1
11
#define TA_STOP               TACTL &= ~MC1
12
13
#define DELAY_TBIT            5.33    // UART @ 93750
14
//////////////////////////////////////////////////////////////////////////


> Ist es möglich der code mit der function main() uploaden, es wäre
> nähmlich sehr hilfreich.
Das das sonderlich hilfreich ist, glaube ich nicht :)
Gibt es konkrete Fragen?
1
//////////////////////////////////////////////////////////////////////////
2
void main (void)
3
{
4
5
  ///////////////////////////////////////
6
  watchdog_aus          ();
7
  init_MCU              ();
8
  switch_SMCLK_XT1_8MHz ();
9
  init_UART0            ();
10
  init_Profibus         ();
11
  interrupt_settings    ();
12
  ///////////////////////////////////////
13
14
  while(1)
15
  {
16
    // Hier Code fuer Hauptprogramm
17
  }
18
}
19
/////////////////////////////////////////////////////////////////////////

von Alberto C. (Gast)


Lesenswert?

Hallo Jörg

Ok, es ist einfacher als ich dachte.
In dem fall 5.33 sind das 5.33 ms?

mfg.
  Alberto

von Jörg S. (joerg-s)


Lesenswert?

>In dem fall 5.33 sind das 5.33 ms?
Nein, das ist die Anzahl der Takte des Timer A für ein Bit.

Timer A = 500kHz -> 2µs/Takt
Profibus = 93750 Baud -> 10,66µs/Bit

10,66µs/2µs = 5,33 Takte/Bit

von Alberto C. (Gast)


Lesenswert?

Hi Jörg,
vielen dank für die erklärung. Ich versuchs mal
zu einem PIC.

von Jochen K. (jogibear9988)


Lesenswert?

Hier war mal die rede von einer Version für einen AVR, ist darraus was 
geworden?

Welche maximale Profibus Baudrate wäre denn mit einem MSP430F2252 
möglich?

von Jörg S. (joerg-s)


Lesenswert?

>Welche maximale Profibus Baudrate wäre denn mit einem MSP430F2252
>möglich?
Wenn Marc noch ne 2. SPS auftreiben kann, wollte ich ein Versuch mit 
500k und 1,5M starten.
500k sollte sicherlich noch gehen, 1,5M würde schon ausserhalb der Spec 
vom 2252 liegen, es gibt aber MSPs der F2xxer Serie die das laut 
Datenblatt noch können.

von Allgegenwärtig (Gast)


Lesenswert?

Interessant wäre eine Portierung auch auf einen ARM ala STM32 oder LPC2

von Jörg S. (joerg-s)


Lesenswert?

Allgegenwärtig schrieb:
> Interessant wäre eine Portierung auch auf einen ARM ala STM32 oder LPC2
Auf meinem Schreibtisch liegt schon ne Platine mit ARM Cortex M3 
(LPC1768) :)

von Allgegenwärtig (Gast)


Lesenswert?

Ah, ein Sample ;)

von Jörg S. (joerg-s)


Lesenswert?

Jain, hat mit einem Sample angefangen, den 1768 hab ich aber normal 
gekauft ;)
Wird aber noch etwas dauern bis da Profibus läuft. Bis jetzt blinkt nur 
ne LED, als nächstes kommt erst mal ein Display dran, danach dann 
UART...

von Jochen K. (jogibear9988)


Lesenswert?

Jörg S. schrieb:
> Wenn Marc noch ne 2. SPS auftreiben kann, wollte ich ein Versuch mit
> 500k und 1,5M starten.
> 500k sollte sicherlich noch gehen, 1,5M würde schon ausserhalb der Spec
> vom 2252 liegen, es gibt aber MSPs der F2xxer Serie die das laut
> Datenblatt noch können.

wo bekomme Ich dennam besten die MSP Microcontroller?

Bei welchem würden denn laut Datenblatt 1,5 gehen, hab mal gestöbert, 
aber Ich finde bei allen die gleiche Uart Frequenz!

von Jörg S. (joerg-s)


Lesenswert?

>wo bekomme Ich denn am besten die MSP Microcontroller?
HBE (www.hbe-shop.de) hat eigentlich alle im Programm.

>Bei welchem würden denn laut Datenblatt 1,5 gehen, hab mal gestöbert,
>aber Ich finde bei allen die gleiche Uart Frequenz!
Die F21x2 gehen z.B. bis 2MHz BitClk.

von KiliPet (Gast)


Lesenswert?

Hallo!
Wie ist denn die Einschätzung das auf einem ATtiny2313 zum Laufen zu 
bekommen?

von Jörg S. (joerg-s)


Lesenswert?

Hab eben mal schnell mein Projekt total abgespeckt. Es kommen 2,3 kByte 
Flash und 150 Byte RAM raus (bei MSP430 / Code Optimierung "low").
Beim Profibus könnte man aber noch einiges raus werfen (z.B. SAP 62 -> 
DSAP 62) und dadurch noch etlichen Speicher sparen.

Wenn man also nur ein paar Byte direkt von einem Port auslesen oder 
setzen will, könnte man es mit eisernem Willen vielleicht schon mit 2 
kByte Flash und 128 Byte RAM schaffen. Wäre hart an der Grenze, aber 
wohl noch im Bereich des möglichen.

von Jörg S. (joerg-s)


Angehängte Dateien:

Lesenswert?

Und wenn wir schon dabei sind....
Der 6-fach Dimmer befindet sich gerade in der Testphase :)

von Christian A. (noeppkes)


Lesenswert?

Hallo Joerg,

sieht wirklich Klasse aus was du da machst.
Habe auch eine SPS im Keller hängen zur Haussteuerung.
Wäre sehr an dem 6-fach Dimmer interessiert.

Würdest du die Daten herausgeben (Source-Code, Layout etc.) ?
Ich benutze Eagle. Sieht auch sehr nach Eagle aus.

noeppkes ...

von Jörg S. (joerg-s)


Lesenswert?

Beschreibung von dem ganzen Kram ist schon in Arbeit.
Evt. könnte ich am Wochenende die Homepage soweit fertig machen das 
schon ein paar Schaltpläne usw. mit drin sind...

Und ja, es ist mit Eagle gemacht :)

von Christian A. (noeppkes)


Lesenswert?

Hallo Joerg.

Freue mich schon drauf.
Hinterlasse hier einfach eine Nachricht.

Bis dann ...
noeppkes ...

von Jörg S. (joerg-s)


Lesenswert?

So, hier findet sich jetzt die Schaltungsbeschreibung, Schaltplan und 
das Eagle Projekt:
http://www.see-solutions.de/projekte/projekte.htm (2007_02)

Weiss noch nicht genau wie das dann mit der Beschreibung der SPS Seite 
werden soll. Evt. gibt es dann mal eine separate Homepage für die ganze 
Sache...

von Einar S. (Firma: Norwegen) (esjaavik)


Lesenswert?

Hallo Jörg,

Als eine PROFIBUS slave sollte es unter beliebige master (SPS oder 
anders) arbeiten.

Ich versuche diese mit ein AVR AtMega16 zu machen. Es springt doch eine 
meldung herüber und die nächste wird dann im Profibus_RX bearbeitet!? 
Also jede zweite meldung ist verloren.

Dann muss immer als 3 oder so in master als Retry Count angegeben. Dann 
wird die fehler behebt bei die nächste (retry) meldung.

Ich hat die Timer_ISR unter case PROFIBUS_GET_DATA ein kurzes ein/aus 
mit der RS485 treiber gemacht (7,5us). Dann kann ich es in ProfiTrace2 
oscilloscope als ein "blip" sehen. Und wenn eine meldung bearbeitet sind 
wird die nächste es nicht. Aber immer die meldung danach.

Hast du mit ProfiTrace oder ähnliches überprüft dass deine slave keine 
meldungen übersehen?

von Einar S. (Firma: Norwegen) (esjaavik)


Lesenswert?

Hurra Propeller!! Nun laüft es.

Und es springt keine meldungen herüber. Dass war meine fehler wenn zum 
AVR umschreiben.

In SAP_CHK_CFG sollte du erst diese kode einsetzen:
1
Output_Data_size=0;
2
Input_Data_size=0;
Danach alle "=" mit "+=" ersätzen. Dann wird es mehrere module 
akzeptieren. Wenn du in konfigurator 10 byte input angibt als ein modul 
8byte und ein modul 2byte, dann bekommst du nur 2 byte! Mit diese 
korrektur kannst du mehrere module korrekt einsetzen. Und diese slave 
will sich zum master konfiguration anpassen, nicht nur wie üblich 
überprüfen.

Es lüft nun mit 187.5Kbit/s und Tsdr 42Tbit. Wird mit ProfiTrace2 
ausgemessen.

Mit 2 kleine änderungen ist auch Set Slave Address OK.

Wie geht es dann mit ihre hausautomations projekt Jörg?

von KiliPet (Gast)


Lesenswert?

Hallo Einar,
ich würde auch gerne mal mit meinem Atmega16 und Profibus 
herumexperimentieren. Könntest Du vielleicht den Code deiner Portierung 
zum AVR zur Verfügung stellen?

Dann muss ich das Rad nicht neu erfinden.

Danke im Voraus
Kilian

von Jörg S. (joerg-s)


Lesenswert?

Einar S. schrieb:
> In SAP_CHK_CFG sollte du erst diese kode einsetzen:
>
1
> Output_Data_size=0;
2
> Input_Data_size=0;
3
>
Das wird ja schon in der init_Profibus() gemacht.

Einar S. schrieb:
> Danach alle "=" mit "+=" ersätzen. Dann wird es mehrere module
> akzeptieren. Wenn du in konfigurator 10 byte input angibt als ein modul
> 8byte und ein modul 2byte, dann bekommst du nur 2 byte! Mit diese
> korrektur kannst du mehrere module korrekt einsetzen.
Das mit den Modulen ist bekannt. Hab ich weiter oben schon erwähnt. Für 
Konfigurationen mit mehreren Modulen sind die auskommentierten Arrays
Input_Data_size_Module[INPUT_MODULE_CNT]
und
Output_Data_size_Module[OUTPUT_MODULE_CNT]
vorgesehen. Da hab ich aber noch nicht weiter dran gearbeitet. Das mit 
+= ist natürlich erst mal eine einfache Lösung :)

von Jörg S. (joerg-s)


Lesenswert?

Einar S. schrieb:
>Wie geht es dann mit ihre hausautomations projekt Jörg?
Grundätzlich läuft's. Ein paar kleine Probleme und Änderungen müssen 
noch bearbeitet werden :)

von Einar S. (Firma: Norwegen) (esjaavik)


Lesenswert?

Ich muss es doch erst ein bisschen durchsehen, so bitte geduld Kilian.
Und nur wenn Jörg gibt sein OK.

@Jörg: Ist es OK wenn ich die modifizierte kode auch für andere zu 
verfügung stellt? Es is ja nahezu 100% deine arbeit.

von Jörg S. (joerg-s)


Lesenswert?

>@Jörg: Ist es OK wenn ich die modifizierte kode auch für andere zu
>verfügung stellt? Es is ja nahezu 100% deine arbeit.
Hätte ich kein Problem mit.

von Einar S. (Firma: Norwegen) (esjaavik)


Angehängte Dateien:

Lesenswert?

KiliPet schrieb:
> Dann muss ich das Rad nicht neu erfinden.

Hier isses.
Das rundlauf diese rad konnte besser sein. ;-)

Bei mir geht es ziemlich gut, aber es ist bekannte fehler darin.

Für meine erste projekt LEDlicht steuerung/dimmer ist es scon gut genug. 
Verbesserungen will ich trotzdem machen.

von Jochen Kühner (Gast)


Lesenswert?

Einar S. schrieb:
> Hier isses.
> Das rundlauf diese rad konnte besser sein. ;-)
>
> Bei mir geht es ziemlich gut, aber es ist bekannte fehler darin.
>
> Für meine erste projekt LEDlicht steuerung/dimmer ist es scon gut genug.
> Verbesserungen will ich trotzdem machen.

Kann man auch einen Schaltplan zu deinem entwurf bekommen?

von Einar S. (Firma: Norwegen) (esjaavik)


Lesenswert?

Ich habe die PROFIBUS treibern von eine slave modul ausgeschlachtet.

Meistens ist die alle gleich. Und in das buch "The New Rapid Way to 
Profibus DP" (Manfred Popp) ist auch shaltplan zu finden.

Oder 75176 datenblatt suchen.

von Jochen Kühner (Gast)


Lesenswert?

Einar S. schrieb:
> Ich habe die PROFIBUS treibern von eine slave modul ausgeschlachtet.
>
> Meistens ist die alle gleich. Und in das buch "The New Rapid Way to
> Profibus DP" (Manfred Popp) ist auch shaltplan zu finden.
>
> Oder 75176 datenblatt suchen.

Hab leider dieses Buch nicht...

Und in dem Datenblatt finde Ich kein Schaltplan mit AVR...

geht auch ein Max3485 als PB Treiber??

von Einar S. (Firma: Norwegen) (esjaavik)


Lesenswert?

Jochen Kühner schrieb:

> Und in dem Datenblatt finde Ich kein Schaltplan mit AVR...

Findet du auch nicht in buch.
Diese kannst du in Profibus.c lesen:
"Pins used: USART RX / TX, Portd:2 controls TX enable."
Besser kann ich nicht tun. Ich habe selber keine schaltplan.

Diese DP-slave ist keine DIY DP-slave.
Es ist auch keine komplette DP-Slave, aber eine basis für DP funktionen 
herumzuspielen. Man sollte PROFIBUS und AVR ziemlich gut verstehen um 
von hier weiter zu kommen. (Gilt mindestens für meine AVR anpassung. Wie 
es mit Jörg's MSP430 ist, weiss ich nicht.)

von Jörg S. (joerg-s)


Lesenswert?

>geht auch ein Max3485 als PB Treiber??
Es sollte jeder 485 Treiber gehen.

von Soares (Gast)


Lesenswert?

Hello. i try the code profibus.c and the profibus.h that u gave but when 
i run apper this:

error: `FALSE' undeclared (first use in this function)
Projecto\Firmware\Firware\SPC3_app_example\Profibus_Final\profibus.c:51: 
error: (Each undeclared identifier is reported only once
Projecto\Firmware\Firware\SPC3_app_example\Profibus_Final\profibus.c:51: 
error: for each function it appears in.)
Projecto\Firmware\Firware\SPC3_app_example\Profibus_Final\profibus.c:91: 
error: `TACTL' undeclared (first use in this function)
Projecto\Firmware\Firware\SPC3_app_example\Profibus_Final\profibus.c:91: 
error: `MC1' undeclared (first use in this function)
Projecto\Firmware\Firware\SPC3_app_example\Profibus_Final\profibus.c:91: 
error: `TASSEL1' undeclared (first use in this function)
Projecto\Firmware\Firware\SPC3_app_example\Profibus_Final\profibus.c:91: 
error: `ID_3' undeclared (first use in this function)
Projecto\Firmware\Firware\SPC3_app_example\Profibus_Final\profibus.c:92: 
error: `TAR' undeclared (first use in this function)
Projecto\Firmware\Firware\SPC3_app_example\Profibus_Final\profibus.c:93: 
error: `TACCR0' undeclared (first use in this function)
Projecto\Firmware\Firware\SPC3_app_example\Profibus_Final\profibus.c: At 
top level:
Projecto\Firmware\Firware\SPC3_app_example\Profibus_Final\profibus.c:101 
:  error: function name not found in vector #pragma
Projecto\Firmware\Firware\SPC3_app_example\Profibus_Final\profibus.c: In 
function `USCIAB0RX_ISR':
Projecto\Firmware\Firware\SPC3_app_example\Profibus_Final\profibus.c:105 
:  error: `UCA0RXBUF' undeclared (first use in this function)
Projecto\Firmware\Firware\SPC3_app_example\Profibus_Final\profibus.c:123 
:  error: `TAR' undeclared (first use in this function)
Projecto\Firmware\Firware\SPC3_app_example\Profibus_Final\profibus.c: In 
function `profibus_RX':
Projecto\Firmware\Firware\SPC3_app_example\Profibus_Final\profibus.c:146 
:  error: `FALSE' undeclared (first use in this function)
Projecto\Firmware\Firware\SPC3_app_example\Profibus_Final\profibus.c:166 
:  error: `TRUE' undeclared (first use in this function)
Projecto\Firmware\Firware\SPC3_app_example\Profibus_Final\profibus.c:269 
:  error: `LED_ERROR_AN' undeclared (first use in this function)
Projecto\Firmware\Firware\SPC3_app_example\Profibus_Final\profibus.c:271 
:  error: `LED_ERROR_AUS' undeclared (first use in this function)
Projecto\Firmware\Firware\SPC3_app_example\Profibus_Final\profibus.c:367 
:  warning: comparison is always false due to limited range of data type
Projecto\Firmware\Firware\SPC3_app_example\Profibus_Final\profibus.c: In 
function `profibus_TX':
Projecto\Firmware\Firware\SPC3_app_example\Profibus_Final\profibus.c:712 
:  error: `RS485_TX_EN' undeclared (first use in this function)
Projecto\Firmware\Firware\SPC3_app_example\Profibus_Final\profibus.c:714 
:  error: `TACCR0' undeclared (first use in this function)
Projecto\Firmware\Firware\SPC3_app_example\Profibus_Final\profibus.c:720 
:  error: `IFG2' undeclared (first use in this function)
Projecto\Firmware\Firware\SPC3_app_example\Profibus_Final\profibus.c:720 
:  error: `UCA0TXIFG' undeclared (first use in this function)
Projecto\Firmware\Firware\SPC3_app_example\Profibus_Final\profibus.c:721 
:  error: `IE2' undeclared (first use in this function)
Projecto\Firmware\Firware\SPC3_app_example\Profibus_Final\profibus.c:721 
:  error: `UCA0TXIE' undeclared (first use in this function)
Projecto\Firmware\Firware\SPC3_app_example\Profibus_Final\profibus.c: In 
function `addmatch':
Projecto\Firmware\Firware\SPC3_app_example\Profibus_Final\profibus.c:752 
:  error: `FALSE' undeclared (first use in this function)
Projecto\Firmware\Firware\SPC3_app_example\Profibus_Final\profibus.c:754 
:  error: `TRUE' undeclared (first use in this function)
Projecto\Firmware\Firware\SPC3_app_example\Profibus_Final\profibus.c: At 
top level:
Projecto\Firmware\Firware\SPC3_app_example\Profibus_Final\profibus.c:760 
:  error: function name not found in vector #pragma
Projecto\Firmware\Firware\SPC3_app_example\Profibus_Final\profibus.c: In 
function `USCIAB0TX_ISR':
Projecto\Firmware\Firware\SPC3_app_example\Profibus_Final\profibus.c:766 
:  error: `UCA0TXBUF' undeclared (first use in this function)
Projecto\Firmware\Firware\SPC3_app_example\Profibus_Final\profibus.c:769 
:  error: `IE2' undeclared (first use in this function)
Projecto\Firmware\Firware\SPC3_app_example\Profibus_Final\profibus.c:769 
:  error: `UCA0TXIE' undeclared (first use in this function)
Projecto\Firmware\Firware\SPC3_app_example\Profibus_Final\profibus.c:772 
:  error: `TAR' undeclared (first use in this function)
Projecto\Firmware\Firware\SPC3_app_example\Profibus_Final\profibus.c: At 
top level:
Projecto\Firmware\Firware\SPC3_app_example\Profibus_Final\profibus.c:777 
:  error: function name not found in vector #pragma
Projecto\Firmware\Firware\SPC3_app_example\Profibus_Final\profibus.c: In 
function `TIMERA0_ISR':
Projecto\Firmware\Firware\SPC3_app_example\Profibus_Final\profibus.c:783 
:  error: `TACTL' undeclared (first use in this function)
Projecto\Firmware\Firware\SPC3_app_example\Profibus_Final\profibus.c:783 
:  error: `MC1' undeclared (first use in this function)
Projecto\Firmware\Firware\SPC3_app_example\Profibus_Final\profibus.c:789 
:  error: `TACCR0' undeclared (first use in this function)
Projecto\Firmware\Firware\SPC3_app_example\Profibus_Final\profibus.c:813 
:  error: `RS485_RX_EN' undeclared (first use in this function)
Projecto\Firmware\Firware\SPC3_app_example\Profibus_Final\profibus.c:825 
:  error: `TAR' undeclared (first use in this function)

Why apper that? can u help me? please

von Jörg S. (joerg-s)


Lesenswert?

>Why apper that? can u help me? please
What Compiler are you using?
It looks like you do not include the Header Files for the MSP430 
specific Defines.
Other Defines like "LED_ERROR_AN" or "RS485_TX_EN" are Defines for some 
Port-Pin Switching. They have to be created by you.

Has the "SPC3" Name to do anything with your Project? Because this 
Source Code isn't for any Profibus-ASIC like the SPC!

von Jörg S. (joerg-s)


Lesenswert?

In eigener Sache:

Das Profibus Handbuch von Max Felser habe ich mal auf meine Homepage 
gestellt, da es ja nicht mehr im web verfügbar ist:
http://www.see-solutions.de/sonstiges/sonstiges.htm#Profibus_Handbuch

In den nächsten Woche gibt's auch wieder ein kleines Update. Da ist das 
dann mit den Modulen für die I/O Datengröße besser gelöst.

von Soares (Gast)


Lesenswert?

Im using mplap. I trying to developing a module with VPC3+S using the 
SPI interface. Can you help me ?please

von Soares (Gast)


Lesenswert?

I forgot. my email is soaresandre@live.com We can talk by email if you 
want.

With regards

von Jörg S. (joerg-s)


Lesenswert?

Soares schrieb:
> Im using mplap. I trying to developing a module with VPC3+S using the
> SPI interface. Can you help me ?please
Sorry, i don't know nothing about mplap and nothing about the VPC3 Chip.


Summary:
This Project implements a Profibus Client ONLY WITH SOFTWARE to a MSP430 
Microcontroller. There is no need for a special Profibus Chip, because 
this things are done within the Software on the µC!
On the Hardware-Side, you need a µC with UART and a RS485 Transceiver 
Chip, that's all :)

von Jörg S. (joerg-s)


Angehängte Dateien:

Lesenswert?

Neue Version.

Änderungen:
diagnose_status wird nicht mehr als Flag benutzt, sondern jetzt direkt 
als Status Byte 1 in der Diagnose verwendet. Daher Umbenennung in 
diagnose_status_1.
Der Ablauf der Diagnose wurde ebenfalls überarbeitet, da ein Bug dazu 
führte das die falsche Anzahl der Diagnose Bytes gesendet wurde.
Die Software benutzt zur Zeit die Gerätebezogene Diagnose. Die weiteren 
zwei Diagnosemöglichkeiten wurden noch nicht getestet.
Das Define DIAGNOSE wurde in DATA_HIGH unbenannt, um konform zur Felser 
Dokumentation zu sein.
Hinweis zum Ablauf: Wenn man Diagnosedaten überträgt, löscht die SPS den 
Diagnosestatus erst wenn bei gesetztem Diagnosebit (diagnose_status_1 & 
EXT_DIAG_) leere Diagnosedaten übertragen wurden. Löscht man EXT_DIAG_ 
zusammen mit den Diagnosedaten, so erkennt die SPS den gelöschten 
Diagnose Status nicht.


Beim "Parameter Request" ist die Bezeichnung User Parameter richtiger. 
Daher wird das Define VENDOR_DATA_SIZE umbenannt in USER_PARA_SIZE.
Achtung: Der Name VENDOR_DATA_SIZE wird weiterhin verwendet (Bei Config 
Request).


Wie bereits angekündigt wird die Input/Output Datengröße neu ermittelt. 
Dazu wird ein neues, 2-Dimensionales, Array Module_Data_size[][] 
verwendet.
Die SPS kann nicht nur eine einzige Eingangs- und Ausgangsgröße 
festlegen, sondern auch verschiedene Module. Vor allem beim "speziellem 
Format" spielt das eine Rolle.
Mit MODULE_CNT wird die Anzahl der Module festgelegt. In den zwei Byte 
pro Modul im Array wird die Anzahl der Eingangs- und Ausgangsbytes 
gespeichert.
Bei einem Fehler wird automatisch das entsprechende Flag (CFG_FAULT_) in 
der Diagnose gesetzt.
Der gesamte Abschnitt "Check Config Request" wurde diesbezüglich 
überarbeitet.

von Jochen K. (jogibear9988)


Lesenswert?

Einar S. schrieb:
> KiliPet schrieb:
>> Dann muss ich das Rad nicht neu erfinden.
>
> Hier isses.
> Das rundlauf diese rad konnte besser sein. ;-)
>
> Bei mir geht es ziemlich gut, aber es ist bekannte fehler darin.
>
> Für meine erste projekt LEDlicht steuerung/dimmer ist es scon gut genug.
> Verbesserungen will ich trotzdem machen.

Ich habe nun auch meine Profibus Platine fertig, habe jedoch statts 
einem 12mHz Quarz ein 16MHz quarz verwendet.

Sehe Ich das richtig, das Ich in der profibus.h die F_CPU auf 16000000 
anpassen muss, und noch die DELAY_TBIT  auf 85 erhöhen, das wars dann 
schon??

Und wenn Ichs mit 1,5 Mbit testen will, muss Ich dann auch nur die 
DELAY_TBIT anpassen (um faktor 8 verkleinern?)

von Jochen K. (jogibear9988)


Lesenswert?

Ok, Ich hab gesehen, Ich muss auch noch die werte bei
#define UART_BAUD_187500 anpassen.

Aber wie kommt man bei 12MHz Quarz auf 7 für #define UART_BAUD_187500 
7
(Wert fürs Register UBBRL)

Wenn Ich da die Formeln aus dem Microcontroller Wiki nehm, kommt bei mir 
bei 12MHz 3 raus!

von Jochen K. (jogibear9988)


Angehängte Dateien:

Lesenswert?

Die beiden vorherigen Fragen haben sich soweit erledigt, habe jetzt auch 
ein 12MHz Quarz eingelötet, da sonst für die Teilerberechnungen ja 
unschöne Werte rauskommen. Wenns mit dem 12MHz mal läuft werd Ich ja 
sehen ob Ich das 16MHz noch brauche oder nicht.

Hab nur das Problem Ich kriegs nicht zum laufen. Hab mir mal einen 
Blinker ins Hauptprogramm eingebaut, der geht, aber sonst läufts nicht.


In profibus_RX hab Ich mal einen meiner Ausgänge angesteuert, da läufts 
anscheinend rein, aber dann springt er im select zum case default.

Und wenn Ich das ganze ein paar minuten laufen lasse, dann hängt 
plötzlich der PD2 Ausgang (also das Umschalten von Recieve auf Send), 
und dann geht der ganze Profibus nicht mehr (da auch TX die ganze Zeit 
bei 5V ist!)

Hab mal meinen Plan angehängt, viel. ist ja auch da noch was falsch!

Mfg.

von Einar S. (Firma: Norwegen) (esjaavik)


Lesenswert?

Mit 16MHz muss du 500Kbit/s läufen. Und dann wird die PROFIBUS timing 
ein problem. Mindestens mit die heutige erkennung von ende der 
einkommende meldung. Es wird erkannt als die antwort ausgehen sollte.

Ihr plan ist OK. Ich habe galvanische trennung zwischen MCU und RS485. 
Aber wenn deine testbus nur am labortisch ist sollte das kein problem 
sein.

Die steuerungsaufgaben sollte in doit() sein. Und es sollte nimmer die 
interrupt blockieren.

von Jochen K. (jogibear9988)


Lesenswert?

Ich habe nun ein 12Mhz eingelötet, zur Problemanalyse. Auch die 
Busgeschwindigkeit habe Ich auf 187500 eingestellt. Der Profibus 
funktioniert also noch nicht.

Ich habe zur Kontrolle mal die empfangen daten ins Eeprom geschrieben, 
aber im uart_buffer[0] steht nie ein SD1, SD2, SD3 oder SD4. Es wird 
dort immer in den default case gesprungen. d.h. ich empfange daten, aber 
nicht die richtigen.
Hast du da noch irgendwelche Ideen?

Was für einen Optokoppler hast du denn drin, bzw würdest du empfehlen?

Danke schonmals.

von Jörg S. (joerg-s)


Lesenswert?

A und B vielleicht vertauscht?

von Einar S. (Firma: Norwegen) (esjaavik)


Lesenswert?

Hast du die quellcode wie es ist versucht? Bei mir läuft es gut.
Erst die originalcode nützen. Wenn es läuft ist deine hardware in 
ordnung.

Von störungen weghalten und es sollte ausser galvanische trennung OK 
sein.

Hast du die fuse für externe quarz einprogrammiert? Wenn nicht lauft es 
etwa 8MHz von die interne PLL. Und wenn du eine neue ATmega kriegst ist 
diese fuse nicht für externe quarz programmiert.

von Jochen K. (jogibear9988)


Lesenswert?

Ich Idiot!

Es war das vertauschen von A und B!

Danke schon mal an Einar und Jörg für die Hilfe.

Hab jetzt noch sporadisch Busausfälle, hast du das auch Einar?

Werd mal morgen mit dem Profibusanalyser drangehen, um zu sehen ob er im 
nicht gestörten Zustand schon oft in die Telegrammwiederholung kommt.

Als nächstes werd Ich dann noch versuchen AutoBau Erkennung zu 
implementieren. Müsste doch möglich sein, wenn man einen Zähler bei den 
empfangen falschen Telegrammen einbaut, so das wenn dieser zu groß wird, 
man die Baudrate ändert, bis es funktioniert?

von Jochen K. (jogibear9988)


Lesenswert?

Einar S. schrieb:
> Von störungen weghalten und es sollte ausser galvanische trennung OK
> sein.

Ist den eine Galvanische Trennung bei PB-Vorschrift? Machst du in deinen 
PB Platinen eine galvaische Trennung Jörg?

von Jochen K. (jogibear9988)


Lesenswert?

Noch Infos:

Wenn Ich das RetryLimit hochsetze, bekommt die CPU die Störung nicht 
mehr mit. Muss morgen mal mit dem Busanalyser sehen, ob der Slave gar 
nicht Antwortet, oder was falsches schickt...

von Jochen K. (jogibear9988)


Lesenswert?

Und schon wieder Ich.

@Eimar:

Sollte in deinem AVR Projekt nicht auch unsigned char data_in_register 
[INPUT_DATA_SIZE]; volatile sein?

Wenn es gedacht Ist die Verabreitung in doit zu machen, gehts bei mir 
ohne nicht!

von Jochen K. (jogibear9988)


Lesenswert?

Und nochmals Ich:

Ich hab jetzt das Retry_Limit auf 5, und da läuft es eigendlich stabil. 
Doch wenn ich dann z.B. den baugruppenzustand in Step7 aufmache, und 
somit mein Schnittstellenadapter ein Haufen Informationen vom Bus zieht, 
habe Ich einen Busausfall von meinem Teilnehmer. werd das auch mal 
morgen weiter Analysieren, aber viel. hat ja da schon jemand eine Idee!

von Jörg S. (joerg-s)


Lesenswert?

Jochen Kuehner schrieb:
> Machst du in deinen PB Platinen eine galvaische Trennung Jörg?
Nein.

> Doch wenn ich dann z.B. den baugruppenzustand in Step7 aufmache, und
> somit mein Schnittstellenadapter ein Haufen Informationen vom Bus zieht,
> habe Ich einen Busausfall von meinem Teilnehmer.
Das Verhalten kenne ich bei der MSP Software als damals noch der Buffer 
-Überlauf durch zu viele Eingangsdaten noch nicht abgefangen wurde.

von Jochen K. (jogibear9988)


Lesenswert?

Jörg S. schrieb:
> -Überlauf durch zu viele Eingangsdaten noch nicht abgefangen wurde.
Das ist aber in dem AVR Code von Eimar schon drinn...

Um erstmal HW Probleme auszuschließen, was macht Ihr denn mit dem 
Schirm?

von Jochen K. (jogibear9988)


Angehängte Dateien:

Lesenswert?

So....

hab jetzt was Rausgefunden. Sowie es aussieht braucht der Teilnehmer zu 
lange wenn Ich große Telegramme auf dem Bus Verschicke.

Ich bin ja schon bei Normal laufenden Bus bei einer Min-SDT von 49.

Hab die max sdt deshalb mal hochgesetzt, dann geht die CPU auch nicht 
mehr in Stop, doch es kommt immer noch zu einer Telgrammwiederholung, da 
selbst nach über 279 Bitzeiten noch keine Antwort kam.

Hab mal einen Screenshot vom telegramlog angehäüngt, und hab mal auf die 
Telegrammwiederholung getriggert. Im normalen Betrieb tritt keine 
wiederholung auf. Was mich aber wundert ist, das nach dem längeren FDL 
request, welcher wahrscheinlich die Probleme verursacht, erst mal 2 
normale telegramme vom teilnehmer kamen, und erst danach das mit der 
wiederholung passiert ist!

Einer Ne Idee?

Achso, noch Infos: ID SPS=2 , ID AVR=1
Spalte 1 - TeleNr
Spalte 2 - zeitstempel
Spalte 3 - Adressen
Spalte 4 - Protokoll
Spalte 5 - Primitive
Spalte 6 - Dienst
Spalte 7 - Daten

von Jochen K. (jogibear9988)


Angehängte Dateien:

Lesenswert?

Habs jetzt auch noch im normalen Betrieb geschafft.

Wenn das Global_Control Telegramm kommt, kann der AVR nicht auf die 
Statusanfrage danach gleich Antworten.

Denke das ist aber, da der AVR das Global Control noch verarbeiten muss, 
und daher noch nicht auf das neue Telegramm reagieren kann! Kann das 
sein?

von Jörg S. (joerg-s)


Lesenswert?

Bei Global Control muss er ja nichts machen, noch nicht mal antworten. 
Von daher sollte er da ja schon sehr schnell durch sein...

von Jochen K. (jogibear9988)


Lesenswert?

Jörg S. schrieb:
> Bei Global Control muss er ja nichts machen, noch nicht mal antworten.
> Von daher sollte er da ja schon sehr schnell durch sein...

keine Ahnung warums dann passiert.

Hast du denn den Bus bei dir ohne ausfälle (Telegrammwiederholungen) am 
laufen? Irgend eine Idee was das sonst verursachen könnte?

von Jörg S. (joerg-s)


Lesenswert?

Vielleicht ist ist Zeit Tsyn nach Global Control noch nicht abgelaufen.

Hast du ein Speicheroszi? Dann könnte man sich mal an einem Portpin 
ausgeben lassen wann er wieder bereit ist und schauen ob vorher schon 
Daten reinkommen.

von Jochen K. (jogibear9988)


Lesenswert?

Speicheroszi ist leider nicht vorhanden. Mal sehen was Ich noch an Tests 
durchführen kann...

von Michael P. (Firma: Piciorgros GmbH) (colonia)


Lesenswert?

Hallo Jörg S.
ich habe mit Interesse Ihr Projekt und die Kommentare dazu studiert.
Könnten Sie mich diesbezüglich bitte per E-Mail kontaktieren?
mfG
Michael

von Daniel Wiljan (Gast)


Lesenswert?

Hallo,
ich verfolge diesen Beitrag nun schon eine ganze Weile. Ich wollte diese 
DP-Ablaufsteuerung auf einen AVR, am besten AtmegaXY ummünzen. Jetzt 
gibts da kleinere Probleme beim Anpassen der Interrupts und des Timers.

Hat jemand vllt. eine funktionierende Anpassung an einen atmega32 oder 
ähnlich... nur mal zum rein schauen und draus lernen :-)

vielen Dank schon mal

Grüße Daniel

von Einar S. (Firma: Norwegen) (esjaavik)


Lesenswert?

Ja, für ATmega16. Bitte mein post von Datum: 07.05.2010 14:44 lesen. Da 
ist die quellkode dabei.

Vielleicht kannst du nicht diese als "gast" sehen?

ATmega32 ist soweit ich weiss dieselbe MCU mit mehr Flash & RAM.

Einar

von Daniel W. (Firma: WD-Electronic-Solutions) (wdaniel)


Lesenswert?

Vielen Dank für die schnelle Antwort, ja die AtmegaXY sind so ziemlich 
gleich, vor allem was Register angeht... werde den Code die Tage mal 
testen..
man muss ja manchmal auch noch arbeiten nebenher :-)

von Zachter (Gast)


Lesenswert?

Ich beschäftige mich schon länger mit dem Thema und hab folgendes 
gefunden:
http://netload.in/datei2gwFjdz2UF/profibus.zip.htm
Vieleicht hilft das jemandem weiter?

von Einar S. (Firma: Norwegen) (esjaavik)


Lesenswert?

@Zachter (Gast): Leider nicht. Ich bekommt nur ein fehlermeldung:
--------------
Error
Code: ER_NFF_102420110918
Possible reasons for that:
* you have a mistake in the link
* The file was deleted in case of a abuse report.
* The file was deleted by the uploader.
--------------

@Daniel: Wie geht es? Atmega32 sollte ohne änderungen spielen.

von Zachter (Gast)


Lesenswert?

http://www.hackchina.com/?lang=en&q=profibus
Da gibts auch jede menge sourcen und beispiele, aber vor allem mit dem 
vcp3

von Zachter (Gast)


Lesenswert?

BTW: Was ich eigentlich brauche sind ein paar Slaves mit 1,5Mbit für 
meinen Hausbus. Dafür ist aber jeder ASIC viel zu teuer...
Eine lösung hab ich bisher leider nicht.

von Jörg S. (joerg-s)


Lesenswert?

Wenn der µC genug Power hat, sollte mit der Software Lösung auch 1,5MBit 
möglich sein.
LPC13xx von NXP sollte z.B. ganz gut passen.

von cell85 (Gast)


Lesenswert?

Hi,

ich arbeite gerade daran meine steuerung für motoren als Profibus slave 
zu erweitere.
Die Daten werden dann praktisch aus meiner Steuerung an eine S7 gesendet 
und von dort aus an ein PLS.
Ich verwende einen ARM Cortex und habe eine Möglichkeit gesucht, 
praktisch einen Profibus DP Slave Code zu finden und somit die 
funktionialität in meine MCU zu integrieren als bspw. ein Profichip 
Modul zu kaufen.

Meint ihr das ist mit eurem Code möglich?

Ich muss ca. 80Byte an daten an die S7 senden.

Viele Grüße
Steffen

von Einar S. (Firma: Norwegen) (esjaavik)


Lesenswert?

Ist es ein hobbyprojekt? Dann versuchen sie es. Es ist möglich.

Aber wenn es ein kommerzielles produkt ist, dann nein! überhaupt nicht! 
Diese code hat elementen die nie durch eine PROFIBUS certification 
kommt.

http://www.profibus.com/community/test-labs/

Dann sollte du ein chiplösung oder modullösung suchen. Profichip ist 
einer von diese, es gibt mehrere. Ich rate sie mit eine PICC zu sprechen 
wenn dies eine kommerzielle produkt ist.

MvG
Einar

von Jörg S. (joerg-s)


Lesenswert?

cell85 schrieb:
> Meint ihr das ist mit eurem Code möglich?
Der Code stellt ein Profbus Slave dar. Geht also :)

> Diese code hat elementen die nie durch eine PROFIBUS certification
> kommt.
Ausserdem hab ich komerzielle Nutzung untersagt ;)

Wenn man noch einiges an Zeit reinsteckt kann auch was zertifizierbares 
raus kommen. Aber im aktuellen Zustand ist der Code natürlich nicht 100% 
Profibus konform. Wie auch auch schon im Ursprungspost steht.

von Cell85 (Gast)


Lesenswert?

ja mir reicht eigentlich die Info aus, das es möglich ist einen 
soft-pb-dp in meine mcu zu integrieren. Ich würde versuchen einen 
konformen stack zu benutzen (kaufen/selbst coden) oder eine geeignete 
Chiplösung zu finden.

von Mohammad (Gast)


Lesenswert?

Hi
In the Profibus.c there is a function that not define,
can u explain what's this?
The function is get_Address()

Thanks alot

von Jörg S. (joerg-s)


Lesenswert?

This Function reads the Dip-Switch Status on the µC Port, where the 
Profibus Address is set.

von Mohammad (Gast)


Lesenswert?

Dear Jörg S
Thanks alot for your reply.
I want to use this system with PLC siemens CPU314C-2DP,and I need a GSD 
file,
do u have a correct GSD file for this system?

Best Regards

von Jörg S. (joerg-s)


Lesenswert?

See:
Beitrag "Re: Software Profibus DP-Slave in C"

I think it is not 100% correct and doesn't matches the actual Source 
code exactly, but it should be a good starting Point.

von Mohammad (Gast)


Lesenswert?

Dear Jörg S
I hope that you are fine .
I have a question : Do you know ,how I can connect with PLC siemens.
Do you have a function that I can use this for communication with PLC 
and MCU .

thanks alot

von Jörg S. (joerg-s)


Lesenswert?

I'am not sure what you are mean with "connect"?

von Mohammad (Gast)


Lesenswert?

Hi
Connect means communication

I want to read and write some bytes between MCU and PLC.

von Jörg S. (joerg-s)


Lesenswert?

If you want to know how to include a Profibus Device into the SPS 
Programm, that are Basics of the SPS Programming. And i'am not familiar 
with that. My Part in this Projekt was only the programming of the 
Firmware for MSP430 µC.

von Azher I. (azher_i)


Lesenswert?

Hello Joerg,

I appreciate your hardwork in developing profibus slave in uC.

Would you please guide me how can I modify this code to view/recive 
32bit(4byte) data from master.
I just want simple DP slave implementation and Slave will receive 4byte 
data from master every second.


Regards,
Azher

von Jörg S. (joerg-s)


Lesenswert?

In the profibus.h File, there is the Define "INPUT_DATA_SIZE" and 
"OUTPUT_DATA_SIZE". Set Input to 4 and Output to 0.
That should be all...

von Janne (Gast)


Lesenswert?

Hi,

Is it possible to get the source code somewhere? I would like to take a 
look at it to determine the complexity of a Profibus slave and possibly 
port it to an ARM Cortex M4.

Best regards,
Janne

von Jörg S. (joerg-s)


Lesenswert?

>Is it possible to get the source code somewhere?
Sure, take a look in the Thread!

For example the newest Version:
Beitrag "Re: Software Profibus DP-Slave in C"

von Janne (Gast)


Lesenswert?

Thank you very much!

von Thoma Hauc (Gast)


Lesenswert?

Hallo Leute,

Ich stieß auf diesen Thread bei der Suche nach Informationen über die 
Implementierung von PROFIBUS.
Ich denke, ich werde eine Anpassung im programmierbaren Logik machen.
Aber dafür, brauche ich eine Aufzeichnung der Austausch zwischen Master 
und Slave.
Und im Moment, habe ich keine Zugang zu einem SPS.
Könnte jemand mir das bieten?

Vielen Dank im Voraus.

MfG,

Thoma

von Jörg S. (joerg-s)


Lesenswert?

Du suchst also einen Kommunikations-Mittschnitt?

von Thoma Hauc (Gast)


Lesenswert?

Hallo Jörg,

Ja, ich suche ein Kommunikations-Mitschnitt (Ich kannte diesen Begriff 
nicht, Deutsch ist nicht meine Muttersprache).

Hast du so etwas auf dein Festplatte?

Thoma

von Jörg S. (joerg-s)


Lesenswert?

Nein, da hätte ich nichts da, ich wüsste auch nicht ob dich das wirklich 
weiter bringt.
Beantwortet das PROFIBUS Handbuch nicht schon alle deine Fragen:
http://www.see-solutions.de/sonstiges/sonstiges.htm#Profibus_Handbuch

Ansonsten würde ich
http://www.sps-forum.de/
empfehlen. Da kann dir sicher jemand mal einen Log geben.

von Thoma Hauc (Gast)


Lesenswert?

Hallo Jörg,

Ein Kommunikations-Mitschnitt wird mir erlauben, eine zeitgesteuerte 
Prüfstand erstellen.

Dann frage ich einfach diese Forumsteilnehmer.

Vielen Dank für deine Hilfe.

Thoma

von Sony H. (sony)


Lesenswert?

Dear,
I am Sony from Indonesia.

@ Jörg, I really appreciate for your hardwork. I also have hardwork to 
understanding the german language in this forum :D

@ Einar, How to implement your program to AVR with PA as 8bit output and 
PB as 8bit input like layout that attached by Jochen Kuehner?

I actually not familiar wit C language, but I will start to learn. I has 
been try to compile the code with AVR Studio-4 without error and made 
challenge for me.

Gruß

Sony

von Romain (Gast)


Lesenswert?

Hi Jörg,

I'm building an embedded solution to do profibus and i was wondering why 
you didn't use a specific ASIC chip like the VPC3+C or SPC3 for more 
easier develloping.

I'd like to also know which part of your Source Code is doing the job of 
the ASIC chip.

Excuse me i don't speak dutch.

Thanks,

Romain

von deathfun (Gast)


Lesenswert?

Hi Romain,

this post is seven years old. We do not even know whether the author is 
reading yet. Please contact the creator of the solution with a PM or 
open a new topic.

greeting
deathfun

von Romain (Gast)


Lesenswert?

Hi deathfun,

I'm aware that it's an old topic but last message is only 1 year old so 
maybe with luck Jörg is still active ?

But thanks for the advice, i'm gonna PM him :-)

Best regards,

Romain

von Jörg S. (joerg-s)


Lesenswert?

Yes I am not dead ;)

A ASIC is expensive and not easy to get. And so it was much easier to 
start with a normal RS485 Chip. The first test to analyze what is going 
on on the Bus where very good, with the documentation we could decode 
all of the commands.

The profibus.c is doing the job.

von Romain (Gast)


Lesenswert?

Hi Jörg,

cool to see you are here :)

Okay for the Asic you are right but for my embedded solution, the cost 
of the Asic isn't expensive so I'll surely use it.

When i said:

"I'd like to also know which part of your Source Code is doing the job 
of
the ASIC chip."

I wanted to mean which part of your code is only doing the job of the 
Asic ? I'm new with Profibus and i know that in software level, we need 
implement de FDL , the user app and the DP-slave stack. Does your code 
is doing the three of them in a same .c ?

Thanks,

Romain

von Jörg S. (joerg-s)


Lesenswert?

I don't know exactly what the ASIC is doing :) But i would say that all 
of the things you mentioned is in the profibus.c

But (mentioned above) this implementation is not a complete 
implementation! We wanted to send and receive Bytes for a S7 home 
Automation Project. And for this little Project it works fine.

von Romain (Gast)


Lesenswert?

Ok thank you,

I have a new question now,

I just found something strange for me in your source code :

"
// Slave Adresse holen
  slave_addr = get_Address();
"

I understand that you want to get the address of the slave but i don't 
find where this fuction "get_Address()" is defined ?

Thanks

Romain

von Jörg S. (joerg-s)


Lesenswert?

You have to define it for yourself ;)
In my System get_Address() is a function that reads a Dip-Switch.

von Einar (Gast)


Lesenswert?

Other suggestions would be to read it from EEPROM or hard code it.
In that case you would have to set it in EEPROM using any method of your 
choice.

One of them might be the PROFIBUS function Set Slave Address. If using 
this, a "virgin" slave should default to address 126. This strategy is 
useful when you cannot access your hardware because it is potted or in 
other cases where switches are not an option.

Hard coding it is really only sensible when you want to postpone your 
decision during development.

Einar

von Anders L. (Gast)


Lesenswert?

Hi Jorg and Einar,
I have ported Einars softbus(based on Jorg's work)to Basom-avr running 
on a ATMEGA1284p.
For testing, its connected to a DeltaV system and a couple of bytes are 
configured as input and output.
This is working ok, but when I reset(or power cycles) the 1284 the 
communication goes down and are not restored
until I dissables/enables the DP port on the system side.
Is this also the case with yours tests?

I also tried to implement the latest version from Jorg, but have some 
problem understanding
the "else" witch I marked >>>>>??
------------------------------------------------------------------------ 
-
if (Vendor_Data_size != 0)
            {
              // Auswerten
            }


            // Bei Fehler -> CFG_FAULT_ in Diagnose senden
            #if (VENDOR_DATA_SIZE > 0)
            if (Module_cnt > MODULE_CNT || Vendor_Data_size != 
VENDOR_DATA_SIZE)
              diagnose_status_1 |= CFG_FAULT_;
            #else
            if (Module_cnt > MODULE_CNT)
              diagnose_status_1 |= CFG_FAULT_;
            #endif
>>>>>??     else
              diagnose_status_1 &= ~(STATION_NOT_READY_ + CFG_FAULT_);


            // Kurzquittung
            profibus_send_CMD(SC, 0, SAP_OFFSET, &uart_buffer[0], 0);

            break;
------------------------------------------------------------------------ 
---
I'm not an C expert som I thoght that:
if (Vendor_Data_size != 0)
            {
              // Auswerten
            }
 the if will end here.
 So I cant understand the marked else.
 Could you explain?

 Regards
 Andes L.

von Einar S. (Firma: Norwegen) (esjaavik)


Lesenswert?

Did you check if that is caused by this slave, the DeltaV master or your 
master configuration.

That would not be my master of choice to test a "newborn" slave, as it 
has a few peculiarities itself.

So I suggest you first try with another slave to make sure that it is 
really your slave that causes this. I don't say that you encountered a 
bug in your master, but that it may be a feature that is not exactly 
announced on page 1 in the manual. ;-) Like what is the behaviour when a 
slave disappear? Maybe you need to handle that fault in some way (in the 
master).

Look for what behaviour it will have to different abnormal timings from 
the slave. I am a bit surprised that you can actually do this in Bascom! 
I thought that was a language of convenience more than speed?

If I remember correctly The DeltaV master and configurator are actually 
branded in components, so may not have gotten full focus from the 
producer.

Einar

von Anders L. (Gast)


Lesenswert?

Hi Einar,
I’ve been working with DeltaV the last 15+ years and believe me it deals 
with Profibus DP quit well 
The slave I’m making is just for fun as a hobby and I test it in a lab 
of course.
Other slaves as motor starters ,etc are also connected and behave as 
expected when powered off/on.
They resume communication after a short period after this power cycle.
The GSD file I’m using is the one that you shared in AVRSoftBus.zip.
Could it be that the GSD needs modification in order to handle the power 
off/on event?

@Jorg: Could you try to explain me the diagnose_status_1 handling with 
the “else” that confusing me?

von Einar S. (Firma: Norwegen) (esjaavik)


Lesenswert?

Anders L. schrieb:
> Could it be that the GSD needs modification in order to handle the power
> off/on event?

The slave does not "see" the .GSD file, so the only thing to think about 
is if the GSD does tell the master that some timing (or other factor)is 
outside what the slave actually can handle.

Since your program is assumed to be quite different than mine, as you 
used another (slower?) language. What I did was to observe with 
ProfiTrace and squeeze the timing until the slave could not keep up. 
Then I relaxed it somewhat. And this at the higher baudrate(s). At low 
baudrate the slave is just sitting there twiddling its thumbs anyway.

If I remember right, the timing that needed to be pushed up a bit is max 
Tsdr.

There is much room for improvement. If this was something I would use 
for several of my projects, I would process incoming messages in 
parallel with them arriving. So that when the last byte of a message 
arrive the response packet is ready to be shoved out the UART. You would 
not know there was a microcontroller doing it all behind the scenes. :-)

Check with your bus analyzer what the master does when the slave is 
lost. Does it continue issuing data exchange messages, or does it issue 
diagnostic requests? Disregard the FDL status request to the slave. 
That's just the master looking for a mate ;-)

von Jörg S. (joerg-s)


Lesenswert?

Anders L. schrieb:

> I'm not an C expert som I thoght that:
> if (Vendor_Data_size != 0)
>             {
>               // Auswerten
>             }
>  the if will end here.
>  So I cant understand the marked else.
>  Could you explain?
Right, the if ends there.
The else is the else from the if Part here:
1
#if (VENDOR_DATA_SIZE > 0)
2
  if (Module_cnt > MODULE_CNT || Vendor_Data_size != VENDOR_DATA_SIZE)
3
    diagnose_status_1 |= CFG_FAULT_;
4
#else
5
  if (Module_cnt > MODULE_CNT)
6
    diagnose_status_1 |= CFG_FAULT_;
7
#endif

von Peter (Gast)


Lesenswert?

Hallo,

gibt es eigentlich inzwischen eine neuere Version?

Die einzige Version die ich finde ist von 2010.

Peter

von Peter (Gast)


Lesenswert?

Habe da noch eine Frage.

Gibt es hier von einen Port für einen ARM Cortex M.

Ich wollte für ein Projekt einen M0 als RS485 (Profibus) Datenlieferant 
einbauen und dieser Code wäre da was passendes.

von Jörg S. (joerg-s)


Lesenswert?

Peter schrieb:
> gibt es eigentlich inzwischen eine neuere Version?
Nein, gibt nichts neues.

von Michael B. (mb_)


Lesenswert?

Falls jemand an einer Profibus-DP-Implementierung in Python interessiert 
ist:
http://bues.ch/h/profibus

Entwickelt wird aktuell im git branch "more-features".
http://bues.ch/gitweb?p=raspi-profibus.git;a=shortlog;h=refs/heads/more-features

von Peter (Gast)


Lesenswert?

Schade das es nichts neues gibt, ist an sich ein wirklich gutes Stück 
Software. Ich werde versuchen die Software einzusetzen!


Bitte Michael nimm mir es nicht Übel aber Phyton ist nicht gerade das 
was ich für so was nehmen würde.

Aber in Prinzip ist es so was ähnliches was ich bauen will.
Ein M0 der sich um den Profibus kümmert so wie ein SPC3 und ein 
Hauptsystem das das darüber liegende Protokoll macht. Wobei mir dann 
egal wäre in welcher Sprache das Protokoll abgearbeitet wird, ist ab da 
sowieso nichts wildes mehr. Aber mein M0 (dein AVR) sollte schon etwas 
mehr machen.

VG, Peter

von Bhaudip M. (bhaudip_m262)


Lesenswert?

can you share this code with us using arm cortex m0?

von Peter (Gast)


Lesenswert?

I started with my project this week and i saw that i need a CPU with a 
12mBit UART.
Now i'm locking for a solution.


May be some one else had a M0 solution without the 12Mbit.

von haroun (Gast)


Lesenswert?

je suis un etudiant en master technologie de l'informtion et de 
communication alors mon sujet du memoire fin d'etude est sur le profibus 
dans les reseaux indestruels sans fil  alors je veut implémenté ca avec 
n'importe quelle simulateur ns2 ou bien ns3 pas de probleme ...alors 
aidez moi svp
merci d'anvance

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Pour participier ici, communiquez en allemand svp. L'utilization 
d'anglais est une seule exception.

von haroun (Gast)


Lesenswert?

i am a student on master information and communication technology soo my 
memory of is about profibus in wireless indistruel  networks soo
I want an implementation of this protocole with ns2 or ns3 anything ....
so help me pleasee

thank you in advance

von Michael (Gast)


Lesenswert?

Dear mr. Jörg S!
Many thanks for such an excellent implementation of the Profibus DP 
software slave. With minor changes, on the Cortex-M0 I achieved a stable 
exchange rate of 3Mb / sec. Thanks again for such a wonderful job!
Best Regards, Michael.

von Ilya M. (Firma: Home) (forsage1994)


Lesenswert?

Michael schrieb:
> Dear mr. Jörg S!
> Many thanks for such an excellent implementation of the Profibus DP
> software slave. With minor changes, on the Cortex-M0 I achieved a stable
> exchange rate of 3Mb / sec. Thanks again for such a wonderful job!
> Best Regards, Michael.

Hallo Michael, könntest du den Code teilen?

von Peter F. (fibko)


Angehängte Dateien:

Lesenswert?

Hello,

I changed code from project AVRSoftBus for atXmega32A4U. It's run on 
48Mhz. I tested both speed 187500 and 1M5, everything work. In 
profibus.h need change UART_BAUD and DELAY_TBIT. I used USART D0. I 
believe this code is usable for someone.

von Tadej S. (tadythefish)


Angehängte Dateien:

Lesenswert?

Hello!

I would like to share my adaption of your software to Arduino MEGA2560
Hope it helps someone!

von Amigo I. (Firma: hobby) (sony2019)


Lesenswert?

any example for Arduino UNO?

thank

Sony

von Amigo I. (Firma: hobby) (sony2019)


Lesenswert?

OK I has been done with UNO based on code from Tadej, I think it's same 
with NANO setup.
I only change in serial setup from serial2 to serial0.
I has been followed this topic since November 2013 and beginning to try 
again a few month ago.

Thank you for everything.

: Bearbeitet durch User
von Tadej S. (tadythefish)


Lesenswert?

I'm sorry for the late reply. Did you manage to make it work? If not I 
can also post code for the UNO/Nano version.
I made it work with a Nano (MEGA328) and 5 i2c PWM output expanders. I 
have been testing this slave for 3 months now with no profibus errors. 
It works great but only goes up to 45.45k speed
Anyway those 5 PWM expander provide 48 PWM outputs!

von Amigo I. (Firma: hobby) (sony2019)


Lesenswert?

Hallo,
It is great. I also test with DS18B20 temperature sensor.
Now I still test to ATMega32 based arduino MIGHTYCORE but not success 
yet.
@Tadej if you have code is wellcome.

Regards

von Yuriy (Gast)


Lesenswert?

Michael schrieb:
> Dear mr. Jörg S!
> Many thanks for such an excellent implementation of the Profibus DP
> software slave. With minor changes, on the Cortex-M0 I achieved a stable
> exchange rate of 3Mb / sec. Thanks again for such a wonderful job!
> Best Regards, Michael.

Michael, can you share the code?

von Rico S. (ridchi1980)


Lesenswert?

Tadej S. schrieb:
> Hello!
>
> I would like to share my adaption of your software to Arduino MEGA2560
> Hope it helps someone!

Hello TadyTheFish,

I use a Controllino Mega and would like to use your implementation.
https://www.controllino.biz/wp-content/uploads/2018/10/CONTROLLINO-MEGA-Pinout.pdf

In the Controllino is an SN65HVD08, which should actually work the same 
way.
Your code contains a lot of assembler, which I cannot.

Can you rewrite me your code that I can work with RX3-TX3 instead of 
RX2-TX2.

Thanks.
Ridchi

von Amigo I. (Firma: hobby) (sony2019)


Lesenswert?

If still use the same controller with Arduino mega maybe you just change 
the register related serial3 and also consider the working clock for the 
CPU. In uno / nano I just change the register serial2 to serial0 from 
Tadej's code. You can read the Atmega2560 datasheet to find the 
register.

von Tadej S. (tadythefish)


Angehängte Dateien:

Lesenswert?

Hello

Sorry for the late reply. I have editedd the programs and made 3 
versions.

Mega2560 UART2
Mega2560 UART3
Mega328

I have not tested the UART3 version so please if it works leave reply or 
if it dos not :)

EDIT: Whoops.. both attachements are the same :D

: Bearbeitet durch User
von Amigo I. (Firma: hobby) (sony2019)


Lesenswert?

Hi Tadej,
Do you have try the ATMega16 or ATMega32? Please share the code.

Thank you in advance

von Tadej S. (tadythefish)


Lesenswert?

Sorry I don't. I work with arduino IDE and those chips are not included 
by default and I never had a need for them. You could addopt the code to 
work with those chips but you need to find the registers for UART and 
Timer and change them to suite those chips

von Rico S. (ridchi1980)


Lesenswert?

Thanks Tadej,

i will test it.

Ridchi

von Rico S. (ridchi1980)


Lesenswert?

Tadej S. schrieb:
> Hello
>
> Sorry for the late reply. I have editedd the programs and made 3
> versions.
>
> Mega2560 UART2
> Mega2560 UART3
> Mega328
>
> I have not tested the UART3 version so please if it works leave reply or
> if it dos not :)
>
> EDIT: Whoops.. both attachements are the same :D

Hello Tadej,

i have test the Mega2560 UART3.
You have forgotten to change in row 853:
1
UCSR2B |= _BV(UDRIE2);  // <<< AVR Version

into
1
UCSR3B |= _BV(UDRIE3);  // <<< AVR Version

then it works.


But I get a lot of warnings when compiling.
The Problem is the conversion from unsigned char* into char*

for example:
1
if (checksum(&uart_buffer[1], 3) != FCS_data) break;

you must write for correctly syntax
1
if (checksum((char*)&uart_buffer[1], 3) != FCS_data) break;

;-)


Currently my Profibus connection works with 93750baud without problems.

Thanks.


PS:  Why did you insert an offset (+5) in uart_buffer?

: Bearbeitet durch User
von Tadej S. (tadythefish)


Lesenswert?

Hmm thank you for your input.. Maybe you could upload the corrected 
version?
I'm sorry so much things to do and so little time. I remember this 
problem the IDE was failing to compile the original version when I was 
"porting" the code.
Anyway the mega328 version is running on my friends test bench for 3 
months and 2 day till today...
Maybe I forgot to change this in the mega2560 code I don't know I didn't 
really gave much attention since it works for my friend
But it works with 45.45k. I can't remember seeing the baudrate you have 
specified in WinCC or TIA portal.. But I am not really the PLC 
programming guy. I just helped my friend that is a Simatic guru ?

von Tadej S. (tadythefish)


Lesenswert?

I just found out that why the code compiled properly on my IDE..
Compiler warnings were turned off :) thabk you so much.

I have corrected the registers that you have pointed out. Yes I have 
changed on the bottom and I missed the TX routine that needed changing ?

As I said its been 3 month since I last saw the code ?

The +5 is not an offset i expanded the buffer because I had problems and 
I couldn't find what was wrong. The program was crashin so I tought that 
maybe the program goes out of bounds somwhere but in the end there was a 
problem with a poor profibus connection.. You can remove the +5 it 
should work the same.. Or you can leave it there is more than enough 
space

: Bearbeitet durch User
von Amigo I. (Firma: hobby) (sony2019)


Lesenswert?

Tadej S. schrieb:
> Sorry I don't. I work with arduino IDE and those chips are not included
> by default and I never had a need for them. You could addopt the code to
> work with those chips but you need to find the registers for UART and
> Timer and change them to suite those chips

Maybe you can try to add the hardware ATmega16 or 32 from mightycore 
https://github.com/MCUdude/MightyCore

I just have problem in how to compile from your code (Arduino mega) to 
mega32 controller. It's many error that I do not understand. If you can 
compile without error I can try to the my hardware hardware.

von Peter (Gast)


Lesenswert?

Hi Guys.
I saw that there are already M0 ports.
Would be nice if the code were published here.

von M@tti@ (Gast)


Lesenswert?

Hi at all, anybody have an example to read an digital input on the 
Arduino and write in the PLC and viceversa?

Many thanks at all

M@tti@

von Amigo I. (Firma: hobby) (sony2019)


Lesenswert?

M@tti@ schrieb:
> Hi at all, anybody have an example to read an digital input on the
> Arduino and write in the PLC and viceversa?
>
> Many thanks at all
>
> M@tti@

Tadej's code have io access.

von Amigo I. (Firma: hobby) (sony2019)


Lesenswert?

Try to compile with ATMega32 mightycore to many error like below:

########################################################################
Arduino: 1.8.5 (Windows 10), Board: "ATmega32, Standard, 2.7v, Disabled 
(default), 16 MHz external"

C:\M32\profibus_M32_1.ino\profibus_M32_1.ino.ino: In function 'void 
profibus_RX()':

profibus_M32_1.ino:154: error: invalid conversion from 'unsigned char*' 
to 'char*' [-fpermissive]

         if (checksum(&uart_buffer[1], 3) != FCS_data) break;

                                        ^

C:\M32\profibus_M32_1.ino\profibus_M32_1.ino.ino:708:15: note: 
initializing argument 1 of 'unsigned char checksum(char*, unsigned 
char)'

 unsigned char checksum(char *data, unsigned char length)

               ^

profibus_M32_1.ino:171: error: invalid conversion from 'unsigned char*' 
to 'char*' [-fpermissive]

         if (checksum(&uart_buffer[4], PDU_size) != FCS_data) break;

                                               ^

C:\M32\profibus_M32_1.ino\profibus_M32_1.ino.ino:708:15: note: 
initializing argument 1 of 'unsigned char checksum(char*, unsigned 
char)'

 unsigned char checksum(char *data, unsigned char length)

               ^

profibus_M32_1.ino:188: error: invalid conversion from 'unsigned char*' 
to 'char*' [-fpermissive]

         if (checksum(&uart_buffer[1], 8) != FCS_data) break;

                                        ^

C:\M32\profibus_M32_1.ino\profibus_M32_1.ino.ino:708:15: note: 
initializing argument 1 of 'unsigned char checksum(char*, unsigned 
char)'

 unsigned char checksum(char *data, unsigned char length)

               ^

profibus_M32_1.ino:245: error: invalid conversion from 'unsigned char*' 
to 'char*' [-fpermissive]

             profibus_send_CMD(SC, 0, SAP_OFFSET, &uart_buffer[0], 0);

                                                                    ^

C:\M32\profibus_M32_1.ino\profibus_M32_1.ino.ino:596:6: note: 
initializing argument 4 of 'void profibus_send_CMD(unsigned char, 
unsigned char, unsigned char, char*, unsigned char)'

 void profibus_send_CMD (unsigned char type,

      ^

profibus_M32_1.ino:320: error: invalid conversion from 'unsigned char*' 
to 'char*' [-fpermissive]

               profibus_send_CMD(SD2, DATA_LOW, SAP_OFFSET, 
&uart_buffer[7], 8 + EXT_DIAG_DATA_SIZE);

                                                                                                   ^

C:\M32\profibus_M32_1.ino\profibus_M32_1.ino.ino:596:6: note: 
initializing argument 4 of 'void profibus_send_CMD(unsigned char, 
unsigned char, unsigned char, char*, unsigned char)'

 void profibus_send_CMD (unsigned char type,

      ^

profibus_M32_1.ino:349: error: invalid conversion from 'unsigned char*' 
to 'char*' [-fpermissive]

               profibus_send_CMD(SD2, DATA_LOW, SAP_OFFSET, 
&uart_buffer[7], 8 + EXT_DIAG_DATA_SIZE);

                                                                                                   ^

C:\M32\profibus_M32_1.ino\profibus_M32_1.ino.ino:596:6: note: 
initializing argument 4 of 'void profibus_send_CMD(unsigned char, 
unsigned char, unsigned char, char*, unsigned char)'

 void profibus_send_CMD (unsigned char type,

      ^

profibus_M32_1.ino:390: error: invalid conversion from 'unsigned char*' 
to 'char*' [-fpermissive]

               profibus_send_CMD(SC, 0, SAP_OFFSET, &uart_buffer[0], 0);

                                                                      ^

C:\M32\profibus_M32_1.ino\profibus_M32_1.ino.ino:596:6: note: 
initializing argument 4 of 'void profibus_send_CMD(unsigned char, 
unsigned char, unsigned char, char*, unsigned char)'

 void profibus_send_CMD (unsigned char type,

      ^

profibus_M32_1.ino:523: error: invalid conversion from 'unsigned char*' 
to 'char*' [-fpermissive]

             profibus_send_CMD(SC, 0, SAP_OFFSET, &uart_buffer[0], 0);

                                                                    ^

C:\M32\profibus_M32_1.ino\profibus_M32_1.ino.ino:596:6: note: 
initializing argument 4 of 'void profibus_send_CMD(unsigned char, 
unsigned char, unsigned char, char*, unsigned char)'

 void profibus_send_CMD (unsigned char type,

      ^

profibus_M32_1.ino:543: error: invalid conversion from 'unsigned char*' 
to 'char*' [-fpermissive]

         profibus_send_CMD(SD1, FDL_STATUS_OK, 0, &uart_buffer[0], 0);

                                                                    ^

C:\M32\profibus_M32_1.ino\profibus_M32_1.ino.ino:596:6: note: 
initializing argument 4 of 'void profibus_send_CMD(unsigned char, 
unsigned char, unsigned char, char*, unsigned char)'

 void profibus_send_CMD (unsigned char type,

      ^

profibus_M32_1.ino:571: error: invalid conversion from 'unsigned char*' 
to 'char*' [-fpermissive]

           profibus_send_CMD(SD2, DIAGNOSE, 0, &uart_buffer[7], 0);  // 
Request a diagnosis

                                                                 ^

C:\M32\profibus_M32_1.ino\profibus_M32_1.ino.ino:596:6: note: 
initializing argument 4 of 'void profibus_send_CMD(unsigned char, 
unsigned char, unsigned char, char*, unsigned char)'

 void profibus_send_CMD (unsigned char type,

      ^

profibus_M32_1.ino:573: error: invalid conversion from 'unsigned char*' 
to 'char*' [-fpermissive]

           profibus_send_CMD(SD2, DATA_LOW, 0, &uart_buffer[7], 
Input_Data_size);  // send data

                                                                               ^

C:\M32\profibus_M32_1.ino\profibus_M32_1.ino.ino:596:6: note: 
initializing argument 4 of 'void profibus_send_CMD(unsigned char, 
unsigned char, unsigned char, char*, unsigned char)'

 void profibus_send_CMD (unsigned char type,

      ^

C:\M32\profibus_M32_1.ino\profibus_M32_1.ino.ino: In function 'void 
profibus_send_CMD(unsigned char, unsigned char, unsigned char, char*, 
unsigned char)':

profibus_M32_1.ino:613: error: invalid conversion from 'unsigned char*' 
to 'char*' [-fpermissive]

       uart_buffer[4] = checksum(&uart_buffer[1], 3);

                                                   ^

C:\M32\profibus_M32_1.ino\profibus_M32_1.ino.ino:708:15: note: 
initializing argument 1 of 'unsigned char checksum(char*, unsigned 
char)'

 unsigned char checksum(char *data, unsigned char length)

               ^

profibus_M32_1.ino:632: error: invalid conversion from 'unsigned char*' 
to 'char*' [-fpermissive]

       uart_buffer[7+length_pdu] = checksum(&uart_buffer[4], length_pdu 
+ 3);

                                                                           ^

C:\M32\profibus_M32_1.ino\profibus_M32_1.ino.ino:708:15: note: 
initializing argument 1 of 'unsigned char checksum(char*, unsigned 
char)'

 unsigned char checksum(char *data, unsigned char length)

               ^

profibus_M32_1.ino:648: error: invalid conversion from 'unsigned char*' 
to 'char*' [-fpermissive]

       uart_buffer[9] = checksum(&uart_buffer[4], 8);

                                                   ^

C:\M32\profibus_M32_1.ino\profibus_M32_1.ino.ino:708:15: note: 
initializing argument 1 of 'unsigned char checksum(char*, unsigned 
char)'

 unsigned char checksum(char *data, unsigned char length)

               ^

profibus_M32_1.ino:678: error: invalid conversion from 'unsigned char*' 
to 'char*' [-fpermissive]

   profibus_TX(&uart_buffer[0], length_data);

                                           ^

C:\M32\profibus_M32_1.ino\profibus_M32_1.ino.ino:689:6: note: 
initializing argument 1 of 'void profibus_TX(char*, unsigned char)'

 void profibus_TX (char *data, unsigned char length)

      ^

exit status 1
invalid conversion from 'unsigned char*' to 'char*' [-fpermissive]

This report would have more information with
"Show verbose output during compilation"
option enabled in File -> Preferences.

########################################################################
how to solve?

: Bearbeitet durch User
von Rico S. (ridchi1980)


Lesenswert?

you must write for correctly syntax

if (checksum((char*)&uart_buffer[1], 3) != FCS_data) break;

!!!!!!!!

The same with the other line with Checksum ()

Ridchi

von Amigo I. (Firma: hobby) (sony2019)


Lesenswert?

Hi Ridchi,
The code is compile without error in UNO, NANO and MEGA. What is wrong 
in arduino mightycore?

von Tadej S. (tadythefish)


Lesenswert?

The errors you posted should actually be warnings.
The problem is with registers. Mega32 uses completely different 
registers then a meva328 or 2560 uses. The code needs alot of adapting 
to run on an mega32.

Why don't you upgrade to a different MCU?

von M@tti@ (Gast)


Lesenswert?

Hi @Amigo I., and many thanks for the reply.
I tried the Tadej S. code, but without result, in the PC i don't see the 
state of the digital input (for example Arduino pin 4) change.
How is mapped this digital input (pin 4) of Arduino in the PLC?
In the Hardware Configuration (Step7) i have make for first an Universal 
Module, for second 1 byte Input and for third 1 byte Output. It's ok 
this configuration?
Do you have an example or a screenshot of your project that works?

Thank you very much

M @ TTI @

von Rico S. (ridchi1980)


Lesenswert?

You must Write the state of Pin4 as Bit0 in data_out_register[0] then 
you can used this in PLC I1.0 ect... The input Adress is this who 
configured it in Hardwareconfig.

von Amigo I. (Firma: hobby) (sony2019)


Lesenswert?

Tadej S. schrieb:
> The errors you posted should actually be warnings.
> The problem is with registers. Mega32 uses completely different
> registers then a meva328 or 2560 uses. The code needs alot of adapting
> to run on an mega32.
>

Hi Tadej,
I already change the Mega32 register, no error found related register. 
Only the error: invalid conversion from 'unsigned char*'
to 'char*' [-fpermissive] too many appear. I thing it's not hardware 
setting but about format to write. I not to much familiar with C.

> Why don't you upgrade to a different MCU?
Because I have few of Mega16 / Mega32 :)

thank

von Amigo I. (Firma: hobby) (sony2019)


Angehängte Dateien:

Lesenswert?

M@tti@ schrieb:
> Hi @Amigo I., and many thanks for the reply.
> I tried the Tadej S. code, but without result, in the PC i don't see the
> state of the digital input (for example Arduino pin 4) change.
> How is mapped this digital input (pin 4) of Arduino in the PLC?
> In the Hardware Configuration (Step7) i have make for first an Universal
> Module, for second 1 byte Input and for third 1 byte Output. It's ok
> this configuration?
> Do you have an example or a screenshot of your project that works?
>
> Thank you very much
>
> M @ TTI @

You can play the variable "data_in_register" and "data_out_register" 
related the I/O in "doit" routine.
In Simatic you can see in variable table.

von Vital K. (Firma: UMMC) (vital_k)


Lesenswert?

Michael schrieb:
> Dear mr. Jörg S!
> Many thanks for such an excellent implementation of the Profibus DP
> software slave. With minor changes, on the Cortex-M0 I achieved a stable
> exchange rate of 3Mb / sec. Thanks again for such a wonderful job!
> Best Regards, Michael.


and what RS485-UART chip did you get in contact with at 1.5Mb/s?

von Vital K. (Firma: UMMC) (vital_k)


Lesenswert?

Peter F. schrieb:
> Hello,
>
> I changed code from project AVRSoftBus for atXmega32A4U. It's run on
> 48Mhz. I tested both speed 187500 and 1M5, everything work. In
> profibus.h need change UART_BAUD and DELAY_TBIT. I used USART D0. I
> believe this code is usable for someone.


Hello, and what RS485-UART chip did you get in contact with at 1.5Mb / 
s?

von Bastler (Gast)


Lesenswert?

I have used the MAX1487 for 1,5 MBit/s.

von Piotr (Gast)


Lesenswert?

Hello,
I trying this code with ATmega2560 & 9.6kbps. My PLC always send 0x6D as 
function code.

Received byte: 68 5 5 68 C0 82 6D 3C 3E 29 16
Arduino send: 68 B B 68 FFFFFF82 FFFFFFC0 8 3E 3C 2 5 0 FFFFFFFF 
FFFFFFC0 FFFFFFDE 68 16

Adresses:
PLC 2, Arduino 64.

Please, advise me.

von Piotr (Gast)


Lesenswert?

I found the issue, my transmitter was broken. I test it as Ethernet/IP 
(Devicenet) - Profibus gate. May be  I make a success of my 3 years 
work.

von Jörg S. (joerg-s)


Lesenswert?

It is nice to see the Code is still alive! It gives me a good feeling :)

von Tadej S. (tadythefish)


Lesenswert?

Yes and we have all of you to thank! I ported the code to arduino and 
now i ported it to STM32F405. I got a stable connection at 6Mbits
Only now that i have worked with your code I understand the bus. So 
thank you again

von Torsten M. (Gast)


Lesenswert?

Hallo,
es ist zwar schon etwas älter hoffe aber trotzdem auf Hilfe.
Ich beschäftige mich gerade mit diesem Thema und habe da ein paar 
„kleine“ Probleme bei diesem Programm.
Zum Einsatz kommt eine S7-315-2DP und einen Atmega16
Die Dateien in meinem Programm sind vom 28.4.2010 (hoffe das es die 
aktuellste Version ist)

Die Funktion
1
slave_addr = get_Address();

Gibt es diese oder muss man die wenn nötig selbst erstellen?

1
//////////////////////////////////////////////////////////////////////////
2
void main (void)
3
{
4
5
  ///////////////////////////////////////
6
  //watchdog_aus          ();
7
  //init_MCU              ();
8
  //switch_SMCLK_XT1_8MHz ();
9
  init_UART0            ();
10
  init_Profibus         ();
11
  //interrupt_settings    ();
12
  ///////////////////////////////////////
13
14
  while(1)
15
  {
16
    // Hier Code fuer Hauptprogramm
17
  }
18
}
19
/////////////////////////////////////////////////////////////////////////

Die Auskommentierten Zeilen sind nicht in der .c bzw .h Datei enthalten, 
werden diese Benötigt?

Wie genau kann ich jetzt dann Daten Senden oder Empfangen… stehe 
irgendwie gerade auf dem Schlauch.

1
profibus_send_CMD(SD2, DIAGNOSE, 0, &uart_buffer[7], OUTPUT_DATA_SIZE);
Kann ich hiermit Daten schon senden wenn sie im uart_buffer stehen??


Schon mal danke für die Hilfe im vorraus.

Mfg
Torsten

von Bastler (Gast)


Lesenswert?

Hallo,
die Funktion "get_Address()" muss man sich schon selber schreiben.
Es weiß ja sonst keiner wo und wie die Adresseingabe erfolgt.

Ich habe bei einem Prokekt über ein 74HC166 eingelesen, bei einem 
anderen Projekt direkt über die GPIOs.

>Die Auskommentierten Zeilen sind nicht in der .c bzw .h Datei enthalten,
>werden diese Benötigt?
Deine GPIOs, UARTs, Timer, etc musst du schon initialisieren.
Je nach MCU verschieden.

>Kann ich hiermit Daten schon senden wenn sie im uart_buffer stehen??
Ich würde sagen ja.

Tipp:
Bau dir einen RS485->RS232 Sniffer, dann kannst du mit hterm die Daten 
in Hex ansehen. Hat mir öfters geholfen.

von Torsten M. (Gast)


Lesenswert?

Hallo,

dank für die Antwort.
Dann habe ich das soweit verstanden und werde mal schauen das ich das 
jetzt zum Laufen bekommen.

Das mit dem Sniffer ist kein schlechter Vorschlag, wird ich mich mal 
einen Bauen.

von Crk (Gast)


Lesenswert?

Hello, nice job!
I'm using this code to play with industrial items,
everything works until i add "liquidcrystal" library,
it does the setup, but when in the "loop"
the LCD goes back to reset.
Does Timer or Uart affects its usage?
Thank you

von Crk (Gast)


Angehängte Dateien:

Lesenswert?

I attach here my code

von Torsten M. (Gast)


Angehängte Dateien:

Lesenswert?

Hallo,

ich beschäftig ich jetzt schon etwas länger mit dem Thema und bekomme 
das nicht zum laufen... habe einen sehr einfachen Code genommen soll nur 
etwas Senden.

Als Vorlage habe ich die Bibliothek verwende wo schon vorhanden ist 
(9.2009 (Aktueller Stand)).
Als Übertragungsgeschwindigkeit habe ich auf dem Mikrocontroller sowie 
im TIA Portal 45,45 kBit/s eingestllet (Im TIA Portal bringt er bei den 
anderen Fehlermeldungen.
1
int main (void)
2
{
3
  //Ausgänge
4
  E_A = 0xFF;
5
6
  Profibus_Init();
7
  init_UART0();
8
  
9
//***while Schleife************************************************************************************************************************
10
  while(1)
11
  {
12
//*****************************************************************************************************************************************
13
    doit();
14
    profibus_send_CMD(SD1, DIAGNOSE, 0, &uart_buffer[7], OUTPUT_DATA_SIZE);
15
  }
16
//****while Schleife ende*******************************************************************************************************************
17
}

In der SPS Hardware Config zeigt er mir auch Teilnehmer nicht 
erreichbar.

Habe ich hier in dem Programm noch etwas vergessen. In der Bibliothek 
habe ich nichts verändert.

von Bastler (Gast)


Lesenswert?

Du kannst nicht einfach was an einen Master senden.

Der Master macht eine zyklische Anfrage, dann muss eine definierte 
Wartezeit eingehalten werden, erst dann erfolgt die Antwort.

Google mal nach "Profibus Felser" dort findest du eine gute Erklärung 
mit allen Abläufen.

Wenn du einen Frame erhalten hast startest du einen Timer mit 33 
Bitzeiten.
Wenn der Timer abgelaufen ist sendest du die Antwort.

.. und vergiss nicht die Richtung am RS485 Tranceiver umzuschalten.

von Piotr Kot (Gast)


Lesenswert?

Has anyone ported code to Arduino Due?

von Mathias Shabo (Gast)


Lesenswert?

Hallo,
ich weiß, dass der Thread schon fast zwei Jahre her ist.. Ist das 
Projekt noch aktiv und wird noch daran gearbeitet?
Ich schätze diese Arbeit sehr und finde kaum andere Lösungen als diese 
hier. Die, die ich finde, sind diesem Code sehr ähnlich.

Mit freundlichen Grüßen
Mathias Shabo

von Amigo I. (Firma: hobby) (sony2019)


Lesenswert?

Hi all,
Just for refreshing after few year not visiting this nice thread :D
Has anyone try for ESP32? Maybe wireless profinet will be good.

regards

von Jörg S. (joerg-s)


Lesenswert?

Mathias Shabo schrieb:
> Ist das Projekt noch aktiv und wird noch daran gearbeitet?
Am Ursprungsprojekt wird nicht weiter gearbeitet. Updates wird es da 
also nicht geben.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.