Alessandro Campodonico
Risposte nei forum create
-
AutorePost
-
Febbraio 27, 2025 alle 2:58 pm in risposta a: Acquisizione valori via Modbus da contatori Iskraemeco #79936
Alessandro Campodonico
PartecipanteIo utilizzo la versione 5.12.0.36 di logiclab nella gestione libreria non ho l’opzione per aggiungere il pacchetto di libreria, per adesso preferisco non aggiornare in quanto mi ritrovo ( con vecchi programmi ) ad avere decine e decine di problemi in compilazione, per ora preferirei rimanere cosi.
Ho importato eGETReal ora però non trova PVOID, cè un elenco della posizione di tutte queste funzioni o FB necessarie cosi da importarle tutte?
Febbraio 27, 2025 alle 1:46 pm in risposta a: Acquisizione valori via Modbus da contatori Iskraemeco #79920Alessandro Campodonico
PartecipanteGrazie mille per le dritte,
Si il mio problema è che devo leggere la corrente di un inverter tramite Modbus, e l’inverter appoggia la variabile float su 2 registri consecutivi WORD, quindi devo combinarli insieme e convertirli in REAL.
La prima parte l’ho fatta (anche se WordsToDouble mi restituiva un errore “funzione sconosciuta” alla fine cercando un ho visto che nella libreria eLLabUtyLib cè l’FB WordsToDouble)
Il problema ora è che anche eGetREAL mi ritorna errore ” funzione sconosciuta” ma non sono riuscito a trovarlo in nessuna libreria, come posso risolvere?
Febbraio 26, 2025 alle 6:23 pm in risposta a: Acquisizione valori via Modbus da contatori Iskraemeco #79882Alessandro Campodonico
PartecipanteRispolvero questo vecchio post ho provato ad utilizzare la funzione, con il seguente codice
CombinedValue : DWORD; CombinedValueR : REAL; CombinedValueR:=IEE754DoubleToFloat(ADR(CombinedValue));
Ma purtroppo ottengo un errore in compilazione SDF(1) – errore G0101: VALUE => Tipo non corrispondente in assegnazione.
La mia necessità sarebbe quella di leggere tramite modbus la corrente di assorbimento presa da 2 registri consecutivi a 16 bit, concatenarli in 1 variabile dword e convertirli in float(real).
Ho visto che avete FB WordToDouble e questa funzione IEE754DoubleToFloat, con questi due sistemi dovrei riuscire ad ottenere quello che mi serve, il problema è l’errore in compilazione.
Alessandro Campodonico
PartecipanteBuongiorno, ho provato ad eseguire il comando consigliato. questo è il risultato:
[Admin]> I2CSts Find devices on I2C Auxiliary bus Device: 104 (0x68) Found Find devices on I2C extension bus Device: 32 (0x20) Found Device: 33 (0x21) Found
Il modulo è un Cortex M7 Extended RS485 che se non erro dovrebbe avere già di default RTC a bordo.
Se eseguo un reboot della CPU, RTC torna a funzionare per un pò di tempo, poi ad un certo punto smette di funzionare. ho scaricato il file Log.txt tramite FTP ma tutti i Logs sono uguale a questo:
[15/02/2023 00:20:44.472] [E] SFR050[ 3040] RTC read error
Ho provveduto ad eliminare il file Logs sulla CPU e fare un reboot, per cercare di scaricare il file Logs al momento del blocco dell’RTC.
Alessandro Campodonico
PartecipanteMi sono imbattuto in questa vecchia discussione, in quanto sarei interessato al reboot dello SlimLine da programma utente.
Mi chiedevo se negli anni sia stata implementata una “sistema alternativo per riavviare lo slimline da programma, o se è sempre da tenere valida la soluzione
WHILE (Di00CPU) DO END_WHILE
Alessandro Campodonico
PartecipanteGrazie mille per la risposta,
In realtà mi stai confermando quello che gia sospettavo ( un problema di disturbi ), in quanto ho una valvola proporzionale che a volte nonostante il comando analogico sia fisso fa qualche scatto, quindi penso proprio ci sia qualche disturbo che circola nel quadro, i cavi del bus non sono schermati, ma sono molto corti sarà 1 metro in tutto, pero penso ci sia qualche cavo che va fuori dal quadro con qualche problema.
Appena torno a bordo ricontrollerò!
Alessandro Campodonico
PartecipanteGrazie mille per la risposta, veloce e precisa come sempre, in questi giorni farò una prova.
Alessandro Campodonico
PartecipanteGirovagando nel forum sono venuto a conoscenza di questo FB ACModbus, considerando che in determinate strumentazioni utilizzo i vostri sistemi per comunicare via Modbus RS485 con 5 Inverter, mi piacerebbe avere qualche info in piu su questa FB che presumo sia nata recentemente.
Se non ho capito male viene “comodo” usarla quando si ha necessita di leggere registri non consecutivi su più Device, corretto?
In che modo migliora la comunicazione? L’utilizzo di questa FB potrebbe migliorare le performance della comunicazione e quindi anche la velocita?
Grazie mille per le delucidazioni
Alessandro Campodonico
PartecipanteGrazie della risposta, incollo anche la parte di codice dove inserisco i dati nel registro FIFO.
// ------------------------------------------------------------------------- // TEMPORIZZAZIONE INVIO // ------------------------------------------------------------------------- // Eseguo invio di 38 valori ogni ora. IF ((SysDateTime-DateTime) < 3600) THEN CaseNr:=0; RETURN; END_IF; // Temporizzo invio tra i valori (Invio ogni 1/2 secondo). IF ((SysGetSysTime(TRUE)-TimeBf) < 500000) THEN RETURN; END_IF; TimeBf:=SysGetSysTime(TRUE); //Time buffer (uS) // ------------------------------------------------------------------------- // INVIO DATI // ------------------------------------------------------------------------- // Gestione case programma. i:=Sysmemset(ADR(RESTVars.Request), 0, SIZEOF(RESTVars.Request)); //REST request CASE (CaseNr) OF 0: RESTVars.JEncode(Object:=ADR(RESTVars.Request), OSize:=SIZEOF(RESTVars.Request), Name:=ADR('Nr Partenze Pompa 1'), VType:=WORD_TYPE, VAddress:=ADR(IMPULSI_POMPA_1_HMI), Count:=1); 1: RESTVars.JEncode(Object:=ADR(RESTVars.Request), OSize:=SIZEOF(RESTVars.Request), Name:=ADR('Nr Partenze Pompa 2'), VType:=WORD_TYPE, VAddress:=ADR(IMPULSI_POMPA_2_HMI), Count:=1); 2: ... 3: ... Continuo con l'invio dei vari dati (Ci sono 38 invvi totali) 37: ... ELSE DateTime:=SysDateTime; //Date/Time Epoch END_CASE; // ------------------------------------------------------------------------- // INVIO REST // ------------------------------------------------------------------------- CaseNr:=CaseNr+1; //Case programma RESTVars.FIFO(In:=TRUE, Dp:=ADR(RESTVars.Request), Dls:=LEN(RESTVars.Request)); //Write record on FIFO // [End of file]
Alessandro Campodonico
PartecipantePerfetto pare che aggiornando al ModbusMaster_v1 il problema sia sparito.
Sempre molto disponibili e utili come sempre!
Alessandro Campodonico
PartecipanteGrazie della veloce risposta, volevo provare ad aggiornare la libreria con il FB ModbusMaster_v1 dove lo trovo?
Alessandro Campodonico
PartecipanteStò utilizzando con ottimi risultati il FB Modbus Master per comunicare con 5 inverter. Però in modo apparentemente casuale il FB mi riporta un errore che spiandolo con Toolly è 10007506, se non ho capito male indica un errore nella ricezione dati, questo errore comunque non interrompe la comunicazione, che prosegue senza problemi. L’errore viene fuori a random un pò su tutti gli inverter più o meno ogni 2/4 minuti, ecco il report della console di spionaggio
03:23:03 (.310)|Tx|02 03 1C 20 00 01 82 63 03:23:03 (.011)|Rx|02 03 02 00 03:23:03 (.002)|Rx|Error:10007606, On Case:212, Back:51 ... 03:23:05 (.310)|Tx|03 03 1C 20 00 01 83 B2 03:23:05 (.016)|Rx|02 03 02 00 05 01 B7
Si vede chiaramente che nella risposta mancano dei caratteri ma non capisco il motivo. La configurazione di Baud rate ecc direi che è corretta altrimenti penso non comunicherebbe mai, invece riesco a comandare gli inverter.
Il timeout è 100mS, il delay è 10mS (ma anche portandolo a valori più alti 300mS) il problema si presenta lo stesso. Qualche Consiglio ?
Marzo 27, 2020 alle 11:04 am in risposta a: Libreria per comunicazione tra sistemi su Internet #54304Alessandro Campodonico
PartecipanteSto testando la libreria con un PLC master e 1 Slave (per ora), perche dovrei realizzare un programma di un macchinario (master) che trasferisce e riceve informazioni da qualche slave, per ora saranno un paio poi aumenteranno a circa 10. Mi servirebbero però alcuni chiarimenti a dei dubbi che mi sono venuti e che non sono riuscito a chiarirmi da solo.
1) Nel manuale allegato all’ultima versione di logiclab nella pagina dedicata a TCPDEXCHNODEDEFS si evidenziano ingressi e uscite che in realtà nel programma dimostratico non sono riuscito a trovare ad esempio AutoTxD, TxHeartbeat, RxHeartbeat. Nonostante abbia provato a eseguirlo.
Inoltre trovo un’incongruenza nella descrizione di RxOk | BOOL | R | Rx data Ok. Settato su ricezione dati dall’altro sistema, i dati sono stati trasferiti in RxBuffer. Deve essere resettato da programa utente.
Poi sotto si legge che
I campi RW devono essere impostati dal programma utente, i campi R non devono essere modificati da programma utente, possono solo essere letti. siccome RxOk fa parte del gruppo “R” non capisco se bisogna resettarlo oppure no, in caso affermativo come?
2) Nel FB TCPDataExchClient cè una variabile ingresso Heartbeat, impostata a 5 (s) da quello che ho capito è un atutomatismo per mandare un pacchetto per controllare la connessione giusto? in ogni caso ho provato a cambiare il valore, se provo a mettere un valore minore di 5 il TCPDEXCHNODEDEFS va in errore, 5 secondi è il tempo minimo?
3) Sempre nel manuale nella pagina riguardante TCPDataExchClient non riporta come variabili Heartbeat come se non ci fosse, ma in realta nel fb è presente.
4) Non mi è chiaro come si potrebbe gestire un controllo sulla comunicazione, l’unica cosa che mi è venuta in mente è controllare la variabile Active di TCPDEXCHNODEDEFS, in true quando connessione stabilita e false quando connessione non riuscita è esatto? ci sono altri metodi?
5) In caso i parametri da passare ai PLC fossero di size diverse (word, doppie word e real) come dovrei gestire il trasferimento dati a txbuffer. dovrei istanziare un altro FB TCPDataExchClient e TCPDEXCHNODEDEFS, ma non avendo un’uscita done non saprei.
Per adesso direi basta vediamo se mi vengono altri dubbi.
Alessandro Campodonico
PartecipanteHo preso spunto dal programma che hai postato. queste sono le istruzioni:
IF (SysFirstLoop) THEN TimeBf:=SysTime; END_IF; K:=6.0/TO_REAL(Sec); (* Costante per risultato divisione *) Sec:=500; (* Tempo in millisecondi *) IF ((SysTime-TimeBf) < Sec) THEN RETURN; END_IF; TimeBf:=SysTime; (* Time buffer (uS) *) (* Calcolo litri ogni volta che è passato il tempo "Sec" *) MemoCtr:=CONT.Value-MemoCtr; (* Memo counter *) L_Min:=((TO_REAL(MemoCtr)*1.815714)*K)/2; (* Litri istantanei (L/Min) *); MemoCtr:=CONT.Value; (* Memo counter *) (* [End of file] *)
Poi per migliorare un po la risoluzione ho settato CONT.Mode A 64 cosi da contare anche gli impulsi sul fornte di discesa ed avere il doppio degli impulsi, come si nota nella stringa di calcolo L_Min alla fine divido il risultato per “2”
Alessandro Campodonico
PartecipanteMi è arrivato il sensore, e ho iniziato a fare delle prove. Sto utilizzando il FB SysGetCounter, e riesco a leggere gli impulsi ovviamente sotto forma di counter. Mi servirebbe però un aiuto nella scrittura di un programma che mi calcoli i litri al minuto istantanei in base agli impulsi. Quello che ho realizzato io adesso è il seguente.
LI:=LI+1; IF (LI < 100) THEN RETURN; END_IF; LI:=0; LITRI:=CONT.Value-Counter; Counter:=CONT.Value; ISTA:=LITRI*0.0001666666*600.0;
Praticamente ogni 100 ms calcolo la differenza tra il Cont.value e Counter (la differenza sarebbero gli impulsi in 100ms). La costante 0.0001666666 sarebbe il calcolo da 6000 impulsi su litro e trovo praticamente i litri ad impulso e moltiplico per 600.0. Quello che ho fatto io pare che funzioni abbastanza, ma mi da l’idea che sia poco sicuro, nel senso che quando il counter raggiunge il suo limite e si reinizializza non so che succede.
Altro limite è che confrontando ogni 100ms il numero degli inpulsi è un valore abbastanza piccolo quindi con minima variazione si ha una differenza del risultato abbastanza grande. Potreste suggerirmi qualcosa?
-
AutorePost