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

image0

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
image1

Esempio FBD (PTP116B000, FBD_SysSerialPort)

image2

Un esempio identico funzionalmente al precedente realizzato in linguaggio ST.

Definizione variabili
image3

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;

image4

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

image5

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
image6

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;

image7

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

image8

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
image9

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

image10

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
image11

Esempio LD

image12

SysSetSerialDTR, set DTR signal status

image13

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
image14

Esempio LD

image15