Software Profibus DP-Slave in C

#932774
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.
Angehängte Dateien:
Gast #933190
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
#933223
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.
#933977
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?
#934071
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.
Angehängte Dateien:
Gast #934114
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
#934135
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.
#942047
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.
Gast #942332
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
;
Gast #942488
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
#942559
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.
#950046
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.
Gast #950857
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
#951656
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.
#952490
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.
Angehängte Dateien:
#954805
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.
#985880
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.
Angehängte Dateien:
Gast #1018392
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...
#1018420
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
//////////////////////////////////////////////////////////////////////////
#1020148
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
Gast #1022356
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) ).
#1022576
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 :)
#1031175
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.
Angehängte Dateien:
#1043558
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.
#1186351
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
Gast #1186790
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ß
Gast #1187426
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
Gast #1188483
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ß
Gast #1193893
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
Gast #1194127
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ß
Gast #1194199
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
#1243802
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.
#1421646
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.
Angehängte Dateien:
Gast #1430120
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
#1551364
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
/////////////////////////////////////////////////////////////////////////
#1566142
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!
#1647821
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.
(Firma: Norwegen) #1699000
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?
(Firma: Norwegen) #1700125
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?
#1701680
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 :)
(Firma: Norwegen) #1703099
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.
Angehängte Dateien:
Gast #1718649
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??
(Firma: Norwegen) #1718664
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.)
Gast #1813121
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
#1813203
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!
#1813224
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.
#1814499
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 :)
#1844656
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.
Angehängte Dateien:
#1925851
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?)
#1926999
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.
Angehängte Dateien:
(Firma: Norwegen) #1928469
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.
#1929649
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.
(Firma: Norwegen) #1930354
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.
#1930419
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?
#1930643
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!
#1930835
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.
#1931557
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
Angehängte Dateien:
#1931574
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?
Angehängte Dateien:
Gast #2370408
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
(Firma: Norwegen) #2392827
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.
Gast #2429427
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
(Firma: Norwegen) #2429474
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
#2430321
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.
Gast #3228421
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
#3422319
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
Gast #4024711
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
Gast #4035372
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
Gast #4099971
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.
(Firma: Norwegen) #4100076
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
Gast #4104395
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?
(Firma: Norwegen) #4104508
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 ;-)
#4104526
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
Gast #4109319
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

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren