Twincat3 4 schieberegister

Beiträge
69
Reaktionspunkte
2
Zuviel Werbung?
-> Hier kostenlos registrieren
guten morgen SPS Welt!

ich moechte fuer eine Aufgabe ein Datenbit seriell verschieben und 4 ausgaenge parallel abfragen.

die perfekte loesung waere ein 4 bit Schieberegister mit einem seriellen Dateninput und 4 parallelen ausgaenge.
zb

aber in twicat 3 gibt es nicht (so ein baustein), soweit ich weiss. kann man ein solcher Baustein bauen? wenn ja, wie?

ich habe folgendes gemacht:
- 4 Netzwerk , in dem ich 4 baustein SHL mit EN/ENO eingebaut habe. dann ein fallende Taktimpuls P (EN) , Eingang D (zu verschieben), n=1(zahl der bit zu verschieben), D1 (ausgang) und P_out(ENO) wurde am ersten baustein angehängt. bei den 3 folgenden Netzwerke habe ich D1/D2, D2/D3, D3/D4 als EIngang/ Ausgang gemacht. Ausgangspostion p=True und D=1 danach kann D beliebige werte annehmen 0 der 1. Aber während der Simulation ist mein Ergebnis falsch.
was habe ich falsch gemacht?
koennte jmd mir sagen wie ich das loesen soll? mit FBD-sprache

danke im voraus fuer ihre Hilfe
 
Zuletzt bearbeitet:
die perfekte loesung waere ein 4 bit Schieberegister mit einem seriellen Dateninput und 4 parallelen ausgaenge.
...
aber in twicat 3 gibt es nicht (so ein baustein), soweit ich weiss.
...
in dem ich 4 baustein SHL mit EN/ENO eingebaut habe.
Du schreibst "gibt es in TwinCat3 nicht" ... was ist denn "SHL"? SHift Left, also schiebe nach links?
Was wäre perfekt am 4 Bit SchiebeRegister? Die 4? Spendiere doch einfach ein Byte oder ein Word oder ein Dword mit 8 oder 16 oder 32 Bit!
Die höherwertigen Bits kannst Du ignorieren oder "platt machen" durch VerUNDen mit der Konstante 15.
Warum hast Du "4 Baustein SHL"? Rufst Du SHL an 4 Stellen auf? Begnüge Dich doch mit 1 Aufruf.

Gruss, Heinileini
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Du schreibst "gibt es in TwinCat3 nicht" ... was ist denn "SHL"? SHift Left, also schiebe nach links?
Was wäre perfekt am 4 Bit SchiebeRegister? Die 4? Spendiere doch einfach ein Byte oder ein Word oder ein Dword mit 8 oder 16 oder 32 Bit!
Die höherwertigen Bits kannst Du ignorieren oder "platt machen" durch VerUNDen mit der Konstante 15.
Warum hast Du "4 Baustein SHL"? Rufst Du SHL an 4 Stellen auf? Begnüge Dich doch mit 1 Aufruf.

Gruss, Heinileini

- mit 4 bit Schieberegister (SIPO) kann man die 4 ausgaegen parallel abfragen. und das ist genau das ich moechte ich implementieren.
- ich benutze 4 SHL um die 4 ausgaenge gleichzeitig aufzurufen. Aber wie ich oben erklaert habe funktionniert nicht. ich weiß nicht warum.
-
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Moin Funktionsbaustein,

klar ist das möglich.

Vielleicht nimmst Du ein Byte? Das reicht ja für ein Byte.

Du könntest auch mit einer CASE-Anweisung arbeiten (und statt schieben kann man auch mit 2 multiplizieren, wenn immer nur um ein Bit geschoben werden soll):

Code:
IF Flanke THEN
CASE Variable OF    // ich kenne allerdings die Syntax bei Codesys nicht
1: Variable := Variable * 2; // Variable = 2
2: Variable := Variable * 2; // Variable = 4
4: Variable := Variable * 2; // Variable = 8
else: Variable := 1; // bei "8" oder falschem Wert oder wenn initialisiert werden muss: Variable = 1
END_CASE;
END_IF;

