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 <#FctSysGetLastError>`__ è 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)* .. code-block:: none (\* 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 <#FctSysGetLastError>`__ è 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)* .. code-block:: none (\* 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 <#FctSysGetLastError>`__ è 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)* .. code-block:: none (\* 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 <#FctSysfopen>`__. 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 <#FctSysGetLastError>`__ è 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 <#FctSysfopen>`__. 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 <#FctSysGetLastError>`__ è 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| .. |image0| image:: media/image1.jpg :width: 2.27153in :height: 3.01181in .. |image1| image:: media/image2.jpg :width: 7.08681in :height: 0.55139in .. |image2| image:: media/image3.jpg :width: 7.08681in :height: 3.89792in .. |image3| image:: media/image4.jpg :width: 7.08681in :height: 0.61042in .. |image4| image:: media/image5.jpg :width: 4.72431in :height: 3.29931in .. |image5| image:: media/image6.jpg :width: 1.81528in :height: 0.65764in .. |image6| image:: media/image7.jpg :width: 7.08681in :height: 0.7125in .. |image7| image:: media/image8.jpg :width: 3.52153in :height: 2.54236in .. |image8| image:: media/image9.jpg :width: 1.79167in :height: 0.64583in .. |image9| image:: media/image10.jpg :width: 7.08681in :height: 0.7125in .. |image10| image:: media/image11.jpg :width: 1.59444in :height: 0.44861in .. |image11| image:: media/image12.jpg :width: 7.08681in :height: 0.3625in .. |image12| image:: media/image13.jpg :width: 7.08681in :height: 2.02361in .. |image13| image:: media/image14.jpg :width: 1.64583in :height: 0.6375in .. |image14| image:: media/image15.jpg :width: 7.08681in :height: 0.3625in .. |image15| image:: media/image16.jpg :width: 7.08681in :height: 2.2125in