Frage zu SerialLineControlADS TC3

Gizzl0r

Level-1
Beiträge
142
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Guten Morgen,
folgendes Szenario:


Standard PC mit TC3 Runtime und Interner RS232 Schnittstelle (COM2 & COM3)

Ich will jetzt über TC3 auf die RS232 Schnittstellen des Rechners zugreifen.

Dazu habe ich den Baustein SerialLineControlADS gefunden.
Die Hilfestellung von Beckhoff habe ich auch durch, jedoch verstehe ich den Einsatz der VAR_IN_OUT Variablen nicht:

Link zum SerialLineControlADS:
https://infosys.beckhoff.de/index.p...cPlcLibSerCom_FB_SerialLineControlADS.htm&id=


Meine Vorgehensweise:
Ich habe 2 Strukturen:

TYPE ComSerialConfig :
(* contains the configuration parameters of the com port to be opened. *)
STRUCT
ComPort :UDINT :=1; (* Serial port number [1..255] *)
Baudrate :UDINT :=9600;
Parity :ComParity_t :=PARITY_NONE;
DataBits :INT :=8; (* [4..8] *)
StopBits :ComStopBits_t :=STOPBITS_ONE;


DTR :ComDTRCtrl_t :=DTR_CTRL_HANDSHAKE; (* 'Data Terminal Ready' signal *)
RTS :ComRTSCtrl_t :=RTS_CTRL_HANDSHAKE; (* 'Request to Send' signal (= RFR 'Ready for Receiving') *)
CTS :BOOL :=FALSE; (* 'Clear to Send' signal *)
DSR :BOOL :=FALSE; (* 'Dataset Ready' signal *)


TraceLevel :BYTE :=0; (* None=0;Error=1,Warning=2,Info=3,Verbose=4,Noise=5 *)


Reserved1 :BYTE;
Reserved2 :BYTE;
Reserved3 :BYTE;
END_STRUCT
END_TYPE


und:


TYPE ComBuffer:
STRUCT
Buffer: ARRAY[0..300] OF BYTE;
RdIdx: INT;
WrIdx: INT;
Count: INT; (* Anzahl der Zeichen im Ringpuffer *)
FreeByte:INT; (* Anzahl freie Plätze im Ringpuffer *)
Error: INT; (* Fehlercode der Schnittstelle *)
blocked : BOOL;
END_STRUCT
END_TYPE



Der Funktionsbaustein sieht wie folgt aus:

FUNCTION_BLOCK rs232
VAR_INPUT
Connect :BOOL; (* connect to serial port [TRUE=connect, FALSE=disconnect] *)
SerialCfg :ComSerialConfig;
NetId :T_AmsNetId :=''; (* host NetId *)
Timeout :TIME :=DEFAULT_ADS_TIMEOUT; (* Timeout for ADS calls *)
END_VAR
VAR_IN_OUT
TxBuffer :ComBuffer; (* serial Tx ComBuffer *)
RxBuffer :ComBuffer; (* serial Rx ComBuffer *)
END_VAR
VAR_OUTPUT
PortOpened :BOOL; (* Indicates if selected serial port is opened *)
Error :BOOL; (* 'TRUE' if an error occurred *)
ErrorID :UDINT; (* Displays the error code; 0 = no error *)
Busy :BOOL; (* 'TRUE' if internal ADS communication is busy *)
TxBufCount :UDINT; (* number of bytes in internal Tx buffer *)
RxBufCount :UDINT; (* number of bytes in internal Rx buffer *)
END_VAR




SerialLineControlADS(
Connect:= ,
SerialCfg:=SerialCfg ,
NetId:= ,
Timeout:= ,
TxBuffer:=TxBuffer ,
RxBuffer:=RxBuffer,
PortOpened=> ,
Error=> ,
ErrorID=> ,
Busy=> ,
TxBufCount=> ,
RxBufCount=> );




Die Main sieht so aus:
PROGRAM MAIN
VAR
visu_funktionen:visu_funktionen();
eingabe:eingabe();
barcode:barcode();
sondergenehmigung:sondergenehmigung();
initialisierung:initialisierung();
rs232:rs232();

END_VAR



visu_funktionen();
eingabe();
barcode();
sondergenehmigung();
initialisierung();
rs232();






