Vai al contenuto

Visualizzare su pagina web stato variabili usando puntatori

Home Forum Programmazione IEC 61131 (LogicLab) Visualizzare su pagina web stato variabili usando puntatori

Stai visualizzando 2 post - dal 1 a 2 (di 2 totali)
  • Autore
    Post
  • #60653
    Anonimo
    Inattivo

    Dovrei leggere degli stati, su pagina web, di alcuni ingressi digitali e dato che non sono sequenziali ma per semplicità di programmazione vorrei eseguire una scansione come se lo fossero ho usato dei puntatori, assegnando in modo corretto poi i vari indirizzi degli ingressi.

    G_DoorStatus : ARRAY[0..31] OF @BOOL; (* Door status *)
    G_DoorStatus[0]:=ADR(%IX0.0);
    G_DoorStatus[1]:=ADR(%IX0.1);
    G_DoorStatus[2]:=ADR(%IX0.2);
    G_DoorStatus[3]:=ADR(%IX0.3);

    Da esempi precedenti ho visto che se voglio leggere la variabile da pagine web attraverso Ajax, la variabile deve essere assegnata alla zona di memoria nella DB100.

    Posso assegnare G_DoorStatus in questo caso come un puntatore ad una zona di memoria %Mx100 ? Come calcolo lo spazio occupato, come un BOOLEANO?

    O mi conviene fare variabili di appoggio ed assegnare a queste il valore degli ingressi come ad esempio:

    G_DoorStatus_0 AT %MX100.16 : BOOL;
    G_DoorStatus_1 AT %MX100.17 : BOOL;
    G_DoorStatus_2 AT %MX100.18 : BOOL;
    G_DoorStatus_0:=%IX0.0;
    G_DoorStatus_1:=%IX0.1;
    G_DoorStatus_2:=%IX0.2;
    #60661
    Sergio Bertana
    Amministratore del forum

    Essendo i nostri sistemi basati su architettura a 32 bits un puntatore (Pointer, indicato come @xxxx) occupa 4 bytes di memoria e se allocato in DB100 và allocato sempre ad indirizzi divisibili per 4.

    Come correttamente hai fatto notare il server web agisce solo su variabili allocate in DB100, ma se tu allochi un pointer il server web non ha previsto la visualizzazione del valore della variabile a cui il pointer punta. Quindi se lo visualizzi come DWORD vedresti l’indirizzo della variabile ma non il suo valore.

    Quindi il modo corretto è di appoggiare gli ingressi su variabili BOOL. Ti consiglio di allocare un array di variabili BOOL nella DB100 e poi con un semplice ciclo FOR potrai trasferire dall’array di pointer alle variabili in DB100. E così saranno accessibili da web server agli indirizzi 100.32, 100.33, ecc.

    VAR
    i : UDINT; (* Auxiliary variable *)
    G_DoorStatus : ARRAY[0..31] OF @BOOL; (* Door status BOOL pointer *)
    A_DoorStatus AT %MX100.32 : ARRAY[0..31] OF BOOL; (* Door status BOOL variable *)
    END_VAR
    FOR i:=0 TO (SIZEOF(G_DoorStatus)/SIZEOF(G_DoorStatus[0]))-1 DO
        A_DoorStatus[i]:=@G_DoorStatus[i];
    END_FOR;

    Come in tutti isistemi PLC gli I/O sono gestiti in immagine di processo, e siccome il task real time è lo slow l’immagine di processo è eseguita in task slow. Quando ti riferisci a variabili di I/O in task diverse dall slow LogicLab crea automaticamente una immagine di processo virtuale per garantire che lo stato delle variabili sia costante per tutta l’esecuzione del task.

    Se ti riferisci a variabili di I/O con il loro indirizzo (Esempio %IX0.0) in task diverse, se visualizzi in debug l’indirizzo vedrai che per lo stesso I/O si hanno indirizzi diversi per ogni task sarà LogicLab a trasferirne il valore automaticamente. Ma attenzione il trasferimento del valore nella immagine di processo virtuale delle task diverse dalla slow avviene solo se LogicLab si accorge che la variabile è utilizzata quindi vedi lo scenario.

    VAR
        MyBOOL : BOOL; (* BOOL value *)
        MyBOOLADR : @BOOL; (* BOOL pointer *)
    END_VAR
        MyBOOL:=%IX0.0; //LogicLab si accorge che è usata
        MyBOOLADR:=ADR(%IX0.0); //LogicLab non si accorge che è usata

    Quindi affinchè il tuo programma funzioni ti consiglio di eseguirlo in task slow.

Stai visualizzando 2 post - dal 1 a 2 (di 2 totali)
  • Devi essere connesso per rispondere a questo topic.