In einem Lehrertrainingsprojekt der deutschen Entwicklungszusammenarbeit wird der Raspberry PI 2 B mit Codesys V3.5 Sp14 eingesetzt. Neben einem Horter&Kalb digitalem Eingangsmodul wird auch ein MCP23017 verwendet. Der Baustein soll die benötigten digitalen Ausgänge zur Verfügung stellen. Das kleine Testprogramm (Bild 1) funktioniert nur, wenn ich vorher ein i2cdump dausgeführt habe und auch nur solange ich in Codesys das Programm nicht gestoppt habe. Nach dem erneuten Start muss ich wieder ein i2cdump durchführen, bevor er Ausgang reagiert.
Die Testprogramme, die ich im Forum gefunden habe funktionieren bei mir auch nicht.
P.S. Ein Testprogramm in Phyton funktioniert problemlos, so dass ich davon ausgehe, dass kein Hardwarefehler vorliegt. Der Raspberry ist auch komplett aktualisiert.
Ich hoffe, dass jemand im Forum eine Lösung meines Problems hat und bedanke mich schon einmal im Voraus.
If you would like to refer to this comment somewhere else in this project, copy and paste the following link:
Anonymous
-
2019-02-17
Originally created by: *michi
Hallo JJoe,
so wie ich das verstehe, schreibst du in jedem Zyklus die Konfiguration an MCP raus. Ich vermute IO_B ist bei der Register 01.
Die Konfiguration reicht, wenn diese einmalig gesetzt wird. Des weiteren empfiehlt es sich (wer mag) den geschriebenen Befehl erneut einzulesen, um sicher zu stellen, dass hier der korrekte Initialisierungswert übertragen wurde. By the Way... du mappst den Eingang direkt auf den Ausgang. Versuche erstmals dies mit einer Boolschen Variable. Um einzugrenzen ob dein Eingang nicht übertragen wird oder der Ausgang ein Problem hat.
Gruß
If you would like to refer to this comment somewhere else in this project, copy and paste the following link:
Hallo Michi,
vielen Dank für deine schnelle Antwort.
Das Codesys Programm funktioniert so wie es programmiert ist. Aber nur dann, nachdem ich in einem Raspberry Terminal den Befehl i2cdump -y 1 0x24 durchgeführt habe. Und nur solange, bis ich das Codesys Programm stoppe.
Viele Grüße
JJoe
If you would like to refer to this comment somewhere else in this project, copy and paste the following link:
Anonymous
-
2019-02-24
Originally created by: *michi
Hallo,
hört sich unterm Strich so an, als würde Codesys deinen I2C nicht korrekt initialisieren, bzw. funktioniert nur der erste Teilnehmer nicht, oder beide, oder nur der zweite als Ausgang?!
Mit dem I2cdump machst du unterm Strich nichts anderes, als ein Register lesen vom MCP23007. Es wäre wesentlich einfacher, wenn der Quellcode von deinem MCP23007 hier abgebildet wäre. Ich vermute, dass hier deine Ansteuerung in der Lib nicht korrekt ist. Was ich mir vorstellen könnte, das mit dem i2cdump die Adresse "irgendwie" gesetzt wird und du darüber Zugriff hast. Bei Stop, bzw. Reset ist diese natürlich dann 0. Das Codeschnippsl von dir ist an der Stelle nicht aussagekräftig...
If you would like to refer to this comment somewhere else in this project, copy and paste the following link:
ich habe leider das gleiche Problem wenn ich das Gerät "MCP23017 IO Expansion Board" an einem BeagleBone Black betreiben möchte. Die Eingänge werden in CODESYS sofort erkannt. Die Ausgänge schalten nachdem sie in CODESYS geändert werden erst dann, wenn per linux shell einmal "i2cdump -y 2 0x27" ausgeführt wurde (die Adresse meines Boards ist ohne Veränderung 0x27 und nicht 0x20). Danach schalten sie bei jeder Änderung in CODESYS.
Ich habe eine Lösung für das Problem "die Ausgänge werden nicht gesetzt, bevor nicht ein Dump über die Linux Shell ausgeführt wurde":
Schnell und einfach: Ändere die vorkonfigurierten Werte der Bibliothek nach den Bedürfnissen ab. Benutze 16#FF ffür Eingänge und 16#00 für Ausgänge:
IO_A:BYTE:=16#FF;IO_B:BYTE:=16#FF;
Etwas gebräuchlicher: Reinitialisiere die Port Konfiguration auf Anfrage. Füge diesen Code in der Bibliothek der Case Struktur des FB hinzu:
10:IFREINITTHEN_iState:=0;END_IF
Zusätzlich muss die Reinitialisierung der Port Konfiguration angefragt/angestoßen werden, nachdem das Gerät betriebsbereit (operational) ist. Und wenn man möchte kann man die Polarität der Eingänge und ob Port A/B mit Eingängen oder Ausgängen konfiguriert werden soll, zur Laufzeit ändern. Füge diesen Code oder Teile davon zu deinem Projekt hinzu:
Deklaration:
IPOL_A:BYTE:=16#00;// Port A configuration: 0=same/1=opposite (INPUT POLARITY PORT REGISTER)IPOL_B:BYTE:=16#00;// Port B configuration: 0=same/1=opposite (INPUT POLARITY PORT REGISTER)
Code:
STATE := STATE AND write8(16#02,IPOL_A); // IPOL: INPUT POLARITY PORT REGISTER // 1=GPIO register bit reflects the opposite logic state of the input pin. // 0=GPIO register bit reflects the same logic state of the input pin.STATE := STATE AND write8(16#03,IPOL_B); // IPOL: INPUT POLARITY PORT REGISTER // 1=GPIO register bit reflects the opposite logic state of the input pin. // 0=GPIO register bit reflects the same logic state of the input pin.
In einem Lehrertrainingsprojekt der deutschen Entwicklungszusammenarbeit wird der Raspberry PI 2 B mit Codesys V3.5 Sp14 eingesetzt. Neben einem Horter&Kalb digitalem Eingangsmodul wird auch ein MCP23017 verwendet. Der Baustein soll die benötigten digitalen Ausgänge zur Verfügung stellen. Das kleine Testprogramm (Bild 1) funktioniert nur, wenn ich vorher ein i2cdump dausgeführt habe und auch nur solange ich in Codesys das Programm nicht gestoppt habe. Nach dem erneuten Start muss ich wieder ein i2cdump durchführen, bevor er Ausgang reagiert.
Die Testprogramme, die ich im Forum gefunden habe funktionieren bei mir auch nicht.
P.S. Ein Testprogramm in Phyton funktioniert problemlos, so dass ich davon ausgehe, dass kein Hardwarefehler vorliegt. Der Raspberry ist auch komplett aktualisiert.
Ich hoffe, dass jemand im Forum eine Lösung meines Problems hat und bedanke mich schon einmal im Voraus.
Originally created by: *michi
Hallo JJoe,
so wie ich das verstehe, schreibst du in jedem Zyklus die Konfiguration an MCP raus. Ich vermute IO_B ist bei der Register 01.
Die Konfiguration reicht, wenn diese einmalig gesetzt wird. Des weiteren empfiehlt es sich (wer mag) den geschriebenen Befehl erneut einzulesen, um sicher zu stellen, dass hier der korrekte Initialisierungswert übertragen wurde. By the Way... du mappst den Eingang direkt auf den Ausgang. Versuche erstmals dies mit einer Boolschen Variable. Um einzugrenzen ob dein Eingang nicht übertragen wird oder der Ausgang ein Problem hat.
Gruß
Hallo Michi,
vielen Dank für deine schnelle Antwort.
Das Codesys Programm funktioniert so wie es programmiert ist. Aber nur dann, nachdem ich in einem Raspberry Terminal den Befehl i2cdump -y 1 0x24 durchgeführt habe. Und nur solange, bis ich das Codesys Programm stoppe.
Viele Grüße
JJoe
Originally created by: *michi
Hallo,
hört sich unterm Strich so an, als würde Codesys deinen I2C nicht korrekt initialisieren, bzw. funktioniert nur der erste Teilnehmer nicht, oder beide, oder nur der zweite als Ausgang?!
Mit dem I2cdump machst du unterm Strich nichts anderes, als ein Register lesen vom MCP23007. Es wäre wesentlich einfacher, wenn der Quellcode von deinem MCP23007 hier abgebildet wäre. Ich vermute, dass hier deine Ansteuerung in der Lib nicht korrekt ist. Was ich mir vorstellen könnte, das mit dem i2cdump die Adresse "irgendwie" gesetzt wird und du darüber Zugriff hast. Bei Stop, bzw. Reset ist diese natürlich dann 0. Das Codeschnippsl von dir ist an der Stelle nicht aussagekräftig...
Hallo ,
ich habe leider das gleiche Problem wenn ich das Gerät "MCP23017 IO Expansion Board" an einem BeagleBone Black betreiben möchte. Die Eingänge werden in CODESYS sofort erkannt. Die Ausgänge schalten nachdem sie in CODESYS geändert werden erst dann, wenn per linux shell einmal "i2cdump -y 2 0x27" ausgeführt wurde (die Adresse meines Boards ist ohne Veränderung 0x27 und nicht 0x20). Danach schalten sie bei jeder Änderung in CODESYS.
Benutzt habe ich die Gerätebeschreibungsdatei und die Bibliothek von eschwellinger.
Quelle: https://forge.codesys.com/forge/talk/Runtime/thread/8981ce928a/?page=1&limit=25#1cc1
Im Programm verwende ich den Code von elconfa:~~~
MCP23017_1.IO_A := 16#FF; //Input
MCP23017_1.IO_B := 16#00; //Output
Button_1 := MCP23017_1.IN_A.0;
Button_2 := MCP23017_1.IN_A.1;
Button_3 := MCP23017_1.IN_A.2;
Button_4 := MCP23017_1.IN_A.3;
Button_5 := MCP23017_1.IN_A.4;
Button_6 := MCP23017_1.IN_A.5;
Button_7 := MCP23017_1.IN_A.6;
Button_8 := MCP23017_1.IN_A.7;
MCP23017_1.OUT_B.0 := Rele_1;
MCP23017_1.OUT_B.1 := Rele_2;
MCP23017_1.OUT_B.2 := Rele_3;
MCP23017_1.OUT_B.3 := Rele_4;
MCP23017_1.OUT_B.4 := Rele_5;
MCP23017_1.OUT_B.5 := Rele_6;
MCP23017_1.OUT_B.6 := Rele_7;
MCP23017_1.OUT_B.7 := Rele_8;
~~~
Quelle: https://forge.codesys.com/forge/talk/Runtime/thread/d10648ca06/#1323
Eine Lösung scheint hierfür leider noch nicht beschrieben zu sein.
Ich habe eine Lösung für das Problem "die Ausgänge werden nicht gesetzt, bevor nicht ein Dump über die Linux Shell ausgeführt wurde":
Zusätzlich muss die Reinitialisierung der Port Konfiguration angefragt/angestoßen werden, nachdem das Gerät betriebsbereit (operational) ist. Und wenn man möchte kann man die Polarität der Eingänge und ob Port A/B mit Eingängen oder Ausgängen konfiguriert werden soll, zur Laufzeit ändern. Füge diesen Code oder Teile davon zu deinem Projekt hinzu:
Deklaration:
Code:
Ich habe das positiv getestet mit der alten Bibliothek (gepostet von eschwellinger am 2021-11-27 https://forge.codesys.com/forge/talk/Runtime/thread/8981ce928a/?page=1&limit=25#1cc1) und mit der neuen Bibliothek (gepostet von elconfa at 2019-01-10 https://forge.codesys.com/forge/talk/Runtime/thread/a2dd4dd45f/#774c). Letztlich habe ich die neue Biliothek so erweitert, dass die Umschaltung der Polarität der Eingänge mit einer Variablen gesteuert wird:
Deklaration:
Code: