Sergio Bertana
Risposte nei forum create
-
AutorePost
-
Settembre 29, 2025 alle 10:48 am in risposta a: Acquisire il nome di un file da una directory #84142
Sergio Bertana
Amministratore del forumPurtroppo il FB FTPClient non esegue il listato directory del server FTP, nelle operazioni gestite Store, Rerieve e Delete occorre definire il nome completo del file non è possibile utilizzare *.jpg anche se nella cartella puntata esiste un solo file.
La soluzione più semplice se possibile è eseguire una applicazione sul server NAS che acquisisce il nome del file (Quindi la targa del veicolo) e poi la invia allo SlimLine con una connessione TCP.
Sergio Bertana
Amministratore del forumPuoi utilizzare l’esempio ST_SysGetPhrDI, se il modulo PCB124 ha indirizzo 0 dovrai modificarlo così:
DInp.Address:=0; //Module address DInp.Mode:=DI_MODE#DI_I_16_L; //Acquisition mode DInp(); //Digital input acquisition IF (DInp.Done) THEN InpValue:=DInp.Value; END_IF;Nel post si parla di conteggio veloce su ingressi digitali quindi ho definito Mode con DI_MODE#DI_I_16_L in modo da escludere il debouncing hardware sul modulo che filtra l’ingresso a circa 5mS.
Se la tua necessità è di gestire 16 contatori uno per ogni ingresso del modulo dovrai come nell’esempio sopra eseguire il programma in task Fast, ma attenzione rispetto alla acquisizione dal modulo CPU in cui la SysGetPhrDI viene acquisita in 10uS una acquisizione da modulo di estensione necessita di circa 300uS quindi se imposti il tempo di esecuzione a 500mS come nel primo esempio del post dovrai verificare di avere tempo sufficente ad eseguire tutte le operazioni.
Ti ricordo che in debug puoi visualizzare le variabili di sistema SysTFastExTm e SysTFastExTmMax per controllare l’effettivo tempo di esecuzione.
Sergio Bertana
Amministratore del forumStò cercando di capire cosa può essere successo.
Quando dici “dopo la risposta ARP non vi erano altri pacchetti che facessero iniziare un ping o una connessione” immagino tu stessi spiando con Wireshark con il PC connesso ad una delle porte dello switch. E se sullo switch non hai abilitato il port mirroring quello che potevi spiare erano solo i pacchetti ARP inviati in broadcast perchè tutti gli altri individuato il MAC sarebbero stati inviati alla porta corretta dello switch e non alla porta in cui è connesso il PC.
Lo SlimLine invia i pacchetti ARP con un ritardo di ca 5 secondi, ma avendo 5 SlimLine sulla rete il tuo PC vedeva probabilmente i pacchetti ARP di tutti e 5 i sistemi.
Come sono impostati i sistemi, in DHCP o con IP statico?
Sergio Bertana
Amministratore del forumImmaginando che il file di targa sia l’unico presente nella cartella è posibile utilizzare il programma PlateRead come in esempio:
PROGRAM FileList VAR PathName : @STRING; (* Directory in cui cercare *) Plate : STRING[ 16 ]; (* Targa automezzo *) PNDList : STRING[ 32 ]; (* Directory list path *) PNFDelete : STRING[ 32 ]; (* Nome file da cancellare *) PTrigger : R_TRIG; (* Pulse trigger *) DList : SysGetFileInfos; (* Get file infos *) END_VAR // ***************************************************************************** // PROGRAM "PlateRead" // ***************************************************************************** // Eseguo lettura file di targa veicolo. // ----------------------------------------------------------------------------- // ------------------------------------------------------------------------- // INIZIALIZZAZIONE // ------------------------------------------------------------------------- // Program initializations. IF (SysFirstLoop) THEN PathName:=ADR('C:/CarIn'); //Directory in cui cercare DList.PathName:=ADR(PNDList); //Percorso di ricerca eTO_JUNK(SysVsnprintf(ADR(PNDList), SIZEOF(PNDList), ADR('%s/*.*'), STRING_TYPE, PathName)); END_IF; // ------------------------------------------------------------------------- // ESEGUO RICERCA FILE // ------------------------------------------------------------------------- // Ogni secondo eseguo ricerca 1° file presente in directory. PTrigger(CLK:=SysClock1000); IF (PTrigger.Q) THEN DList(Init:=TRUE); IF (DList.Found) THEN eTO_JUNK(Sysmemset(ADR(Plate), 16#00, SIZEOF(Plate))); eTO_JUNK(Sysmemmove(ADR(Plate), DList.Name, Sysstrlen(DList.Name))); // Cancello il file trovato. eTO_JUNK(SysVsnprintf(ADR(PNFDelete), SIZEOF(PNFDelete), ADR('%s/'), STRING_TYPE, PathName)); eTO_JUNK(SysCVsnprintf(ADR(PNFDelete), SIZEOF(PNFDelete), ADR('%s'), STRING_TYPE, DList.Name)); eTO_JUNK(SysFileRemove(ADR(PNFDelete))); END_IF; END_IF; // [End of file]Sergio Bertana
Amministratore del forumIl comportamento dell’allrme STO è condizionato dal valore del parametro P08.52 STO lock.
- 0: STO alarm lock, Alarm-lock means STO alarm must be reset after state restoration when STO occurs.
- 1: STO alarm unlock Alarm-unlock means when STO occurs, after state restoration, STO alarm will disappear automatically.
Nel tuo inverter avrai il parametro settato a 0 quindi il comando del circuito STO genera un allarme che deve essere riconosciuto dal rest manuale. Impostando il parametro a 1 al ripristino del circuito STO l’allarme si resetta automaticamente.
Sergio Bertana
Amministratore del forumIntanto bisogna chiarire che errore compare perchè esiste un errore UV ed un errore OV2, ma non un errore UV2.
Se è un errore UV DC bus under-voltage:
Allarme di sottotensione, di solito si presenta quando la tensione di alimentazione dell’inverter è troppo bassa. Verifica se è effettivamente questa la causa. Strano che succeda attivando il freno, sembra che l’attivazione del freno provochi un abbassamento della tensione di linea. Puoi disabilitarne il controllo e quindi la comparsa dell’allarme impostando
- P11.00=0 (Phase loss protection) Input phase loss software protection disable
- P11.01=1 (Frequency drop at sudden power dip) Disabled
Se è un errore OV2 Over-voltage during deceleration:
Allarme di sovratensione durante la fase di decelerazione, di solito succede se la rampa di decelerazione è troppo veloce e quindi si ha una sovratensione sul bus DC. Per risolverlo puoi provare a rendere più lenta la rampa di decelerazione. Se ti serve invece arrestare il motore velocemente allora devi inserire una resistenza di frenatura per impedire cher la tensione del bus DC si alzi troppo.
Sergio Bertana
Amministratore del forumAxel has just informed me that this behaviour is a bug. They have opened ticket:
LL-3790: Invalid constant value for structured types.
A fix will be available in future versions of LogicLab.
Sergio Bertana
Amministratore del forumCollegare dispositivi I2C tramite I/O digitali rispetto alla connessione diretta degli stessi sul bus di espansione (Vedi funzione SysI2CWrRd) può essere utile per collegare dispositivi che si trovano lontani dal modulo CPU, in questo modo i segnali I2C sono optoisolati dal sistema ed il sistema è protetto da eventuali disturbi indotti sul bus.
Ma naturalmente ci sono delle controindicazioni, utilizzando gli I/O presenti sul modulo CPU il tempo di gestione è minore rispetto agli I/O dei moduli di estensione e questo permette di avere una gestione del bus I2C più veloce.
Ma la cosa più importante è che i segnali I2C devono essere open collector, quindi l’unico modo per gestirli con I/O digitali è che le uscite permettano questa gestione e solo uscite statiche di tipo MOS lo permettono. Il modulo PCB124 ha uscite a driver quindi non è possibile utilizzarlo.
Inoltre i segnali I2C sono tipicamente a 5Vdc e quindi occorre avere ingressi ed uscite in grado di gestire segnali a 5Vdc e solo gli I/O del modulo CPU hanno questa caratteristica.
Sergio Bertana
Amministratore del forumIn effetti con un pò di impegno si riesce ad usare come server di posta anche GMail.
Occorre gestire la password per app secondarie, ecco una piccola guida.
Sergio Bertana
Amministratore del forumAggiungo una doverosa precisazione…
Il protocollo Modbus prevede registri a 16 bits, e non specifica l’endianness dei dati se espressi su registri di dimensioni maggiori come nel tuo caso un registro DINT a 32 bits.
I dati nei sistemi basati su architettura ARM come i ns SlimLine hanno una architettura Little-Endian, la memorizzazione inizia dal byte meno significativo per finire col più significativo.
Ma può essere che il dispositivo dove viene effettuata la scrittura abbia una architettura Big-Endian quindi il dato scritto non verrebbe interpretato correttamente, in questo caso è possibile convertire l’endianness del dato da inviare in Modbus con la funzione SwapData.
Sergio Bertana
Amministratore del forumHai diverse possibilità di arresto motore in emergenza.
- Arresto inerziale: Utilizzando il circuito STO (Safe Torque Off), oppure programmando il parametro P01.08 Stop selection al valore 1, si ottiene un arresto inerziale.
- Arresto in frenatura: Si può mantenere l’arresto decelerato con tempo di rampa impostato nel parametro P00.12 Deceleration time 1, e poi si imposta una soglia di frenatura DC parametro P01.09 Starting frequency of DC breaking while stop con una corrente di frenatura DC parametro P01.11 Stop DC breaking current ed un tempo di frenatura parametro P01.12 Stop DC breaking time.
L’arresto di emergenza dipende dalle normative, un arresto con il circuito STO scollega il motore dall’inverter quindi equivale alla apertura del teleruttore di comando di un motore asincrono AC. È quindi assimilabile a un arresto di emergenza secondo normative di sicurezza (assenza di energia al motore).
Un arresto controllato in corrente provoca un arresto istantaneo del motore ma il motore rimane controllato dall’inverter.
Sergio Bertana
Amministratore del forumIl protocollo Wiegand non ha uno standard rigido, ma la maggior parte dei dispositivi sul mercato segue delle specifiche de facto abbastanza consolidate.
- Larghezza impulso (Pulse Width): Da 20 µs a 100 µs tipico più comune 50 µs. (Significa che quando viene trasmesso un bit, la linea D0 o D1 viene portata bassa per quel tempo).
- Intervallo tra impulsi (Pulse Interval): Da 200 µs a 20 ms, tipico 1~2 ms tra un bit e il successivo.
- Sequenza di bit: I bit sono inviati in sequenza su D0 e D1, con timing definito sopra.
- Frame completo (es. Wiegand-26): 1 bit di parità iniziale, 24 bit di dati (generalmente 8 bit Facility Code+16 bit ID), 1 bit di parità finale, totale 26 bit inviati in 26~30 ms.
Come visto esiste una grande differenza tra i vari dispositivi, ad esempio il lettore RFID R3 ha una larghezza di impulso di 500us ed intervallo di 2ms in tal caso è possibile acquisire su di un modulo CPU direttamente gli ingressi in polling in task Fast (Può essere eseguito al minimo ogni 100uS vedi SysSetTaskLpTime). Non è possibile acquisire gli ingressi in polling così velocemente dai moduli di estensione perchè l’acquisizione necessita di circa 400uS.
Per poter acquisire ingressi Wiegand più veloci vedi la soluzione proposta nell’esempio ST_WiegandDcd di questo articolo. Dove i 2 ingressi sono connessi a 2 contatori, quindi occorre acquisire il conteggio ogni tempo di intervallo che anche nel caso minimo di 1 mS è ampiamente gestibile dalla task Fast. Ma anche in questo caso non è possibile acquisire i counters in polling così velocemente dai moduli di estensione.
Venendo alla tua necessità l’unica soluzione applicabile è utilizzare un modulo CPU compact, con l’opzione 4 counter e connettere al modulo 2 dispositivi. Per acquisire 8 lettori ti serviranno 4 moduli che potrai connettere tra di loro in ethernet ad esempio con il FB DataTransfer. Potrai utilizzare gli I/O liberi dei moduli come I/O digitali per la tua applicazione.
Sergio Bertana
Amministratore del forumI moduli 4G (gateway/router cellulari) di Milesight supportano APN personalizzati, incluse impostazioni di APN private.
Dalla pagina web di configurazione cellulare si può configurare APN (Access Point Name) secondo il requisito dell’operatore utilizzato. Ci sono anche campi per username e password, se richiesti dall’operatore, ed il tipo di autenticazione (None/PAP/CHAP) e PIN della SIM.
Quindi, a meno di resrizioni particolare dell’operatore posso ragionevolmente dire che i dispositivi Milesight 4G possono usare APN privati, non sembra che ci siano restrizioni tecniche che impediscano questo.
Sergio Bertana
Amministratore del forumErrors are generated only if you declare the MS data structure as CONSTANT.
VAR CONSTANT MS : MYSTRUCT := (V1:=FALSE, V2:=[10,20,30,40]); END_VARWithout the CONSTANT attribute, the program works correctly.
I have informed Axel about this problem and I am still waiting for their response.Sergio Bertana
Amministratore del forumIl FB ModbusMaster invia il dato al tuo dispositivo utilizzando i comandi
- 16#06 Preset single register (Se scrivi un solo registro)
- 16#10 Preset multiple registers (Se scrivi più registri)
In entrambi i casi se i valori sono espressi su una variabile a 16 bit il dato presente nella variabile è inviato al dispositivo slave. Da quello che dici sembra sia il tuo dispositivo slave a non accettare valori negativi.
Come dice giustamente Concetto occore verificare la documentazione del tuo dispositivo.
-
AutorePost