Step 7 DB-Timer funktioniert, dann wieder nicht

Hucky

Level-2
Beiträge
218
Reaktionspunkte
4
Zuviel Werbung?
-> Hier kostenlos registrieren
Mahlzeit...
Ich bin "etwas" ratlos.
An einer "Kartonaufrichtermaschine" habe ich die Bodenleimung etwas umgebaut.
Um Schwankungen wie Leimtemperatur, Druckluft zum Leimkopf usw....abgleichen zu können und dass der Leim nicht am Karton vorbei sich auf dem Boden sammelt habe ich zwei BCD Schalter in die Stuerung integriert, die jeweils auf 4 BIT eines Eingangsbytes verdrahtet sind. Die Schalter sind jeweils für Leimanfang (Zeitverzögerung bis Beginn zur Leimung) und Länge der Leimspur.
Durch die einzelnen Schalterstufen werden die Timer jeweils um 30ms verlängert, oder verkürzt.
Das ganze realisiere ich in einem Baustein, der direkt vom OB 1 aufgerufen wird.
Durch die vier Bits der Schalter wird jeweils ein in einem Datenbaustein hinterlegter Zeitwert ausgelesen und in ein "aktueller Zeitwert" Wort in diesem DB gespeichert.
In einem anderen Baustein, wo die Schrittkette vom Kartontransport incl. Leimung stattfindet, der auch direkt vom OB 1 angesteuert wird werden die beiden Timer mit den jeweils aktuellen Zeitwerten (Word) versorgt.
Die Zeiten sind jeweils um die 300ms lang. Die Zyklenzeit der CPU liegt bei 6ms.
Die Timer werden bei jedem Zyklus mit dem aktuellen Zeitwert "überschrieben". Verstelle ich nichts an den Schaltern bleibt der Wert also immer gleich.

Jetzt ist es so, dass aus irgendwelchen Gründen zwischendurch die Leimung auf einmal zu spät anfängt. Verstelle ich den Schalter "Leimanfang" auf einen kleineren Zeitwert müsste der Leim früher aufgetragen werden. 30ms Unterschied entspricht ca. 5mm.
Der Leim wandert aber nicht. So als wenn eine falsche, konstante Zeit abläuft.
Mit der Leimspurlänge gibt es diese Probleme komischerweise nicht.
Ich habe mitlerweile einen Lasersensor verbaut, der exakt den Kartonanfang erkennt. Der Trigerpunkt sollte eigentlich immer gleich sein.

