Sonstiges 7 Segment Anzeige Ansteuern mit TM1637

felix-ep

Level-1
Beiträge
5
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Guten Tag, ich möchte mit meiner SPS eine 4 stellige 7 Segment-Anzeige Ansteuern.
Ich befinde mich momentan in der Ausbildung und wir haben auch schon ein wenig mit einer SPS programmiert, aber abseits von einfachen Sensor/Aktor Steuerungen (Signal von kapazitivem Sensor, Magnetventil ansteuern, usw.) sind wir noch nicht sehr tief in die Materie eingedrungen.

Meine Daten
CPU: 6ES7 314-1AG13-0AB0
Digitale Eingabe (DI 16xDC24V): 321-1HB01-0AA0
Digitale Ausgabe (DO 16x24VDC/0,5A): 6ES7 322-1BH01-0AA0
Analoge Ausgabe(AO 4x12 Bit): 6ES7 332-5HD01-0AB0

Die 7-Segment-Anzeige:
https://www.az-delivery.de/products...MIiqfEva606wIVhM13Ch2RsQSbEAQYAiABEgLmdfD_BwE

Mein Problem ist, das ich nicht weiß wie ich die Komponenten (Ausgabebaugruppe und 7-Segment Anzeige) miteinander verbinde. Zur Spannungsversorgung der Anzeige habe ich einen DC/DC Wandler der die 5VDC herstellt.

Screenshot (46).jpg

Erstmal zu den Basics. Würde das so funktionieren vom Programm her, wie das im Bild aufgebaut ist.

Ich bedanke mich schon mal im Voraus für eure Hilfe
icon10.png


PS: Im Anhang ist eine PDF zu den Baugruppen (Analog Ausgabe ist auf Seite 469, Digitale Ausgabe auf Seite 149)
 

Anhänge

  • S7-300_Automatisierungssystem S7-300_Baugruppendaten.pdf
    8,9 MB · Aufrufe: 12
  • 4_Digit_7_Segment_Display_Datenblatt.pdf
    6,6 MB · Aufrufe: 29
Zuletzt bearbeitet:
Ich befinde mich momentan in der Ausbildung und wir haben auch schon ein wenig mit einer SPS programmiert, aber abseits von einfachen Sensor/Aktor Steuerungen (Signal von kapazitivem Sensor, Magnetventil ansteuern, usw.) sind wir noch nicht sehr tief in die Materie eingedrungen.
Hoffentlich ist das keine Aufgabe, die Du unter Zeitdruck lösen musst!
Mit diesem Exemplar einer 4 stelligen 7-Segment-Anzeige hast Du Dir etwas ausgesucht, das zwar nicht aussichtslos, aber recht anspruchsvoll ist, um damit tiefer die Materie einzudringen!
Deine angedachte INT-in-BCD-Wandlung sagt meiner Glaskugel, dass Du nicht auf den Kopf gefallen bist, aber auch, dass Du vermutlich noch nicht ahnst, dass Dein grösstes Problem wahrscheinlich die serielle Schnittstelle zu der Anzeige werden wird.
Das Datenblatt habe ich bisher nur überflogen, aber es kommt mir recht rätselhaft vor. Da es den Anschein hat, dass pro Stelle 8 Datenbits übertragen werden sollen, darfst Du schlimmstenfalls die Umkodierung von 4 Bit für eine Stelle auf die 7 bzw. 8 Segmente der Stelle in Deinem Programm selbst ausführen. Kein unlösbares Problem, aber eine weitere Hürde.
Ich schätze Du wirst erst die Eigenschaften des Moduls und die korrekte Ansteuerung auskundschaften müssen, ehe es sich lohnt, sich Gedanken über das Zerlegen der INT-Zahl zu machen.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Wie Heinileini schon schrieb: die Aufgabe ist ziemlich anspruchsvoll, aber lösbar.

Der 7-Segment-Anzeigebaustein benötigt 5VDC: + an VCC, und - an GND
Die SPS muß die Anschlüsse CLK und DIO steuern, d.h. es werden 2 Digitalausgänge benötigt, einer für CLK und einer für DIO. Mit diesen Ausgängen mußt Du die Datenbits bitweise seriell ausgeben und mit der steigenden Flanke an CLK wird das Bit in den Anzeigebaustein übernommen.