Jetzt meldet er beim Compilieren:
Error 30 Cannot convert type 'ComSerialConfig' to type 'ComSerialConfig(tc2_serialcom, 3.3.6.0 (beckhoff automation gmbh))'
Error 28 Functionblock 'SerialLineControlADS' must be instantiated to be accessed
Error 32 Type 'ComBuffer' is not equal to type 'ComBuffer' of VAR_IN_OUT 'RxBuffer'
Error 31 Type 'ComBuffer' is not equal to type 'ComBuffer' of VAR_IN_OUT 'TxBuffer'
Error 27 VAR_IN_OUT 'RxBuffer' must be assigned in call of 'rs232'
Error 26 VAR_IN_OUT 'TxBuffer' must be assigned in call of 'rs232'


Was habe ich da vergessen bzw. wo liegt hier mein Problem?! Ich hoffe mir kann jemand weiter helfen.
Danke im Voraus

Gruß
Daniel
 
Nicht ganz einfach, ohne den Fehlerort sehen zu können.
Die Typen ComSerialConfig und ComBuffer sind bereits in der TC2_SerialCom Bibliothek deklariert, die brauchst und darfst Du in Deinem Programm nicht nochmal deklarieren, sondern nur Instanzen davon.
Code:
VAR
   MyComSerialConfig:ComSerialConfig;
   MyRXBuffer:ComBuffer;
   MyTXBuffer:ComBuffer;
END_VAR
Und beim Aufruf von RS232 musst Du dem FB natürlich auch diese Daten übergeben:
Code:
RS232(
   SerialCfg:=MyComSerialConfig,
   TxBuffer:=MyTxBuffer,
   RxBuffer:=MyRxBuffer);
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Zum Verständnis:
in die Main kommt folgendes?:

PROGRAM MAIN
VAR
visu_funktionen:visu_funktionen();
eingabe:eingabe();
barcode:barcode();
sondergenehmigung:sondergenehmigung();
initialisierung:initialisierung();

MyComSerialConfig:ComSerialConfig;
MyRXBuffer:ComBuffer;
MyTXBuffer:ComBuffer;



END_VAR



visu_funktionen();
eingabe();
barcode();
sondergenehmigung();
initialisierung();



RS232(
SerialCfg:=MyComSerialConfig,
TxBuffer:=MyTxBuffer,
RxBuffer:=MyRxBuffer);




Und im RS232 FB:
SerialLineControlADS(
Connect:= ,
SerialCfg:=Main.MyComSerialConfig,
NetId:= ,
Timeout:= ,
TxBuffer:=Main.MyTXBuffer ,
RxBuffer:=Main.MyRXBuffer,
PortOpened=> ,
Error=> ,
ErrorID=> ,
Busy=> ,
TxBufCount=> ,
RxBufCount=> );


Bin was das angeht ein Laie. Wenn möglich wäre es super eine Erläuterung zu kriegen wie sowas deklariert wird.
 
Ich kenne den SerialLineCtrlADS nicht persönlich, kann Dir deshalb nur bei grundsätzlichen Fragen helfen. Bei dem Aufruf von SerialLineControlADS im RS232 musst Du statt der MAIN-Variablen die Variablen übergeben, die Du dem RS232 als VAR_INPUT und VAR_IN_OUT übergeben hast, also so wie Du es in Deinem ersten Post geschrieben hast. Das Gleiche gilt auch für Connect, NetId und TimeOut.
Auch dort musst Du die entsprechenden INPUT-Variablen des RS232 eintragen.

Noch was: SerialLineCtrlADS ist nur der FB-Typ, Du musst im RS32 eine Instanz davon deklarieren und die kannst Du dann aufrufen.
 
Zuletzt bearbeitet:
Hi,
ich habe jetzt folgendes Problem sobald ich in den Run Modus komme:
Error 31 17.06.2019 10:02:02 170 ms | 'Port_851' (851): Exception (Exception Code: 0xc00000fd, stack overflow) in PLC Application Untitled1 Instance, Task PlcTask (RBP: 0xffffb37b16752040, RIP: 0xffff938c97eac145, RSP: 0xffffb37b16752000)


Bedeutet der Overflow, dass der Buffer überläuft?



Es ist nun wie folgt eingepflegt:


