Step 7 Schleife AWL

Zuviel Werbung?
-> Hier kostenlos registrieren
auf wunsch des Support habe ich das komplette Programm zugesendet ( 20 Seiten ):)
Die CPU ist gerade besetzt sobald sie Frei wird teste ich das ganze mal.

Wie meinst du 2 CPUs?
Wegen dem "H" dachte nur die Sicherheits CPUs sind doppelt ausgeführt.
Wenn nicht muss ich mal nachschauen welche Firmware Versionen installiert sind
Gruß
Erick
 
auf wunsch des Support habe ich das komplette Programm zugesendet ( 20 Seiten ):)
Die CPU ist gerade besetzt sobald sie Frei wird teste ich das ganze mal.

Wie meinst du 2 CPUs?
Wegen dem "H" dachte nur die Sicherheits CPUs sind doppelt ausgeführt.
Wenn nicht muss ich mal nachschauen welche Firmware Versionen installiert sind
Gruß
Erick
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hi,
ich habe die verschiedenen Varianten versucht aber leider hat es nicht funktioniert
Zudem hat Variante 1 direkt nach der 1. Runde den Vorgang beendet.

Ich hatte es auch mit dem VKE CLR bzw. Set versucht aber auch kein Erfolg.

Ich Versuche morgen mal die Schleife zu halbieren in dem ich den Programmcode entsprechend erweitere / verdoppel
Evtl hat es was mit der Anzahl und Geschwindigkeit an durchläufen zu tun

Gruß
Erick
 
Zudem hat Variante 1 direkt nach der 1. Runde den Vorgang beendet.
Ooo... die Varianten sollten gleich funktionieren.

