Step 7 IBIS LED Anzeige ansteuern

Sternfahrer463

Level-1
Beiträge
29
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo Zusammen,
ich möchte für ein Projekt (Weitenmessung an einem Bremswagen) eine LED Anzeige aus einem Lienienbus ansteuern.
Die Anzeige arbeitet mit IBIS Datensätze.
Hardware mäßig habe ich eine CPU313C(6ES7313-5BE00-0AB0), eine CP341 RS232 (6ES7341-1AH01-0AE0) und einen Schnittstellenumsetzer RS232/ IBIS verbaut.
Software mäßig habe ich den FB108 (FB P_SND_RK) vom CP341 verwendet. Es werden auch Signale an den Schnittstellenumsetzer gesendet (Signal LED blinkt) aber die LED Anzeige bleibt dunkel.

Der IBIS Datensatz müsste folgendermaßen aussehen:
z.B.
aA21T078.21 Meter<LF><LF><CR><7C>

aA2=Adresse Anzeige2
1=Anzahl 16er Zeichenblöcke
T0=Takt+Taktzeit(0sek)
78.21 Meter=Text der auf der Anzeige erscheinen soll, wobei die Zahl im S7 Programm gebildet wird
<LF>=Zeilenwechsel (Line Feed)
<CR>=Datenende (Carriage Return)
<7C>=Paritybyte

Wie bekomme ich das in einen Datenbaustein, den ich dann mit dem CP341 versenden kann?

LG
Sternfahrer463
 
Wenn der Datensatz den du schicken willst fix ist, kannst du ihn dir in einem Array of Char der entsprechenden Länge ablegen. Bei deinem Beispiel z.B. ein Array [0..20] of Char.
Den Datenbaustein schaltest du dann über das Menü "Ansicht" auf die "Datensicht" um, und gibst dann in den einzelnen Feldern deine Zeichen ein.
Für <LF> gibst du $L, für <CR> gibst du $R ein.
Deine Prüfsumme kannst du als $7C eingeben, dieser Wert wird nach der Eingabe aber in ein gleichwertiges Ascii-Zeichen umgewandelt.

An den Sendebaustein kannst du dann das komplette Array in symbolischer Darstellung als Parameter übergeben.

Alternativ kannst du auch eine Variable vom Datentyp String anlegen, und das alles hintereinander als Text eingeben, also 'aA21T078.21 Meter$L$L$R$7C'. Diesen kannst du dann aber nicht direkt symbolisch an den Sendebaustein anschalten, da die ersten beiden Bytes im String Kopfinformationen über die Stringlänge beinhalten die du nicht mitschicken darfst. Du müsstest dann einen absoluten Any-Pointer angeben. Wenn dein String[21] z.B. ab Byte 0 im DB1 beginnt, wäre das P#DB1.DBX2.0 BYTE 21.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Mit dem Array hat es nicht funktioniert, aber mit den String. Ich brauchte auch keinen Any-Pointer, da der FB108 eine Abfrage DBB hat und dort habe ich die 2 eingetagen und auf der Anzeige erscheint 78.21 Meter.
Soweit so Gut.
Aber da es sich hier um eine Weitenmessung handelt, verändert sich der Zahlenwert(0.00 bis 100.00) bei jeder Messung und somit auch das Patitybyte.
Wie kann man das lösen?
 
Da musst du im Handbuch des Gerätes nachsehen, wie das Paritätsbyte gebildet werden muss.
Meistens ist es ein XOR über alle einzelnen Bytes (was bei deinem Beispiel aber nicht hinkommt).

Wenn dein String immer eine konstante Länge hat (d.h. kleine Zahlenwerte mit Leerzeichen " 0.00"), ist das relativ einfach auch in AWL zu bewerkstelligen.
Mal angenommen es ist ein XOR, dann sowas wie:

L DB1.DBB2
L DB1.DBB3
XOW
L DB1.DBB4
XOW
...usw.

Bei 20 Zeichen und fixer Länge würde ich noch keine Schleife dafür bemühen.
 
Bei IBIS soll es folgendermaßen funktionieren:
"Zur Berechnung deklariert man zunächst ein neues Byte mit dem Wert 7F. Dieses wird nach und nach mit jedem Byte des Datensatzes XOR verknüpft. Das Ergebnis ist das Paritybyte."
Kann es daran liegen, das es bei meinem Beispiel nicht hinkommt?
Und wie deklariere ich ein neues Byte mit 7F?
Sorry für die Frage, aber für mich ist das völliges Neuland.
 
