beliebigen Command (Char) übergeben

tobi_w

Level-1
Beiträge
2
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
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.

Code:
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.

Code:
      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:
Code:
data[1]='1'
.
.
data[8]='$r'

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

Code:
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
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
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
 
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:
Code:
      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.
 
Zuletzt bearbeitet:
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).

Code:
     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.
 
Geht ja auf jeden Fall, aber wie ich schon schrieb, für 8 Byte muß man nicht unbedingt den SFC20 bemühen.
 
Du kannst die Zeichenfolge als String übergeben, und dann in deinem FC eine AT-Sicht mit einem Char-array anlegen, etwa so:

Code:
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....
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Du kannst die Zeichenfolge als String übergeben, und dann in deinem FC eine AT-Sicht mit einem Char-array anlegen, etwa so:

Code:
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.
 
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 :)
 
Also noch zur präzisierung,

ich kann jetzt meinen FC so aufrufen

Code:
fcSend(I_sSendString := "Start");

oder so

Code:
fcSend(I_sSendString := "1");

oder so

Code:
fcSend(I_sSendString := "Stop");

oder so

Code:
T_sMyString := ....

fcSend(I_sSendString := T_sMyString);
 
Zuviel Werbung?
-> Hier kostenlos registrieren
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...
 
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.
 
Zurück
Oben