Risposte nei forum create
-
AutorePost
-
Sergio Bertana
Amministratore del forumNaturalmente avendo la necessità di dover comunicare con più drivers devi forzatamente utilizzare una connessione in RS485. Meglio in questo caso sarebbe stato utilizzare un modulo CPU MPS054B110 che ha già l’interfaccia RS485 isolata ed essendo basato su CPU CortexM7 avresti anche una maggiore velocità di esecuzione ed un maggior spazio di programma. Visto che disponi di un MPS053 puoi eventualmente utilizzare un convertitore RS232/Rs485 con i vari adattatori per RJ45 per lo scopo.
Certo devi tenere presente quale è la velocità richiesta nella comunicazione, tenendo conto che il massimo baud rate e 115200 (ca 10000 caratteri al secodo) e nel protocollo Modbus oltre ai dati ci sono i controlli ed ad ogni pacchetto vi è un pacchetto di risposta con tutti i tempi relativi per gestirli.
Sergio Bertana
Amministratore del forumNel parsing dei TAGs è importante la posizione delle virgole e degli spazi, devi scrivere la TAG nel modo:
Intero: <!--["%d", UINT, 10]-->
Così vedrai che tutto ti funzionerà.
Sergio Bertana
Amministratore del forumVista la dipendenza delle pagine web dalla versione del firmware del sistema abbiamo realizzato e distribuiamo un package che contiene tutto quello che serve per eseguire l’upgrade del sistema puoi trovare le informazioni sull’upgrade dei sistemi ed eseguire il download del package dalle pagine relative sia ai sistemi basati su ARM7 che CortexM7.
Aggiungo che dopo avere aggiornato il firmware e caricato le nuove pagine, devi dare da telnet (Loggandoti come Admin) il comando “CfgCommit -d” che aggiorna i diritti di accesso alle varie directories del sistema seguito dal comando “Reboot”. Puoi verificare nella pagina Security come sono settati i diritti.
C:/Web - Anonymous - Admin C:/Web/webpages - Guest - Admin
Attenzione che il comando resetta a default l’indirizzo IP, sui sistemi Cortex si attiva il client DHCP ed aspetta l’indirizzo dal server. Se non c’è server DHCP va in IP di fallback 192.168.0.122. Per vedere che indirizzo IP assume il sistema utilizza la funzione Discovery di Toolly.
Per le impostazioni occorre agire sull’icona ingranaggio come da screenshot.
Sergio Bertana
Amministratore del forumPer quanto riguarda la visualizzazione della TAG dici che hai allocato una variabile REAL nella DB100.0 allora avresti dovuto mettere indirizzo variabile a 0 non 100. Il DB100 è di default devi solo indicare l’indirizzo. Prova a modificare il file htm così:
<!--["%.3f",REAL,0]-->
Sergio Bertana
Amministratore del forumLa gestione delle TAGs utente (Quelle relative alle variabili allocate in DB100) per compatibilità con il passato è rimasta esattamente uguale alla precedente.
Abbiamo modificato le TAGs di sistema che nelle vecchie versioni di firmware non erano documentate ed erano utilizzate esclusivamente nelle nostre pagine di sistema.
Ora abbiamo aggiunto le definizioni dei SYS_ID che possono essere utilizzati sia nelle pagine web che da programma utente con la funzione SysOSIDValue.
Sergio Bertana
Amministratore del forumHai già inserito correttamente i blocchi di codice formattato…
Per farlo si edita il post in modalità testo e si include il blocco di codice nei TAGs “<pre>Testo da includere</pre>.
Per quanto riguarda la gestione Ajax delle pagine nelle nuove pagine web abbiamo già introdotto una serie di funzioni richiamabili che alleggeriscono il lavoro. La tecnica che abbiamo utilizzato è di avere una pagina con estensione html che contiene la visualizzazione dei valori ed una pagina dello stesso nome con estensione htm che contiene i TAGs che saranno sostituiti dal server con i relativi valori. Se tu guardi le pagine web dello SlimLine troverai questa tecnica e nelle pagine htm troverai qualcosa tipo questo:
{"OSID_TELNET_SVR_EN" : <!--[OSID_TELNET_SVR_EN]-->, "OSID_TELNET_SVR_PORT" : <!--[OSID_TELNET_SVR_PORT]-->, "OSID_WEB_SVR_EN" : <!--[OSID_WEB_SVR_EN]-->}Quelli che vedi sono TAGs che ritornano e permettono di impostare variabili di sistema qui trovi l’elenco.
Ora siamo chiusi e non riesco a farti un esempio, al rientro preparerò un esempio esplicativo.
Sergio Bertana
Amministratore del forumNon ho capito bene quello che vuoi fare, l’argomento è un pò complicato vedo di spiegarlo magari inserendo più posts di risposta. Inizaimo con una gestione non in Ajax, quindi se vuoi un rinfresco della pagina la devi ricaricare dal browser. Ti riporto il listato di un programma che permette la visualizzazione e l’input da pagina web di variabili.
VAR i : UDINT; (* Auxiliary variable *) IString AT %MX100.100 : STRING[ 15 ]; (* Stringa in input *) IVar AT %MX100.116 : UINT; (* Variabie in input *) OString AT %MX100.118 : STRING[ 31 ]; (* Stringa risultato *) END_VAR // ----------------------------------------------------------------------------- // Di seguito il contenuto della pagina "Test.htm" da trasferire sullo SlimLine // nella directory "C:\Web". // // E' visualizzata in un campo input la stringa "ISting" allocata a DB100.100. // E' visualizzata in un campo input la variabile "IVar" allocata a DB100.116. // E' visualizzata in un campo <div> la stringa di concatenazione del risultato. // ----------------------------------------------------------------------------- /* <head> <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" /> <title>SlimLine - Simple page</title> </head> <body"> <div><!--['%s', STRING, 118]--></div> <form id="MyForm" name="MyForm" method="post" action="Test.htm"> Stringa: <input name="STRING 100 15" type="text" size="10" maxlength="16" value="<!--['%s', STRING, 100]-->"></br> Valore: <input name="UINT 116" type="text" size="10" maxlength="10" value="<!--['%d', UINT, 116]-->"></br> <input type="submit" id="MyButton" value="Save"/> </form> </body> </html> */ // ----------------------------------------------------------------------------- i:=SysVsnprintf(ADR(OString), SIZEOF(OString), ADR('Result:%s'), STRING_TYPE, ADR(IString)); i:=SysCVsnprintf(ADR(OString), SIZEOF(OString), ADR(' - %d'), UINT_TYPE, ADR(IVar)); // [End of file]Metto in evidenza che il tipo file deve essere .htm, perchè solo nei files con questa estensione vengono sostituiti i TAGs.
Le variabili stringa sono definite di lunghezza 15 e 31 perchè ricordo che al termine delle stringhe è automaticamente aggiunto il codice tappo 16#00 che allunga di 1 byte la lunghezza definita.
Per impostare i parametri da pagina web utilizzo un form che invia i valori in POST, nelle variabili stringa nei campi di inputazione occorre definire la lunghezza masima questo per evitare di “sforare” la dimensione in memoria.
Sergio Bertana
Amministratore del forumCerto che è possibile eseguire l’aggiornamento (Vedi articolo) basta scaricare dal sito il package per l’upgrade a XUnified che contiene sia il sistema operativo che le pagine web aggiornate.
Se includi nel progetto la libreria eLLabXUnifiedAdjLib potrai compilare il tuo programma senza fare modifiche. Altrimenti dovrai sostituire gli oggetti rinominati nel passaggio da XTarget ad XUnified.
Sergio Bertana
Amministratore del forumPer la lettura dell’RFID se usi la versione con bus Wiegand devi utilizzare un sistema SlimLine perchè i sistemi Netlog non hanno la velocità di acquisizione necessaria. Sui sistemi Netlog puoi utilizzare il lettore RFID con interfaccia 1-wire collegando alla porta seriale del Netlog l’Adattatore 1-Wire a RS232 DS9097U.
Visto che mi parli di invio eMail quindi il sistema è connesso ad Internet, posso consigliarti di utilizzare un HMI con la licenza EasyAccess o di acquistare la licenza a parte, questo ti permetterà di accedere al sistema HMI/PLC da remoto via Internet.
Con la connettività Internet hai tutti i requisiti per omologare l’impianto secondo la normativa Industry 4.0 ed accedere ai benefici fiscali (Vedi blog).
Sergio Bertana
Amministratore del forumCome puoi vedere in questo articolo, tutte le librerie sono state riscritte per avere la compatibilità con l’architettura XUnified, tu probabilmente stai compilando su di un sistema con architettura XTarget, quindi avendo modificato il nome di alcuni oggetti il compilatore non trova la nuova funzione SysVsnprintf utilizzata nella libreria.
Per poter utilizzare le nuove librerie con l’architettura XTarget devi aggiungere al tuo progetto la libreria eLLabXTargetAdjLib.
Sergio Bertana
Amministratore del forumSi tratta di una warning, che indica che in una pagina web dinamica realizzata dall’utente abbia una variabile stringa in cui non è stata definita la lunghezza massima. Riporto l’estratto del manuale di programmazione che tratta l’argomento.
All’interno della pagine con estensione htm è possibile inserire TAGs che verranno automaticamente sostituite dal server con il valore di una variabile PLC. I TAGs hanno il costrutto di un commento HTML, il TAG <!–[‘%d’, UINT, 10]-> verrà sostituito con il valore della variabile UINT allocata nella DB100.10.
Questa warning non ha niente a che vedere con il programma realizzato ma riguarda esclusivamente il server web con la gestione di pagine realizzate dall’utente.
Sergio Bertana
Amministratore del forumL’indirizzo IP del gateway nella configurazione di rete di qualsiasi dispositivo deve essere quello del dispositivo che permette di comunicare con Internet, o comunque con altre reti al di fuori della classe di rete configurata per il prodotto.
Quindi ipotizzando che l’IP dello SlimLine sia quello di default 192.168.0.122/24 quando si cerca di comunicare con un IP esterno alla classe di rete i pacchetti vengono inviati all’indirizzo IP del gateway che li instraderà verso la rete a cui l’indirizzo IP appartiene.
Se non c’è la necessità di comunicare con dispositivi esterni alla propria classe di rete il gateway non è necessario ed il campo può avere qualsiasi valore.
Sergio Bertana
Amministratore del forumGooglando troverete moltissimi articoli che parlano di questa tecnica di programmazione, da una rapida lettura ho ritenuto interesante estrarrne i vantaggi.
La programmazione batch o passo a passo è più lunga e laboriosa, ma rende il programma più affidabile, perché svolto con singole fasi indipendenti. Inoltre è molto più facile la manutenzione, se sorge un problema all’impianto, il programma si fermerà ad un dato passo che ci permetterà di individuare immediatamente la causa.
Inoltre permette di gestire in modo affidabile la diagnostica e gli allarmi. Ad ogni passo è possibile controllare e gestire eventuali emergenze o anomalie come:
- Tempo massimo di esecuzione passo superato.
- Finecorsa avanti e indietro attivi contemporaneamente o non attivi dopo il tempo massimno di movimento.
- Pressione del pulsante emergenza
- Rimozione di protezioni di sicurezza, ecc
In questo caso si potranno prevedere una serie di misure quali l’arresto della macchina (o il riposizionamento in uno stato di riposo/sicurezza) e la segnalazione dell’errore/anomalia/guasto.
Sergio Bertana
Amministratore del forumRiporto per chi come me non la conosceva la definizione di programmazione con la tecnica batch.
La tecnica batch prevede di associare ad ogni passo della sequenza un merker di passo e gestire l’evoluzione del sistema settando il merker successivo e resettando quello attuale ad ogni transizione. In questo modo in ogni momento sarà attivo un solo merker e lo stato del sistema sarà sempre definito.
Non conoscendola ho scoperto che quasi tutti i miei programmi sono realizzati con la tecnica batch, se cercate nel forum o nella knowledge base troverete molti esempi (Quasi sempre in linguaggio ST) dove il programma è eseguito a passi di solito uso una variabile CaseNr e con lo statement CASE sequenzio i vari passi del programma. Ma nulla vieta di usare la stessa tecnica con gli altri linguaggi usando variabili BOOL come sequenziatori o usando le istruzioni di comparazione per sequenziare i vari passi.
Venendo alla domanda se guardi gli esempi credo che in tutti sia stata utilizzata la variabile di primo loop proprio per inizializzare il programma, la variabile SysFirstLoop è infatti attiva per un solo loop di programma alla prima esecuzione. Comunque ricordo che esiste la task Boot eseguita una sola volta all’avvio della esecuzuione programma, a questa task puoi assegnare i tuoi programmi che gestiscono l’inizializzazione delle variabili.
Sergio Bertana
Amministratore del forumCredo che il problema possa essere nella gestione ELSE del CASE dove tu arrivi dopo avere inviato l’ultimo dato. In quel caso non carichi nulla nella variabile RESTVars.Request, e quindi LEN(RESTVars.Request) torna 0. Proverei a modificarlo così:
ELSE DateTime:=SysDateTime; //Date/Time Epoch RETURN; END_CASE; -
AutorePost