ODER:
Code:
IF Flanke THEN
CASE Variable OF    // ich kenne allerdings die Syntax bei Codesys nicht
1,2,4: Variable := Variable * 2; // Variable = 2, 4, 8
else: Variable := 1; // bei "8" oder falschem Wert oder wenn initialisiert werden muss: Variable = 1
END_CASE;
END_IF;

VG

MFreiberger
 
Zuletzt bearbeitet:
... ist es möglich ...
Ja, siehe #5:
Bit0 := (Variable UND 1) = 1
Bit1 := (Variable UND 2) = 2
Bit2 := (Variable UND 4) = 4
Bit3 := (Variable UND 8 ) = 8
wobei Variable diejenige ist, die Du als SchiebeRegister benutzt und Bit0 .. Bit3 die 4 Ausgänge.


PS:
Bit3 := (Variable UND 8 ) = 8 bedeutet:
- Variable mit Konstante 8 verUNDen
- ZwischenErgebnis mit Konstante 8 vergleichen
- Ergebnis zuweisen

Lass Dich nicht dadurch irritieren, dass ich die Numerierung der Bits mit 0 begonnen habe - Bit3 ist das 4. Bit.

PPS:
Die CaseSelektion ist nicht so ganz gut geeignet, sie funktioniert nur, wenn immer höchstens 1 der 4 Bit den Zustand 1 hat.

PPPS:
Bin leider auch nicht in der ZwillingsKatzen-Sprache bewandert und noch viel weniger in FBD.
 
Zuletzt bearbeitet:
Du könntest einen FB in ST programmieren und den dann in FBD/FUP aufrufen.
Code:
FUNCTION_BLOCK SIPO4
VAR_INPUT
  CLK : BOOL;
  IN  : BOOL;
END_VAR
VAR_OUTPUT
  OUT1 : BOOL;
  OUT2 : BOOL;
  OUT3 : BOOL;
  OUT4 : BOOL;
END_VAR
VAR
  register : BYTE := 0; [COLOR="#008000"]//oder WORD[/COLOR]
  m : BOOL := FALSE;
END_VAR

IF CLK AND NOT m THEN [COLOR="#008000"]//steigende Flanke[/COLOR]
  register := SHL(register, 1) OR [COLOR="#0000FF"]BOOL_TO_BYTE(IN)[/COLOR]; [COLOR="#008000"]//oder BOOL_TO_INT(IN) ? oder SEL(IN, 0, 1)[/COLOR]
END_IF;

m := CLK; [COLOR="#008000"]//Zustand von CLK merken für Flankenerkennung[/COLOR]

OUT1 := register.0;
OUT2 := register.1;
OUT3 := register.2;
OUT4 := register.3;

In FBD/FUP kann man das sicher auch programmieren, doch da habe ich keine Ahnung, wie man in Twincat Anweisungen wie ADD/OR/SEL nur bedingt ausführt. Vielleicht so: ?
Code:
    R_TRIG_CLK
    +--------+              +-------+              +------+
    | R_TRIG |              |  SHL  |              |  OR  |
CLK-|CLK    Q|--------------|EN  ENO|--------------|EN ENO|-
    +--------+     register-|       |--------------|      |-register
                          1-|       |    +---------|      |
                            +-------+    |         +------+
                            +-------+    |
                            |  [COLOR="#0000FF"]SEL[/COLOR]  |    |
                         IN-|G      |----+
                          0-|IN0    |
                          1-|IN1    | [COLOR="#008000"]("SEL" oder "BOOL TO INT")[/COLOR]
                            +-------+
           +--------+
           |  MOVE  |
register.0-|        |-OUT1
           +--------+
           +--------+
           |  MOVE  |
register.1-|        |-OUT2
           +--------+
           +--------+
           |  MOVE  |
register.2-|        |-OUT3
           +--------+
           +--------+
           |  MOVE  |
