Sergio Bertana
Risposte nei forum create
-
AutorePost
-
Sergio Bertana
Amministratore del forumPer impostare i parametri da modbus sugli inverters INVT fare riferimento al manuale utente 7.4.2 Address instruction of other function in Modbus. Occorre però fare alcune precisazioni.
L’indirizzamento modbus è a base 0, quindi nel pannello devi scegliere MODBUS RTU (Zero base addressing) (Screenshot).
Come vedi dal manuale l’indirizzo del registro Modbus per l’impostazione della frequenza è 2001 esadecimale, quindi 8193 decimale.
Siccome hai più di un inverter connesso alla stessa porta seriale devi anteporre all’indirizzo della variabile l’indirizzo del nodo Modbus impostato sull’inverter (Parametro P14.00 local communication address).
Devi abilitare l’impostazione di frequenza via Modbus (Parametro P00.06=8 Frequency command selection -> Set via Modbus (0x2001)).
Da quanto detto è evidente dovrai inserire nella tua pagina di terminale 12 oggetti Numeric input ognuno dei quali punterà alla variabile 8193 preceduta dall’indirizzo di nodo (Esempio 1#8193, 2#8193, …). La frequenza ha risoluzione 0.01 Hz quindi nel campo Format dell’oggetto numeric input dovrai definire 2 cifre a destra del punto decimale.
Sergio Bertana
Amministratore del forumPer trasformare variabili in testo rendiamo disponibili due funzioni SysVarsnprintf e SysLWVarsnprintf, entrambe convertono una variabile in una stringa di testo. La prima serve se si deve stampare in una stringa una sola variabile, la seconda permette di accodare ad una stringa il risultato della conversione della variabile creando una stringa che contiene più valori.
Grazie al campo Format puoi spaziare in una infinità di opzioni per la creazione della stringa valore.
Marzo 27, 2020 alle 11:27 am in risposta a: Libreria per comunicazione tra sistemi su Internet #54349Sergio Bertana
Amministratore del forumQuesta libreria è in evoluzione, ora la documentazione ufficiale la trovi nel manuale sul sito di supporto, vedi questi articoli (TCPDEXCHNODEDEFS, TCPDataExchServer, TCPDataExchClient). Ti consiglio di coipiare ed incollare gli esempi riportati, come vedi utilizzando il localhost puoi testare il funzionamento eseguendo sia il server che il client (1 o più) su di un unico sistema.
Il bit RxOk non và resettato da programma, in realtà si attiva per un loop di programma ad ogni ricezione dei dati.
La variabile Heartbeat ora è definita nella struttura dati di configurazione.
La variabile Active presente nelle struttura dati di configurazione se è attiva indica che la connessione tra ia sistemi è attiva.
Non capisco la domanda sulla trasmissione dai dati, occorre definire un’area da inviare all’altro sistema, poi in quell’area puoi mettere tutti i tipi di dato che vuoi. Nel mio esempio ho usato per semplicità un array, ma nel caso reale conviene utilizzare una struttura dati in modo da poter raggruppare dati disomogenei.
Marzo 27, 2020 alle 10:55 am in risposta a: Passaggio dati in POST in formato JSON verso server HTTP #54346Sergio Bertana
Amministratore del forumAppurato che il difetto che lamenti è un BUG del watch di LogicLab, ho già avvisato la Axel che ha aperto un ticket al riguardo.
Ma non mi dici se hai eseguito il test utilizzando la console di spionaggio e cosa vedi dalla console, perchè a parte la visualizzazione errata in watch il programma deve funzionare.
Marzo 27, 2020 alle 10:52 am in risposta a: Connettere dispositivi I2C al bus di espansione SlimLine #54344Sergio Bertana
Amministratore del forumNon ho mai usato multiplexer I2C come quello che citi, ma leggendo il datasheet mi sembra di capire che il multiplexer usa un indirizzo I2C per la sua gestione.
Quindi nessun problema esegui un comando di write di 1 byte sull’indirizzo I2C del multiplexer indicando quale canale vuoi attivare. Da questo momento tutti i comandi I2C andranno in uscita sul canale indirizzato.
Alternative… Se i componenti che usi hanno un pin di abilitazione puoi parallelarli tutti sul bus I2C e poi dovrai gestire (Magari con un PIO I2C) i vari comandi di abilitazione.
Marzo 22, 2020 alle 11:13 am in risposta a: Passaggio dati in POST in formato JSON verso server HTTP #54204Sergio Bertana
Amministratore del forumIn effetti nella visualizzazione di LogicLab i dati sembrano errati, devo sentire Axel al riguardo, non avevo mai notato questo semplicemente perchè come strumento diagnostico utilizzo la nostra console di spionaggio. E utilizzando proprio l’esempio citato nella HTTPClient ecco il risultato visto nella console di spionaggio.
[Admin]> SpyData Spy data active, type "Ctrl-C" to exit... 20:52:17( 288)|Tx|GET //Mdp095a000/Ptp119b000/Division.php? 20:52:17(.104)|Rq|Dividend=500&Divisor=10 20:52:17(.080)|Rx|[17] HTTP/1.1 200 OK..Date: 20:52:17(.001)|Rx|[37] Date: Sun, 22 Mar 2020 11:03:42 GMT..Conten 20:52:17(.001)|Rx|[40] Content-Type: text/html; charset=UTF-8..Transf 20:52:17(.001)|Rx|[28] Transfer-Encoding: chunked..Connec 20:52:17(.053)|Rx|[19] Connection: close..Set-Co 20:52:17(.054)|Rx|[168] Set-Cookie: __cfduid=d50c ***HttpOnly; SameSite=Lax.. 20:52:17(.055)|Rx|[23] Vary: Accept-Encoding..CF-Cac 20:52:17(.055)|Rx|[26] CF-Cache-Status: DYNAMIC..Server 20:52:17(.056)|Rx|[20] Server: cloudflare..CF-RAY 20:52:18(.053)|Rx|[30] CF-RAY: 577f6d79bfb3e8f7-MXP....11.. 20:52:18(.055)|Rx|[2] ..11..T 20:52:18(.055)|Lg|Start Rx page, chunked page 20:52:18(.053)|Lg|RxD Chars:28, ChunkLgt:17, TotLgt :0 20:52:18(.054)|Rx|[17] The result is: 500.... 20:52:18(.058)|Pi|Page length: 17 Page load time: 0.796 (S)
Le stringhe visualizzate in console sono troncate alla lunghezza di 80 caratteri ma permettono comunque di capire il funzionamento. Ecco la riga di richiesta inviata al server e la riga di risposta ricevuta dal server:
|Rq|Dividend=500&Divisor=10
|Rx|[17] The result is: 500….Nella risposta ricevuta dal server, il numero tra [] è la lunghezza della stringa ricevuta. Nota: dopo il numero 50 vi è il carattere 0 che fà sembrare la risposta 500 ma in realtà avendo ricevuto una risposta in chunked, lo 0 è la lunghezza dell’ultimo chunk ricevuto. Se metti in debug la variabile Page dove c’è il contenuto ricevuto vedrai che è corretto ed è lungo 17 caratteri.
Sergio Bertana
Amministratore del forumDal programma che hai fatto vedo che utilizzi 3 ingressi digitali del modulo CPU:
Di00 per rilevare il comando Up dell’attuatore
Di01 per rilevare il comando Dw dell’attuatore
Di02 per rilevare il trasduttore effetto hall dell’attuatoreDal problema che lamenti, modificherei il programma in questo modo.
VAR Pulse : BOOL; (* Input pulse *) DwUp : BOOL; (* Direzione, Dw:FALSE, Up:TRUE *) Position : DINT; (* Posizione asse *) DInp : SysGetPhrDI; (* Digital input acquisition *) END_VAR // ------------------------------------------------------------------------- // INIZIALIZZAZIONE // ------------------------------------------------------------------------- IF (SysFirstLoop) THEN DInp.Address:=255; //Module address DInp.Mode:=DI_8_LL; //Acquisition mode END_IF; // ------------------------------------------------------------------------- // CONTEGGIO IMPULSI // ------------------------------------------------------------------------- // Eseguo acquisizione ingressi digitali. DInp(); //Digital input acquisition // Controllo quale comando è attivo se Up o Down. IF TO_BOOL(DInp.Value AND 16#01) THEN DwUp:=TRUE; END_IF; IF TO_BOOL(DInp.Value AND 16#02) THEN DwUp:=FALSE; END_IF; // Conteggio impulsi da sensore trasduttore. IF (TO_BOOL(DInp.Value AND 16#04) <> Pulse) THEN Pulse:=TO_BOOL(DInp.Value AND 16#04); //Input pulse // Se si controlla "Pulse" incremento solo su fronte attivazione. // Togliendo controllo si incrementa anche su fronte disattivazione. IF (Pulse) THEN IF (DwUp) THEN Position:=Position+1; ELSE Position:=Position-1; END_IF; END_IF; END_IF; // [End of file]Non è molto diverso dal tuo, unica differenza è utilizzare una sola flag per indicare la direzione, in questo modo anche quando spegni il motore dell’attuatore rimane memorizzata l’ultima direzione. Così siccome sull’arresto non c’è un arresto immediato ma ci potrebbero essere ancora degli impulsi in questo modo vengono contati correttamente.
Nota: E’ importante che la variabile Position sia di tipo DINT per permettere di andare in negativo nel caso servisse.
Sergio Bertana
Amministratore del forumEcco le risposte:
I formati supportati sono: jpg, bmp, gif, png.
La dimensione immagine consigliata è non oltre 1024×768 a meno che non si usi un cMT-FHD allora si può andare oltre. Come dimensione file meglio stare sotto 1Mb.
Se si prova ad aprire un file non esistente rimane aperto l’ultimo.
Sergio Bertana
Amministratore del forumGli inverter GD20 dispongono di 4 ingressi digitali, gli ingressi sono configurabili mediante i parametri del gruppo P05 Input terminal. Per ogni ingresso è possibile scegliere tra 43 opzioni diverse, di seguito riporto solo quelle relative alla tua domanda:
0: No function 1: Forward rotation operation 2: Reverse rotation operation ... 4: Forward jogging 5: Reverse jogging ... 16: Multi-step speed terminal 1 17: Multi-step speed terminal 2 18: Multi-step speed terminal 3 19: Multi-step speed terminal 4
Per selezionare una velocità diversa devi impostare su di un ingresso la funzione Multi-step speed, esistono 4 selezioni che combinate tra di loro ti permettono di scegliere tra 16 diversi valori di velocità. Il valore di velocità andrà impostato nel gruppo P10, Multi-step speed control.
Se a te serve un’unica velocità imposterai uno degli ingressi per selezionare ad esempio il Multi-step speed 1 ed andrai nel parametro P10.04 ad impostare il valore di velocità.
Sergio Bertana
Amministratore del forumUtilizzando l’oggetto Picture View puoi visualizzare immagini da disco scegliendo come cartella il disco USB. Nelle proprietà dell’oggetto devi specificare la cartella su disco da cui acquisire le immagini, può essere direttamente la cartella root del disco o una cartella predefinita.
In alternativa puoi abilitare il Dinamic folder path, che permette di definire la cartella utilizzando variabili HMI o PLC. In questo modo puoi definire la cartella direttamente da programma PLC.
Attivando Specify file from address puoi definire una variabile HMI o PLC tramite la quale definire il nome del file immagine da visualizzare.
Ho realizzato un semplice progetto PictureViewExample che visualizza immagini da USB, lo puoi testare direttamente in simulazione su PC. Nel file di progetto ho caricato alcune immagini di esempio già pronte, i loro nomi sono Image01.jpg, Image02.jpg, ecc. dovrai caricare le immagini nella cartella usb1 nel percorso di installazione di EasyBuilder Pro (Esempio C:\Program Files\EBpro\usb1\).
Attivando il progetto in simulazione su PC basterà definire il nome della immagine desiderata nella casella di inputazione per vederla visualizzata (Screenshot).
Sergio Bertana
Amministratore del forumAggiungo il progetto di esempio DatabaseServerDemo, un’altro progetto che utilizza la connessione ad un database MySQL per esportare nel database dei dati acquisiti dal terminale.
Sergio Bertana
Amministratore del forumNon specifichi se si tratta di modelli MT8102iP o MT8102iE, come puoi vedere dal capitolo Appendix A del manuale EsyBuilder Pro (Il documento è scaricabile dal ns sito). i modelli iP essendo la gamma entry level della famiglia non possono gestire nè le ricette ne la connessione al server SQL.
I modelli iE hanno invece la possibilità di gestire ricette sul loro database interno ma non possono connettersi a database SQL esterni.
Per poter gestire la connessione a database SQL esterni devi utilizzare prodotti della gamma cMT.
Nel forum trovi topics che trattano gli argomenti che cerchi, in questo topic ed in questo topic si parla di ricette.
In questo topic si parla di connessione a server SQL.
Allego per il download il progetto SQLQueryDemo che si connette ad un server MySQL (Nel progetto si utilizza la connessione in localhost). Il progetto si può testare direttamente sul PC in emulazione, occorre avere il server MySQL attivo.
Sergio Bertana
Amministratore del forumHo realizzato un semplice progetto con una macro che esporta il nome del’Item della ricetta, ecco la macro:
macro_command main() char nome[5] short i,num short loc=0 // verifico il numero di ricette presenti GetData(num, "Local HMI", RECIPE, "test.Count") num=num-1 // Prelevo i singoli nomi e li metto su local word // Modificare SetData se si vuole trasferire su PLC for i=0 to num RecipeGetData(nome[0], "test.NOME",i) loc=i*5 SetData(nome[0], "Local HMI", LW, loc, 5) next i end macro_command
E’ possibile scaricare il progetto GetRecipeItem per testarlo da EasyBuilder Pro direttamente in emulazione su PC (Download).
Sergio Bertana
Amministratore del forumPer curiosità ho analizzato il problema ed ho eseguito il calcolo del tempo di esecuzione del tuo programma, ho inserito in testa al tuo programma il salvataggio del tempo di sistema, ed in coda il calcolo del tempo di esecuzione.
VAR TimeBf : UDINT; (* Time buffer (uS) *) ExTime : UDINT; (* Tempo di esecuzione (uS) *) MaxTime : UDINT; (* Massimo tempo di esecuzione (uS) *) END_VAR TimeBf:=SysGetSysTime(TRUE); ... Programma cliente di cui calcolare tempo esecuzione. ... ExTime:=SysGetSysTime(TRUE)-TimeBf; IF (ExTime > MaxTime) THEN MaxTime:=ExTime; END_IF;Il tempo di esecuzione è di 315uS con un massimo di 320uS quindi occupa un terzo del tempo di task (1mS), infatti gira senza problemi. Ora visto che tu lamentavi il problema immagino avessi ridotto il tempo di esecuzione della task Fast, o che avessi altro codice da eseguire.
Nota: Tutto il tempo è necessario per accedere alla scheda periferica di lettura encoder, se commento la riga di codice che esegue la lettura il tempo necessario per eseguire il programma passa a 7uS.
Marzo 17, 2020 alle 8:57 am in risposta a: Passaggio dati in POST in formato JSON verso server HTTP #54035Sergio Bertana
Amministratore del forumTutte le librerie sono comunque scaricabili dalla pagina di download del sito https://www.elsist.biz/lista-download/. Basta inserire nella casella di ricerca il nome o parte di esso della libreria cercata.
Nota: Alle librerie inizialmente veniva aggiunto il suffisso _A000 dove la lettera ed i numeri indicavano la versione. Con l’ultima versione di LogicLab il suffisso è sparito e la libreria riporta un numero di versione che è visualizzato e gestito da LogicLab.
-
AutorePost