Nun meine Frage: Kann es sein, dass es sich auf den Timer irgendwie negativ auswirkt wenn bei jedem Zyklus der über den Schalter eingestellte Wert aus dem DB erst gelesen wird, in das aktuelle Timer Wort kopiert wird und damit der Timer versorgt wird ? Also quasi der Zeitwert für den Timer immer wieder neu geschrieben wird ? Ich stell mir das irgendwie so vor, dass dadurch der Timerwert abhängig von der CPU Zykluszeit bei ungünstigen Konstallation in der CPU ungültig, bzw. falsch ist.
Wäre das möglich ? Mir gehen sonst so langsam die Ideen aus :(

Hucky
 
Welche SPS hast du? Welche Zeiten verwendest du? Wie wandelst du die Eingänge in Zeiten um?
Wenn man S5-Timer nimmt und die Umwandlung nicht richtig macht, dann kann das Probleme bereiten.
Wenn der gleiche Wert immer geschrieben wird, dann spielt das keine Rolle. Ist ja eigentlich bei einer fixen Zuweisung auch das gleiche.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Timer, deren Wert aus einem DB versorgt werden, habe ich schon etliche verwendet.
Hat eigentlich immer funktioniert.
Zum Testen mal folgender Vorschlag:
Du kannst mal deinen "BCD-Baustein" deaktivieren.
Anschließend am Anfang des OB das DD deines DBs mit einem festen Zeitwert beschreiben.
Dann hast du auch in jedem Zyklus ein überschreiben.
Wenn das klappt, dann kannt du deinen Bausteinaktivieren und das EB im OB1 mit einem festen Wert überschreiben
Ich vertraue den BCD-Schaltern nicht mehr seit mich so ein DIng mal in den Wahnsinn getrieben hat
 
Ich würde es evtl. so machen, und die Einstellung des BCD Schalters erst übernehmen wenn sich diese z.B. für 500ms nicht mehr geändert hat. Falls beim Einstellen mal ein paar Bits wackeln.
 

Durch die vier Bits der Schalter wird jeweils ein in einem Datenbaustein hinterlegter Zeitwert ausgelesen und in ein "aktueller Zeitwert" Wort in diesem DB gespeichert.
Wort? Verwendest Du S5-Timer?

Die Zeiten sind jeweils um die 300ms lang. Die Zyklenzeit der CPU liegt bei 6ms.
Die Timer werden bei jedem Zyklus mit dem aktuellen Zeitwert "überschrieben".
Auch bei einem laufenden Timer?

Kann es sein, dass es sich auf den Timer irgendwie negativ auswirkt wenn bei jedem Zyklus der über den Schalter eingestellte Wert aus dem DB erst gelesen wird, in das aktuelle Timer Wort kopiert wird und damit der Timer versorgt wird ?
S.o.

Verstelle ich nichts an den Schaltern bleibt der Wert also immer gleich.
Ist das die Theorie oder hast Du das schon geprüft?

Mit der Leimspurlänge gibt es diese Probleme komischerweise nicht.
Schonmal die beiden Exemplare der BCD-Schalter getauscht?
 
Zuviel Werbung?
-> Hier kostenlos registrieren
@funkey
- 313 5BE01 0AB0
- S5 Timer S_SEVERZ für Leimanfang, S_EVERZ für Leimlänge
- Ich lese das Eingangsbyte der beiden Schalter ein. Low-Nibble entspricht Schalter 1 (Leimanfang), Hi-Nibble entspricht Schalter 2 (Leimspur)

Mist - Wurstfinger.
Kann das hier leider nicht löschen - kommt gleich eine komplette Antwort...
 
@funkey
- 313 5BE01 0AB0
- S5 Timer S_SEVERZ für Leimanfang, S_EVERZ für Leimlänge
- Ich lese das Eingangsbyte der beiden Schalter ein. Low-Nibble entspricht Schalter 1 (Leimanfang), Hi-Nibble entspricht Schalter 2 (Leimspur)

Mist - Wurstfinger.
Kann das hier leider nicht löschen - kommt gleich eine komplette Antwort...
Ich würde es evtl. so machen, und die Einstellung des BCD Schalters erst übernehmen wenn sich diese z.B. für 500ms nicht mehr geändert hat. Falls beim Einstellen mal ein paar Bits wackeln.
Wann übernimmst du denn den Wert aus den BCD Schaltern ? Wie Thomas_V2.1 richtig schreibt ist es wichtig den richtigen Zeitpunkt
für die Übernahme zu bestimmen, also Altwert/Neuwert vergleichen, keine Änderung mehr, dann Wert speichern oder mit
Übernahme -Taster arbeiten.
Sonst erwischt du unter Umständen einen völlig falschen Wert.
Wenn du keinen Analyzer zur Aufzeichnung der Werte hast, dann speicher doch den ausgewählten Zeitwert in ein Schieberregister ab,
dann kannst du kontrollieren was für Werte erzeugt wurde,
 
@funkey
- 313 5BE01 0AB0
- S5 Timer S_SEVERZ für Leimanfang, S_EVERZ für Leimlänge
- Ich lese das Eingangsbyte der beiden Schalter über MOVE in ein DBW in einem Datenbaustein ein. Low-Nibble im unteren DBB vom DBW entspricht Schalter 1 (Leimanfang), Hi-Nibble im unteren DBB cvom DBW entspricht Schalter 2 (Leimspur).
DBW vergleiche ich dann auf 0-9 und lade entsprechend aus einer "Tabelle" im Datenbaustein über MOVE den S5 Zeitwert in den aktuellen DBW für den Timer im Programm.
Beim 2. Schalter (H-Nibble) ist es ähnlich - allerdings verschiebe ich erst die 16 Bits mit SHR_W um 4 Bit nach rechts - sodass och direkt auf 0-9 vergleichen kann.
- ja, das denke ich eigentlich auch. Auf anderen System habe ich schon alles Mögliche erlebt - daher meine Frage.
Ich bin kein Crack im programmieren von SPS - versuche das meist irgendwie umzusetzen bzw. abzuleiten von 6502/6510 und Atmel Programmierung :LOL:
Gefährliche Mischung - aber bisher hat immer alles funktioniert was ich in S5/S7 machen wollte 🤷‍♂️

@Blockmove
Danke für den Tipp - probiere ich aus

@Thomas_v2.1
So etwas ähnliches hatte ich auch schon angedacht.
Entweder eine Übernahme der Schaltereinstellungen über einen weiteren Eingang mit Taster, oder in der Richtung was du vorgeschlagen hast.

@Heinileini
- ja, S5 Timer
- als ich in die CPU online geschaut hatte war der aktuelle Wert auf 6ms - wenn ich es richtig in Erinnerung habe zeigte mir die CPU auch einen Wert an, der max. erreicht wurde. Lag bei 8ms meine ich.
- im Prinzip ist es Theorie. Gucke ich online in den Baustein steht immer der selbe Wert. Kann sich natürlich in Bruchteilen einer Sekunde aus irgendwelchen Gründen auch immer ändern - kann man dann nur online leider nicht sehen :(
- Die Schalter habe ich noch nicht gegeneinander getauscht.


Ich gehe jetzt gleich erstmal zur Anlage und "experimentiere" etwas weiter ;)

Hucky
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Ich habe mitlerweile einen Lasersensor verbaut, der exakt den Kartonanfang erkennt. Der Trigerpunkt sollte eigentlich immer gleich sein.
Gibt es z.B. Löcher im Karton? Kann es sein, dass die Lichtschranke zwar den Anfang des Kartons richtig erkennt, dann aber auch ein zweites Mal und nun die Einschaltverzögerung dadurch nachgetriggert (bzw. erneut gestartet) wird?
 
Ich verstehe das nicht.
Das Program ist neu, sonnst wurde das Problem zeit lange erkennt und gelöst werden, oder ?
Wer macht Programme in 2021 mit S5 Timer und BCD Schalter ???

versuche das meist irgendwie umzusetzen bzw. abzuleiten von 6502/6510 und Atmel Programmierung
Wechsle auf IEC Timer und Eingabe von Parameter über ein HMI.
Wenn das ist zu viel Aufwand, dann zeige uns deiner Code.

Die Zeiten sind jeweils um die 300ms lang. Die Zyklenzeit der CPU liegt bei 6ms.
Die Zykluszeit den du siehst wenn online aktualisiert nicht 100% mit die tatsächlichen Zykluszeit. Es kann sein dass die Zykluszeit ab und zu springt auf ein viel höheren Wert, du siehst es aber nicht. Das kann problematisch sein wenn die Logik zyklusgenau funktioneren soll.
Die Abhilfe ist die Zeitkritische Funktione in ein Zeit-OB zu verlegen.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Über Ursprung, Alter u.s.w. haben wir (noch) keine Information.
Ich habe dies gelesen als ob eine uralte Microcontrollersteuerung durch ein S7 ersetzt wurde.
versuche das meist irgendwie umzusetzen bzw. abzuleiten von 6502/6510 und Atmel Programmierung

edit: Selbst wenn es handelt um eine Änderung von eine bestehende S7-300 Steuerung, dann Frage ich ob es ist Sinnvoll solch eine Aufgabe mit S5 Timer zu lösen.
 
S5-Timer funktionieren einwandfrei. Man darf sie ruhig noch verwenden.

Wen ich das Problem lösen müsste, dann würde ich so vorgehen:
*BCD-Eingänge in Integer umwandeln
*Integer mit 30ms multiplizieren plus eventuell einen Offset dazurechnen
*Wert über Rampe glätten, damit man die eventuellen Fehler vom BCD-Schalter auch beobachten kann - hatte noch nie Probleme mit solchen schaltern
*Umwandeln in entweder S5Time oder Time für IEC-Timer (leichter)
*verknüpfen mit dem Zeitbaustein.
 
*BCD-Eingänge in Integer umwandeln
Bei mehr als einer BCD-Stelle allemal.
Aber bei nur einer BCD-Stelle gegenstandslos.
Lieber die evtl. hereinströmenden PseudoTetraden entschärfen.

Au ja, 6502! Der gute alte PET (und Konsorten).
AWL ist sehr nah an AssemblerProgrammierung, deshalb hier in AWL:
Code:
// beide BCD-Schalter auf PseudoTetraden (A..F) prüfen
       L    EB x         // beide BCD-Schalter
       L    15
       UW
       L    9
       >I
       SPB  SKIP         // PseudoTetrade BCD0
       L    EB x         // beide BCD-Schalter
       SRW  4
       UW
       L    9
       >I
       SPB  SKIP         // PseudoTetrade BCD1
// ein "Bisschen" Entprellung für beide BCD-Schalter
       L    zuvor        // statische HilfsVariable BYTE
       L    EB x         // beide BCD-Schalter
       T    zuvor
       ><I
       SPB  SKIP
       T    übernommen   // die übernommenen Werte der beiden BCD-Schalter BYTE
SKIP   ...

*Wert über Rampe glätten, damit man die eventuellen Fehler vom BCD-Schalter auch beobachten kann - hatte noch nie Probleme mit solchen schaltern
An Probleme mit BCD-"ThumbWheels" kann ich mich auch nicht erinnern. Die ganz normale Prellerei, ja.
Könnte mir allerdings vorstellen, dass sie bei Erschütterungen scheinbar grundlos prellen.
Glätten über eine Rampe dürfte sehr gut funktionieren, um die Störungen beobachtbar zu machen.
Aber bei Bedarf bitte zusätzlich und nicht standardmässig für die normale WeiterVerarbeitung der eingestellten Werte.
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
Das Problem bei einem BCD Schalter liegt eben in der Codierung. Wenn du von 8 auf 7 wechselst, dann werden 4 Bits geändert. Und ob die alle im gleichen Zyklus im SPS Programm erfasst werden ist zweifelhaft. Darum existieren auch andere Codierungen wie Gray Code mit einer Hamming-Distanz von 1.

In sehr vielen Ausbildungsunterlagen zur SPS kommt irgendein Beispiel mit BCD-Schalter vor, aber das wird nie beachtet.
 
Das Problem bei einem BCD Schalter liegt eben in der Codierung. Wenn du von 8 auf 7 wechselst, dann werden 4 Bits geändert. Und ob die alle im gleichen Zyklus im SPS Programm erfasst werden ist zweifelhaft. Darum existieren auch andere Codierungen wie Gray Code mit einer Hamming-Distanz von 1.

In sehr vielen Ausbildungsunterlagen zur SPS kommt irgendein Beispiel mit BCD-Schalter vor, aber das wird nie beachtet.
Absolut, Thomas. Aber auch der GrayCode bei ThumbWheels nützt nicht allzu viel, wenn die Kontakte prellen.
Da bei dieser Anwendung lediglich einer von 10 Zeitwerten ausgewählt wird und alle 10 bei 300 ms liegen sollen und ferner, weil die 6 unzulässigen Codes (PseudoTetraden) zuverlässig erkannt werden können, würde ich das Thema aber hier nicht dramatisieren.

Die merkwürdigen AusbildungsUnterlagen (die es leider zu Hauf gibt - auch zu vielen anderen Themen) sind aber (hoffentlich) kein ausreichender Grund, die dort beschriebenen Geräte bzw. Verfahren allesamt aus dem Repertoire zu streichen, nur weil sie gelegentlich unvollständig oder sogar falsch erklärt werden!?
 
Zuletzt bearbeitet:
Durch die vier Bits der Schalter wird jeweils ein in einem Datenbaustein hinterlegter Zeitwert ausgelesen und in ein "aktueller Zeitwert" Wort in diesem DB gespeichert.
In einem anderen Baustein, wo die Schrittkette vom Kartontransport incl. Leimung stattfindet, der auch direkt vom OB 1 angesteuert wird werden die beiden Timer mit den jeweils aktuellen Zeitwerten (Word) versorgt.
Kannst Du mal den Programmcode zeigen wie der BCD-Wert in einen Zeitwert umgerechnet wird, und wie die Timer damit "versorgt" werden, und wie die Timer aufgerufen werden, und wie die Timer verwendet/verknüpft werden?

Wenn der Timer dann falsch funktioniert, liefert der BCD-Schalter da einen falschen Wert?

Harald
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Als ich noch BCD-Schalter verwendet hab, hab ich eigentlich nie den Wert zyklisch übernommen.
Zum einen prellen die Dinger und zum andern sind sie anfällig für Vibrationen.
Ich hab meist einen Leuchttaster "Wert übernehmen" verwendet.
Da ja Leute gerne an Schaltern rumdrehen, hab ich den Leuchttaster blinken lassen, wenn der gespeicherte Wert ungleich des eingestellten Wertes war. Damit hast du gleich auch noch den Nebeneffekt, dass du erkennst, wenn der Schalter zwischendurch prellt.
 
Mahlzeit...
Sorry dass ich mich erst jetzt melde.
Ich habe das Problem Freitag noch in den Griff bekommen.
Einerseits hatte ich im Programm tatsächlich einen Bug, anderseits machte auch der extra neu eingesetzte Laserlichttaster zicken.
Unsere Kartons sind kunststoffbeschichetet. Vier von fünf Layouts laufen ohne Probleme, beim fünften macht der Sensor was er will.
Farbig bedruckte Kartons (von hell bis dunkel) laufen, weiße laufen nicht. Oft löst der Sensor zu spät aus, manchmal gar nicht.
Warum das so ist weiß ich nicht. Ich habe den Sensor mal horizontal installiert, mal leicht nach oben, mal leicht nach unten gekippt.
Die Kunststoffbeschichtung scheint mit weißen Untergrund einen viel höheren Störfaktor darzustellen als bei bedrucktem Karton.
Fazit: eine popelige, normale Lichtschranke verbaut. Das einfachste ist halt oft das beste.
Nun zu dem Bug.
Die BCD Werte der beiden Schalterstellungen lese ich über ein Eingangsbyte ein. Das Eingangsbyte schiebe ich in zwei verschiedene DBW in einem Datenbaustein. Da man bei S7 classic nicht, bzw. nicht so einfach einzelne BITS abfragen kann, bzw. maskieren kann habe ich für den zweiten Schalter, der im oberen Nibble vom Eingangsbyte eingelesen wurde und der entsprechende Wert in den BITS 4-7 vom DBW dargestellt wird mit dem Befehl SHR-W um 4 BIT nach rechts geschoben.
Diesen Wert habe ich dann auf 0-9 verglichen und habe mir entsprechend aus verschiedenen Stellen die S5-Timer Werte aus einem Datenbaustein ausgelesen.
Bei dem ersten Schalter, die in den BITS 0-3 abgebildet habe ich das DBW nicht bearbeitet. So nach dem Motto: ich kann ja direkt auf 0-9 abfragen. Toll. Leider wird ja der Wert vom zweiten Schalter dazu addiert :(
Ich habe jetzt mit dem Befehl SHL-W die oberen 12 BITS nach links rausgeschmissen und danach 12 BITS nach rechts geschoben, mit dem Ergebnis, dass das H-Nibble vom zweiten Schalter mit Nullen gefüllt wurde.
Die Werte von den beiden Schaltern werden jetzt auch nicht mehr konstant übernommen, sondern bei einer abfallenden Flanke, wenn der Sensor zur Leimauslösung verlassen wurde.

Funktioniert :)

Vielen Dank für eure Unterstützung

Hucky
 
Bei dem ersten Schalter, die in den BITS 0-3 abgebildet habe ich das DBW nicht bearbeitet. So nach dem Motto: ich kann ja direkt auf 0-9 abfragen. Toll. Leider wird ja der Wert vom zweiten Schalter dazu addiert :(
Das hatte ich schon vermutet...
Code:
L   EB12
UW  W#16#F     //FUP/KOP: WAND_W
T   #BCDwert1  //INT, erhält die Bits 0..3

L   EB12
SRW 4          //FUP/KOP: SHR_W
T   #BCDwert2  //INT, erhält die Bits 4..7

Harald
 
Zurück
Oben