Funzioni ed FB per gestione porta seriale¶
I sistemi SlimLine dispongono di più porte seriali in base alla versione del prodotto. Le porte seriali vengono identificate con un nome del tipo COMx dove al posto della x vi è il numero di porta seriale.
Per la corrispondenza tra il numero di porta ed il connettore fisico ad essa connesso, si rimanda al manuale hardware del prodotto.
SysSerialPort, manage serial port¶
Type | Library |
FB | XTarget_12_0 |
Questo blocco funzione gestisce la comunicazione su porta seriale, Occorre definire in COM la porta da gestire fornendo tutti i parametri di configurazione. Attivando il comando Open la porta viene aperta se non ci sono problemi viene attivato Opened e sull’uscita File viene ritornato lo stream da utilizzarsi per lo scambio dati sulla porta.
Se ci sono errori nei parametri o con la porta definita viene generato Fault.
Open (BOOL) | Comando apertura porta seriale. |
COM (@USINT) | Definizione della porta COM da utilizzare. |
Baudrate (UDINT) | Valore di baud rate porta seriale (da 300 a 115200 baud) |
Parity (STRING[1]) | Tipo di parità, valori possibili “E” pari, “O” dispari, “N” nessuna. |
DataBits (USINT) | Numero di bit frame dato, valori possibili 7, 8. |
StopBits (USINT) | Numero di bit di stop, valori possibili 1, 2. |
DTRManagement (USINT) | Modo di gestione del segnale DTR sulla porta seriale, vedi definizione <#TabSerialModeDefs> __. |
DTRComplement (BOOL) | FALSE: DTR normale, TRUE: DTR complementato. |
EchoFlush (BOOL) | FALSE: I dati trasmessi sono ritornati in ricezione. TRUE: I dati trasmessi sono ignorati. Questa impostazione è utile nelle comunicazione RS485 per non ricevere in echo i dati trasmessi. |
DTROnTime (UINT) | Tempo di attesa dopo attivazione segnale DTR prima di trasmissione caratteri (mS). |
DTROffTime (UINT) | Tempo di attesa dopo trasmissione ultimo dato prima e disattivazione segnale DTR (mS). |
FlushTm (UINT) | Tempo di flush dati, se non sono caricati dati sullo stream dopo il tempo definito i dati presenti vengono automaticamente inviati (mS) (Impostare 0). |
RxSize (UINT) | Dimensione buffer ricezione dati (Impostare 0). |
TxSize (UINT) | Dimensione buffer trasmissione dati (Impostare 0). |
Opened (BOOL) | Attivo se porta porta seriale aperta. |
Fault (BOOL) | Attivo se errore gestione |
File (FILEP) | Stream di I/O. Viene valorizzato su apertura porta seriale. |
Codici di errore
In caso di errore la funzione torna FALSE e con SysGetLastError è possibile rilevare il codice di errore.
9946050 | Errore allocazione blocco funzione. |
9946060 | Terminato spazio memoria rilocabile, non è possibile eseguire l”“FB. |
9946070 | Errore versione blocco funzione. |
9946100 | Dimensione buffers o flush time errati. |
9946110 | Errore impostazione porta seriale. |
9946120 | Errore baudrate. |
9946121 | Errore parity. |
9946122 | Errore data bits. |
9946123 | Errore stop bits |
9946124 | Errore DTR |
9946140 | Errore definizione porta “COMx” |
9946990 | Non implementata nel simulatore. |
Esempi¶
Nell’esempio è attivato un server in ascolto sulla porta seriale. Connettendosi in seriale alla COM0 inviando un carattere se ne riceve l’echo.
Definizione variabili |
![]() |
Esempio FBD (PTP116B000, FBD_SysSerialPort)
Un esempio identico funzionalmente al precedente realizzato in linguaggio ST.
Definizione variabili |
![]() |
Esempio ST (PTP116B000, ST_SysSerialPort)
(\* Serial port initialization. \*)
IF (SysFirstLoop) THEN
Serial.COM:=ADR('COM0'); (\* COM port definition \*)
Serial.Baudrate:=19200; (\* Baudrate \*)
Serial.Parity:='E'; (\* Parity \*)
Serial.DataBits:=8; (\* Data bits \*)
Serial.StopBits:=1; (\* Stop bits \*)
Serial.DTRManagement:=DTR_AUTO_WO_TIMES; (\* DTR management \*)
Serial.DTRComplement:=FALSE; (\* DTR complement \*)
Serial.EchoFlush:=FALSE; (\* Received echo flush \*)
Serial.DTROnTime:=0; (\* DTR On time delay (mS) \*)
Serial.DTROffTime:=0; (\* DTR Off time delay (mS) \*)
Serial.FlushTm:=0; (\* Flush time (mS) \*)
Serial.RxSize:=0; (\* Rx buffer size \*)
Serial.TxSize:=0; (\* Tx buffer size \*)
END_IF;
(\* Manage the serial port. \*)
Serial(Open:=TRUE); (\* Serial port management \*)
Fp:=Serial.File; (\* File pointer \*)
(\* Execute the echo loop. \*)
IF (SysFIsOpen(Fp)) THEN
IF (TO_BOOL(SysGetIChars(Fp)) AND TO_BOOL(SysGetOSpace(Fp))) THEN
i:=Sysfputc(Sysfgetc(Fp), Fp); (\* Character echo \*)
END_IF;
END_IF;
Per testare l’esempio è possibile utilizzare il programma Toolly scaricabile dal nostro sito. Aprendo una sessione terminale è possibile inviare caratteri da porta seriale e ricevere l’echo.
SysGetSerialMode, get serial mode¶
Type | Library |
Function | XTarget_07_0 |
Questa funzione ritorna il modo di comunicazione impostato sulla porta seriale connessa al parametro File, precedentemente aperto da FB SysSerialPort o dalla funzione Sysfopen.
Nel parametro Mode occorre definire l’indirizzo della struttura SYSSERIALMODE in cui dovrà essere trasferito il modo seriale attualmente impostato sulla porta. La funzione ritorna FALSE in caso di errore.
Parametri funzione:
Mode (@SYSSERIALMODE) | Indirizzo struttura `SYSSERIALMODE <#VarSYSSERIALMODE >`__ in cui trasferire il modo letto. |
File (FILEP) | Flusso dati stream ritornato dalla funzione Sysfopen. |
La funzione ritorna:
(BOOL) | FALSE: Errore esecuzione. TRUE: Funzione eseguita correttamente. |
Codici di errore
In caso di errore la funzione torna FALSE e con SysGetLastError è possibile rilevare il codice di errore.
9995010 | Valore di File non definito. |
9995020 | Indirizzo struttura SYSSERIALMODE non corretto, verificare Mode. |
9995100 ÷ 1 | Errore esecuzione funzione. |
9995990 | Non implementata nel simulatore. |
Esempi¶
Su fronte attivazione ingresso Di00M00 viene salvato il modo impostato sulla porta seriale COM0 nella variabile Sm e viene attivata l’uscita Do00M00.
Definizione variabili |
![]() |
Esempio ST (PTP116A300, ST_SysGetSerialMode)
(\* Here the COM0 port is opened in read/write. \*)
IF (Fp = NULL) THEN
Fp:=Sysfopen('COM0', 'rw'); (\* Port COM0 file pointer \*)
END_IF;
(\* Check if the COM0 port is open. \*)
IF (Fp <> NULL) THEN
(\* Check if input is activated. \*)
IF (Di00M00 <> Pulse) THEN
Pulse:=Di00M00; (\* Pulse flag \*)
(\* On input raising edge the serial mode is read. \*)
IF (Di00M00) THEN
Do00M00:=SysGetSerialMode(ADR(Sm), Fp);
END_IF;
END_IF;
END_IF;
Mettendo in watch la variabile Sm di tipo SYSSERIALMODE possiamo vedere i valori di tutti i suoi membri come riportato nella figura a lato. In questo caso è visualizzata la configurazione di default 115200, e, 8, 1.
SysSetSerialMode, set serial mode¶
Type | Library |
Function | XTarget_07_0 |
Questa funzione imposta il modo di comunicazione definito nella struttura SYSSERIALMODE sulla porta seriale connessa al parametro File, precedentemente aperto da FB SysSerialPort o dalla funzione Sysfopen.
Nel parametro Mode occorre definire l’indirizzo della struttura SYSSERIALMODE in cui è definito il modo seriale da impostare sulla porta. La funzione ritorna FALSE in caso di errore.
Parametri funzione:
Mode (@SYSSERIALMODE) | Indirizzo struttura `SYSSERIALMODE <#VarSYSSERIALMODE >`__ con il modo da impostare. |
File (FILEP) | Flusso dati stream ritornato dalla funzione Sysfopen. |
La funzione ritorna:
(BOOL) | FALSE: Errore esecuzione. TRUE: Funzione eseguita correttamente. |
Codici di errore
In caso di errore la funzione torna FALSE e con SysGetLastError è possibile rilevare il codice di errore.
9994010 | Valore di File non definito. |
9994020 | Indirizzo struttura SYSSERIALMODE non corretto, verificare Mode. |
9994050 | Errore valore di baud rate. |
9994051 | Errore valore di parità. |
9994052 | Errore valore bit di dato. |
9994053 | Errore valore bit di stop. |
9994100 | Errore esecuzione funzione. |
9994990 | Non implementata nel simulatore. |
Esempi¶
Su fronte attivazione ingresso Di00M00 viene salvato il modo impostato sulla porta seriale COM0 nella variabile Sm. Poi vengono modificati alcuni dati e poi impostata la porta seriale. Viene attivata l’uscita Do00M00.
Definizione variabili |
![]() |
Esempio ST (PTP116A300, ST_SysSetSerialMode)
(\* On input raising edge the serial mode is changed. \*)
IF (Di00M00 <> Pulse) THEN
Pulse:=Di00M00; (\* Pulse flag \*)
IF (Di00M00) THEN
IF (Fp = NULL) THEN Fp:=Sysfopen('COM0', 'rw'); END_IF;
Do00M00:=SysGetSerialMode(ADR(Sm), Fp);
Sm.Baudrate:=19200;
Sm.Parity:='N';
Sm.DTRManagement:=DTR_AUTO_WO_TIMES;
Do01M00:=SysSetSerialMode(ADR(Sm), Fp);
END_IF;
END_IF;
SysGetSerialCTS, get serial CTS signal status¶
Type | Library |
---|---|
Function | XTarget_07_0 |
Questa funzione ritorna lo stato del segnale CTS della porta seriale connessa al parametro File, precedentemente aperto dalla funzione Sysfopen.
Parametri funzione:
File (FILEP) | Flusso dati stream ritornato dalla funzione Sysfopen. |
La funzione ritorna:
(BOOL) | FALSE: Segnale CTS non attivo. TRUE: Segnale CTS attivo. |
Codici di errore
In caso di errore la funzione torna FALSE e con SysGetLastError è possibile rilevare il codice di errore.
9993010 | Valore di File non definito. |
9993990 | Non implementata nel simulatore. |
Esempi¶
Lo stato del segnale CTS della porta seriale COM0 è appoggiato sull’uscita Do01M00.
Definizione variabili |
![]() |
Esempio LD
SysSetSerialDTR, set DTR signal status¶
Type | Library |
Function | XTarget_07_0 |
Questa funzione imposta lo stato del segnale DTR della porta seriale connessa al parametro File, precedentemente aperto dalla funzione Sysfopen.
Per poter gestire il segnale DTR occorre avere definito sulla porta seriale il valore DTR_OFF nella variabile DTRManagement nella struttura SYSSERIALMODE.
Parametri funzione:
Status (BOOL) | Stato segnale DTR su porta seriale |
File (FILEP) | Flusso dati stream ritornato dalla funzione Sysfopen. |
La funzione ritorna:
(BOOL) | FALSE: Errore esecuzione. TRUE: Ok esecuzione. |
Codici di errore
In caso di errore la funzione torna FALSE e con SysGetLastError è possibile rilevare il codice di errore.
9992010 | Valore di File non definito. |
9992990 | Non implementata nel simulatore. |
Esempi¶
Lo stato dell’ingresso Di00M00 viene trasferito sul segnale DTR della porta seriale COM0.
Definizione variabili |
![]() |
Esempio LD