Vai al contenuto

Sergio Bertana

Risposte nei forum create

Stai visualizzando 15 post - dal 106 a 120 (di 4,368 totali)
  • Autore
    Post
  • Sergio Bertana
    Amministratore del forum

    Iniziamo con il dire che non c’è limite sulla dimensione dei dati che si possono inviare e/o ricevere in una comunicazione HTTP con il FB HTTPClient. Visto che per i dati in ricezione ti è chiaro come procedere e penso che il programma ST_HTTPClient_ToFile ne sia un esauriente esempio, vediamo come procedere per i dati da inviare al server.

    Premesso che si si hanno molti dati da inviare è preferibile utilizzare una richiesta POST in cui i dati vengono inviati nel body senza limiti di lunghezza. Nelle richieste in GET i dati vengono passati nell’URL, che ha una lunghezza definita per ogni server, solitamente mi limito ai 256 caratteri. Ora vediamo il valore 512 a cui penso ti riferissi, negli esempi del FB HTTPClient vedi questo valore ripetuto più volte.

    TCPClient.RxSize:=512; //Rx buffer size
    TCPClient.TxSize:=512; //Tx buffer size
    HTTPRq.DBSize:=512; //Data buffer size

    Nel TCPClient, è definita la dimensione dei buffers Rx e Tx, un pacchetto TCP tipico trasporta fino a 1460 byte di dati, quindi si potrebbero definire questi buffer pari a questa dimensione. Solitamente utilizzo la dimensione 512 per non allocare troppa memoria RAM, il protocollo TCP negozia la quantità dei dati da trasferire in ogni pacchetto dimensionandola alla dimensione buffer. Quindi i dati da ricevere/trasmettere su protocollo TCP saranno frazionati in tanti pacchetti pari alla dimensione definita.

    Nel HTTPClient è definita la dimensione del buffer di appoggio per trasmissione/ricezione dati verso stream di comunicazione (TCPClient) l’indirizzo è trasferito in DBAddress. Il FB compone i dati da inviare in questo buffer e poi li invia allo stream definito in File. I dati ricevuti dallo stream sono trasferiti nel buffer e la dimensione dei dati ricevuti è trasferita in DBChars in modo da permettere al programma utente di leggerli.

    I dati da inviare al server vanno scritti in un buffer di memoria il cui indirizzo và definito in Request, attivando Send il FB provvederà ad inviare la richiesta inviando la stringa presente nel buffer. Siccome i sistemi SlimLine non hanno molta memoria RAM ipotizzando di dover inviare 4kBytes di dati conviene utilizzare la funzione SysRMAlloc per allocare il buffer, memoria che sarà disallocata al termine dell’invio. L’invio verrà sudiviso in pacchetti di dimensione pari al valore più piccolo tra quelli definiti in DBSize e TxSize.

    in risposta a: Intervento interruttore differenziale #82597
    Sergio Bertana
    Amministratore del forum

    Aggiungo una foto in cui evidenzio il ponticello da rimuovere per escludere il filtro EMC presente nell’inverter della famiglia GD270.

    in risposta a: Conversione progetto da XTarget12 ad XUnified #82567
    Sergio Bertana
    Amministratore del forum

    Non tutte le ciambelle escono con il buco…

    Con l’ultima versione di LogicLab il termine STEP è diventato un termine riservato quindi non è più possibile utilizzarlo negli oggetti di libreria, purtroppo nella raccolta di librerie versione Pck055A040 nel FB AESDecryption vi è proprio un parametro nominato Step, l’argomento è stato trattato in questo topic.

    E se il tuo progetto non ha attivata la distinzione tra i termini scritti in minuscolo da quelli scritti in maiuscolo Step è uguale a STEP, ed ecco che si genera l’errore:

    AESDECRYPTION(H:13) - error C4113: Step => Invalid name

    Per eliminare l’errore puoi attivare la distinzione tra minuscole e maiuscole nel tuo progetto, ma se non hai definito correttamente tutte le variabili questo potrebbe generarti altri errori. In alternativa puoi eseguire il download della nuova versione beta del package PCK055a05_ in cui è stato corretto il problema e sostituirlo alla raccolta librerie definita nel tuo progetto.

    in risposta a: Conversione progetto da XTarget12 ad XUnified #82554
    Sergio Bertana
    Amministratore del forum

    Purtroppo c’è un BUG nella distribuzione del LogicLab ci siamo dimenticati di inserire nell’elenco delle compatibilità tra i prodotti il modulo MPS056.

    Per fortuna il workaround è molto semplice, aperto il progetto dal menù Project->Select target puoi selezionare il modulo SlimLine MPS054 XUnified.

    Confermata la richiesta il progetto verrà convertito per la nuova architettura XUnified. A questo punto è possibile nuovamente dal menù Project->Select target selezionare il target desiderato (Screenshot).

    Eseguita la conversione consiglio di rimuovere tutte le librerie standard incluse nel progetto tranne le librerie di tua realizzazione (Nell’esempio è stata eliminata la libreria eLLabUtyLib_C040), nella conversione viene già automaticamente inclusa l’ultima versione del package di librerie. Siccome si tratta di un progetto XTarget che deve essere eseguito su di un sistema XUnified come indicato in questo articolo occorre anche includere la libreria eLLabXUnifiedAdjLib (Screenshot). Nel caso in cui nella finestra di output compaiano voci del tipo:

    warning P2086:  eLLabStdLib: CTD => Object is already defined in the project and will be unloaded

    Significa che nel tuo progetto avevi incluso oltre a librerie standard anche degli oggetti come si vede dallo screenshot, quindi la warning stà ad indicare che verrà utilizzato l’oggetto incluso nel progetto e scartato l’oggetto presente nella raccolta librerie. Se vuoi utilizzare quello presente nella raccolta librerie puoi eliminare gli oggetti dal tuo progetto ed eseguire il comando Project->Refresh all libraries.

    Ora puoi ricompilare il progetto e trasferirlo sul tuo nuovo sistema target.

    in risposta a: Invio di eMail su comando da ingresso digitale #82550
    Sergio Bertana
    Amministratore del forum

    Se c’è connessione Internet allora non ci sono problemi.

    Se si utilizza il dispositivo STE2 è possibile definire il nome dell’ingresso ed il messaggio per la condizione di aperto e di chiuso (Screenshot).

    SE si utilizza il sistema SlimLine l’unico limite è la fantasia, puoi comporre qualsiasi messaggio, magari anche allegando i dati da un file di log, vedi il programma ST_SendFileByEMail nella pagina di descrizione FB.

    in risposta a: Acquisizione temperatura da termocoppia #82541
    Sergio Bertana
    Amministratore del forum

    L’acquisizione di temperatura da termocoppia è possibile con il Modulo di espansione I/O Analogici.

    Come vedi dalla pagina del prodotto esistono 2 versioni di moduli uno che può acquisire fino a 4 termocoppie ed uno che ne può acquisire fino ad 8. Naturalmente se ti occorrono più ingressi puoi utilizzare più moduli.

    Per l’acquisizione della temperatura si utilizza il FB SysGetAnInp, indicando in Mode il tipo di termocoppia da acquisire. Il FB ritorna una variabile REAL con l’indicazione della temperatura in gradi Celsius. Di seguito un esempio di acquisizione in gradi Celsius e Fahrenheit.

    VAR
        Celsius : REAL; (* Celsius temperature (°C) *)
        Fahrenheit  : REAL; (* Fahrenheit temperature (°F) *)
        AInp : SysGetAnInp; (* Analog input acquisition *)
    END_VAR
    
        AInp.Address:=0; //Module address
        AInp.Channel:=0; //Module channel
        AInp.Mode:=AI_MODE#AD_THERMOCOUPLE_J; //Acquisition mode
        AInp(); //Analog input acquisition
        IF (AInp.Done) THEN
            Celsius:=AInp.Value; //Celsius temperature (°C)
            Fahrenheit:=((AInp.Value*1.8)+32.0); //Fahrenheit temperature (°F)
        END_IF;
    
    // [End of file]
    in risposta a: Invio di eMail su comando da ingresso digitale #82530
    Sergio Bertana
    Amministratore del forum

    Abbiamo due soluzioni…

    • Dispositivo HWg-STE2 R2/Plus, il dispositivo oltre alla acquisizione di temperatura (Con sonda compresa) e di altre grandezze fisiche tramite sonde opzionali dispone di 2 ingressi digitali. Su attivazione/disattivazione ingresso è possibile inviare una eMail a fino 5 destinatari. Il messaggio della eMail è preconfezionato è possibile solo definire una stringa di definizione ingresso.
    • Utilizzare un sistema SlimLine, questo è un dispositivo programmabile che dispone di 6 ingressi digitali, tramite LogicLab è possibile programmarlo per soddisfare le proprie esigenze. Il FB EMailSend permette di inviare la eMail secondo le proprie esigenze.

    Sul sito c’è ethernet ma non specifichi se è presente una connessione Internet che è una condizione indispensabile per inviare l’eMail.

    In questo topic una interesante discussione sull’invio di eMail da programma LogicLab.

    in risposta a: Routing con RUT140 Teltonika #82514
    Sergio Bertana
    Amministratore del forum

    Il RUT14x è nato proprio per questa esigenza, in pratica per ottenere quello che desideri dovrai:

    • Configurare l’interfaccia LAN con la classe di rete (IP, Mask) dei tuoi dispositivi di controllo (PLC, azionamenti, ecc). Dovrai definire come gateway dei tuoi dispostivi l’IP configurato sulla LAN del RUT14x.
    • Configurare l’interfaccia WAN con la classe di rete (IP, Mask) su un indirizzo di rete libero del cliente. Consiglio di non utilizzare il client DHCP ma di definire un IP statico.
    • Abilitare forwarding tra WAN->LAN per permettere alle connessioni in ingresso da rete aziendale di raggiungere i dispositivi sul’limpianto
    • Abilitare forwarding tra LAN->WAN per permettere ai dispositivi sull’impianto di raggiungere i dispositivi IP della rete aziendale e di conseguenza Internet. Non abilitarlo se il cliente non vuole che i dispositivi su impianto raggiungano la rete.

    Con questa soluzione se setti un route map sui PC connessi alla WAN potrai raggiungere direttamente i dispositivi di controllo con i loro indirizi IP. Esempio la rete del cliente ha classe 192.168.0.1/24, i tuoi dispositivi di controllo hanno classe 10.0.0.1/24, l’indirizzo IP settato sulla rete WAN è 192.168.0.10, basterà sul PC definire un route map del tipo:

    route add 10.0.0.0 mask 255.255.255.0 192.168.0.10

    Ora dal PC potrai pingare tutti i tuoi dispositivi direttamente con il loro indirizzo IP. Questa soluzione sicuramente funziona con tutte le comunicazioni ethernet non sono sicuro funzioni con Profinet.

    Il router inoltre supporta ZeroTier oltre a altre VPN come OpenVPN in questo modo se è connesso ad Internet potrai raggiungere da Internet tutti i dipositivi per la teleassistenza.

    in risposta a: Problema lettura/scrittura REAL su PLC SlimLine #82499
    Sergio Bertana
    Amministratore del forum

    Ho dato una occhiata alla allocazione delle variabili e se ho capito la tua tabella vedo che sullo SlimLine le variabili REAL sono allocate correttamente ad indirizzi divisibili per 4 e correttamente distanziate di 4 bytes tra di loro in entrambi i sistemi (Esempio %MR100.2004, %MR100.2100).

    L’indirizzo sul pannello Weintek è corretto (40000+(Indirizzo/2)), quindi %MR100.2004->%MDW-41002, %MR100.2100->%MDW-41050, ecc. quindi non capisco dove possa essere il problema considerando che su MPS054C100 funziona e su MPS056A110 no, visto che il sistema operativo dei due modelli è lo stesso. Azzardo ipotesi sul tuo problema (Vedi screenshot).

    • Gli asterischi negli oggetti di visualizzazione numerica appaiono quando il valore della variabile supera il valore di range definito, quindi se la tua variabile REAL sullo SlimLine esce dal range il pannello visualizza asterischi al posto del valore (Vedi immagine 1).
    • Il formato della variabile in visualizzazione è stato definito di tipo 32-bit Float (Vedi immagine 1).
    • Se visualizzi e/o imposti da debug in LogicLab il valore della variabile REAL nel programma SlimLine ad un valore compreso nel range definito vedi ancora gli asterischi.
    • Siccome a quanto dici le variabili a 16 bits sono visualizzate correttamente, non è che hai erroneamente definito una regola di Data conversion nel device riferito al MPS056A110 (Vedi immagine 2).
    in risposta a: Merge tra più file TAGs generati dal Symbols converter #82472
    Sergio Bertana
    Amministratore del forum

    Utilizzare l’utility di import di EasyBuilder per importare i files di TAGs generati nei vari programmi. Per evitare che l’importazione di un nuovo file di TAGs provochi la cancellazione delle TAGs precedentemente importate occorre disattivare la flag Remove old tags (Screenshot). Quando si genera un nuovo file di TAGs a seguito della modifica di un programma SlimLine occore:

    • Eseguire una importazione attivando la flag Remove old tags di uno dei files, in modo da eliminare tutte le TAGs presenti lasciando solo le nuove importate.
    • Eseguire una importazione disattivando la flag Remove old tags di tutti gli altri files di TAGS, in modo da aggiungere le nuove TAGs a quelle presenti.

    In alternativa è possibile scrivere un semplice programma batch che esegue il merge dei vari file di TAGs in un unico file che poi potrà essere importato nel progetto EasyBuilder. Contenendo tute le TAGs l’importazione del file và fatta attivando la flag Remove old tags. Ecco un esempio di script batch.

    copy /b ProjectA\TAGsProjectA.csv+ProjectB\TAGsProjectB.csv TAGs.csv

    Nell’esempio 2 files di TAGs generati dal convertitore simboli (TAGsProjectA.csv, TAGsProjectB.csv) sono uniti in un unico file TAGs.csv che potrà essere importato in EasyBuilder attivando la flag Remove old tags. Il comando batch di copia e l’importazione in EasyBuilder andrà eseguita ad ogni modifica dei files di TAGs.

    in risposta a: Gestire con comandi Modbus più inverter #82463
    Sergio Bertana
    Amministratore del forum

    La porta COM da settare è sempre e solo 1… quella che utilizzi per la connessione con tutti gli inverters.

    Come ho scrito non importa il numero di nodo che definisci nelle impostazioni della porta perchè il protocollo utilizzerà il numero di nodo Modbus definito nell’indirizzo del registro…

    Se vedi la mia macro utilizzo sempre lo stesso device server, sempre lo stesso indirizzo di variabile, cambia solo il nodo Modbus.

    in risposta a: Sockets insufficenti su sistema server con TCPDataExchServer #82446
    Sergio Bertana
    Amministratore del forum

    Iniziamo con il dire che guardando il report di SysLog vedo che non hai l’opzione RTC sul sistema Simulated RTC in use quindi tutti gli orari iniziano dall’Epoch time.

    Venendo al tuo problema ricordo che il sistema operativo SFW210C010 supporta fino a 32 sockets, 5 sockets sono già utilizzati dal sistema operativo con il comando NetStat vediamo:

    [Admin]> netstat
     Id  Proto  Local Address          Foreign Address        Status
    [00] UDP    0.0.0.0:9999           *.*                              
    [01] TCP    0.0.0.0:23             0.0.0.0:0              LISTENING 
    [02] TCP    0.0.0.0:502            0.0.0.0:0              LISTENING 
    [03] TCP    0.0.0.0:80             0.0.0.0:0              LISTENING 
    [04] TCP    0.0.0.0:21             0.0.0.0:0              LISTENING 
    [05] TCP    192.168.0.181:23       192.168.1.251:58434    ESTABLISHED

    Ad ogni connessione come ad esempio la connessione Telnet (porta 23) si ha un socket aperto in ascolto (LISTENING) ed uno o più sockets (Dipende dal numero di connessioni accettate) in ESTABLISHED. Quindi nel tuo caso non puoi avere 28 connessioni perchè dalle 32 devi già toglierne 5 e comunque il FB TCPDataExchServer per gestire 28 connessioni utilizza 29 sockets (1 in LISTENING e 28 in ESTABLISHED).

    Per capire quanti sono effettivamente i client connessi devi eseguire il comando NetStat e verificare quanti sockets hai in ESTABLISHED sulla porta definita del server. Per avere accesso al sistema sia in Telnet che in LogicLab ed in HTTP occorrono almeno 8 sockets liberi, quindi il massimo di clients che puoi gestire sono 24.

    Nel tuo caso avendo 28 clients ti consiglio di configurare 2 sistemi come server magari scambiando i dati tra di loro con il FB DataTransfer per tenere l’area di memoria sincronizzata tra di loro.

    in risposta a: Gestire con comandi Modbus più inverter #82437
    Sergio Bertana
    Amministratore del forum

    Devi configurare come dispositivo server un dispositivo Modbus RTU, configurare la porta con i corretti parametri di comunicazione. Per al comunicazione multidrop dai una occhiata al capitolo Come definire nodo Modbus in comunicazioni RS485 e/o TCP multidrop ? nelle FAQs.

    In pratica si indica il numero di nodo seguito dall’indirizzo della variabile, esempio 01#40016 (Nodo 1, variabile 40016), 02#40016 (Nodo 2, variabile 40016), …. Il numero di nodo và sempre indicato con 2 cifre.

    Ora dovendo dare il comando di marcia e di stop contemporaneamente su più inverter credo che la soluzione più semplice sia realizzare una macro utilizzando la funzione SetData per trasferire il valore di una LW sull’inverter.  Dovrai eseguire una SetData per ogni inverter. Ecco un esempio:

    macro_command main()
    short Command
    
    GetData(Command, "Local HMI", LW, 10, 1) //Leggo valore LW 10
    SetData(Command, "MODBUS RTU (Zero-based Addressing)", 3x, 01#8192, 1) //Comando inverter 1
    SetData(Command, "MODBUS RTU (Zero-based Addressing)", 3x, 02#8192, 1) //Comando inverter 2
    SetData(Command, "MODBUS RTU (Zero-based Addressing)", 3x, 03#8192, 1) //Comando inverter 3
    SetData(Command, "MODBUS RTU (Zero-based Addressing)", 3x, 04#8192, 1) //Comando inverter 4
    
    end macro_command

    Se esgui la macro a tempo scrivendo nella LW 10 i valori di start e di stop gestisci tutti gli inverter. Nota che ho scelto il protocollo MODBUS RTU (Zero-based Addressing), che ha offsert 0 quindi l’indirizzo 2000H -> 8192 l’ho definito senza sommare 1. Ho scritto la macro senza testarla spero funzioni.

    in risposta a: Gestire con comandi Modbus più inverter #82426
    Sergio Bertana
    Amministratore del forum

    Per gestire l’inverter da Modbus con i nostri PLC abbiamo realizzato il FB InvtGD20EU, che gestisce tutte le funzioni. Ma mi sembra di capire che tu vuoi gestirlo da un pannello operatore.

    Al capitolo 7 del manuale inverter trovi tutte le informazioni sul protocollo Modbus e trovi anche la tabella con i registri su cui operare per gestire l’inverter da Modbus. Come puoi vedere nella tabella per comandare l’inverter in marcia devi impostare il valore 0001H nel registro Modbus 2000H il valore 0005H forza lo stop.

    Per permettere la gestione da Modbus devi impostare alcuni registri ti rimando al capitolo Comando da Modbus di questo articolo. Naturalmente dovendo gestire più inverter dovrai realizzare una connessione multidrop in RS485 ed assegnare indirizzi di nodo diversi ad ogni inverter.

    Poi sul pannello dovrai configurare la connessione ai singoli inverter e con un comando Modbus 16#06 Preset single register scrivere il valore desiderato nel registro 2000H di tutti gli inverter.

    Attenzione all’offset sull’indirizzo gli indirizzi definiti sul manuale sono i reali indirizzi dei registri (Offset 0), il protocollo Modbus prevede l’offset di 1 sull’indirizzo, quindi se il pannello operatore gestisce correttamente l’offset per accedere al registro 2000H dovrai definire il registro 2001H.

    in risposta a: Come utilizzare gli I/O dei moduli CPU e di estensione #82407
    Sergio Bertana
    Amministratore del forum

    Nei ns sistemi come in tutti i PLC gli I/O sono gestiti in immagine di processo (Vedi articolo), quindi il sistema operativo riconosce i moduli presenti e provvede a gestire gli I/O mappandoli in datablock di memoria. Gli ingressi saranno indirizzabili con %IXaaa.bb e le uscite con QXaaa.bb dove

    • aaa: Indica l’indirizzo del modulo da 0 a 15 (255 per il modulo CPU).
    • bb: Indica l’I/O sul modulo.

    Quindi il modo corretto è definire il nome dell’I/O mappandolo correttamente cone %IX o %QX. Esempio

    • Start AT %IX0.1 : BOOL; (* Di 01 Module 0 *)
    • Stop AT %IX0.2 : BOOL; (* Di 02 Module 0 *)
    • Motor AT %QX255.0: BOOL; (* Do 00 CPU module *)

    Esistono dei FB che permettono di gestire direttamente gli I/O sui moduli SysGetPhrDI e SysSetPhrDO, utilizzando questi FB lo stato dell’ingresso viene acquisito immediatamente e l’uscita viene settata immediatamente. Questi FB si utilizzano in casi particolari, quando ad esempio occorre acquisire velocemente un ingresso o gestire velocemente un’uscita eseguendone la gestione in task Fast che può essere eseguita ogni 1mS o anche più velocemente.

    Il FB CPUModuleIO è un vecchissimo FB il cui uso è ormai deprecato da tempo.

Stai visualizzando 15 post - dal 106 a 120 (di 4,368 totali)