Iris _

Pixsys Forum

everybody's effort for the same goal

[TD700] Funzione dei "Task" e dei tipi di variabili

Post Reply
user3451
Posts: 4
Joined: 20/06/2012, 10:13

[TD700] Funzione dei "Task" e dei tipi di variabili

Post by user3451 »

Buongiorno a tutti! Sto iniziando a creare un progetto per un pannello TD700, e sto incontrando un po' di difficoltà a reperire informazioni tecniche. I manuali del LogicLab e del PageLab dicono molte cose... ma non tutte. Per esempio il manuale del linguaggio ST me lo sono dovuto cercare in rete, e ho dovuto scartabellare parecchio per trovarene una versione soddisfacente.

Però ci sono molte altre domande che mi ronzano, e non so bene dove trovare risposte. Esempi:

- Che differenza c'è fra il task Boot e il task Init? Ovvero, che caratteristiche precise ha ognuno dei diversi tipi di task? Come si intercalano i vari task allo scaricamento di un nuovo progetto, oppure all'aggiornamento dello stesso, oppure ancora in caso di spegnimento e riaccensione del pannello quando un progetto è in esecuzione? Si possono creare nuovi task?

- Come si fa a mantenere variabili che mantengano il loro valore a cavallo di un ciclo di spegnimento-accensione del programma, e altre che all'accensione siano azzerate?

- In particolare, come si fa ad accedere al handle di una linea seriale, se questa risulta già aperta e tutte le funzioni della famiglia SERIAL_ lavorano in base a questo valore, senza che lo si possa recuperare? (Lo so che per ora sto "pasticciando", e che sicuramente sto sbagliando qualcosa).

Insomma, programmo computer da più di trent'anni, non sono alle prime armi. Ma forse per la mia non più tenera età gradisco ancora manuali stampabili, o almeno una raccolta di file di help da poter interrogare... Quindi alla fine la domanda è: dove trovo le informazioni tecniche che mi occorrono, senza disturbare nè i blogger nè i tecnici di questo sito? In effetti nel sito non riesco a trovare ciò che mi serve
(magari, oltre che attempato, sono anche "cecato"! :) )

Grazie a tutti!

Aldo
Pixsys tecnico 3
Moderatore
Posts: 28
Joined: 29/02/2012, 16:12

Re: Ricerca documentazione

Post by Pixsys tecnico 3 »

Buongiorno,

i task presenti sono 4 e hanno le seguenti funzioni:
- BOOT, viene eseguito solamente all'avvio del PLC, se il PLC viene resettato in maniera software non viene eseguito.
- INIT, viene eseguito successivamente al task di boot, ed è eseguito anche quando il PLC viene resettato via software.
- BACKGROUND, è un task che cicla ad una frequanza fissa di 100 mS, parte la sua esecuzione dopo il task di boot e di init, ha priorità minore rispetto al task di FAST, in questo task vanno messe tutte le funzioni logiche che sono bloccanti (lettura/scrittura file, scrittura su porta seriale etc..).
- FAST, è un task che cicla ad un tempo di default di 10 mS ma può essere impostato fino a 2 mS, questo task ha la priorità su tutti gli altri ed è il task che comanda l'aquisizione dei dati network (Modbus RTU, Modbus TCP/IP, CANOpen, ETD884).
Non è possbile creare altri task, è possibile legare ad un task più file di programma, scritti anche in codice diverso tra loro, che saranno eseguiti nell'ordine in cui verranno inseriti nel task.

L'aggiornamento del progetto viene fatto in maniera intelligente senza bloccare il PLC, il PLC verrà bloccato oresettato solo se viene modificata la configurazione Hardware o la configurazione dei task.

VARIABILI:
Esistono 4 famiglie di variabili, le automatiche, le automatiche "retain", le mappate e le mappate "retain".
Le automatiche sono variabili visibili solo sul PLC, se dichiarate di tipo "retain" durante la fase di creazione, verranno salvate in una memoria riservata con un refresh garantito di 1 secondo. La memoria di queste variabili non ha bisogno di batterie e non ha problemi di spegnimenti improvvisi.

Le variabili mappate sono variabili con una locazione di memoria ben precisa, che viene assegnata a loro in maniera automatica in fase di creazione.
Queste variabili sono disponibile sia sul PLC che sulla parte HMI (PageLab).
Le variabili mappate retain hanno le stesse propietà di salvataggio sopra descritte e le stesse propietà delle variabili mappate.

Quando si usa un Handle per la seriael lo apre con la funzione "MyHandel := Serial_ConfigPort();" che restituisce un Handle di tipo "SERIAL_HANDLE".
Poi si fanno tutte le operazioni di scrittura e lettura, una volta finite è sempre opportuno chiudere l'handle creato con la funzione "Result := Serial_ClosePort(MyHandel );", è importante che queste funzioni siano in esecuzione sul task di "background" altrimenti non funzionano.

