Vai al contenuto

Sergio Bertana

Risposte nei forum create

Stai visualizzando 15 post - dal 61 a 75 (di 4,232 totali)
  • Autore
    Post
  • in risposta a: Gestione riscaldatore acqua con uscita PWM #80743
    Sergio Bertana
    Amministratore del forum

    Quindi utilizzi il FB PWMOut per modulare variando il duty-cycle l’uscita di comando della resistenza. Ti ricordo che devi eseguire il programma nella task Fast che eseguita di default ogni 1mS ti permette di suddividere il periodo della frequenza di uscita (100mS) in 100 parti, ottenendo una risoluzione più che accettabile.

    Veniamo ora alla domanda sul Mask, siccome le uscite sono gestite in immagine di processo nella task Slow, per permettere a task diverse dalla Slow di gestire le uscite in modo sincronizzato occorre abilitarne la gestione. Il parametro Mask del FB SysSetPhrDO serve proprio a questo, ogni modulo di uscita può gestire massimo 32 uscite, quindi settando il relativo bit nella DWORD di Mask ne viene abilitata la gestione da parte del FB. Ora se tu vuoi utilizzare l’uscita 1 del modulo di espansione con indirizzo 1 hai sbagliato il Mask, devi definire:

        DOut.Address:=1; //Module address
        DOut.Mask:=16#00000002; //Output mask

    Hai sbagliato anche i valori in AND ed OR sulla gestione di DOut.Value, devono essere 16#FFFFFFFD e 16#00000002. Altro consiglio per gestire DOut.Value, puoi utilizzare semplicemetne l’operando bit in questo modo:

        DOut.Value.1:=Pwm.Out;
    in risposta a: Informazioni su convertitore 1-Wire to Modbus RTU #80717
    Sergio Bertana
    Amministratore del forum

    Il gateway ADA-401WP CEL-MAR permette di utilizzare i sensori 1-Wire in ambienti industriale rendendoli accessibili tramite protocollo Modbus RTU in RS485. Grazie al protocollo Modbus è così possibile acquisire i sensori da programmi PC (SCADA), terminali operatore, sistemi PLC in questo articolo trovi informazioni sulla configurazione del prodotto.

    Quindi se il PLC che utilizzi può gestire la connessioneModbus RTU non ci sono problemi nell’utilizzo.

    Ricordo che nei ns sistemi SlimLine questo modulo CPU dispone nativamente della interfaccia 1-Wire e che in alternativa questo convertitore permette di collegare sensori 1-Wire ad una porta RS232 dei ns moduli CPU. Per l’ambiente di sviluppo LogicLab esiste il FB OWRdTemperature per l’acquisizione di temperatura ed il FB OWSearch esegue la ricerca degli ID dei dispositivi connessi alla rete1-Wire.

    Una precisazione l’utilizzo del convertitore 1-Wire/RS232 da un qualsiasi PLC o PC non è trasparente, occorre gestire una serie di comandi complessi che nei nostri sistemi sono gestiti dal FB OWireCore.

    in risposta a: Connessione sensore 4-20mA ad ingresso analogico modulo CPU #80602
    Sergio Bertana
    Amministratore del forum

    Dalle informazioni riportate sullo schema non si capisce se il tuo sensore è un sensore che si autoalimenta dall’uscita del segnale 4-20mA oppure se è un sensore alimentato e quindi in grado di generare autonomamente l’uscita 4-20mA. Sul modulo CPU si utilizza un ingresso 0-10V per acquisire la corrente, la resistenza di carico da 500Ohm serve a convertire i 4-20mA in 2-10V.

    • Se il sensore si autoalimenta dall’uscita 4-20mA lo schema è corretto, devi sicuramente alimentarlo con una tensione di 24Vdc, perchè a 20mA di uscita come abbiamo visto cadono 10V sulla resistenza di carico quindi ne rimangono ancora 14 per l’alimentazione del sensore.
    • Se il sensore và alimentato (E visti i segnali Tx, Rx, GND che mi fanno pensare ad una uscita seriale RS232) credo che si tratti di un sensore che richiede una sua alimentazione, in tal caso lo schema è errato. Il sensore è in grado di generare autonomamente i 4-20mA di uscita, quindi ti basta collgare l’uscita (18-) all’ingresso AGnd, e l’uscita (17+) all’ingresso Ai00, mantenendo tra i due morsetti la resistenza di carico di 500Ohm.

    Se il sensore ha una uscita seriale perchè non utilizzarla per il collegamento, dalla connessione seriale sicuramente potrai ottenere più dati è maggiore precisione di una connessione analogica.

    in risposta a: Errore in compilazione dopo aver aggiornato LogicLab #80598
    Sergio Bertana
    Amministratore del forum

    Non dici che errore ti viene segnalato…

    Se hai problemi nella compilazione di un progetto, puoi inviare alla nostra eMail di supporto il progetto oppure contattami telefonicamente così vediamo insieme qual’è il problema.

    Sergio Bertana
    Amministratore del forum

    Nella nuova versione FileMemoryDump_v1 è stato aggiunto parametro Mode per selezionare il modo in cui i dati sono presenti nel file. Ora definendo il modo FILEMDUMP_MODE#ASCII viene utilizzata una formattazione ascii che è più leggibile rispetto alla formattazione binaria.

    E’ stato aggiunto anche il parametro FPOfs, che permette di utilizzare un offset sull’accesso in lettura/scrittura sul file definito, questo permette di accodare ad un file esistente altra memoria.

    E’ stato modificato il nome ai parametri MBufferPtr che diventa MBAdd e MBufferSize che diventa MBSize.

    Ecco un programma che utilizza la vecchia versione.

    VAR
        DBuf : ARRAY[0..15] OF BYTE; (* Data buffer *)
        MDump : FileMemoryDump; (* FBinstance *)
    END_VAR
    
        // -------------------------------------------------------------------------
        // MEMORY DUMP
        // -------------------------------------------------------------------------
        // On set by debug the Read or Write command the memory is read or write on
        // file. The command resets when operation is finished.
    
        MDump.MBufferPtr:=ADR(DBuf); //Dump memory address
        MDump.MBufferSize:=SIZEOF(DBuf); //Dump memory size
        MDump.Filename:=ADR('C:/MRetain.txt'); //Dump memory file
        MDump(); //Execute the FB
        IF (MDump.Done) THEN MDump.Read:=FALSE; MDump.Write:=FALSE; END_IF;

    Ecco come si può modificarlo utilizzando la nuova versione.

    VAR
        DBuf : ARRAY[0..15] OF BYTE; (* Data buffer *)
        MDump : FileMemoryDump_v1; (* FBinstance *)
    END_VAR
    
        // -------------------------------------------------------------------------
        // MEMORY DUMP
        // -------------------------------------------------------------------------
        // On set by debug the Read or Write command the memory is read or write on
        // file. The command resets when operation is finished.
    
        MDump.MBAdd:=ADR(DBuf); //Dump memory address
        MDump.MBSize:=SIZEOF(DBuf); //Dump memory size
        MDump.Mode:=FILEMDUMP_MODE#BINARY; //Dump mode
        MDump.Filename:=ADR('C:/MRetain.txt'); //Dump memory file
        MDump.FPOfs:=0; //File offset
        MDump(); //Execute the FB
        IF (MDump.Done) THEN MDump.Read:=FALSE; MDump.Write:=FALSE; END_IF;
    in risposta a: Utilizzo tastiera esterna USB #80518
    Sergio Bertana
    Amministratore del forum

    No da tastiera esterna non esistono comandi per passare  da un campo all’altro.

    Eventualmente in fase di programmazione da EasyBuilderPro puoi attivare l’intoduzione ordinata in modo che quando si inserisce i dati in un campo alla pressione del tasto invio ci si posiziona direttamente al campo successivo sino alla fine della sequenza o fino alla pressione deal tasto <ESC>.

    in risposta a: Gestione I/O logici da pagina web e connessione con Node-RED #80506
    Sergio Bertana
    Amministratore del forum

    La soluzione è facilmente realizzabile con un MPS056, potrai realizzare una semplice pagina web che tramite il suo server integrato permetterà di visualizzare e gestire da browser gli I/O, in questo articolo esempi di realizzazione di pagine web dinamiche.

    Per avere una idea del risultato puoi eseguire il download dei programmi DataExchange o DoorKeeper, dal quale potrai utilizzare le pagine modificandole per il tuo scopo. Come vedi dallo screenshot le pagine del programma DoorKeeper sono molto più curate la differenza stà nelle capacità grafiche di chi realizza le pagine.

    Per quanto riguarda l’accesso da applicazione in Node-RED si può utilizzare una connessione Modbus TCP nativa nel sistema, oppure puoi realizzare un programma ad-hoc sul PLC che istanzia un server TCP ed un server comandi per gestire l’interfacciamento, questa soluzione è riportata in questo articolo.

    Un’altra possibilità è di utilizzare il FB HTTPServer per creare delle API HTTP di interfaccia, in questo topic trovi ad esempio un programma che gestisce una API per allarmi da telecamere di sorveglianza.

    Ricordo che per aiutare i clienti nello sviluppo delle applicazioni e/o per istruzione sulla programmazione dei sistemi forniamo un servizio di supporto tecnico on-line.

    in risposta a: Decodifica allarmi da richiesta HTTP #80494
    Sergio Bertana
    Amministratore del forum

    Si certo il FB HTTPServer è stato pensato proprio per poter gestire richieste HTTP sia in GET che in POST, ecco il programma HTTPCamera, un esempio pronto all’uso.

    PROGRAM HTTPCamera
    VAR
        CameraNr : UDINT; (* Numero telecamera *)
        APtr : @STRING; (* Auxiliary pointer *)
        TxData : STRING[ 128 ]; (* Tx data *)
        TxHeader : STRING[ 128 ]; (* Tx header buffer *)
        HTTPSv : HTTPServer_v2; (* HTTP server *)
    END_VAR
    
    // *****************************************************************************
    // PROGRAM "HTTPCamera"
    // *****************************************************************************
    // Gestione uscite allarme su richiesta GET da telecamera, la richiesta è:
    // "http://xxx.xxx.xxx.xxx:2000/api/v1/nc/inputs/81/alarm"
    // -----------------------------------------------------------------------------
    
        // -------------------------------------------------------------------------
        // INIZIALIZZAZIONI
        // -------------------------------------------------------------------------
        // Eseguo inizializzazioni.
    
        IF (SysFirstLoop) THEN
            HTTPSv.Enable:=TRUE; //Server enable
            HTTPSv.SpyOn:=TRUE; //Spy active
            HTTPSv.Port:=2000; //TCP Port
            HTTPSv.AConnections:=2; //Accepted connections
            HTTPSv.HTTPBSize:=1024; //HTTP buffer size
            HTTPSv.HPath:=ADR('C:/'); //Home path (Cortex M7)
            HTTPSv.PDefault:=ADR('Home.html'); //Default page
            HTTPSv.Timeout:=2.0; //Execution timeout (S)
            HTTPSv.Header:=eNULL;
            HTTPSv.CORSHeader:=eNULL;
            HTTPSv.pTxData:=ADR(TxData); //Pointer to Tx data
        END_IF;
    
        // -------------------------------------------------------------------------
        // HTTP SERVER
        // -------------------------------------------------------------------------
        // Gestione server ed attesa ricezione richiesta GET.
    
        HTTPSv(); //HTTP server
        HTTPSv.RAck:=FALSE; //Request acknowledge
        HTTPSv.RNAck:=FALSE; //Request not acknowledge
        IF NOT(HTTPSv.RRcvd) THEN RETURN; END_IF;
        HTTPSv.StatusCode:=eNULL; //Status code
        HTTPSv.TxDSize:=0; //Data to send size
    
        // -------------------------------------------------------------------------
        // ARRIVO SU RICHIESTA PAGINA
        // -------------------------------------------------------------------------
        // Spionaggio pagina richiesta per debug.
        // Spionaggio dati ricevuti con richiesta, (Non dovrebbero essercene).
    
        eTO_JUNK(SysWrSpyData(SPY_ASCII, 0, 16#00000001, ADR('Requested page'), HTTPSv.pPage));
        eTO_JUNK(SysWrSpyData(SPY_ASCII, 0, 16#00000001, ADR('Received data'), HTTPSv.pRxData));
    
        // Cerco percorso pagina fino al numero telecamera per verificare se pagina
        // corretta. In caso contrario ritorno HTTP status=404.
    
        APtr:=SysStrFind(HTTPSv.pPage, ADR('api/v1/nc/inputs/'), FIND_GET_END);
        IF (APtr = eNULL) THEN 
            HTTPSv.StatusCode:=ADR('HTTP/1.1 404 Not Found$r$n');
            HTTPSv.RNAck:=TRUE; //Request not acknowledge
            RETURN;
        END_IF;
    
        // Rilevo il numero di telecamera se errato ritorno HTTP status=400.
    
        IF NOT(SysVsscanf(APtr, ADR('%d'), UDINT_TYPE, ADR(CameraNr))) THEN
            HTTPSv.StatusCode:=ADR('HTTP/1.1 400 Bad request$r$n');
            HTTPSv.TxDSize:=TO_UDINT(SysVsnprintf(HTTPSv.pTxData, HTTPSv.HTTPBSize, ADR('%s'), STRING_TYPE, ADR('Wrong camera number')));
            HTTPSv.RAck:=TRUE; //Request acknowledge
            RETURN;
        END_IF;
    
        // Se non presente testo "alarm" ritorno HTTP status=400.
    
        APtr:=SysStrFind(APtr, ADR('/alarm'), FIND_GET_END);
        IF (APtr = eNULL) THEN 
            HTTPSv.StatusCode:=ADR('HTTP/1.1 400 Bad request$r$n');
            HTTPSv.TxDSize:=TO_UDINT(SysVsnprintf(HTTPSv.pTxData, HTTPSv.HTTPBSize, ADR('Alarm not found in camera %d message'), UDINT_TYPE, ADR(CameraNr)));
            HTTPSv.RAck:=TRUE; //Request acknowledge
            RETURN;
        END_IF;
    
        // Messaggio corretto, posso attivare l'uscita relativa al numero di camera.
        // La gestione delle uscite và realizzata in un programma ladder separato.
    
        HTTPSv.TxDSize:=TO_UDINT(SysVsnprintf(HTTPSv.pTxData, HTTPSv.HTTPBSize, ADR('Camera %d on alarm'), UDINT_TYPE, ADR(CameraNr)));
        HTTPSv.RAck:=TRUE; //Request acknowledge
    
    // [End of file]
    in risposta a: Disabilitazione messaggio Pop-Up su inserimento chiave USB #80489
    Sergio Bertana
    Amministratore del forum

    Si il pop-up di dispositivo connesso non è disattivabile, quindi devi accettare che compaia per un attimo.

    in risposta a: Acquisizione lettore Wiegand #80485
    Sergio Bertana
    Amministratore del forum

    Tra i moduli di estensione quelli che prevedono una gestione counter al momento sono:

    • PCB124B010 SlimLine Modulo esp. I/O uscite statiche 16In 8Out + Gestione Counter/Encoder avanzata (4 counters)
    • PCB124B000 SlimLine Modulo esp. I/O uscite statiche 16In 8Out (2 counters)

    Tutti e due i moduli dispongono di 4 ingressi (Di12~Di15) high speed, e con possibilità di settare l’ingresso a 5Vdc. Questo è importante perchè i segnali Wiegand sono a 5Vdc e quindi possono essere acquisiti solo da questi ingressi digitali o dagli ingressi digitali del modulo CPU.

    in risposta a: Acquisizione lettore Wiegand #80470
    Sergio Bertana
    Amministratore del forum

    L’esempio a cui fai riferimento utilizza il FB WiegandDcd che permette di decodificare un codice Wiegand a 26 bits,. Fornendo al FB il numero di bits che compongono il codice ed il codice Wiegand da decodificare il FB darà in uscita il Facillity e IDNumber del codice decodificato.

    Nell’esempio a cui fai riferimento un program eseguito in una task Fast, con tempo di esecuzione settato a 1mS viene acquisito il dato Wiegand da un lettore connesso a due ingressi digitali di un modulo CPU. Come vedi dalle specifiche del protocollo l’ampiezza dell’impulso del segnale Wiegand è compresa tra 20 uS e 100 uS e l’intervallo tra impulsi è compreso tra 200 uS e 20 mS.

    Quindi nell’esempio per poter acquisire ingressi cosi veloci sono stati utilizzati due counters, alla transizione dei due segnali Wiegand si ha un incremento del relativo counter. Ora essendo l’intervallo tra gli impulsi compreso tra 200 uS e 20 mS è importante che il programma esegua il controllo sulla variazione degli ingressi in questo tempo.

    Quindi il tempo di esecuzione del programma và impostato rilevando qual’è il tempo di intervallo degli impulsi del tuo lettore, nel caso del lettore utilizzato nel programma ST_WiegandDcd era necessario controllare gli impulsi ogni 1mS.

    Venendo alla tua domanda se possibile utilizzare gli I/O delle estensioni, precisando che comunque devi utilizzare ingressi counter, devi tenere presente il tempo di acquisizione di un counter da modulo di estensione. Se acquisire un counter sul modulo CPU richiede qualche uS, l’acquisizione da modulo di estensione richiede 300uS dovendo acquisirne 2 sono necessari 600uS. Ora se il programma viene eseguito ogni 1mS utilizziamo più della metà del tempo solo per acquisire i moduli di estensione e questo essendo la task Fast la più prioritaria rallenta l’esecuzione sia della Slow che della Back.

    Quindi la risposta è se il tuo lettore Wiegand ha un intervallo tra impulsi di qualche mS puoi tranquillamente rallentare l’escuzione della task Fast e gestire gli I/O anche da modulo di estensione.

    in risposta a: Importa oggetti su ultima versione LogicLab #80411
    Sergio Bertana
    Amministratore del forum

    La gestione degli oggetti nella nuova versione è uguale alle versioni precedenti. Nella compilazione gli oggetti (FB, funzioni, definizioni, ecc) utilizzati nei programmi seguono questo ordine di ricerca:

    1. Oggetti presenti nel tree di progetto.
    2. Oggetti presenti nelle librerie importate nel progetto.
    3. Oggetti presenti nella raccolta (Package) librerie.

    Quindi se si hanno oggetti “personali” singoli o contenuti in una o più librerie personali è sempre possibile importarli nel progetto. La voce di menù Project->Import Object si abilita/disabilita in base al focus del progetto. Se punti con il mouse il nome del progetto o una cartella nel tree vedrai che l avoce si abilita, ma puoi anche con il tasto destro del mouse eseguire l’import. Nello screenshot si può vedere un esempio di utilizzo di oggetti:

    • Il FB FBStartStop fà parte del progetto.
    • Nel progetto ho incluso una mia libreria MyLib.
    • Nel progetto ho collegato il package di librerie Pck055a040.

    Come si vede dalle warning nel package vi sono oggetti che sono già presenti nel progetto, in questo caso si trovano nella libreria MyLib, quindi nel momento in cui collego il package di librerie questi oggetti vengono ignorati. Nella compilazione saranno utilizzati quelli presenti in MyLib.

    Per poter definire nel progetto o includere librerie che hanno oggetti con lo stesso nome di oggetti presenti nel package occorre eliminare la definizione di package, definire l’oggetto e/o includere la libreria e solo al termine definire il package.

    in risposta a: Disabilitazione messaggio Pop-Up su inserimento chiave USB #80407
    Sergio Bertana
    Amministratore del forum

    E’ possibile deisabilitare la comparsa del Pop-Up tramite i settings sul pannello stesso o tramite bit di sistema LB9063.

    LB-9063 disable(set ON)/enable(set OFF) popping information dialog while finding an USB disk

    in risposta a: Gestione stringhe ascii #80383
    Sergio Bertana
    Amministratore del forum

    Sinceramente non hoi mai trovato questo tipo di problema…

    L’oggetto impostazione/visualizzazione Ascii come hai detto giustamente tu opera su WORD quindi ogni WORD contiene due caratteri Ascii. Se sul tuo PLC la variabile stringa ad esempio è di 16 caratteri tu dovrai definire nell’oggetto la lunghezza di 8 WORDs.

    E nella visualizzazione e/o impostazione non ci saranno spazi, ma il testo verrà visualizzato esattamente come scritto nel PLC (Questo salvo che il PLC non tratti le stringhe in modo particolare), Quello che ho scritto vale sicuramente per i ns sistemi SlimLine ma anche per moltissimi altri PLC con cui i nostri clienti si sono connessi.

    Attenzione al codice tappo, le stringhe Ascii sul PLC possono essere terminate con il codice tappo (16#00) quindi solitamente se definisci una variabile STRING[16] in realtà nella memoria vengono allocati 17 bytes (Uno per il tappo) quindi devo definire lunghezza 9 WORDs. Nessun problema in visualizzazione, quando viene acquisito il valore il codice tappo termina la stringa. Ma in inputazione vegono inviati al PLC 18 bytes e quindi vado a sporcare anche i primo bytes della variabile allocata dopo la variabile STRING, in tal caso occorre lasciare un byte libero o allocare stringhe di lunghezza dispari in  modo che il byte aggiuntivo di tappo le renda di lunghezza pari.

    in risposta a: Come allegare immagini atopic/risposte sul forum #80378
    Sergio Bertana
    Amministratore del forum

    Puoi caricare l’immagine da inviare su un sito di condivisione immagini come ImgBB, PostImage, oppure imgur. Caricata l’immagine ti verrà dato un link che potrai inserire nel tuo messaggio.

Stai visualizzando 15 post - dal 61 a 75 (di 4,232 totali)