Sergio Bertana
Risposte nei forum create
-
AutorePost
-
Aprile 2, 2025 alle 8:03 am in risposta a: Copiare un carattere da una stringa in una variabile #81146
Sergio Bertana
Amministratore del forumIl problema è nell’aver settato l’opzione Strict pointer check nel menù Project->Options->Code generation. Questa opzione che per sicurezza viene settata di default effetua il controllo sul tipo di pointer segnalando errore quando si valorizza un pointer con un indirizzo di variabile diversa dal suo tipo.
La variabile ChPtr definita come pointer ad USINT la valorizzi con l’indirizzo di una stringa.
ChPtr:=ADR(DString); //Character pointer
Per soluzionare puoi disabilitare lo Strict pointer check, ma la soluzione più corretta è utilizzare eTO_POINTER nel modo:
ChPtr:=eTO_POINTER(ADR(DString)); //Character pointer
eTO_POINTER() trasforma l’indirizzo in un puntatore a void ePVOID che essendo un tipo diremmo oggi “fluido” viene accettato da tutte le assegnazioni.
Sergio Bertana
Amministratore del forumAggiungo che vista la tua esigenza di acquisire più sensori e magari a distanze superiori ai 1 o 2 metri, posso consigliare di utilizzare il FB I2CBusManager con I2CMode:=1. In questo modo i segnali del bus I2C sono gestiti utilizzando una routine software con degli I/O digitali, la gestione del bus ha frequenze decisamente inferiori ma con segnali optoisolati dal sistema. Questo permette di aumentare molto la distanza garantendo anche una immunità ai disturbi.
Anche in questo modo avresti il problema dell’unico sensore per ogni bus (Visto che l’indirizzo è fisso), ma utilizzando ad esempio il modulo MPS056B310 con 4 ingressi e 4 uscite potresti pilotare 2 diversi bus I2C ed acquisire 2 sensori.
In alternativa si pootrebbe realizzare un FB ad-hoc dove si utilizza un ingresso ed 1 uscita per il segnale DATA e con 3 uscite si possono gestire 3 segnali CLOCK da utilizzare per il comando di 3 sensori. In questo modo un unico modulo CPU potrebbe acquisire 3 sensori.
Sergio Bertana
Amministratore del forumAbbiamo già affrontato l’acquisizione di questi sensori vediamo di rispondere alle tue domande. Ipotizzando di collegare il sensore al bus di espansione del ns modulo CPU per l’acquisizione utilizzeremo la funzione SysI2CWrRd.
- I sensori hanno interfaccia I2C ma come si evince dal manuale utente hanno indirizzo fisso (16#0A) quindi è possibile collegare un solo sensore al bus.
- Essendo il bus I2C delle estensioni dei ns moduli CPU, un bus a 400Khz la distanza massima ipotizzabile in sicurezza potrebbe essere 1 o 2 metri.
- Avendo il sesore unico indirizzo si può collegare 1 solo sensore.
Ecco il programma che abbiamo realizzato per l’acquisizione di un sensore a 16 zone. Nell’array Pn sono presenti le 16 temperature delle zone acquisite dal sensore.
PROGRAM D6TMeasure VAR i : UDINT; (* Auxiliary variable *) CaseNr : USINT; (* Program case *) TimeBf : UDINT; (* Time buffer (uS) *) Errors : ARRAY[0..1] OF UDINT; (* Error counter *) I2CWrite : ARRAY[0..1] OF BYTE; (* I2C write buffer *) I2CRead : ARRAY[0..63] OF BYTE; (* I2C read buffer *) PTAT : REAL; (*Reference temperature (°C) *) Pn: ARRAY[0..15] OF REAL; (* Temperature points (°C) *) END_VAR // ***************************************************************************** // PROGRAM "D6TMeasure" // ***************************************************************************** // Acquires a Omron MEMS Thermal Sensors D6T. // ----------------------------------------------------------------------------- // ------------------------------------------------------------------------- // PROGRAM CASES // ------------------------------------------------------------------------- // Program cases management. CASE (CaseNr) OF // --------------------------------------------------------------------- // Conversion command "Single Shot Mode high repeatability" clock // streching disabled. 0: I2CWrite[0]:=16#4C; //Comando scrittura IF NOT(SysI2CWrRd(Address:=16#0A, WrBytes:=1, WrBuffer:=ADR(I2CWrite), RdBytes:=0, RdBuffer:=NULL)) THEN Errors[0]:=Errors[0]+1; //Error counter CaseNr:=0; //Program case RETURN; END_IF; // Save time to wait. TimeBf:=SysGetSysTime(TRUE); CaseNr:=CaseNr+1; //Program case // --------------------------------------------------------------------- // Wait conversion complete (Max time oh high repeatability 15 mS). 1: IF ((SysGetSysTime(TRUE)-TimeBf) < 500000) THEN RETURN; END_IF; // Read the conversion results. IF NOT(SysI2CWrRd(Address:=16#0A, WrBytes:=0, WrBuffer:=NULL, RdBytes:=35, RdBuffer:=ADR(I2CRead))) THEN Errors[1]:=Errors[1]+1; //Error counter CaseNr:=0; //Program case RETURN; END_IF; // Acquire the reference temperature. PTAT:=TO_REAL(TO_INT((TO_UINT(I2CRead[1])*256+I2CRead[0])))/10.0; // Acquire the Pn temperatures. FOR i:=0 TO 15 DO Pn[i]:=TO_REAL(TO_INT((TO_UINT(I2CRead[3+(2*i)])*256+I2CRead[2+(2*i)])))/10.0; END_FOR; CaseNr:=0; //Program case END_CASE; // [End of file]
Sergio Bertana
Amministratore del forumIl modem Telit EGX81-W a differenza dei modelli precedenti non ha l’auto baudrate, di default la comunicazione è settata a 115200, n, 8, 1. Quindi devi modificare il programma definendo il corretto baudrate (Ho corretto l’esempio portando da 9600 a 115200 il settaggio del baudrate). Ricordati di disabilitare il PIN sulla SIM.
Il modem inoltre non trasmette se il segnale CTS è basso, quindi occorre utilizzare il corretto cavo di connessione al modulo SlimLine, consiglio l’adattatore modem CBL055 ed il cavo di estensione CBL057. Tramite questi accessori il segnale DTR in uscita dal modulo CPU viene connesso sia al DTR (Pin 4) che al CTS (Pin 7) del modem.
Per individuare i problemi consiglio di attivare lo spionaggio e di verificare i risultati nella console di spionaggio. Ecco i risultati:
08:43:39.271687|ModemCore:Lg|Wait again:14 (S) 08:43:44.273058|ModemCore:Lg|Wait again:9 (S) 08:43:49.273750|ModemCore:Lg|Wait again:4 (S) 08:43:54.262965|ModemCore:Lg|----------------------------------------------[Modem power on]- 08:44:04.264664|ModemCore:Tx|AT[0D] 08:44:04.370939|ModemCore:Rx|[0D][0A]OK[0D][0A] 08:44:04.372770|ModemCore:Tx|AT[0D] 08:44:04.478925|ModemCore:Rx|[0D][0A]OK[0D][0A] 08:44:04.482193|ModemCore:Tx|AT&F[0D] 08:44:04.612816|ModemCore:Rx|[0D][0A]OK[0D][0A] 08:44:04.614626|ModemCore:Tx|ATE0[0D] 08:44:04.721050|ModemCore:Rx|ATE0[0D][0D][0A]OK[0D][0A] 08:44:04.723145|ModemCore:Tx|AT+CMEE=2[0D] 08:44:04.828856|ModemCore:Rx|[0D][0A]OK[0D][0A] 08:44:04.830659|ModemCore:Tx|ATV1[0D] 08:44:04.936732|ModemCore:Rx|[0D][0A]OK[0D][0A] 08:44:04.938732|ModemCore:Tx|ATX3[0D] 08:44:05.044667|ModemCore:Rx|[0D][0A]OK[0D][0A] 08:44:05.046470|ModemCore:Tx|AT&D2[0D] 08:44:05.152692|ModemCore:Rx|[0D][0A]OK[0D][0A] 08:44:05.154843|ModemCore:Tx|AT+CNMI=0,0,0,0,1[0D] 08:44:05.276665|ModemCore:Rx|[0D][0A]OK[0D][0A] 08:44:05.278483|ModemCore:Tx|AT+CMGF=1[0D] 08:44:05.384800|ModemCore:Rx|[0D][0A]OK[0D][0A] 08:44:05.386806|ModemCore:Tx|AT+CSMS=0[0D] 08:44:05.500182|ModemCore:Rx|[0D][0A]+CSMS: 1,1,0[0D][0A][0D][0A]OK[0D][0A] 08:44:05.502472|ModemCore:Tx|AT+CPMS="SM","SM","SM"[0D] 08:44:05.616033|ModemCore:Rx|[0D][0A]+CPMS: 0,50,0,50,0,50[0D][0A][0D][0A]OK[0D][0A] 08:44:05.617653|ModemCore:Lg|-------------------------------------------------[Modem check]- 08:44:05.620538|ModemCore:Tx|AT[0D] 08:44:05.725870|ModemCore:Rx|[0D][0A]OK[0D][0A] 08:44:05.729313|ModemCore:Tx|AT+CSQ[0D] 08:44:05.842675|ModemCore:Rx|[0D][0A]+CSQ: 21,99[0D][0A][0D][0A]OK[0D][0A] 08:44:05.846344|ModemCore:Tx|AT+CREG?[0D] 08:44:05.953668|ModemCore:Rx|[0D][0A]+CREG: 0,1[0D][0A][0D][0A]OK[0D][0A] 08:44:05.957201|ModemCore:Tx|AT+COPS?[0D] 08:44:06.073693|ModemCore:Rx|[0D][0A]+COPS: 0,0,"WINDTRE",3[0D][0A][0D][0A]OK[0D][0A] 08:44:21.073883|ModemSMSReceive:Lg|---------------------------------[Check SMS received messages]- 08:44:21.077098|ModemCore:Tx|AT+CMGR=0[0D] 08:44:21.187832|ModemCore:Rx|[0D][0A]OK[0D][0A]
Sergio Bertana
Amministratore del forumDallo screenshot non vedo dove finisce il segnale di Done, ma a parte questo c’è sicuramente una stranezza nella gestione dell’Enable, ti consiglio di non negare l’ingresso di Enable e di utilizzare in serie al segnale Connected un contatto normale chiuso di Done. In risposta alle tue domande:
- L’utilizzo della FB ModbusMaster è corretto, il programma deve essere eseguito in task Back.
- Come indirizzo IP e come porta devi definire quella richiesta dal dispositivo che interroghi. La porta 502 è la porta stanndard utilizzata dal protocollo Modbus/TCP. Quindi se così dice la specifica del tuo dispositivo è corretto, anche perchè se l’IP o la porta fossero errati non avresti mai l’uscita di Connected.
- Il tempo di delay dipende da quanto è veloce a rispondere il dispositivo che interroghi. 250mS mi sembra già un tempo abbastanza lungo.
- RxSize e TxSize vanno dimensionati in base alla lunghezza del frame di comando e del frame di risposta del comando Modbus. Tu leggi 2 registri (4Bytes) a cui aggiungi l’header (6 bytes). In totale meno di 16 bytes.
- Visto che hai dei timeout puoi esagerare con il tempo di Timeout (1S), tanto per vedere se è davvero un problema di programma o se è il tuo dispositivo che non riesce a rispondere in 250mS.
Tieni comunque presente che 28 errori su quasi 19000 pacchetti scambiati, non è molto, anche se in Modbus/TCP solitamente si hanno pochissimi errori.
Sergio Bertana
Amministratore del forumC’è un po di confusione…
Le FB ModbusMaster collegate allo stesso SysTCPClient.File devono essere gestite in cascata, il Done della prima sull’Enable della successiva e così di seguito fino all’ultima FB il cui Done negato va connesso all’Enable della prima.
Non c’è nessun legame tra le FB Modbus collegate al File di FB SysTCPClient diverse, ognuna di esse opera dialogando con il proprio dispositivo e non interferisce con le altre. E’ proprio questo il vantaggio di poter operare in parallelo.
Dal tuo screenshot, vedo un contatto di Done di una FB ModbusMaster sull’Enable della prima, ma non capisco se è il Done dell’ultima FB della cascata di quelle connesse a quel SysTCPClient. Inoltre si tratta di un Done normale, mentre dovrebbe essere un Done negato.
L’errore che tu vedi è proprio indicativo di più FB Modbus master che sono eseguite contemporaneamente sullo stesso File, in pratica una “Ruba” i dati all’altra che riceve un transaction identifier errato. Credo che i tuoi problemi sono tutti nella errata gestione delle cascate.
Sergio Bertana
Amministratore del forumL’Auto-APN consente al router di analizzare la scheda SIM e selezionare l’APN corretta da un elenco precaricato nel firmware del router. Ciò significa che il router può essere spedito in tutto il mondo senza richiedere una configurazione APN per le SIM che saranno inserite.
Il router acquisisce il Mobile Country Code (MCC) ed il Mobile Network Code (MNC) dalla SIM inserita e erca in una tabella all’interno del proprio firmware l’APN relativa alla SIM inserita. Siccome si aggiungono nuovi operatori ad ogni giorno è evidente che la tabella presente nel firmware del router potrebbe non essere aggiornata con i nuovi operatori. Eseguendo un update del firmware si provvederà anche ad aggiornare l’elenco degli operatori.
Tra i routers da noi commercializzati l’unico modello che supporta l’Auto-APN è il Router cellulare industriale 4G LTE R200, nel caso l’APN della SIM inserita non sia presente nel firmware è possibile da pagina web inserirla manualmente. Il router è basato sul sistema operativo OpenWRT permettendo così anche l’installazione di moltissimi package software disponibili.
Il package APN Database webui permette di visualizzare su pagina web tutti providers mappati nel firmware del router permettendone la modifica e/o la definizione di nuovi operatori.
Tra i package più interessanti citiamo OPC-UA server e client, ZeroTier, AWS IoT Core, Azure IoT Hub, ecc…
Sergio Bertana
Amministratore del forumTutti router che distribuiamo sono adatti all’ambiente industriale, possono essere montati su supporto DIN ed hanno range di temperatura elevato. Tutti supportano la creazione di diversi tipi di VPN. In riferimento al tempo di avvio si attestano tra i 60 e 90 secondi. Il sistema operativo nel caso di Milesight è proprietario, mentre Teltonika utilizza OpenWRT. Dal nostro sito è possibile verificare tutte le caratteristiche ed eseguire il download della documentazione.
Possiamo proporre alcuni modelli della famiglia Milesight, questi modelli hanno la possibilità di programmazione in Phyton che ne aumenta la flessibilità.
- UR32S-L04EU: Router cellulare industriale, alimentazione 9÷48Vdc e PoE, connessione LAN/WAN e WiFi. Integra le funzioni watchdog e failover multi-link per garantire comunicazioni stabili.
- UR32-L04EU-W-485: Router cellulare industriale doppia SIM, alimentazione 9÷48Vdc e PoE, connessione LAN/WAN e WiFi. Integra le funzioni watchdog e failover multi-link per garantire comunicazioni stabili. Dispone di interfaccia seriale RS232/485 e di 1 ingresso ed 1 uscita digitale.
In alternativa il modello della famiglia Teltonika:
- RUT200-S: Router cellulare industriale, alimentazione 9÷30Vdc, connessione LAN/WAN e WiFi. Integra le funzioni watchdog e failover multi-link per garantire comunicazioni stabili. Dispone di di 1 ingresso ed 1 uscita digitale. Basato su sistema operativo OpenWRT può essere connesso alla rete ZeroTier. Questo router gestisce la configurazione in Auto APN, e quindi in grado di configurare automaticamente l’APN in base all’operatore della SIM.
Sergio Bertana
Amministratore del forumCome si legge dalla FAQ Quante connessioni TCP/IP simultanee possono essere gestite?, il numero massimo di connessioni TCP/IP gestite è 32. Ora per connetterti a più dispositivi Modbus TCP hai due opzioni.
Comunicazione in parallelo con tutti i dispositivi: Istanziare un FB SysTCPClient per ogni dispositivo a cui devi connetterti e come dici correttamente colleghi l’uscita File all’ingresso File del FB ModbusMaster o di più FB in cascata. In questo modo puoi lasciare tutte le connessioni attive che lavorano in parallelo.
Comunicazione multiplexata tra i vari dispositivi: Istanziare un FB SysTCPClient e le relative ModbusMaster poi creare un programma batch in cui ai vari passi esegui:
- Connessione all’indirizzo IP del dispositivo.
- Esecuzione comandi Modbus con 1 o più FB ModbusMaster in cascata.
- Disconnessione dal dispositivo.
- Iterazione sul punto 1 cambiando l’indirizzo IP del dispositivo. Raggiunto l’ultimo dispositivo riparto dal primo.
Con la comunicazione in parallelo hai anche la massima velocità di comunicazione con tutti i dispositivi ma anche il massimo impegno di risorse, tipicamente la memoria RAM utilizzata pere gestire le connessioni e la comunicazione Modbus.
Con la comunicazione sequenziale minimizzi l’utilizzo di risorse ma la comunicazione sarà molto più lenta.
LocalAdd deve essere (‘0.0.0.0’) e LocalPort (0) in modo che vengano prese in automatico.
Il fatto che con 1 istanza di SysTCPClient funzioni e con 2 no è strano… non ci sono assolutamente problemi ad utilizzare più istanze, se mandi il programma alla nostra eMail di supporto vediamo di capire il perchè.
Marzo 27, 2025 alle 6:08 pm in risposta a: Blocco invio eMail e notifiche in fase di manutenzione #81026Sergio Bertana
Amministratore del forumPer quanto riguarda le notifiche push di EasyAccess sul cellulare, è possibile dalla App dal TAB Invia notifica bloccare l’invio su quel dispositivo (Vedi screenshot), se si hanno più utenti che ricevono la notifica l’operazione và fatta sul cellulare di ognuno degli utenti. Per l’eMail invece non è prevista nessuna possibilità di bloccare l’invio.
Dalla tua domanda mi sembra di capire che tu vorresti con un solo comando bloccare sia l’invio delle eMail che delle notifiche push su tutti i dispositivi collegati nelle fasi di manutenzione impianto.
Per fare questo secondo me la soluzione più semplice è agire sul programma PLC, basterà inibire durante la manutenzione, la gestione delle variabili a cui il pannello collega la generazione degli allarmi e quindi l’invio delle eMail e delle notifiche push.
Sergio Bertana
Amministratore del forumIl problema è nel tipo di progetto, come vedi dalla estensione si tratta di un progetto .ppjs in questo tipo di progetto occorre racchiudere i commenti tra i caratteri “(* Commento *)” e NON supporta i commenti con il prefisso “//”.
Per poter utilizzare i commenti con il “//” devi prima di inserire il nuovo commento, salvare il progetto con l’estensione .plcprj, dal menù File->Save project As.. definisci il nome del progetto scegliendo l’estensione .plcprj (Vedi screenshot).
Aggiungo che si può utilizzare i caratteri “//” per i commenti di riga, mentre se si vuole commentare un blocco occorre iniziare il blocco con i caratteri “/*” e terminare il blocco con i caratteri “*/”.
Sergio Bertana
Amministratore del forumPremetto che il nostro core business è la fornitura di sistemi programmabili PLC da noi progettati e realizzati, vedi ad esempio la famiglia SlimLine. I pannelli Weintek come tutti gli altri prodotti da noi forniti ad esempio inverters, routers, ecc.. sono prodotti che commercializziamo.
Su tutti i prodotti che commercializziamo compresi i nostri PLC forniamo supporto tecnico sia telefonico che via forum, ma non facciamo corsi di formazione.
Abbiamo però un servizio di supporto tecnico on-line che forniamo utilizzando un software di controllo remoto (Attualmente utilizziamo Supremo) scaricabile dal nostro sito.
Grazie a questo servizio possiamo sviluppare con il cliente l’applicazione fornendo le informazioni che necessitano eventualmente con parti di programma, macro, ecc… attingendo dal ns repository di applicazioni sviluppate nel tempo.
Marzo 27, 2025 alle 2:47 pm in risposta a: Implementazione sistema di supervisione IoT su cloud #80994Sergio Bertana
Amministratore del forumSi certo la soluzione WeinCloud può essere una soluzione interessante, visto che sugli impianti hai già un pannello operatore Weintek che grazie ad EasyAccess ti permette l’accesso da remoto per operare sul pannello e per interventi di manutenzione sia sul programma del pannello che del PLC.
In alternativa esistono portali specifici per applicazioni IoT ad esempio Beebotte o suoi competitors tutte queste soluzioni, sia WeinCloud che i portali IoT permettono report anche storici ma non permettono l’esecuzione di automazioni lato server. Per poter gestire i dati aggregati da più impianti e gestire automazioni lato server occorre realizare un proprio servizio cloud pubblicando API in REST (Vedi articolo). Ad esempio i nostri clienti hanno realizzato soluzioni tipo:
- Gestione manutenzione preventiva impianti, il server REST memorizza i parametri di lavoro ed avvisa il cliente sulle operazioni di manutenzione.
- Calcolo consumi energetici con avvisi su superamento soglie e suddivisione costi per centro di costo.
- Calcolo costi di produzione, portale a cui impianti industriali inviano dati sui pezzi prodotti, sui tempi di fermo macchina, sui consumi energetici, ecc..
Marzo 27, 2025 alle 2:02 pm in risposta a: Controllo ventilconvettori con acquisizione sonda temperatura #80982Sergio Bertana
Amministratore del forumIl modulo Yotta A-1012 gestisce 2 uscita analogiche 0/4-20mA purtroppo a specifiche non è indicata la tensione massima erogabile e/o il massimo valore ohmico della resistenza di carico. Ma immaginando di alimentare il dispositivo con 24Vdc (12Vdc potrebbe essere un valore troppo vicinop ai 10Vdc che si desiderano in uscita) posso pensare che configurando le uscite a 0-20mA e caricandole con 500Ohm è possibile avere in uscita un valore da 0 a 10V. Questo dipende anche dalla impedenza di ingresso del ventilconvettore che essendo un ingresso analogico suppongo essere abbastanza elevata.
In caso contrario ti serve come hai detto correttamente tu nella domanda un convertitore da 0-20mA a 0-10V, ma purtroppo non abbiamo a catalogo nessun dispositivo di questo tipo.
Per quanto riguarda le sonde di temperatura puoi dare una occhiata a queste sonde di temperatura a contatto su tubo con cavo, dove puoi trovare sia il modello con Pt100 che con Pt1000.
Marzo 27, 2025 alle 10:21 am in risposta a: Sostituzione CPU basate su ARM7 con nuove versioni basate su Cortex M7 #80968Sergio Bertana
Amministratore del forumPer quanto riguarda la comunicazione one-to-one tra moduli CPU puoi utilizzare il FB DataTransfer che in base al FB di gestione stream di comunicazione permette di comunicare sia in UDP che in TCP. L’esempio ST_DataTransfer che trovi nell’articolo ha gia realizzate sia la comunicazione server che client, ti basterà copiare la parte server in un sistema e la parte client nell’altro.
Aggiungo per completezza anche se non riguarda la tua applicazione che per implementare una comunicazione TCP tra più moduli client verso un modulo server sono disponibili i FB TCPDataExchClient e TCPDataExchServer.
In riferimento alla memoria ti rimando a questo articolo, come vedi i modelli Cotex M7 disper quanto riguarda il codice dispongono standard di 131Kb di memoria programma, quindi 35Kb in più della versione attuale, inoltre la compilazione dei programmi sui sistemi Cortex M7 è più ottimizzata come vedi:
- Compilazione 1000 istruzioni logiche: ARM7:12Kb, CortexM7:8Kb
- Compilazione 1000 istruzioni matematiche fixed point: ARM7:18Kb, CortexM7:13Kb
- Compilazione 1000 istruzioni matematiche float point: ARM7:39Kb, CortexM7:29Kb
Quindi per la dimensione del codice non hai sicuramente problemi.
In riferimento alla memoria dati la dimensione disponibile standard è la stessa per entrambi i sistemi (8Kb), sui CortexM7 è disponibile una opzione per estenderla a 16Kb. Dai dati di compilazione del tuo progetto vedo che hai ancora liberi 1940 (794h) bytes quindi credo siano ampiamente sufficenti. Ti rimando al capitolo Ottimizzazione memoria RAM che trovi in fondo alll’articolo della knowledge base che ti ho linkato.
-
AutorePost