In linea di massima l'help è indicizzato, ovvero premendo F1 sopra al blocco funzionale si viene portati alla pagina del manuale.
C'è anche un Help per ogni blocco funzionale accedento alle propietà del blocco stesso.
user3451
Posts: 4
Joined: 20/06/2012, 10:13

Re: Ricerca documentazione

Post by user3451 »

Ringrazio moltissimo delle risposte! Però ho un paio di domande ancora sulla linea seriale.

Nel task Background ho messo un programma con il seguante codice:

if hSer <= 0 then (* do not proceed if hSer is a valid handle *)
hSer := Serial_ConfigPort( 3, SERIAL_BAUDRATE_4800, SERIAL_NOPARITY, SERIAL_BYTESIZE_8, SERIAL_ONESTOPBIT, FALSE );
end_if;

Nella finestra di debug la variabile hSer assume sempre il valore -4, ovvero "ERR port il already configured". E questo anche subito dopo lo spegnimento e riaccensione del pannello. Non riesco quindi ad usare la linea, perché già configurata; ma non la posso chiudere perché non ne conosco il handle. Cosa sto sbagliando?

------------

Ulteriore domanda sui task. Se ho capito bene, i file di programma che compaiono all'interno dello stesso task vengono eseguiti in sequenza. Quindi se metto la seriale in ricezione, diciamo con timeout di 500ms, in caso di mancata ricezione gli altri task in background non "girano" per tutto questo tempo. Ho capito bene?

Aldo
Pixsys tecnico 3
Moderatore
Posts: 28
Joined: 29/02/2012, 16:12

Re: Ricerca documentazione

Post by Pixsys tecnico 3 »

Dovrebbe verificare che la seriale non sia in uso dal Modbus, deve andare sulla scheda risorse e quindi selezionare COM port e verificare che non sia selezionata la COM3.

Qui di seguito le riporto un esempio di scrittura su porta com:
(* Configurazione porta seriale in uso *)
HSerial := Serial_ConfigPort(N_SerialPort, SERIAL_BAUDRATE_9600, SERIAL_NOPARITY, SERIAL_BYTESIZE_8, SERIAL_ONESTOPBIT, FALSE);
(* Apro la porta *)
Result := Serial_OpenPort(HSerial);
Result := Serial_PutString(Hserial,MyStringToPrint);
Result := Serial_PutByte(Hserial,10);
Result := Serial_PutByte(Hserial,13);
(* Fine scrittura chiudo la porta e l'handle *)
Result := Serial_ClosePort(HSerial);

dove HSerial è di tipo SERIAL_HANDLE e Result è di tipo BOOL.
Lei non può verificare il valore dell'Handle prima ancora di aprire L'handle, inoltre ad ogni ciclo lo deve chiudere.
Il programma riportato sopra apre e chiude la porta ad ogni ciclo di background.

Le funzioni di scrittura/lettura seriale e scrittura/lettura file si dicono bloccanti, cioè bloccano l'esecuzione del task a cui sono associate.
Pertanto se c'è un timeout in ricezione il task di background viene bloccato per 500 mS, mentre il task di Fast continua a mantenere la propia indipendenza e la propia periodicità impostata.
user3451
Posts: 4
Joined: 20/06/2012, 10:13

Re: Ricerca documentazione

Post by user3451 »

Comincia a funzionare: forse il mio disguido derivava dal fatto che il valore del handle restituito dalla Serial_ConfigPort è sistematicamente zero - e sono abituato che, in windows, se un handle è zero... allora NON è un handle valido! paese che vai...

Ancora grazie!

Aldo
user3451
Posts: 4
Joined: 20/06/2012, 10:13

Re: [LogicLab] Funzione dei "Task" e dei tipi di variabili

Post by user3451 »

Ancora un paio di domande.

1 - Se nel progetto ho un unico programma in background, esso può comprendere un end-less-loop? In questo modo mi risparmierei le pause da 100ms, ma non so se così facendo do "fastidio" al sistema.

2 - Si può accedere a variabili globali dall'interno di una funzione? Non mi riesce di definire VAR_EXTERNAL all'interno di una funzione, come vedo nel manuale del LogicLab - ma forse, come al solito, sto facendo un po' di confusione.

Grazie
Pixsys tecnico 3
Moderatore
Posts: 28
Joined: 29/02/2012, 16:12

Re: [LogicLab] Funzione dei "Task" e dei tipi di variabili

Post by Pixsys tecnico 3 »

Rispondo:
1 - Non è possibile fare un loop continuo, altrimenti il task di background bloccherebbe tutte le risorse e non potrebbe più essere eseguito il task di Fast con conseguenza che il PLC non funziona più.

2- In una function non è possibile fare riferimento ad una variabile esterna, mentre è possibile fare riferimento ad una variabile esterna in un "Function block" che ha la funzione molto simile di una function. In questo caso semplicemente prendedo la variabile di sistema e trascinandola sulle dichiarazioni delle varibili viene inglobata.
Post Reply