Risposte nei forum create
-
AutorePost
-
Sergio Bertana
Amministratore del forumLe domande non sono mai banali, sono un modo per capire meglio il sistema.
Con “Eseguito ciclicamente dall’alto verso il basso” si intende l’esecuzione del programma è eseguita dall’alto verso il basso ma ogni riga di programma viene valutata ed eseguita, quindi nelle righe che tu citi MIDx viene prima incrementato e poi sulla riga successiva viene controllato (Quindi ha già il nuovo valore).
Per quanto riguarda gli I/O logici invece, si parla di immagine di processo gli ingressi sono acquisiti ciclicamente prima di iniziare l’esecuzione del programma e le uscite sono gestite al termine della esecuzione del programma. Questo per avere lo stato degli ingressi che non cambia per tutto il loop di esecuzione programma, se fossero letti nel momento in cui li controllo potrei avere in un punto l’ingresso disattivo ed in un altro l’ingresso attivo.
Complimenti hai scoperto l’errore… in effetti se il primo comando da eseguire (Definito nella struttura MdbCfg) è un comando di scrittura, quindi alla prima esecuzione del programma, verrebbe scritto un valore non corretto, poi ai loop successivi tutto torna a funzionare. Per evitare il problema basterebbe definire come primo comando nella struttura un comando di read.
A mia scusa (Non faccio mai errori), l’esempio l’ho ricavato da un taglia/cuci di un programma fatto per un cliente ed ho cucito male…
Sergio Bertana
Amministratore del forum1. In effetti c’è un problema sulla finestra di Welcome, se manca connessione ad Internet si blocca, stiamo già lavorando per risolvere il problema. A breve rilasceremo una patch con la soluzione.
2. Problema segnalato ad Axel, siamo in attesa di una loro risposta.
3. La nuova versione nell’onda delle specifiche IEC61131 è più restrittiva sulle assegnazioni. In effetti un pointer è una variabile a 32 bits, quindi poteva benissimo essere passata in una variabile UDINT. Ma in realtà và definita correttamente come pointer.
Sergio Bertana
Amministratore del forumNon ne ho idea….
Ho girato la richiesta ad Axel che sviluppa LogicLab e stò attendendo la risposta…Sergio Bertana
Amministratore del forumIl file system dello SlimLine considera la SDCard non operabile al volo, questo perchè deve gestire la sicurezza sui dati in FAT (Spegnimenti random con file aperti). La gestione prevede una transazione dei dati sulla memoria FRAM interna. Alla accensione viene eseguita una scansione della intera FAT e se vi era una transazione non correttamente chiusa i dati in FRAM sono copiati nella SDCard.
Inoltre se usi la formattazione eFAT hai la possibilità di definire i nomi dei files con 14 caratteri (Compreso il punto) con caratteri maiuscoli e minuscoli. Se usi la formattazione FAT standard puoi solo usare nomi 8+3 tutti in maiuscolo.
Per il trasferimento dei dati verso l’esterno del sistema puoi utilizzare l’accesso in FTP (Il sistema gestisce sia il server che il client FTP).
Sergio Bertana
Amministratore del forumIn effetti l’algoritmo utilizzato nello sviluppo di questo driver di comunicazione ha alcune particolarità che lo complicano. Intanto posto l’intero progetto LogicLab con tutti i FB utilizzati pronto per essere utilizzato come dimostrativo (Download programma).
La variabile FMIDx (* Force Modbus index *), è utilizzata per forzare il comando di scrittura Modbus, siccome per velocizzare lo scambio dati i comandi di scrittura sono eseguiti solo sulla variazione del valore da scrivere ho previsto di comunque scrivere il valore ciclicamente così se per caso ci fosse una disincronizzazione tra quello che lo SlimLine pensa di avere scritto e quello scritto nel sistema ci si risincronizza.
Il programma è eseguito ciclicamente dall’alto verso il basso, quando ho il Done a TRUE significa che il comando Modbus è terminato e posso inviare un’altro comando. Quindi dovendo inviare un comando di scrittura devo caricare il valore da scrivere poi dare il comando Enable:=TRUE.
Se noti il FB ModbusMaster MMdb(); (* Modbus master communication *) è eseguito dopo avere posto Enable:=FALSE, quindi entrando in FB con Enable disabilitato inizializzo gestione e resetto Done pronto per il prossimo giro di esecuzione ad essere attivato.
Sergio Bertana
Amministratore del forumCosa dice lo slogan del nostro sito di supporto…
Benvenuto sul sito di supporto Elsist, Siamo qui per aiutarti.Sergio Bertana
Amministratore del forumIl counter hardware del modulo CPU non ha la possibilità di gestire gli ingressi hardware di reset e di reverse. Questa cosa è possibile sui counter presenti su alcuni moduli di estensione I/O dove settando opportunamente l’ingresso Mode del SysGetCounter è possibile definire quale ingresso hardware del modulo deve essere connesso al comando di reset e quale al comando di reverse.
Come vedi dalla documentazione per ogni comando possibile (Clock, Reset, Reverse) ci sono 3 bits di mode e 5 bits di selezione ingresso. Con 5 bits puoi indirizzare ognuno dei possibili 32 ingressi massimi di un modulo di estensione.
Però non capisco la tua perplessità sulla opzione software è estremamente semplice e flessibile, non solo puoi resettare ma puoi anche presettare il valore che desideri. Il comando da ingresso hardware si utilizza solo quando si deve eseguire il reset su un evento esterno molto veloce (Esempio ipotizzando di dover contare i denti di una ruota dentata che ruota velocemente azzerando il conteggio ad ogni giro su un proximity di zero la cui durata dell’impulso è inferiore al mS tempo in cui si potrebbe anche gestire da software campionando l’ingresso nella task Fast).
Sergio Bertana
Amministratore del forumDevi visualizzare la lampada nei due stati e spostare la posizione della etichetta per farle sovrapporre, o posizionarle dove tu desideri stiano in ogni stato. Cerco di spiegartelo con un screenshot.
Con la selezione di copia degli attributi della label in tutti gli stati tu copi solo il tipo e la dimensione del carattere ma non la posizione di visualizzazione.
Sergio Bertana
Amministratore del forumSysMAlloc has 4096 bytes of reserved memory, every time the function is called the specified amount of memory is subtracted from the total memory available. The function returns the pointer to the allocated memory (Type @USINT), if there’s no space available NULL is returned.
SysMAlloc can be called all time you need a memory buffer, but remind that the allocated memory cannot be released. So every time the function is called the specified amount of memory is subtracted from the total memory available. All the SysMAlloc memory is released when user program starts.
SysRMAlloc has 20 KBytes of reserved memory, every time the function is called the specified amount of memory is subtracted from the total memory available. A UDINT buffer is needed by the function to store the pointer to the allocated memory. If there’s no space available the UDINT buffer is set to NULL and FALSE is returned. Instead of the SysMAlloc, the allocated memory can be released by calling the SysRMFree function.
Note that SysRMAlloc uses a completely different allocation mechanism than SysMAlloc, the allocated memory is moved run time by the operating system to optimize the memory space. This obviously causes that the pointer to the allocated memory can be modified (For this reason a buffer to store it is necessary).
So every time a buffer allocated by SysRMAlloc is used it’s mandatory to refer to the address stored in the UDINT buffer passed to it and it’s not possible to use copies of it.
Pointers returned by SysMAlloc e SysMAlloc are aligned so no alignment is needed, obviously when a misaligned buffer is allocated, with the next call, up to 3 bytes of memory can be lost.
Sergio Bertana
Amministratore del forumIl counter hardware della scheda CPU come quelli presenti nelle schede di I/O hanno la possibilità di essere resettati in hardware da un ingresso digitale. Non è prevista però la possibilità di reset e/o preset da software, perchè il problema è facilmente aggirabile con un semplice calcolo matematico sul valore di conteggio.
La tecnica di manipolazione del valore in uscita da un contatore è ampiamente trattata in alcuni topics relativi alla quota encoder dove si deve gestire un problema del tutto simile al tuo (Topic, topic).
Sergio Bertana
Amministratore del forumIl convertitore ATC-1200 come tutti i convertitori Ethernet/Seriale veicolano i dati tra la connessione Ethernet e la seriale. Se come immagino il tuo generatore di vapore è un server Modbus TCP a livello di connessione puoi usare un ATC-1200 settato come client per connettersi al generatore. Ma poi per comunicare dovrai sulla porta seriale utilizzare dei pacchetti Modbus TCP e non Modbus RTU e non sò se il tuo PLC ha questa possibilità.
Pe eseguire la conversione tra i due protocolli ti serve un Gateway come l’ATC-3002 o come il TRP-C37M, questi prodotti eseguono la conversione di protocollo.
Visto che usi PLC se vuoi a costi paragonabili puoi utilizzare un nostro modulo CPU SlimLine che permette di connettersi direttamente via Modbus TCP, oppure di veicolare il modbus TCP anche sulla seriale o con il FB ModbusTCPGateway (Vedi topic) può comportarsi come un gateway Modbus.
Ottobre 8, 2018 alle 12:00 pm in risposta a: Spazio di lavoro personalizzabile in opzione di progetto #45560Sergio Bertana
Amministratore del forumLo spazio di lavoro personalizzabile permette di suddividere il progetto in più cartelle virtuali all’interno di LogicLab. Questo rende più “leggibile” il progetto permettendo di raggruppare per cartelle le varie sezioni in cui si compone.
Un’altra particolarità ancopra più interessante è quella di poter definire dei gruppi di variabili tramite il menù Nuovo gruppo variabili. Questo permette di raggruppare le variabili per funzione, ad esempio è possibile definire il gruppo Inputs per raggruppare tutti gli ingressi, Outputs per raggruppare tutte le uscite, ecc…
Quindi lo spazio di lavoro personalizzabile è un modo per avere un progetto più ordinato, ma non ha alcun effetto sul codice generato.
Sergio Bertana
Amministratore del forumSi con la JSONEncode puoi creare stringhe JSON da inviare come publisher verso il broker, in pratica ad ogni chiamata del FB accodi alla stringa risultato una coppia nome/valore.
Con la JSONDecode invece puoi estrarre da una stringa JSON ricevuta dal broker come subscriber il valore della variabile di cui definisci il nome. Se la variabile con quel nome non esiste nella stringa JSON oppure è di tipo diverso (Tu cerchi una stringa mentre la variabile è numerica) viene ritornato errore.
Ma se per condividere dati verso altri sistemi l’MQTT è la soluzione migliore, per lo scambio dati tra sistemi SlimLine sia per velocità che per facilità di uso consiglio la libreria eLLabRESTSvcLib. Anche se comprendo che essendo usuale l’utilizzo di una tecnica a volte si è restii a cambiare, ma nel cambiamento a volte si scoprono nuove opportunità.
Sergio Bertana
Amministratore del forumIn MQTT non ci sono formati particolari, solitamente si usano stringhe di testo oppure come vuoi fare tu stringhe in formato JSON.
Nella libreria eLLabRESTSvcLib (Scaricabile da qui) trovi oltre al blocco funzione per la gestione del servizio REST anche i FB per la codifica e decodifica JSON (Estratto manuale).
Per lo scambio dati tra sistemi sia in rete locale che su Internet dai una occhiata alla libreria eLLabDataExchLib (Vedi topic), che può essere una alternativa all’MQTT, sopratutto non necessita di un broker ed il trasferimento dei dati è pressoché in tempo reale.
Sergio Bertana
Amministratore del forumAggiungo che per mantenere compatibilità con i programmi scritti quando si apre su disco un file esempio Storage/NomeFile viene automaticamente puntata la cartella C:/Storage. Quando si apre un file esempio SDCard/NomeFile viene automaticamente puntata la cartella D:.
Quindi le definizioni Storage/File.txt e C:/Storage/File.txt sono equivalenti come sono equivalenti le definizioni SDCard/File.txt e D:/File.txt.
Se non si definisce in formattazione la dimensione del cluster viene scelta automaticamente la dimensione ottimale. Ricordo che più grande è la dimensione più veloce è l’accesso al disco ma si spreca più spazio.
-
AutorePost