Elektrischer Anschluß CLK + DIO an die SPS: theoretisch reichen 2 Widerstände als Spannungsteiler 24V zu 5V (z.B. 4k + 1k), aber wenn der 1k-Widerstand kaputtgeht oder die Verbindung zu 0V verliert, dann wird der Eingang des Anzeigebausteins (CLK, DIO) zerstört. Theoretisch kann man auch die SPS-Analogausgänge für CLK und DIO nehmen, um 5V-Signale zu erzeugen, doch bei einem Softwarefehler könnten ebenfalls die Anzeige-Eingänge zerstört werden.
Ich empfehle einen Optokoppler für die Umsetzung 24V-Signal zu 5V-Signal. Optokoppler gibt es fertig für TS35-Hutschiene oder Du bastelst was nach folgender Schaltung (z.B. mit CNY17 oder ähnlich):
Code:
------+
SM322 |
   L+ o-- +24V            Optokoppler
      |                    +-------+
      |      +------+      | CNY17 |
  OUT o------| 2,7k |------o A   C o------o CLK (DIO)
      |      +------+      |       |
      |                +---o K   E o------o GND
      |                |   |       |
    M o---+------------+   +-------+
      |   |
------+   0V
Die Schaltung wird zweimal benötigt: einmal für CLK und einmal für DIO
Widerstand ca. 2,7 kOhm (1/4 oder 1/2 W) (funktioniert vermutlich auch mit Widerstand bis 22 kOhm (I[SUB]F[/SUB] ~ 1mA), noch hochohmiger würde ich das nicht aufbauen)

Die Optokoppler-Schaltung invertiert das Ausgangssignal, was aber ganz praktisch ist, weil SPS-STOP so den Ruhepegel (H) von CLK und DIO erzeugt:
SPS-Ausgang = 0 ---> CLK = H (über den 10K-Pullup-Widerstand des Anzeigebausteins)
SPS-Ausgang = 1 ---> CLK = L (Transistor des Optokopplers schaltet nach GND)

Wie schnell soll die Ausgabe eines Anzeigewertes erfolgen? Pro Ausgabebit werden 3 bis 4 Schaltspiele von CLK+DIO benötigt. Das Datenblatt nur oberflächlich überflogen muß Du vermutlich 60 bis 100 Bits seriell ausgeben, also geschätzt 300 Takte. Wenn Du im SPS-Programm in jedem OB1-Zyklus ein Schaltspiel ausgibst und die SPS-Zykluszeit ca. 10ms beträgt, würde die Übertragung eines vollständigen display control command geschätzt ca. 3 Sekunden dauern.
Schneller: Du könntest die Schaltspiele im OB35 alle 1..2 ms ausgeben, dann dauert es ca. 0,3 bis 0,6 Sekunden.
Noch schneller: mehrere bis alle Bits in einer Schleife in einem SPS-Zyklus direkt an die Peripherie ausgeben (ich habe aber nicht nachgesehen, wie schnell Deine SM322 das kann)(Konzept etwa wie hier: https://www.sps-forum.de/simatic/84496-software-uart-am-digitalout-einer-s7-1200-a-3.html#post635923)

Nachtrag:
Die Digitalausgabebaugruppe 322-1BH01 hat laut Datenblatt eine "Schaltfrequenz max 100 Hz" - das entspricht einer Periodendauer von 10ms, also mindestens 5ms Puls + 5ms Pause. Eine serielle Bitausgabe in einem zyklischen Weckalarm OB3x (die CPU 314: OB35) erfordert OB35-Aufruf >= 5ms. Die komplette serielle Ausgabe dauert dann geschätzt 1,5 Sekunden. Eine Bitausgabe in einer Schleife macht mit der 322-1BH01 keinen Sinn.

Harald
 
Zuletzt bearbeitet:
Ich steige mal etwas tiefer ein, da der TE noch in der Ausbildung ist:
Prinzipiell geht es um serielle 2-Draht-Datenübertragung, wenn ich das Datenblatt richtig deute ähnlich dem I²C-Bus, es muss/braucht jedoch wohl keine Adresse übertragen werden. Das Datenblatt scheint allerdings von einer Software übersetzt worden zu sein, die Chinglisch nur rudimentär beherrscht.

Zur generellen Information: https://de.wikipedia.org/wiki/I²C

Ich vermute eher, dass felix-ep sich nicht darüber im Klaren war, als er die Anzeige gekauft hat.
 
... es muss/braucht jedoch wohl keine Adresse übertragen werden.
Das Datenblatt scheint allerdings von einer Software übersetzt worden zu sein, die Chinglisch nur rudimentär beherrscht.
Ich vermute eher, dass felix-ep sich nicht darüber im Klaren war, als er die Anzeige gekauft hat.
Keine Adresse? Für die Adressierung der (4 von) 6 AnzeigeBytes schon, aber der Chip kann wohl auch automatisch die Adressen erhöhen (wäre mir für den Anfang aber eher zu unsicher).
Chinglisch? Na ja, die blue-ray nixie tubes und das welding regen ein wenig die Fantasie an, kann man aber verkraften. Forward low level and backward high level muss man vielleicht sogar ignorieren.
Und das Thema '1110 1111 stands for 0x7F' - falls doch noch eine Tastatur angeschlossen werden soll - kann uns dank Haralds Beiträgen in diesem Forum auch nicht erschüttern.
Ich hatte beim Lesen der Überschrift des Themas zunächst an eine Dozent-schmeisst-die-Hardware-auf-den-Tisch-und-sagt-mach-mal-eben-Aufgabe gedacht - nach dem Überfliegen des DatenBlattes nicht mehr. Sah mir dann doch mehr nach einem freiwilligen "Fehlgriff" aus. Aber da müssen wir jetzt durch! ;)
 
