HSC "High Speed Counter" zählt nicht

A

Anonymous

Guest
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo, ich habe einen HSC programmiert, doch der zählt nicht, wenn ich eine Spannung am Eingang lege. Muss da unbeding ein Taktsignal anligen oder reicht das wenn ich zum testen mit einem Draht Takte gebe?

Hier ist die Initialisierung:

MOVB 4, ID
MOVD +0, VD100
MOVB 0, CHECK_L
MOVB 0, AB0 // Ausgänge A0.[0..7] auf 0 setzen
MOVB 0, AB1 // Ausgänge A1.[0..7] auf 0 setzen
MOVB 0, Komando

// *** aktueller Zählerwert ***
MOVB 1, SMB48
MOVB 1, SMB49
MOVB 1, SMB50
MOVB 1, SMB51

// *** vorgegebener Zählerwert ***
MOVB 255, SMB52
MOVB 255, SMB53
MOVB 255, SMB54
MOVB 255, SMB55

MOVB 16#FC, SMB47 // Steuerbyte 47
HDEF 1, 6 // Modus für schnellen Zähler definieren


// *** Initialisierungen der seriellen Schnittstelle ***

MOVB 0, RXStatus
MOVB 0, Komando
// Statusflags der Einleseroutine löschen
MOVB 16#09, SMB30 // Freeport-Modus 9K6,n,8,1
ATCH RECEIVE, 8 // Interrupt 8 (serieller Port) -> INT 0

// ***

ATCH RECEIVE, 13
ENI // INT aktivieren
HSC 1 // Zähler HSC1 programmieren


Danke
A. Bebernik
 
Es reicht selbstverständlich, mit einem Draht (dessen anderes Ende an 24V liegt), den Eingabng zu takten.
Die Initialisierung sollte nur im ersten Zyklus (oder nur in einem Zyklus, falls die Betriebsart im Programm gewechselt wird) stattfinden, also z.B. abhängig von SM0.1.
Ich sehe bei dir gar keinen Merker.
Die S7-200 führt Anweisungen wi MOV in Abhängigkeit vom logischen Zwischenergebnis (VKE) aus!
 
Zuviel Werbung?
-> Hier kostenlos registrieren
schneller Zähler geht nicht

Die Initialisierung mache ich in einem Unterbrogramm, dass nur im 1. Zyklus ausgeführt wird:

Code:
LD     SM0.1                       // im ersten Zyklus wahr, sonst falsch
CALL   INIT  
....

im Unterprogramm INIT passiert dann folgendes:

Code:
...
MOVB   16#FC, SMB47                // Steuerbyte 47
HDEF   1, 6                        // Modus für schnellen Zähler definieren
MOVD   +0, SMD48
MOVD   +5000, SMD52

// *** Initialisierungen der seriellen Schnittstelle ***

MOVB   0, RXStatus
MOVB   0, Komando
                                   // Statusflags der Einleseroutine löschen
MOVB   16#09, SMB30                // Freeport-Modus 9K6,n,8,1
ATCH   RECEIVE, 8                  // Interrupt 8 (serieller Port) -> INT 0

ATCH   RECEIVE, 13
ENI                                // INT aktivieren
HSC    1                           // Zähler HSC1 programmieren


Das aktivieren der seriellen Schnittstelle funktioniert auch,
aber der Inhalt der Zählregister SMB48 ff funktioniert nicht:

Diese werden mit dem folgenden Code über die serielle Schnittstelle gesendet:

Code:
....
MOVB   SMB48, MB2                  // aktueller Zählerstand HSC1
CALL   SBR_11
MOVB   SMB49, MB2
CALL   SBR_11
MOVB   SMB50, MB2
CALL   SBR_11
MOVB   SMB51, MB2
CALL   SBR_11

außerdem schreibe ich den niederwertigen Teil vom SMB47 auf AB0:

Code:
....
MOVB   SMB48, AB0
....

aber der Zähler reagiert überhaupt nicht, irgendwas ist also falsch...




:cry:

Gruß

Arthur
 
Also, ich weiß nicht ob das sein muß, aber ich meine, daß, wenn ich ein Unterprogramm in Abhängigkeit von einem Merker aufrufe, ich dennoch ein LD S0.0 vor der 1. MOV-Anweisung stehen habe. Kann aber sein, daß es unnötig ist oder da steht, weil ich vor dem MOV irgendwelche Binärlogik behandel.
Zum Testen des Zählers würde ich erst mal "Programmstatus" verwenden und die serielle Schnittstelle außen vor lassen.
Wenn es dann noch nicht geht: Mit dem Zähler-Assistenten in einem neuen Projekt ein Zählprogramm erstellen und alleine laufen lassen.
Ich habe noch nicht mit der Schnittstelle gearbeitet, aber wenn die Übertragung eines Bytes länger als einen Zyklus dauert, muß man ja irgendwie absichern, daß das Byte im Sendepuffer nicht überschrieben wird, bevor es gesendet ist...
 
schneller Zähler geht nicht

Habe jetzt einen Teilerfolg erziehlt.
Ich kann den Interrupt auslösen und in der Interrupt-Routine einen Zähler hochzählen, den ich dann auslesen kann.

=> Der Zähler zählt

aber:

Ich kann den aktuellen Zählerwert nicht auslesen.

d.h.

MOVB SMB51,AB0

tut nix
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Welchen Interrupt? Vom Eingang? das ist nicht der Sinn des High-Speed-Zählers.

Der Zählerwert ist 32 bit lang
Versuch mal
MOVD SMD48, VDxxx.

Es ist unsinnig, ihn byteweise zu lesen, denn:
Er könnte z.B. auf 1ff stehen, und du liest zuerst SMB51=ff. Bevor du SMB50 liest, springt er auf 200 und dein Ergenis ist 02 FF !
Möglicherweise verhindert die SPS sowas?
 
Zurück
Oben