PDA

View Full Version : beliebigen Command (Char) übergeben



tobi_w
15.08.2008, 11:21
Hallo,

ich habe ein kleines/großes Problem. Meine Erfahrung ist sehr gering in solchem Bereich.


Ich habe einen Barcode-Leser an einer CP340 angeschlossen. Über P_SEND schicke ich einen Command (z.B. '1' für Start).
Diese 1 wird in ein STAT Array[1..8] of char übergeben und an den Scanner gesendet.



data[1]=1
..
data[8]=$r // "$r" = Abschlusscommand.


Soweit so gut. Klappt alles.



Problemstellung:

Der FB in dem P_SEND und P_RCV bearbeitet werden (Multiinstanzen) wird im FCx aufgerufen.



CALL FBx , DBx
iLADDR :=xxx
bStart :=M2.0
iWorkDB :=xxx
iCommand :='1'
bOK :=M2.1
bNOK :=M2.2
bScanFinished:=M2.3
bNewData :=M2.4



Jetzt möchte ich aber für '1' z.B. 'START' eingeben.
Wie kriege ich dann die einzelnen Chars in das array[1..8]?

Also:

Bei Übergabe vom Char '1' sieht das Array[1..8] of char so aus:


data[1]='1'
.
.
data[8]='$r'


Bei Übergabe vom Char 'START' soll das Array[1..8] of char so aussehen:



data[1]='S'
data[2]='T'
data[3]='A'
data[4]='R'
data[5]='T'
.
.
data[8]='$r'



Welches Datenformat muss #iCommand haben (in der Schnittestelle des FB´s als IN) damit ich 'START' übergeben kann?

Ich denke da muss mit indirekter Adressierung gearbeitet werden?
Leider hab ich noch keine Ahnung von.

Für einen gut Rat bzw. Denkanstoß wäre ich sehr dankbar.
Danke.


Mfg Tobi

Hartmut Lux
15.08.2008, 12:34
Probier einfach deine Stings vorher in einem DB zu hinterlegen und Sie mit der SFC20 blkmov in den Ausgabestring zu kopieren.

Larry Laffer
15.08.2008, 12:36
Hallo Tobi,
wenn ich dich richtig verstehe, dann soll das Kommando "Start" (z.B.) als direkt-Übergabe am IN-Parameter deines FC (FB) stehen ...
Wenn ja, das geht leider nicht. Du kannst einem Baustein zwar durchaus einen String (Zeichenkette) als Parameter übergeben, nur muss dieser schon vorher irgendwo zugewiesen sein. An den Baustein wird letztlich nämlich nicht der Inhalt, sondern ein Pointer auf die Speicherstelle mit dem Inhalt übergeben.

Gruß
LL

Ralle
15.08.2008, 15:51
Man kann ja dieses Array in einem Global-DB anlegen und dann mit 8 Lade/Transferbefehlen die Char in das Array kopieren, je nachdem, welcher Befehl ausgeführt werden soll.

Oder wie Hartmut vorschlägt, in diesem Global-DB gleich noch die möglichen/gewünschten Kommandos ebenfalls als Array eingeben und diese dann umkopieren mit SFC20.

Bzw. nicht 8. sondern 2:


L 'Star'
T DB10.DBD 0 //Array 1-4
L 't '
T DB10.DBD 4 //Array 5-8

PS: welches Zeichen genau bist $r ? Das hab ich hier mal weggelassen.

maweri
15.08.2008, 17:03
PS: welches Zeichen genau bist $r ? Das hab ich hier mal weggelassen.

$r steht für Carriage Return (dez: 13, hex: 0D), wird so bei S7 angezeigt, wenn man die Anzeige auf Zeichen bzw. CHAR stehen hat.

@Tobi
Ich habe die zu senden Daten, wie schon von Hartmut erwähnt, in DBs geschrieben und weise je nach Fall den DB, die Startadresse und die Länge zu. (s. Beispiel).