Respekt!
Mit der Aufgabe hätten wohl geschätzt mehr als 50% der Forumsmitglieder Probleme.
Aber die restlichen halten zusammen und sagen mit Angelas Worten "Wir schaffen das!" - notfalls, falls der TE uns im Stich lässt, legen wir die 3,49€ für die 7-Segment-Anzeige zusammen ... 2 OptoKoppler gibt die Wühlkiste vermutlich noch her. ;)
 
Zuletzt bearbeitet:
Ok erstmal vielen lieben Dank für eure zahlreichen Antworten und Vorschläge.
Ich sehe schon, da hab ich was losgetreten😅.
Ich suche lediglich nach einer möglichst simplen Möglichkeit eine Ansteuerung einer 7 Segment Anzeige zu realisieren.
Ich habe lediglich dieses oben gezeigte Modell gekauft, weil ich ganz einfach keine Ahnung davon hatte und das erst beste und billigste gegriffen habe.

Falls ihr bessere/ simplere Möglichkeiten habt, nehme ich diese gerne entgegen. Ich löte mir auch Sachen zusammen, daran soll’s nicht hapern.
Ich bin einfach noch zu frisch in der Materie um sagen zu können welchen IC ich wie auswähle und wie ich diese an die SPS anschließe.

Die 7 Segment Anzeige die wir in der Ausbildung benutz haben, war schon vorverdahtet und verbaut. Kann also nicht sagen wie diese angesteuert wurde.

Ich bin bisher davon ausgegangen das ich die Analog Baugruppen brauche um die Anzeige anzusteuern😅(sorry für meine Unwissenheit)

Aber wie gesagt, ich bin für alles offen.

Und nochmal vielen Dank
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Was willst Du eigentlich mit der Ziffernanzeige anzeigen? Wie schnell muß sich die Anzeige ändern können? Das sind so Sachen die ein Ingenieur oder Elektro-Projektant zuerst checkt und danach sucht er das passenden Teil aus.

Wie bereits geschrieben, kannst Du auch diese 7-Segment-Anzeige mit TM1637 mit der SPS ansteuern - das wird nur etwas komplizierter als eine 0-10V-Anzeige, aber Du lernst dabei auch viel mehr.

Harald
 
Also anzeigen möchte ich damit lediglich Zählerstände und ggf. noch hexadezimal Ziffer, also 0-9,A-F (ich hoffe das ist eine passende Antwort auf die Frage)

Reagieren sollte die Anzeige möglichst unverzögert, also wenn sich der Zählerstand in dem Programm ändert, soll sich auch sofort auch die angezeigte Ziffer anpassen.

Von welchen Reaktionszeiten reden wir denn, bzw. Welche sind realistisch/realisierbar?

PS: ob das jetzt 10ms oder 20ms sind ist nich so wichtig. Ich sag mal es sollte unter 200ms sein
 
