wir sind Studenten und befassen uns im Rahmen einer Studienarbeit mit Codesys in Verbindung mit dem Raspberry Pi, um einen späteren Laborversuch vorzubereiten, damit später andere Studenten den Umgang mit der SPS-Programmierung per Codesys lernen können.
Hierbei wollen wir die SPI-Schnittstelle nutzen, um den Raspberry z.B. mit einem Sensor kommunizieren zu lassen.
Hierzu haben wir uns das Beispielprojekt mit dem Temperatursensor "MCP3008Temperature.project" angeschaut, um dieses nachzuvollziehen. Bisher haben wir herausgefunden, dass die Bibliothek "Raspberry Peripherals" hierbei essentiell ist. Diese liefert, so wie wir es verstehen 6 Funktionen (Transfer, Beforewriteoutputs, etc.).
Was uns verwundert hat war, dass im Programmcode im PLC_PRG keine dieser Funktionen genutzt wird, wie z.B. Transfer, um Daten zum Slave zu übertragen. Wir können leider nicht nachvollziehen, was der verwendete Programmcode im Beispiel für eine Funktion erfüllt.
Welche Schritte müssen konkret eingeleitet werden, um eine korrekte SPI Kommunikation mit einem Sensor (z.B. Temperatursensor) herzustellen?
- wie initialisiere ich den Sensor?
- wie kann ich Daten senden/empfangen?
- kann andere Hardware verwendet werden, oder muss hierzu die Bibliothek umgeschrieben werden?
Wir freuen uns über eine hilfreiche Antwort, damit wir in Zukunft einen entsprechenden Versuch in unserem Labor einbinden zu können, damit die Studenten lernen mit Codesys zu arbeiten.
Studentengruppe der FH Kaiserslautern
If you would like to refer to this comment somewhere else in this project, copy and paste the following link:
wie Ihr schon richtig erkannt habt ist für die SPI Kommunikation die Lib Raspberry Peripherials
unerlässliche, diese wird wenn Ihr ein neues SPI Gerät einfügt mit der dazugehörigen LIB für
das Gerät eingefügt und eine FB Instanz erzeugt. Durch das Einfügen des neuen Geräts werden
dann die entsprechden LIB's automatisch aufgerufen und müssen sozusagen nicht mehr extra
im eigentlichen Projekt aufgerufen werden.
Da findet Ihr eine Beschreibung wie Ihr eigene SPI und I²C Geräte in CoDeSys integrieren könnt.
Folgende Schritte sind einzuhalten für eigene Geräte:
1. Eine eigene Gerätebeschreibung im XML Format erstellen
2. Eine Eigene LIB passend zu meinem Gerät erstellen
3. Gerätebeschreibung sowie LIB in der Repository installieren
4. Gerät einbinden
Die Punkte 1-4 sind in der Anleitung von 3S gut beschrieben, findet Ihr in oberen Link
Den Datenempfang sowie das Daten senden müsst Ihr in Eurer Lib steuern, bei SPI ist es ja so,
dass man nur Daten empfangen kann, wenn man auch Daten sendet, also sozusagen Full duplex
Betrieb.
Die Initialisierung des Sensors muss entsprechend dem Datenblatt des Sensors erfolgen, oder meint Ihr
die Initialisierung des SPI Bus? Der SPI - Bus wir im Body der Device Lib eingestellt, also wie Ihr unten
seht bevor die Funktion Init aufgerufen wird, in diesem Fall wird wird _diMode auf 3 gesetzt.
SUPER^();
CASE _iState OF
0:
_diMode:=3; // SPI Modus, 3= CLK in Ruhe high, Datenübernahme bei steigender Flanke
IF SUPER^.init() THEN
_iState := 1;
END_IF
1:
_iState := 10;
END_CASE
Wenn Ihr andere Hardware verwendet, dann müsst Ihr die Gerätebeschreibung sowie die
Device Lib anpassen.
Gruß Werner
If you would like to refer to this comment somewhere else in this project, copy and paste the following link:
Hallo,
wir sind Studenten und befassen uns im Rahmen einer Studienarbeit mit Codesys in Verbindung mit dem Raspberry Pi, um einen späteren Laborversuch vorzubereiten, damit später andere Studenten den Umgang mit der SPS-Programmierung per Codesys lernen können.
Hierbei wollen wir die SPI-Schnittstelle nutzen, um den Raspberry z.B. mit einem Sensor kommunizieren zu lassen.
Hierzu haben wir uns das Beispielprojekt mit dem Temperatursensor "MCP3008Temperature.project" angeschaut, um dieses nachzuvollziehen. Bisher haben wir herausgefunden, dass die Bibliothek "Raspberry Peripherals" hierbei essentiell ist. Diese liefert, so wie wir es verstehen 6 Funktionen (Transfer, Beforewriteoutputs, etc.).
Was uns verwundert hat war, dass im Programmcode im PLC_PRG keine dieser Funktionen genutzt wird, wie z.B. Transfer, um Daten zum Slave zu übertragen. Wir können leider nicht nachvollziehen, was der verwendete Programmcode im Beispiel für eine Funktion erfüllt.
Welche Schritte müssen konkret eingeleitet werden, um eine korrekte SPI Kommunikation mit einem Sensor (z.B. Temperatursensor) herzustellen?
- wie initialisiere ich den Sensor?
- wie kann ich Daten senden/empfangen?
- kann andere Hardware verwendet werden, oder muss hierzu die Bibliothek umgeschrieben werden?
Wir freuen uns über eine hilfreiche Antwort, damit wir in Zukunft einen entsprechenden Versuch in unserem Labor einbinden zu können, damit die Studenten lernen mit Codesys zu arbeiten.
Studentengruppe der FH Kaiserslautern
Hallo Studentengruppe,
wie Ihr schon richtig erkannt habt ist für die SPI Kommunikation die Lib Raspberry Peripherials
unerlässliche, diese wird wenn Ihr ein neues SPI Gerät einfügt mit der dazugehörigen LIB für
das Gerät eingefügt und eine FB Instanz erzeugt. Durch das Einfügen des neuen Geräts werden
dann die entsprechden LIB's automatisch aufgerufen und müssen sozusagen nicht mehr extra
im eigentlichen Projekt aufgerufen werden.
Schaut euch diesbezüglich auch das mal an: http://forum.codesys.com/viewtopic.php?f=21&t=5744.
Da findet Ihr eine Beschreibung wie Ihr eigene SPI und I²C Geräte in CoDeSys integrieren könnt.
Folgende Schritte sind einzuhalten für eigene Geräte:
1. Eine eigene Gerätebeschreibung im XML Format erstellen
2. Eine Eigene LIB passend zu meinem Gerät erstellen
3. Gerätebeschreibung sowie LIB in der Repository installieren
4. Gerät einbinden
Die Punkte 1-4 sind in der Anleitung von 3S gut beschrieben, findet Ihr in oberen Link
Den Datenempfang sowie das Daten senden müsst Ihr in Eurer Lib steuern, bei SPI ist es ja so,
dass man nur Daten empfangen kann, wenn man auch Daten sendet, also sozusagen Full duplex
Betrieb.
Die Initialisierung des Sensors muss entsprechend dem Datenblatt des Sensors erfolgen, oder meint Ihr
die Initialisierung des SPI Bus? Der SPI - Bus wir im Body der Device Lib eingestellt, also wie Ihr unten
seht bevor die Funktion Init aufgerufen wird, in diesem Fall wird wird _diMode auf 3 gesetzt.
SUPER^();
CASE _iState OF
0:
_diMode:=3; // SPI Modus, 3= CLK in Ruhe high, Datenübernahme bei steigender Flanke
IF SUPER^.init() THEN
_iState := 1;
END_IF
1:
_iState := 10;
END_CASE
Wenn Ihr andere Hardware verwendet, dann müsst Ihr die Gerätebeschreibung sowie die
Device Lib anpassen.
Gruß Werner