Errore su stringa passata come variabile a funzione
Home › Forum › Programmazione IEC 61131 (LogicLab) › Errore su stringa passata come variabile a funzione
- Questo topic ha 2 risposte, 2 partecipanti ed è stato aggiornato l'ultima volta 13 anni, 3 mesi fa da
Sergio Bertana.
-
AutorePost
-
Dicembre 30, 2011 alle 9:52 am #35149
Giorgio
PartecipanteStò facendo pratica sulla programmazione con LogicLab su di un sistema SlimLine.
Nel richiamare la function FTest, dove ho come input la variabile FilePointer e la stringa da inviare alla seriale, mi visualizza il seguente errore:
MAIN(3) – error A4107: STRNCPY => Target function not found
Nel programma ho tralasciato volutamente l’apertura della COM. Lo Slimline è il MPS046A100 firmware: SFW167D100 (Download programma).
Dicembre 30, 2011 alle 9:58 am #37101Sergio Bertana
Amministratore del forumHo dato una occhiata al tuo programma ed in effetti ho visto l’errore che tu riporti, sinceramente non capisco la reale fonte del problema, e purtroppo in questi giorni di festività non posso contattare l’esperto.
Però ho provveduto a correggere una serie di imprecisioni che il tuo programma aveva, e con un semplice workaround ho sistemato anche la funzione FTest per farla funzionare secondo le tue aspettative. Ti riporto le correzioni fatte.
Nel progetto conviene sempre attivare il tick Case sensivity, nel menù Project-> Options (Screenshot). In questo modo si controlla il case delle lettere nei nomi di variabili e funzioni evitando di dare nomi a variabili che possono essere in contrasto con nomi già predefiniti.
Il tuo programma Main tramite la chiamata alla funzione FTest esegue l’invio di dati sulla seriale, è conveniente eseguire i programmi che gestiscono le seriali, i sockets, i files, sempre nella task di Back. E’ inutile sovraccaricare di lavoro le tasks Fast e Slow, rallentando l’esecuzione della logica, con operazioni che potrebbero essere lente.
Il workaround per risolvere l’errore è stato di modificare il tipo del parametro StrCmd, anzichè definirlo STRING l’ho definito di tipo @USINT (Puntatore a USINT). In questo modo nella chiamata alla funzione occorre passare l’indirizzo della stringa da inviare sulla seriale Result[0]:=FTest(FpCom0, ADR(StrCmd1));. La chiamata funziona anche definendo direttamente la stringa in linea Result[1]:=FTest(FpCom0, ADR(‘Hello!’));.
Nel programma Main, ho condizionato la chiamata alla funzione FTest per eseguirla una sola volta ad ogni cambiamento di stato della variabile SysClock1000. Chiamandola sempre come nel tuo programma, siccome il programma è eseguito ciclicamente avresti creato overflow nel buffer di trasmissione. Il programma eseguito ogni loop time di qualche mS (Magari anche meno di 1 mS) avrebbe caricato la stringa nel buffer di trasmissione seriale, la trasmissione su seriale anche a 115200 baud richiede almeno 90 uS per ogni carattere.
Allego il progetto modificato e funzionante per il download.
Dicembre 30, 2011 alle 10:55 am #37102Sergio Bertana
Amministratore del forumAggiungo note sul modo in cui è gestita la trasmissione seriale sullo SlimLine. Esiste un buffer di spooling in cui le funzioni che inviano dati sulla seriale trasferiscono i dati da trasmetere. Il sistema operativo poi provvede ad inviare i dati caricati nel buffer sulla porta seriale.
Se sono caricati più dati nel buffer di quelli che la porta seriale riesce a trasmettere si genera un overflow, ed i precedenti dati seriali in uscita, presenti nel bufer vengono sovrascritti. Per evitare questo o si è certi che il tempo di caricamento dei dati nel buffer, è sufficentemente lento da permettere alla porta seriale di inviarli in uscita. Oppure si controlla lo spazio disponibile nel buffer prima di caricare i dati con la funzione SysGetOSpace.
Ho modificato l’esempio precedente aggiungendo nella funzione FTest il controllo sullo spazio nel buffer di trasmissione prima di caricare i dati da trasmettere.
IF (SysGetOSpace(FpCom) < (Lenght+4)) THEN RETURN; END_IF;
Allego progetto modificato con il controllo dello spazio nel buffer di trasmissione per il download allego anche stampa progetto.
-
AutorePost
- Devi essere connesso per rispondere a questo topic.