PROGRAM MAIN
VAR
visu_funktionen:visu_funktionen();
eingabe:eingabe();
barcode:barcode();
sondergenehmigung:sondergenehmigung();
initialisierung:initialisierung();
SerialLineControlADS:SerialLineControlADS();
MyComSerialConfig:ComSerialConfig;
MyRXBuffer:ComBuffer;
MyTXBuffer:ComBuffer;
END_VAR

visu_funktionen();
eingabe();
barcode();
sondergenehmigung();
initialisierung();
SerialLineControlADS(SerialCfg:=MyComSerialConfig,TxBuffer:=MyTxBuffer,RxBuffer:=MyRxBuffer);








FUNCTION_BLOCK SerialLineControlADS
VAR_INPUT
Connect :BOOL; (* connect to serial port [TRUE=connect, FALSE=disconnect] *)
SerialCfg :ComSerialConfig;
NetId :T_AmsNetId :=''; (* host NetId *)
Timeout :TIME :=DEFAULT_ADS_TIMEOUT; (* Timeout for ADS calls *)
END_VAR
VAR_IN_OUT
TxBuffer :ComBuffer; (* serial Tx ComBuffer *)
RxBuffer :ComBuffer; (* serial Rx ComBuffer *)
END_VAR
VAR_OUTPUT
PortOpened :BOOL; (* Indicates if selected serial port is opened *)
Error :BOOL; (* 'TRUE' if an error occurred *)
ErrorID :UDINT; (* Displays the error code; 0 = no error *)
Busy :BOOL; (* 'TRUE' if internal ADS communication is busy *)
TxBufCount :UDINT; (* number of bytes in internal Tx buffer *)
RxBufCount :UDINT; (* number of bytes in internal Rx buffer *)
END_VAR



MAIN.SerialLineControlADS(
Connect:=GVL.taster ,
SerialCfg:=Main.MyComSerialConfig ,
NetId:=NetId,
Timeout:=T#5S ,
TxBuffer:=MAIN.MyTXBuffer ,
RxBuffer:=MAIN.MyRXBuffer ,
PortOpened=>PortOpened ,
Error=>Error ,
ErrorID=>ErrorID ,
Busy=>Busy ,
TxBufCount=>TxBufCount ,
RxBufCount=> RxBufCount );
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hi,
ich habe jetzt folgendes Problem sobald ich in den Run Modus komme:
Error 31 17.06.2019 10:02:02 170 ms | 'Port_851' (851): Exception (Exception Code: 0xc00000fd, stack overflow) in PLC Application Untitled1 Instance, Task PlcTask (RBP: 0xffffb37b16752040, RIP: 0xffff938c97eac145, RSP: 0xffffb37b16752000)


Bedeutet der Overflow, dass der Buffer überläuft?
Nein, es bedeutet, dass Du einen Stack Overflow hast.
Du hast einen FB SerialLineControlADS geschrieben und einen solchen FB im MAIN instanziiert.
In dem FB rufst Du aber wieder die Instanz MAIN.SerialLineControlADS auf, d. h. der Baustein ruft sich ständig rekursiv selbst auf. Dabei holt er sich bei jedem Aufruf Speicherplatz vom Stack für die Übergabe der VAR_IN_OUT, und irgendwann ist der Stack voll.

Ursprünglich war da doch noch ein FB namens RS232. So einen musst Du als VAR im MAIN deklarieren. Im RS232 deklarierst Du dann eine VAR vom Typ SerialLineControlADS und rufst sie im RS232-Code auf, und zwar mit den Inputs des RS232 und nicht mit den MAIN-Variablen.

By the way:
Gewöhn Dir mal ab, Instanzen genauso zu nennen wie ihre Typen. Das stiftet nur Verwirrung.
Und ohne Dir jetzt zu nahe treten zu wollen: Hast Du das Konzept von FB-Deklaration und FB-Instanziierung verstanden? Oder zielt Deine Frage nach Erläuterung auf diese grundsätzlichen Dinge? Dann sollten wir zunächst dort ansetzen, bevor Du ein Programm zusammenstrickst, das vielleicht irgendwann funktioniert, von dem Du aber nicht weisst, wie und warum es das tut.
 
Hi,
verstehe die Geschichte mit Instanziirung und Deklaration nicht so richtig.

Soweit ich das verstanden habe, mache ich es so:
1.jpg

2.jpg

Wo liegt hier mein Fehler? Wenn ich mit Connect auf High setze, öffnet er mir nicht den Port (Com 3)
Danke jetzt schon mal für dein Verständnis
 