Zuletzt bearbeitet:
Also anzeigen möchte ich damit lediglich Zählerstände und ggf. noch hexadezimal Ziffer, also 0-9,A-F ...
Habe vorhin etwas vermutlich "historisch wertvolles" im Netz gefunden:
https://www.siebert-group.com/docs/Siebert/series D65_D75_D72/BAL/DE/BAL D65_D75_D72 DE.pdf
Das dürfte eine ganz andere Preisklasse (gewesen) sein und ist wahrscheinlich nur noch im Museum noch zu finden. ;)
Vielleicht interessiert es Dich trotzdem, z.B. als Anregung zu dem Thema, mit 7-Segment-Anzeigen (behelfsmässig?) auch die Zeichen A..F darzustellen.

 
Zuviel Werbung?
-> Hier kostenlos registrieren
Ich bin bisher davon ausgegangen das ich die Analog Baugruppen brauche um die Anzeige anzusteuern
Deine Analogausgabebaugruppe 332-5HD01 kann 0-10V und 0/4-20mA-Signale mit einer Auflösung von 12 Bit ausgeben. 7-Segment Anzeigen mit 0-10V oder 0/4-20mA Eingangssignal (auch unter dem Name "Digitales Einbaumessgerät" bekannt) gibt es standardmäßig 3-stellig, weil z.B. für die Übertragung und Anzeige von 0..100 eine Genauigkeit der Analogsignal-Wandlung (DAU + ADU) von max 1% erforderlich/ausreichend ist. Für 3-stellig (0..999) bzw. 4-stellig (0..1000) Anzeigen ist eine Genauigkeit und Auflösung von max 0,1% erforderlich - das wird mit Deiner Analogausgabebaugruppe schon schwierig (Du müsstest vermutlich eine Ausgabeanpassung/kalibrierung programmieren). Echte 4-stellige Signalübertragung (0..9999) geht mit Deiner Analogausgabebaugruppe gar nicht, weil deren DAU nur 12 Bit Auflösung hat.

Für >= 4 Stellen überträgt man den Anzeigewert besser digital. Wenn man jedes Segment einzeln steuern will, braucht man für 4 Stellen mit Dezimalpunkt 32 Datenbits = 32 Digitalausgänge, oder als BCD-Ansteuerung braucht man 16 bis 20 Digitalausgänge. Zur Reduzierung der Anzahl Digitalausgänge kann man die Signale noch multiplexen, so daß man für 4 Stellen z.B. nur noch 8 bis 9 Ausgänge braucht - das erfordert aber in der Anzeige einen entsprechenden Decoder oder Demultiplexer.

Oder man überträgt die vielen Datenbits seriell nacheinander wie bei Deiner Anzeige mit TM1637 - das dauert dann aber eine Weile. Schau Dir die Beschreibung des Übertragungsprotokolls genauer an, möglicherweise reicht es wenn man minimal nur 5 Datenbytes = 40 Bits = 120 bis 160 Schaltspiele ausgibt, das wäre mit Deiner SPS-Hardware bei Ausgabetakt von 5ms in 600 ms bis 800 ms machbar. (Evtl. noch ein klein wenig schneller, wenn man nur die Stellen ausgibt/überträgt, die sich geändert haben.) Möglich wäre wohl auch noch ein Versatz von 3 ms zwischen CLK und DIO und Ausgabetakt von 6 ms (OB35 alle 3 ms), da würde die Ausgabe von 40 Bits nur ca. 480 ms bis 500 ms dauern (das genau zu durchdenken dauert mir jetzt zu lange ;) )

Wegen Deiner langsamen SPS-Digitalausgabebaugruppe könntest Du Dir ein gemischt parallel+seriell Übertragungsprotokoll mit z.B. 5 Digitalausgängen (für 4 Datenbits + CLK) ausdenken, und z.b. einen Arduino als Protokoll-Decoder/Wandler zwischen die SPS und die 7-Segment-Anzeige schalten. Eine solche Lösung könnte 200 ms schaffen, wäre aber höchst anspruchsvoll ... nichts für Beginners.

Harald
 
Hast Du vielleicht eine schnellere Digitalausgabebaugruppe 6ES7322-1BH10-0AA0 zur Verfügung? Da könntest Du mehr als doppelt so schnell die Bits seriell ausgeben, per OB35-Takt alle 2 ms anstatt alle 5 ms.

Harald
 
Zuviel Werbung?
-> Hier kostenlos registrieren
1. Zur Reduzierung der Anzahl Digitalausgänge kann man die Signale noch multiplexen, so daß man für 4 Stellen z.B. nur noch 8 bis 9 Ausgänge braucht - das erfordert aber in der Anzeige einen entsprechenden Decoder oder Demultiplexer.