register.3-|        |-OUT4
           +--------+

Harald
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Bit0 := (Variable UND 1) = 1
Bit1 := (Variable UND 2) = 2
Bit2 := (Variable UND 4) = 4
Bit3 := (Variable UND 8 ) = 8
Sowas formuliere ich lieber so:
Code:
Bit0 := (Variable UND 1) <> 0 ;
Bit1 := (Variable UND 2) <> 0 ;
Bit2 := (Variable UND 4) <> 0 ;
Bit3 := (Variable UND 8) <> 0 ;

Harald
 
Du könntest einen FB in ST programmieren und den dann in FBD/FUP aufrufen.
Code:
FUNCTION_BLOCK SIPO4
VAR_INPUT
  CLK : BOOL;
  IN  : BOOL;
END_VAR
VAR_OUTPUT
  OUT1 : BOOL;
  OUT2 : BOOL;
  OUT3 : BOOL;
  OUT4 : BOOL;
END_VAR
VAR
  register : BYTE := 0; [COLOR=#008000]//oder WORD[/COLOR]
  m : BOOL := FALSE;
END_VAR

IF CLK AND NOT m THEN [COLOR=#008000]//steigende Flanke[/COLOR]
  register := SHL(register, 1) OR [COLOR=#0000FF]BOOL_TO_BYTE(IN)[/COLOR]; [COLOR=#008000]//oder BOOL_TO_INT(IN) ? oder SEL(IN, 0, 1)[/COLOR]
END_IF;

m := CLK; [COLOR=#008000]//Zustand von CLK merken für Flankenerkennung[/COLOR]

OUT1 := register.0;
OUT2 := register.1;
OUT3 := register.2;
OUT4 := register.3;

In FBD/FUP kann man das sicher auch programmieren, doch da habe ich keine Ahnung, wie man in Twincat Anweisungen wie ADD/OR/SEL nur bedingt ausführt. Vielleicht so: ?
Code:
    R_TRIG_CLK
    +--------+              +-------+              +------+
    | R_TRIG |              |  SHL  |              |  OR  |
CLK-|CLK    Q|--------------|EN  ENO|--------------|EN ENO|-
    +--------+     register-|       |--------------|      |-register
                          1-|       |    +---------|      |
                            +-------+    |         +------+
                            +-------+    |
                            |  [COLOR=#0000FF]SEL[/COLOR]  |    |
                         IN-|G      |----+
                          0-|IN0    |
                          1-|IN1    | [COLOR=#008000]("SEL" oder "BOOL TO INT")[/COLOR]
                            +-------+
           +--------+
           |  MOVE  |
register.0-|        |-OUT1
           +--------+
           +--------+
           |  MOVE  |
register.1-|        |-OUT2
           +--------+
           +--------+
           |  MOVE  |
register.2-|        |-OUT3
           +--------+
           +--------+
           |  MOVE  |
register.3-|        |-OUT4
           +--------+

Harald

funktionniert super. ich habe daraus ein 16bit SIPO schieberegister gemacht.

die FBD- code werde ich auch testen.
danke schön.
 
Du könntest einen FB in ST programmieren und den dann in FBD/FUP aufrufen.
Code:
FUNCTION_BLOCK SIPO4
VAR_INPUT
  CLK : BOOL;
  IN  : BOOL;
END_VAR
VAR_OUTPUT
  OUT1 : BOOL;
  OUT2 : BOOL;
  OUT3 : BOOL;
  OUT4 : BOOL;
END_VAR
VAR
  register : BYTE := 0; [COLOR=#008000]//oder WORD[/COLOR]
  m : BOOL := FALSE;
END_VAR

IF CLK AND NOT m THEN [COLOR=#008000]//steigende Flanke[/COLOR]
  register := SHL(register, 1) OR [COLOR=#0000FF]BOOL_TO_BYTE(IN)[/COLOR]; [COLOR=#008000]//oder BOOL_TO_INT(IN) ? oder SEL(IN, 0, 1)[/COLOR]
END_IF;

m := CLK; [COLOR=#008000]//Zustand von CLK merken für Flankenerkennung[/COLOR]

OUT1 := register.0;
OUT2 := register.1;
OUT3 := register.2;
OUT4 := register.3;

In FBD/FUP kann man das sicher auch programmieren, doch da habe ich keine Ahnung, wie man in Twincat Anweisungen wie ADD/OR/SEL nur bedingt ausführt. Vielleicht so: ?
Code:
    R_TRIG_CLK
    +--------+              +-------+              +------+
    | R_TRIG |              |  SHL  |              |  OR  |
CLK-|CLK    Q|--------------|EN  ENO|--------------|EN ENO|-
    +--------+     register-|       |--------------|      |-register
                          1-|       |    +---------|      |
                            +-------+    |         +------+
                            +-------+    |
                            |  [COLOR=#0000FF]SEL[/COLOR]  |    |
                         IN-|G      |----+
                          0-|IN0    |
                          1-|IN1    | [COLOR=#008000]("SEL" oder "BOOL TO INT")[/COLOR]
                            +-------+
           +--------+
           |  MOVE  |
register.0-|        |-OUT1
           +--------+
           +--------+
           |  MOVE  |
register.1-|        |-OUT2
           +--------+
           +--------+
           |  MOVE  |
register.2-|        |-OUT3
           +--------+
           +--------+
           |  MOVE  |
register.3-|        |-OUT4
           +--------+

Harald
was kann ich in dem ST-code aendern ,um mit einer fallende flanke zu arbeiten?
 
was kann ich in dem ST-code aendern ,um mit einer fallende flanke zu arbeiten?
IF CLK AND NOT m THEN //Schiebetakt steigende Flanke

IF NOT CLK AND m THEN //Schiebetakt fallende Flanke


(oder den Schiebetakt negiert auf den Eingang CLK verschalten)


ich habe daraus ein 16bit SIPO schieberegister gemacht.
Das ist sinnvoll für universellere Verwendbarkeit. Dann hat man bestimmt auch bald den Wunsch, das interne 16 Bit Register direkt manipulieren zu können. Man kann dem FB noch etwas mehr Funktionalität geben, dann kann er ein Standard-Baustein werden.
Code:
FUNCTION_BLOCK SIPO16 [COLOR="#008000"]//Schieberegister mit parallelen Ausgängen[/COLOR]
VAR_INPUT
  CLK : BOOL; [COLOR="#008000"]//Schiebetakt (bei steigender Flanke)[/COLOR]
  IN  : BOOL; [COLOR="#008000"]//Serial In Bit[/COLOR]
  LD  : BOOL; [COLOR="#008000"]//Load[/COLOR]
  LV  : WORD; [COLOR="#008000"]//Load value[/COLOR]
  CLR : BOOL; [COLOR="#008000"]//Clear[/COLOR]
END_VAR
VAR_OUTPUT
  OUT1 : BOOL;
  OUT2 : BOOL;
  OUT3 : BOOL;
...
  OUT16 : BOOL;
END_VAR
VAR
  register : WORD := 0;
  m : BOOL := FALSE;
END_VAR

IF CLR THEN [COLOR="#008000"]//Clear[/COLOR]
  register := 0;

ELSIF LD THEN [COLOR="#008000"]//Load[/COLOR]
  register := LV;

ELSIF CLK AND NOT m THEN [COLOR="#008000"]//Schiebetakt steigende Flanke[/COLOR]
  register := SHL(register, 1) OR BOOL_TO_WORD(IN);

END_IF;

m := CLK; [COLOR="#008000"]//Zustand von CLK merken für Flankenerkennung[/COLOR]

OUT1 := register.0;
OUT2 := register.1;
OUT3 := register.2;
...
OUT16 := register.15;
(ungekürzter Code im Anhang)

Harald
 

Anhänge

  • SIPO16.txt
    1,2 KB · Aufrufe: 8
Zurück
Oben