autsch - autsch - autsch....

Deklarationsanteil: Du hast ein Objekt (Variable / Baustein ) und gibst diesem Objekt einen Namen. Hintergrund der ganzen Geschichte: Du könntest ja auch 10 x das identisch Objekt benutzen.
Z.B. Objekt = Familie. Und jetzt hast du eben Instanzen bzw. Namen dafür wie z.B. Müller, Schmidt...

Codeanteil:
Bausteine muss man natürlich im Code auch aufrufen. Von der Syntax bedeutet es das du die Instanz aufrufst - mit einer runden Klammer. Um beim Beispiel oben zu bleiben also Müller().
In der runden Klammer kann (muss aber nicht) übergabeparamter sein.
Wenn du Müller ohne die runde Klammer aufrufst setzt du die Übergabeparamter, rufst aber nicht den Code auf.

Ich sehe in den Screenshots jedenfalls nicht das du eine Instanz SerialLineControlADS (Zyklisch!!!!) aufrufst.
Ganz oben in einem Punkt ist dem zwar so, aber der Eingabeparameter "Connect" ist mit einem "Taster" aufgerufen. Wenn du dich verbinden willst musst das dauerhaft TRUE sein. (sonst hätte der Baustein ja konsequentereweise auch einen Dis-Connect Eingang...

Und was mir sonst noch auf Basis des Screenshots einfällt. Was soll das kopieren im RS232 Baustein der Com-Buffer?
Im Infosys gibt es doch ein Beispiel für die serielle Schnittstelle. Ist zwar nicht für die virtuelle Schnittstelle aber, schau es dir mal an und versuch das zu verstehen.
Danach kannst du dich an deinen Code wagen.

Guga
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Zu Deklaration und Instanziierung:
Wenn Du einen FB deklarierst (also das, was in 2.jpg steht), hast Du erst mal nur den Bauplan für diesen FB, aber noch keinen FB im Speicher. Dazu musst Du eine Variable (Instanz) vom Typ des FBs anlegen, die Du dann im Programm aufrufen kannst.
So wie Du es jetzt mit dem RS232 gemacht hast, ist es also im Prinzip richtig, aber wo ist der SerialLineControlADS geblieben? Auch das ist ein FB, von dem Du eine Instanz anlegen musst, um ihn aufrufen zu können. Ich hatte erst gedacht, dass er im RS232 instanziiert werden sollte, wenn ich mir aber die Variablenliste des RS232 anschaue, bin ich mir nicht mehr so sicher. Diese Liste ist exakt identisch mit der des SerialLineControlADS, ich gehe deshalb davon aus, dass der RS232 nichts anderes tun soll als einen SerialLineControlADS aufrufen. Dann kannst Du ihn aber auch gleich so instanziieren:
Code:
VAR   // Im MAIN
   RS232:SerialLineControlADS;   // Dein SerialLineControlADS-FB
END_VAR

// Und dann der Aufruf im MAIN
// Vorher passende Werte in MyComSerialConfig  eintragen
RS232(
    Connect:=GVL.taster , 
    SerialCfg:=MyComSerialConfig ,   // Das "Main." kannst Du hier weglassen. Du bist ja im MAIN-Editor, dort weiss das Programm selbst, wie es heisst.
    NetId:=NetId, 
    Timeout:=T#5S , 
    TxBuffer:=gvl.tx_buffer , 
    RxBuffer:=gvl.rx_buffer , 
    PortOpened=> ,
    Error=>  , 
    ErrorID=> ,
    Busy=> ,
    TxBufCount=>  , 
    RxBufCount=>  );

Da Du auch schon RX/TX Puffer als globale Variablen angelegt hast, brauchst Du die beiden im MAIN nicht.
 
Vielen vielen Dank schon mal.
@structuredTrasch
Wenn ich es in der Main so definiere: rs232:SerialLineControlADS; dann wird bei FB rs232 nicht "aktiv" gesetzt sondern ist ausgegraut.
Im rs232 FB brauche ich dann nicht mehr ändern oder?
 
By the way:
Gewöhn Dir mal ab, Instanzen genauso zu nennen wie ihre Typen. Das stiftet nur Verwirrung.

Wie schon gesagt.
Der FB RS232, den Du geschrieben hast, wird jetzt nicht mehr verwendet. Der RS232 im Main hat damit nichts mehr zu tun, denn das ist kein FB vom Typ RS232, sondern vom Typ SerialLineControlADS.

Nochmal zum besseren Verständnis:
Wenn Du eine BOOL-Variable anlegen willst, würdest Du ihr doch auch nicht den Namen "Bool" geben (was auch nicht geht, weil das ein reserviertes Schlüsselwort ist), sondern z. B. "Taster".
Mit einem FB ist es genauso.
Code:
VAR
   // Name des FBs                     : Typ des FBs
   Mein_FB_der_die_RS232_in_Gang_setzt : Ein_FB_der_das_kann;   // z. B. ein SerialLineControlADS
END_VAR
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
Wenn ich eine STRUCT anlege. Siehe unten und die dann anpasse mit meinem gewünschtem ComPort und Baudrate übernimmt er diese nicht. Muss ich da noch zusätzlich was anpassen?
TYPE ComSerialConfig :
(* contains the configuration parameters of the com port to be opened. *)
STRUCT
ComPort :UDINT :=2; (* Serial port number [1..255] *)
Baudrate :UDINT :=2400;
Parity :ComParity_t :=PARITY_NONE;
DataBits :INT :=8; (* [4..8] *)
StopBits :ComStopBits_t :=STOPBITS_ONE;

DTR :ComDTRCtrl_t :=DTR_CTRL_HANDSHAKE; (* 'Data Terminal Ready' signal *)
RTS :ComRTSCtrl_t :=RTS_CTRL_HANDSHAKE; (* 'Request to Send' signal (= RFR 'Ready for Receiving') *)
CTS :BOOL :=FALSE; (* 'Clear to Send' signal *)
DSR :BOOL :=FALSE; (* 'Dataset Ready' signal *)

TraceLevel :BYTE :=0; (* None=0;Error=1,Warning=2,Info=3,Verbose=4,Noise=5 *)

Reserved1 :BYTE;
Reserved2 :BYTE;
Reserved3 :BYTE;
END_STRUCT
END_TYPE
 
Zuletzt bearbeitet:
Du hast also jetzt 2 Strukturtypen mit dem gleichen Namen, Deine eigene ComSerialConfig und das Original Tc2SerialCom.ComSerialConfig. Eigentlich sollte der Compiler die beiden unterscheiden können und für die Instanz MyComSerialConfig:ComSerialConfig Deine Struktur nehmen. Hast Du schon online überprüft, welche Werte in MyComSerialConfig stehen?
 
In der Live Ansicht wird mir weiterhin Com 1 und Baudrate 9600 angezeigt...
3.jpg

Auch wenn ich meine STRUCT umbenenne und sie ComSerialConfig_2 nenne und in der GVL auch so definiere serialconfig:ComSerialConfig_2; dann kriege ich folgende Fehlermeldung
Error 21 Cannot convert type 'ComSerialConfig_2' to type 'ComSerialConfig(tc2_serialcom, 3.3.6.0 (beckhoff automation gmbh))'
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
Also erstmal: In Deiner Online-Ansicht zeigst Du eine Variable "SerialCfg" an, die im MAIN-Programm steht. An den RS232-FB übergibst Du aber "GVL.SerialConfig". Das sind zwei unterschiedliche Variablen. Du musst Dich für eine entscheiden und die andere solltest Du aus deinem Projekt löschen.

Der Fehler ist schon klar: Dein RS232-FB erwartet als "SerialCfg" eine Variable vom Typ "ComSerialConfig", und "ComSerialConfig_2" ist nun mal kein "ComSerialConfig", auch wenn sie den gleichen Inhalt hat.
 
Einer Deiner Fehler ist, dass Du immer versuchst eine neue Struktur ComSerialConfig anzulegen, dass musst Du aber nicht, Du musst eine Instanz anlegen, sprich eine Variable vom Typ ComSerialConfig deklarieren und dessen Inhalt entsprechend Deinen Bedürfnissen anpassen.
 
Ok verstanden. Jetzt habe ich das mal alles so gemacht wie ich denke das es laufen sollte. Die GVL.serialconfig habe ich gelöscht und belasse es wir vor einigen Posts bei einer Lokalen Definition:

VAR
MyComSerialConfig:ComSerialConfig;
END_VAR

rs232(
Connect:=GVL.taster ,
SerialCfg:=MyComSerialConfig,
NetId:='',
Timeout:=T#5S ,
TxBuffer:=GVL.rx_buffer ,
RxBuffer:=GVL.tx_buffer ,
PortOpened=> ,
Error=> ,
ErrorID=> ,
Busy=> ,
TxBufCount=> ,
RxBufCount=> );

Die Struktur ist vorhanden:

TYPE ComSerialConfig :
(* contains the configuration parameters of the com port to be opened. *)
STRUCT
ComPort :UDINT :=3; (* Serial port number [1..255] *)
Baudrate :UDINT :=2400;
Parity :ComParity_t :=PARITY_NONE;
DataBits :INT :=8; (* [4..8] *)
StopBits :ComStopBits_t :=STOPBITS_ONE;


DTR :ComDTRCtrl_t :=DTR_CTRL_HANDSHAKE; (* 'Data Terminal Ready' signal *)
RTS :ComRTSCtrl_t :=RTS_CTRL_HANDSHAKE; (* 'Request to Send' signal (= RFR 'Ready for Receiving') *)
CTS :BOOL :=FALSE; (* 'Clear to Send' signal *)
DSR :BOOL :=FALSE; (* 'Dataset Ready' signal *)


TraceLevel :BYTE :=0; (* None=0;Error=1,Warning=2,Info=3,Verbose=4,Noise=5 *)


Reserved1 :BYTE;
Reserved2 :BYTE;
Reserved3 :BYTE;
END_STRUCT
END_TYPE


Fehlermeldung ist weiterhin dieError 27 Cannot convert type 'ComSerialConfig' to type 'ComSerialConfig(tc2_serialcom, 3.3.6.0 (beckhoff automation gmbh))'


Die Struktur heißt ja jetzt auch so wie es sein soll. Langsam verzweifel ich....
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Dann habe ich den Compiler überschätzt. Du kannst keinen eigenen Typ "ComSerialConfig" verwenden, sondern musst den aus der Tc2 Library nehmen.
Also erstmal Dein ComSerialConfig löschen.
Dann die passenden Werte im MAIN-Programm in MySerialConfig eintragen.
Code:
MySerialConfig.ComPort:=2;
MySerialConfig.BaudRate:=2400;
Das Problem mit den nicht passenden Typen liegt jetzt beim Aufruf von SerialLineCtrlADS aus dem RS232 heraus. Der erwartet natürlich eine orignale ComSerialConfig. Das hatte ich aus den Augen verloren.
 
Zuletzt bearbeitet:
Vielen Dank.
Jetzt noch eine Finale Frage.
Die Daten die ich Empfange sind Strings. Ist es richtig das ich den Rxbuffer mit dem FB ReceiveString auslesen muss?


MAIN:

VAR

Receive: ReceiveString;
ReceivedString: STRING;
LastReceivedString: STRING;
StringReceived: BOOL;
ReceiveBusy: BOOL;
ReceiveError: BOOL;
ReceiveErrorID: ComError_t;
ReceiveTimeout: BOOL;
ReceiveCounter: UDINT;

END_VAR

Receive(Prefix:='',
Suffix:='',
Timeout:=T#5S,
Reset:=,
StringReceived=>,
Busy=>,
Error=>,
RxTimeout=>,
ReceivedString:=ReceivedString,
RxBuffer:=rx_buffer);



Als RxBuffer habe ich den Buffer genommen der für den rs232 Baustein genutzt und gefüllt wird. Der RxBuffer vom ComBuffer (SerialLineControlADS) ist ja ein Array OF Bytes. Kann ich das dann so einfach in den Baustein des ReceiveString setzen?
P.s. Ich sende einen String über den Arduino "IN5=HIGH!" der wird nur einmal gesendet. Kann es sein das der gar nicht im Buffer landet?

Mit freundlichsten Grüßen
 
Zuletzt bearbeitet:
Das mit der Übergabe ist schon richtig. Der ReceiveString-FB liest den ComBuffer aus und erzeugt daraus entsprechend den übrigen Vorgaben einen String.
Wo kommt denn jetzt rx_buffer her, ist das wirklich der GVL.rx_buffer, den Du in Deinem letzten Post verwendet hast? Und kommen die Zeichen im GVL.rx_buffer an?
 
Zurück
Oben