2. Möglich wäre wohl auch noch ein Versatz von 3 ms zwischen CLK und DIO und Ausgabetakt von 6 ms (OB35 alle 3 ms), da würde die Ausgabe von 40 Bits nur ca. 480 ms bis 500 ms dauern (das genau zu durchdenken dauert mir jetzt zu lange ;) )

3. Wegen Deiner langsamen SPS-Digitalausgabebaugruppe könntest Du Dir ein gemischt parallel+seriell Übertragungsprotokoll mit z.B. 5 Digitalausgängen (für 4 Datenbits + CLK) ausdenken, ...
Moin Harald,

ich glaube mit 1. und 3. meinst Du (fast) dasselbe. Man gibt die 4 "BCD-Bits" parallel aus und hat die 4 StrobeBits ebenfalls parallel, adressiert damit aber "seriell" immer nur 1 der 4 Stellen. Siehe Siebert-Module laut meinem Link von heute Morgen.
Bei 3. würde der Strobe im Empfänger automatisch die jeweils nächste Stelle adressieren, aber Sender und Empfänger müssten sich einsychronisieren (durch ein weiteres paralleles Bit oder durch eine im ÜbertragungsProtokoll "versteckte" Information. Letzteres entspräche dann in etwa dem beim TM1637 durch 'Start' und 'address auto increment' gegebenen.

Den Versatz laut 2. verstehe ich nicht so ganz, bzw. der ist sowieso schon vorhanden? Die pos. Flanke des CLK übernimmt den Zustand des DIO-Signals und mit der neg. Flanke des CLK gibt man den neuen Zustand des DatenBits aus, der mit der nächsten pos. Flanke übernommen wird. Der ZeitPunkt für die Ausgabe des DatenBits (neg. Flanke des CLK) ist also schon versetzt gegenüber dem ZeitPunkt für die Übernahme des Datenbits (pos. Flanke des CLK). Was willst Du da noch durch eine zeitliche Verschiebung zwischen CLK und DIO "optimieren"?
Das kann doch nur sinnvoll sein, wenn Du für eine gegebene Hardware (PLC-Ausgänge, Eigenschaften der KabelVerbindung, Eingänge des 7-Segment-Moduls) mit ihren TiefPässen und Signal-"Verschleppungen", versuchst, die obere Grenze der ÜbertragungsFrequenz voll auszureizen?

Gruss, Heinileini

PS:
Für das TM1637 müsste man noch klären, ob das Abbrechen der Übertragung per 'address auto increment' nach dem 4. AnzeigeByte zwecks Einsparung der Übertragung des 5. und 6. "MüllBytes" problemlos verkraftet wird. Andererseits, die Übergabe von 6 Bytes mit 'address auto increment' dürfte schneller sein als die Ausgabe von 4 Bytes mit den entsprechenden AdressBytes ...

PPS:
Bisher haben wir keine Übertragung in der umgekehrten Richtung vorgesehen. Vermutlich können wir das 'ACK' durch "Aussitzen" also Pausieren der Ausgabe übergehen. Wie gross muss die Pause sein?
 
Okay danke. Die Antwort fand ich schon mal sehr hilfreich. Ich verstehe nur noch nicht, wie ich meinen Zahlenwert serielle ausgeben kann. Weil mit dem Ausgangswort an dem Converter belege ich ja 16 Bit. Wie kann ich das auf ein bit reduzieren?

Und könnte ich nicht einen externen Takt an dem CLK Eingang anlegen? Mit dem Quarz oder so ähnlich(was das angeht hab ich leider auch noch nicht sehr viel Erfahrung, bzw. Ich habe noch nie einen Quarz benutzt)
 
Okay danke. Das hat mir schon mal weitergeholfen.
Ich verstehe nur noch nicht, wie ich meinen Zahlenwert serielle ausgeben kann. Weil das Ausgangswort an dem Converter nimmt ja 16 Bit ein. Wie kann ich das auf 1 Bit reduzieren?
Sprich wie setze ich das im Programm um?
Könnte ich nicht einen externen Takt an den CLK Eingang anlegen. Durch einen Quarz oder etwas ähnlichem? (Habe in der Hinsicht auch noch nicht viel Erfahrung, bzw. Habe noch nie einen Quarz benutzt)

Und was den OB35 angeht. Wie benutze ich den?
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
ich glaube mit 1. und 3. meinst Du (fast) dasselbe.
Moin Heinrich

Ja, 1. und 3. meint tatsächlich dasselbe. Es geht um nacheinander ausgeben (multiplexen) von je 4 Bits (sinnvollerweise jeweils die 4 BCD-Bits).
Bei 3. war ich nochmal darauf zurückgekommen, weil seine TM1637-Anzeige dieses Multiplexen nicht versteht und deshalb ein Demultiplexer/Protokollwandler gebastelt werden müsste, was z.B. ein Arduino sein könnte.


Den Versatz laut 2. verstehe ich nicht so ganz
So wie im Datenblatt das Timing für die Übergabe eines Bits mit DIO und CLK dargestellt ist, sah es für mich so aus als ob man je Bit 4 Schritte braucht. Man soll zuerst den Wert für DIO ausgeben und danach an CLK eine steigende Flanke erzeugen. Um sicherzugehen, daß die Spannung für das Datenbit an DIO stabil anliegt, soll die steigende Flanke von CLK natürlich nicht gleichzeitig mit dem Zustandswechsel an DIO passieren, sondern erst "kurz" danach. Da hatte ich zunächst die Idee, daß man das (meistens) mit nur 3 Schritten realisieren kann:
Code:
Schritte Abstand 5ms --> Ausgabe eines Bits dauert 15ms
1  DIO := Datenbit B0
2  CLK := 1  --> Übernahme des Bits in die Anzeige
3  CLK := 0

4  DIO := Datenbit B1
5  CLK := 1  --> Übernahme des Bits in die Anzeige
6  CLK := 0
...
Mit "Versatz" meine ich, daß man ja nur je Digitalausgang für sich betrachtet die max 100 Hz (5ms Schritte) einhalten muß, und man die Ausgabe der beiden Signale in 4 Schritten ineinander verschachteln kann (quasi um 90° phasenverschoben):
Code:
Schritte Abstand 3ms --> Ausgabe eines Bits dauert 12ms
1  DIO := Datenbit B0
2  CLK := 1  --> Übernahme des Bits in die Anzeige
3  nichts tun
4  CLK := 0

5  DIO := Datenbit B1
6  CLK := 1  --> Übernahme des Bits in die Anzeige
7  nichts tun
8  CLK := 0
...

Wo ich jetzt noch länger nachdenke, fällt mir auf, daß man die Bitausgabe auch mit nur 2 Schritten machen kann, weil DIO nur während der steigenden Flanke von CLK stabil bleiben muß und man deshalb das nächste Datenbit schon zusammen mit der fallenden Flanke von CLK ausgeben kann. Und wenn ich Deinen Beitrag genau lese fällt mir auf, daß Du das schon genauso beschrieben hast :D
Die pos. Flanke des CLK übernimmt den Zustand des DIO-Signals und mit der neg. Flanke des CLK gibt man den neuen Zustand des DatenBits aus, der mit der nächsten pos. Flanke übernommen wird. Der ZeitPunkt für die Ausgabe des DatenBits (neg. Flanke des CLK) ist also schon versetzt gegenüber dem ZeitPunkt für die Übernahme des Datenbits (pos. Flanke des CLK).
Code:
Schritte Abstand 5ms --> Ausgabe eines Bits dauert 10ms
1  CLK := 0  +  DIO := Datenbit B0
2  CLK := 1  --> Übernahme des Bits in die Anzeige

3  CLK := 0  +  DIO := Datenbit B1
4  CLK := 1  --> Übernahme des Bits in die Anzeige
...
(Für die Ausgabe der kompletten Command Sequenz kommen noch einige Start- und End-Bits dazu.)

Über das 'ACK' vom TM1637 müßte ich noch genauer nachdenken - kurz überflogen scheint mir, daß man das ignorieren kann. Das ACK geht laut Text von der fallenden CLK-Flanke des 8. Bits bis zur nächsten fallenden Flanke (des 9. Bits). Allerdings ist das ACK bei fixed address mode ab Command2 im Timingdiagramm bis zur nächsten steigenden CLK-Flanke gemalt. (???)

Jetzt erscheint das Projekt mit der gegebenen Hardware so langsam als machbar... man müsste mal die Hardware zum ausprobieren verfügbar haben... und Zeit ;)