CLR
= "(send BC data)"
U "(Label iO)"
U "M40.2"
SPBN m001
L 300
T #DB_No
L 204
T #DBB_No
L 181
T #LEN
SET
= "(send BC data)"
m001: NOP 0
U "(Label niO)"
U "M40.2"
SPBN m002
L 304
T #DB_No
L 176
T #DBB_No
L 160
T #LEN
SET
= "(send BC data)"
m002: NOP 0
U "(Label Muster)"
U "M40.2"
SPBN m003
L 303
T #DB_No
L 64
T #DBB_No
L 66
T #LEN
SET
= "(send BC data)"
...

CALL #BCP_Send
REQ :="(send BC data)"
R :="FALSE"
LADDR :=400
DB_NO :=#DB_No
DBB_NO:=#DBB_No
LEN :=#LEN
DONE :=#Done
ERROR :=#error
STATUS:=#status
NOP 0



Ich denke in Deinem Fall wird ein DB reichen. Die Länge dürfte auch jedesmal 8 sein. Musst also nur zusehen, daß am Ende das '$r' steht.

tobi_w
17.08.2008, 18:22
Danke für die Anworten. Habe es jetzt mit SFC20 gelöst - auch wenn es nicht wirklich das wahre ist.

Ralle
17.08.2008, 20:00
Geht ja auf jeden Fall, aber wie ich schon schrieb, für 8 Byte muß man nicht unbedingt den SFC20 bemühen.

Chefmech
17.08.2008, 22:22
Du kannst die Zeichenfolge als String übergeben, und dann in deinem FC eine AT-Sicht mit einem Char-array anlegen, etwa so:



VAR_INPUT
I_sSendString :String[8];
END_VAR

VAR_TEMP

T_hSendArray AT I_sSendString: STRUCT
bActLen :BYTE;
bMaxLen :BYTE;
hData :ARRAY[1..8] OF CHAR;
END_STRUCT;

END_VAR


dann hast du die Zeichen dann in deinem Char Array T_hSendArray.hData[1..8].

Oder du kann auch gleich ein Char-Array übergeben, oder du machst dir einen udt....

Ralle
17.08.2008, 22:25
Du kannst die Zeichenfolge als String übergeben, und dann in deinem FC eine AT-Sicht mit einem Char-array anlegen, etwa so:



VAR_INPUT
I_sSendString :String[8];
END_VAR

VAR_TEMP

T_hSendArray AT I_sSendString: STRUCT
bActLen :BYTE;
bMaxLen :BYTE;
hData :ARRAY[1..8] OF CHAR;
END_STRUCT;

END_VAR


dann hast du die Zeichen dann in deinem Char Array T_hSendArray.hData[1..8].

Oder du kann auch gleich ein Char-Array übergeben, oder du machst dir einen udt....

Aber darum gings ja eigentlich nicht, eher darum, diesen String variabel zu übergeben.

Chefmech
17.08.2008, 22:33
Worum gings dann????

du kannst jetzt bei jedem FB / FC aufruf eine String übergeben, der zur jeweiligen Zeit gesendet werden soll...

um was gings denn genau??? Lesen ist Glücksache :-)

Chefmech
17.08.2008, 22:37
Also noch zur präzisierung,

ich kann jetzt meinen FC so aufrufen



fcSend(I_sSendString := "Start");


oder so



fcSend(I_sSendString := "1");


oder so



fcSend(I_sSendString := "Stop");


oder so




T_sMyString := ....

fcSend(I_sSendString := T_sMyString);

Chefmech
17.08.2008, 22:38
PS:

Vorsicht, die restlichen (nicht benutzen) Stellen im String können noch irgendwelche Werte enthalten, dies sollte dann natürlich noch zu sinnvollen Zeichen verwandelt werden...

Ralle
17.08.2008, 22:44
Worum gings dann????

du kannst jetzt bei jedem FB / FC aufruf eine String übergeben, der zur jeweiligen Zeit gesendet werden soll...

um was gings denn genau??? Lesen ist Glücksache :-)

Dann lies doch selbst nochmal genau nach, ich bin ja nun nicht der Interpreter vom Dienst.