Also diese beiden Varianten müssen exakt gleich funktionieren (außer: Status-Flags sind danach anders):
Meine Variante 1
Code:
CLR
L     W#16#0D0A
L     DBW [AR1,P#2.0]
<>I
SPBN  opei
Deine Variante
Code:
CLR
L     W#16#0D0A
L     DBW [AR1,P#2.0]
==I
SPB   opei


PS: Ich dachte, H-CPU sind immer doppelt?

Harald
 
Hallo Erick,

ich kann zwar den Fehler auch nicht finden. Aber es gibt ein paar Dinge, die mir nicht so recht gefallen. Vielleicht hilft es ja.

.. dann wird aus der Schleife raus gesprungen (SPBN Groe) und eine Berechnung durchgeführt, danach wird zurück in Schleife gesprungen ( ASC1: T ...)
Den Code hast du noch nicht gepostet? Ich glaube, in diesem Fall müsste man das gesamte Programm untersuchen, um einen möglichen Fehler zu finden (falls es einen gibt).


L DBB [AR1,P#0.0] // Lade 1.Byte
L B#16#40
<I // DBB X kleiner "40" dann SP nicht..
Wenn man HEX-Werte mit Integer-Operationen auf größer oder kleiner vergleicht, kann einem das Vorzeichenbit schnell mal einen Streich spielen. Bei deinen Werten kommt dies m.E. jedoch nicht vor.


Oder vielleicht doch?
L DBB [AR1,P#1.0]// Wenn DBB X+1 kleiner 40 dann Subtr "30" damit nur 1 dezstelle über bleibt
L B#16#30
-I


So richtig glücklich wäre ich mit diesem Code nicht.

Schreibweisen wie L '1' anstatt L 16#0031 sind übrigens in Step7 auch möglich.

Eventuell wäre für so eine Auswertung SCL besser geeignet gewesen?


Gruß, Onkel
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Der Sprung nach Groe wird lediglich ein Vergleich durchgeführt
Code:
Groe: L     DBB [AR1,P#0.0]
      L     B#16#41
      ==I   
      SPBN  Nex1
      L     B#16#A0
      SPA   ASC1
Nex1: L     DBB [AR1,P#0.0]
      L     B#16#42
....

Mit den anderen Codes möchte ich jeweils nur das high und low word von dem ASCII code auslesen
ASCII telegramm: 0x30354146 (4Byte)
Dies entspricht : 0x 0 5 A F (2Byte)

Mit dem Code wird quasi erfragt ob der Wert kleiner 40 ist
Ja: Minus 30 (30-30=0, 35-30=5)
Nein: Vergleiche (41==41 ->A; 46==41 , 46==42, ..., 46==46 ->F )

Die Werte liegen alle zwischen 30 und 46 daher gibt es keine negativen Werte
Abgesehen von 0D0A, weshalb auch der Vergleich auf 0D0A.

Gruß
Erick
 
Zuletzt bearbeitet:
Wenn man HEX-Werte mit Integer-Operationen auf größer oder kleiner vergleicht, kann einem das Vorzeichenbit schnell mal einen Streich spielen. Bei deinen Werten kommt dies m.E. jedoch nicht vor.


Oder vielleicht doch?
Wenn man wie hier Byte-Werte mit 16-Bit-Operationen vergleicht, dann ist das Vorzeichen (~ High-Byte) immer positiv.

Harald
 
ASCII telegramm: 0x30354146 (4Byte)
Dies entspricht : 0x 0 5 A F (2Byte)
Das ist also eine Wandlung einer ASCII-Zeichenkette mit Hex-Zeichen zu einem 16-Bit Wert.
Die gibt es eigentlich schon fertig als FC94 ATH (Standard Library > TI-S7 Converting Blocks).

Man kann die einfache Wandlung aber auch selber programmieren.

Umwandlung eines ASCII-Zeichens in einen Hex-Wert:
- '0' ... '9' ? --> '0' abziehen --> 0 ... 9
- 'A' ... 'F' ? --> '7' abziehen --> 10 ... 15 (16#0A ... 16#0F)
- alle anderen ASCII-Zeichen sind unzulässig, kann man z.B. mit 0 ersetzen

Man kann das auch ein wenig optimieren:
- >'F' --> unzulässiges Zeichen
- >='A' --> '7' abziehen --> fertig
- >'9' --> unzulässiges Zeichen
- '0' abziehen, Ergebnis negativ? --> unzulässiges Zeichen

In Microprozessoren nimmt man gerne auch Lookup-Tables.

Man kann die Wandlung in AWL auch einfach mit einer Sprungleiste realisieren:
Code:
      L   #myChar  // das ASCII-Zeichen (z.B. von DBB [AR1,P#0.0])
      L   '0'      // ASCII-Wert des kleinsten zulässigen Zeichens
      -I           // Normierung zu 0...x zur Verkürzung der SPL
      SPL MUNZ
      SPA MZIF     // '0'
      SPA MZIF     // '1'
      SPA MZIF     // '2'
      SPA MZIF     // '3'
      SPA MZIF     // '4'
      SPA MZIF     // '5'
      SPA MZIF     // '6'
      SPA MZIF     // '7'
      SPA MZIF     // '8'
      SPA MZIF     // '9'
      SPA MUNZ     // B#16#3A
      SPA MUNZ     // B#16#3B
      SPA MUNZ     // B#16#3C
      SPA MUNZ     // B#16#3D
      SPA MUNZ     // B#16#3E
      SPA MUNZ     // B#16#3F
      SPA MUNZ     // B#16#40
      SPA MTET     // 'A'
      SPA MTET     // 'B'
      SPA MTET     // 'C'
      SPA MTET     // 'D'
      SPA MTET     // 'E'
      SPA MTET     // 'F'
MUNZ: L   7        // unzulässiges Zeichen! --> soll als 0 interpretiert werden
MTET: +   -7       // bei Tetraden A...F 7 abziehen
MZIF: T   #myByte  // der umgewandelte Wert 0...15 (B#16#00 ... B#16#0F)

PS: ASCII-Schreibweise '0' ... '9' = B#16#30 ... B#16#39 / 'A' ... 'F' = B#16#41 ... B#16#46

Harald
 
Zurück
Oben