Harald
 
Nix Quartz an den CLK-Eingang!
Du gibst mit Deiner PLC das CLK-Signal aus, weil nur Deine PLC weiss, wann sie die Daten(Bits) ausgibt.
Sonst müsstest Du mit der PLC das CLK einlesen und Deine DatenAusgabe darauf synchronisieren. Du brauchst dazu einen super-schnellen Eingang (= 1. Problem) und die DatenAusgabe müsste zeitlich mehr als bestens dazu passen (super-schneller Ausgang plus super-schnelle Verarbeitung im PLC-Programm = 2. und 3. Problem)!

Die SW muss Dein INT in die 4 Dezimal- (bzw. Hexadezimal-)Stellen zerlegen, für jede Stelle in einer Tabelle nachsehen, welche der 7 Segmente leuchten müssen und diese parallel in ein SchiebeRegister laden, dann das SchiebeRegister seriell "entladen" und den DIO dementsprechend auf 0 ziehen oder auch nicht.
Das Drumherum (Starten einer Sequenz, Command ausgeben, ACK abwarten, 1. DatenByte ausgeben, ACK abwarten, u.s.w. bis letztes (4. oder 6.?) DatenByte ausgeben, ACK abwarten, ggfs Command mit HelligkeitsEinstellung ausgeben, ACK abwarten ...
Wie das im Detail auszusehen hat, ist mir anhand des Datenblattes nicht zu 100% klar (z.B. die Zuordnung der DatenBits 0..7 zu den Segmenten a..f, die Ansteuerung der Punkte - eigentlich 1 Punkt pro Stelle, aber andererseits ein einziger DoppelPunkt mitten zwischen den 4 Stellen. Z.B. die Zuordnung der 6 DatenBytes zu den "nur" 4 Stellen der Anzeige.)
Alles halbwegs klar, aber im Detail eben doch schwammig.
Wie ich schon sagte, experimentieren ist angesagt. Wenn man dann den Durchblick hat, kann man das Zerlegen in die Stellen, das Umformen der Stellen in die SegmentDarstellung, das Rausschieben der AnzeigeDaten neben allem, was das Display sonst so benötigt, endgültig realisieren.
 
Ich verstehe nur noch nicht, wie ich meinen Zahlenwert serielle ausgeben kann.
Kurz gesagt: Du musst zunächst Deinen Zahlenwert in 4 Ziffern zerlegen, dann für die Ziffern das 7-Segment-Muster der Ziffer raussuchen und dann die Muster bitweise nacheinander im OB35 an DIO ausgeben und den CLK dazu ausgeben, und auch noch Kommando-Bytes und Start- und End-Bits dazu ausgeben.
Für die bequeme bitweise Ausgabe im OB35 könntest Du mit BOOL-Arrays arbeiten oder die Bits durch schieben und maskieren aus den Datenbytes extrahieren.

Die Programmierung in FUP oder KOP wäre dafür nicht so gut geeignet. Besser wäre die Programmierung in SCL oder AWL.

Wie hier schon mehrfach angemerkt wurde, ist das eine seeehr anspruchsvolle Aufgabe, die bestimmt mehr als die Hälfte der Forumsmitglieder gar nicht alleine hinkriegen würde. Und auch wir Profis schütteln das Programm nicht so einfach aus dem Ärmel.


Könnte ich nicht einen externen Takt an den CLK Eingang anlegen. Durch einen Quarz oder etwas ähnlichem?
Nein, CLK und DIO müssen zueinander synchronisiert sein. Deshalb muß die SPS DIO und den CLK beide selber steuern. (Dafür einen externen Takt an die SPS geben würde die Aufgabe unnötig verkomplizieren.)


Und was den OB35 angeht. Wie benutze ich den?
In HW Konfig in den Eigenschaften der CPU den OB35 auf Aufruf alle 5 ms einstellen.
Dann im Programm einen OB35 einfügen. Wenn in der CPU ein OB35 vorhanden ist, dann wird der dann alle 5 ms aufgerufen, dazu wird das gerade laufende Programm unterbrochen.
Problem: Damit die im OB35 gesteuerten Digitalausgänge auch sofort schalten, muß hier direkt auf die Ausgänge der Ausgabebaugruppe (Peripherie) ausgegeben werden, und das geht nicht auf einen einzelnen Digitalausgang sondern nur auf ein gesamtes Ausgangsbyte oder -word. Dabei dürfen die anderen Ausgänge des Ausgangsbytes nicht beeinflußt werden, falls da was angeschlossen ist.

Harald
 
Zurück
Oben