Hallo Zusammen,
ich habe folgendes versucht, funktioniert aber nicht.
Habe einen Textcode(aA21T0 54.12 Meter$L$L$R ) ohne Paritybyte(dafür zwei Leerzeichen) in den DB11 eingegeben.In der FC5 rufe ich DB11 auf, lade ab DBB2 und transferiere in DB12.DBB2. Anschließend führe ich die XOR Verknüpfung durch(past auch) und transferiere das Ergebnis an DB12.DBB22.
FC5
AUF DB 11
L DB11.DBB 2
T DB12.DBB 2
L B#16#7F
L DB11.DBB 2
XOW
L DB11.DBB 3
XOW
L DB11.DBB 4
XOW
L DB11.DBB 5
XOW
L DB11.DBB 6
XOW
L DB11.DBB 7
XOW
L DB11.DBB 8
XOW
L DB11.DBB 9
XOW
L DB11.DBB 10
XOW
L DB11.DBB 11
XOW
L DB11.DBB 12
XOW
L DB11.DBB 13
XOW
L DB11.DBB 14
XOW
L DB11.DBB 15
XOW
L DB11.DBB 16
XOW
L DB11.DBB 17
XOW
L DB11.DBB 18
XOW
L DB11.DBB 19
XOW
L DB11.DBB 20
XOW
L DB11.DBB 21
XOW
L DB11.DBB 22
XOW
T DB12.DBB 22

FB108
CALL "P_SND_RK_OLD" , DB108
SF :=
REQ :=E0.6
R :=E0.5
LADDR :=110
DB_NO :=12
DBB_NO :=2
LEN :=23
R_CPU_NO:=
R_TYP :=
R_NO :=
R_OFFSET:=
R_CF_BYT:=
R_CF_BIT:=
DONE :=M5.0
ERROR :=M5.1
STATUS :=MW50

Wo ist der Ferhler?
 
In der FC5 rufe ich DB11 auf, lade ab DBB2 und transferiere in DB12.DBB2. Anschließend führe ich die XOR Verknüpfung durch(past auch) und transferiere das Ergebnis an DB12.DBB22.
Hmmm... ganz nachvollziehen kann ich deinen Codeteil nicht...
Code:
FC5
[COLOR=#ff0000]AUF DB 11 <--- Bring eigentlich nichts da du bei den DB-Zugriffen weiter unten die DB-Nummer explitzit angibst.
[/COLOR]L DB11.DBB 2 
[COLOR=#ff0000]T DB12.DBB 2 <-- Hier überträgst du Byte 2 aus DB11 in DB12
------------- <-- Ab hier kommt nur mehr Parity-Bildung[/COLOR]
L B#16#7F
L DB11.DBB 2
XOW 
L DB11.DBB 3
XOW 
[COLOR=#ff0000]--------------------------------------[/COLOR]
T DB12.DBB 22 [COLOR=#ff0000]<--- Hier schreibst du das Parity-Ergebnis in DB12[/COLOR]
Wo kopierst du die Restlichen Bytes aus DB11 in DB12?

Übrigens, du kannst Code-Segmente hier übersichtlicher anzeigen wenn du vorne ein [CODE] und hinten ein [/CODE] einfügst.
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
Unter "funktioniert aber nicht" kann sich mein Glaskugel kaum was vorstellen ;) mir fällt aber auf:
Du willst DB12.DBB2..DBB24 senden, schreibst in Deinem Code aber nur in DBB2 und DBB22. Was steht in den anderen Bytes des Sendepuffers im DB12?
Dein FB108 soll 23 Zeichen senden, Dein Text "aA21T0 54.12 Meter$L$L$R*" ist anscheinend nur 22 Zeichen lang.
Müsste das Parity-Byte nicht in DBB23 stehen?

Harald
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Wie bekomme ich denn den ganzen DB11 in den DB12 transferiet?
Schau dir mal SFC20 (Standardbibliothek / Systemfunktionen ) an.
Damit kann mann ganze Blöcke (deine Strings) auf einmal transferieren.
Code:
//Falls deine Datenbaustein über symbolische Namen verfügen (empfehlenswert)
CALL "BLKMOV"
SRCBLK := DB11Symbolname.StringName
 RET_VAL:=#RetVal
 DSTBLK :=DB12Symbolname.StringName

//Sonst absolut
CALL "BLKMOV"
SRCBLK :=P#DB11.DBX 0.0 BYTE 25 <-- Bin mit nicht sicher wie groß deine Stings sind
 RET_VAL:=#RetVal
 DSTBLK :=P#DB12.DBX 0.0 BYTE 25

oder:
Code:
L DB11.DBD0
T DB12.DBD0
 L DB11.DBD4
T DB12.DBD4
 ... und so weiter und so fort...
L DB11.DBD20
T DB12.DBD20
L DB11.DBB25 //Je nach dem wie es sich mit der Byteanzhal ausgeht.
T DB12.DBB25
 
Zuletzt bearbeitet:
Hallo Zusammen,
ich habe folgendes versucht, funktioniert aber nicht.
Habe einen Textcode(aA21T0 54.12 Meter$L$L$R ) ohne Paritybyte(dafür zwei Leerzeichen) in den DB11 eingegeben.
Wie hast du denn deinen Textcode eingegeben bzw. was hast du in DB11 und 12 eigentlich erstellt.

Einen String mit x-Zeichen Länge (so wie von Thomas vorgeschlagen) oder ein Array of CHAR oder einzelne CHAR oder Bytes...?

Da du beim Sendebaustein einen Offset von 2 Byte einträgst habe ich angenommen dass du einen String erstellt hast.
Da sind aber die ersten beiden Byte mit der Gesamtlänge und der wirklich benutzen Länge belegt.

Wenn ich mir unter der Annahme deine Zeichenkette "aA21T0 54.12 Meter$L$L$R" ansehe,
würde das heißen dass ab Byte 2 das 'a' beginnt und bei Byte 22 das "$R" steht. Das heißt das Parity-Byte steht in Byte 23.
Wie kommst du darauf dass dieses 2-Byte lang sein müsste.
Der nächste Punkt ist dann dass die Länge der Zeichen von Byte 2 bis 23 nur 22 Byte ist - LEN:=22

(hoffe hab mich nirgens verzählt - stimmt aber mit PN//DP überein... :))
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
Beide DBs sind String mit 23 Zeichen.
Die Anzeige benötigt ASCII Zeichen.
Um 54.12 Meter dazustellen muss man folgendes übertragen:
aA21T0 54.12 Meter§L§L§R§52
52 ist in diesem Fall das Parity = 2 Zeichen
da sich aber meine Zahlerwerte bei jeder Messung ändert, möchte ich den Zahlenwert in DB11 ab DBB8 schreiben, anschließend das Parity bilden und alles in den DB12 bekommen
 
Bist du dir sicher, dass der Paritäswert ebenfalls in Ascii übertragen werden soll? Oder warum zwei Bytes?

Laut dieser Seite hier:
http://cybox.ib-luehning.de/ibis/ibisdata.html

würde ich bei der Bezeichnung Paritätsbyte auch davon ausgehen, dass es nur ein einzelnes Byte ist.

Im Anhang ein Beispiel wie ich das umsetzen würde, inklusive Wert-Konvertierung.
 

Anhänge

  • IBIS_string_erzeugen_awl.txt
    4,6 KB · Aufrufe: 10
Zuviel Werbung?
-> Hier kostenlos registrieren
Deine plötzliche Idee mit den 2 Paritätsbytes überprüfe nochmal... Deine Erklärungen in #1 und #5 beschreiben nur 1 Paritätsbyte.

Versuche es mal so:
Code:
//*** ab DBB6 den Messwert einfügen, z.B. '123.45' oder ' 54.12'
      L     '1'
      T     DB12.DBB6
      L     '2'
      T     DB12.DBB7
      L     '3'
      T     DB12.DBB8
      L     '.'
      T     DB12.DBB9
      L     '4'
      T     DB12.DBB10
      L     '5'
      T     DB12.DBB11

//*** Message mit Paritätsbyte erzeugen
      L     B#16#7F       //Init Paritätsberechnung
      L     'a'
      T     DB12.DBB0
      XOW
      L     'A'
      T     DB12.DBB1
      XOW
      L     '2'
      T     DB12.DBB2
      XOW
      L     '1'
      T     DB12.DBB3
      XOW
      L     'T'
      T     DB12.DBB4
      XOW
      L     '0'
      T     DB12.DBB5
      XOW

//*** hier liegt der Messwert (6 Zeichen)
      L     DB12.DBB6
      XOW
      L     DB12.DBB7
      XOW
      L     DB12.DBB8
      XOW
      L     DB12.DBB9
      XOW
      L     DB12.DBB10
      XOW
      L     DB12.DBB11
      XOW
//***
      L     ' '
      T     DB12.DBB12
      XOW
      L     'M'
      T     DB12.DBB13
      XOW
      L     'e'
      T     DB12.DBB14
      XOW
      L     't'
      T     DB12.DBB15
      XOW
      L     'e'
      T     DB12.DBB16
      XOW
      L     'r'
      T     DB12.DBB17
      XOW
      L     '$L'
      T     DB12.DBB18
      XOW
      L     '$L'
      T     DB12.DBB19
      XOW
      L     '$R'
      T     DB12.DBB20
      XOW
      T     DB12.DBB21    //Paritätsbyte

In DB12 ab DBB0 deklariere ein ARRAY[1..22] OF BYTE (oder größer).

Für FB108 gib an:
DB_NO :=12
DBB_NO :=0
LEN :=22

Harald
 
Ihr habt Recht, das Paritybyte ist ein Byte.
habe mich täuschen lassen, da im Ibis Code das Paritybyte in Hex angegeben wird und dann zwei Zeichen sind.
@ Harald
dein Vorschlag funktioniert.:)
@ Thomas
deine Lösung scheint für mein Projekt noch besser zu sein, soweit ich das bis jetzt beurteilen kann.
diese Programmierweise ist für mich noch sehr ungewohnt.
wir haben in der Schule ein wenig in Java programmiert, dadurch kan ich mir einiges erklären.
werde es auf jedenfall ausprobieren.
So, war ein langer Tag. Arbeit, Familie und SPS Programmirung.:D
Morgen gehts weiter!
Euch vielen Dank!!!

Christian
 
@ Thomas
ist das eigentlich noch awl oder schon eine höhere Programmiersprache?:confused:
wenn ja, kann mein Step7 V5.4 das auch?

Gruß Christian
 
Zurück
Oben