* * * *

Privacy Policy

Blog italiano

Clicca qui se vuoi andare al blog italiano su Lazarus e il pascal.

Forum ufficiale

Se non siete riusciti a reperire l'informazione che cercavate nei nostri articoli o sul nostro forum vi consiglio di visitare il
Forum ufficiale di Lazarus in lingua inglese.

Lazarus 1.0

Trascinare un file nel programma
DB concetti fondamentali e ZeosLib
Recuperare codice HTML da pagina web
Mandare mail con Lazarus
Stabilire il sistema operativo
Esempio lista in pascal
File INI
Codice di attivazione
Realizzare programmi multilingua
Lavorare con le directory
Utilizzare Unità esterne
TTreeView
TTreeview e Menu
Generare controlli RUN-TIME
LazReport, PDF ed immagini
Intercettare tasti premuti
Ampliare Lazarus
Lazarus e la crittografia
System Tray con Lazarus
UIB: Unified Interbase
Il file: questo sconosciuto
Conferma di chiusura di un applicazione
Liste e puntatori
Overload di funzioni
Funzioni a parametri variabili
Proprietà
Conversione numerica
TImage su Form e Panel
Indy gestiore server FTP lato Client
PopUpMenu sotto Pulsante (TSpeedButton)
Direttiva $macro
Toolbar
Evidenziare voci TreeView
Visualizzare un file Html esterno
StatusBar - aggirare l'errore variabile duplicata
Da DataSource a Excel
Le permutazioni
Brute force
Indy 10 - Invio email con allegati
La gestione degli errori in Lazarus
Pascal Script
Linux + Zeos + Firebird
Dataset virtuale
Overload di operatori
Lavorare con file in formato JSON con Lazarus
Zeos ... dietro le quinte (prima parte)
Disporre le finestre in un blocco unico (come Delphi)
Aspetto retrò (Cmd Line)
Lazarus 1.0
Come interfacciare periferica twain
Ubuntu - aggiornare free pascal e lazarus
fpcup: installazioni parallele di lazarus e fpc
Free Pascal e Lazarus sul Raspberry Pi
Cifratura: breve guida all'uso dell'algoritmo BlowFish con lazarus e free pascal.
Creare un server multithread
guida all'installazione di fpc trunk da subversion in linux gentoo
Indice
DB concetti fondamentali e connessioni standard
Advanced Record Syntax
DB concetti fondamentali e DBGrid
DB concetti fondamentali e TDBEdit, TDBMemo e TDBText
Advanced Record Syntax: un esempio pratico
Superclasse form base per programmi gestionali (e non)
Superclasse form base per programmi gestionali (e non) #2 - log, exception call stack, application toolbox
Superclasse form base per programmi gestionali (e non) #3 - traduzione delle form
Superclasse form base per programmi gestionali (e non) #4 - wait animation
Un dialog per la connessione al database:TfmSimpleDbConnectionDialog
Installare lazarus su mac osx sierra
immagine docker per lavorare con lazarus e free pascal
TDD o Test-Driven Development
Benvenuto! Effettua l'accesso oppure registrati.
Agosto 11, 2022, 10:14:58 am

Inserisci il nome utente, la password e la durata della sessione.

16 Visitatori, 0 Utenti

Autore Topic: Synapse e Domotica  (Letto 980 volte)

DragoRosso

  • Scrittore
  • Hero Member
  • *****
  • Post: 645
  • Karma: +12/-0
  • Prima ascoltare, poi decidere
Re:Synapse e Domotica
« Risposta #15 il: Giugno 20, 2022, 10:56:52 pm »
Come dissi, non conosco Synapse, ma le caratteristiche di un socket sono comuni a tutti i componenti.

Sia i client TCP che i server TCP (come anche gli UDP) hanno la possibilità di sapere da che socket remoto (IP e Porta) arrivano i dati, quindi anche con un solo socket puoi tranquillamente rilevare i dati, perchè interrogando le sue proprietà puoi identificare la fonte.

Anche la velocità non è un problema (con un solo socket riesco a gestire flussi non compressi di decine di immagini da decine di megabyte).

Poi dipende dalla logica del tuo programma.

Ti faccio un esempio banale con Indy:

Codice: [Seleziona]
//Evento ricezione dati da socket UDP comune a tutte le schede remote
procedure TCardComm.fIdUDPServer1UDPRead(AThread: TIdUDPListenerThread;
  const AData: TIdBytes; ABinding: TIdSocketHandle);
var z: cardinal;
     fLastPeerIP: string;
     //fLastPeerPort: word;
     fLastData: TIdBytes;
begin
  //incrementa un contatore interno per diagnostica
  InterlockedIncrement64(fContatore);
  try
    //Rileva l'IP Remoto di connessione
    fLastPeerIP := ABinding.PeerIP;
    //Rileva la PORTA Remota (non è di interesse)
    //fLastPeerPort := ABinding.PeerPort;
    //Legge i dati ricevuti (e automaticamente svuota il buffer di ricezione)
    fLastData := AData;
    z := 0; //Tiene conto della corsia (un sensore per corsia)
    {$IFDEF DEBUG}
      if fLastPeerIP = '127.0.0.1' then
        begin
          z := 0;
        end
      else
    {$ENDIF}
    if fLastPeerIP = '192.168.137.11' then
      begin
        z := 0;
      end
    else
      if fLastPeerIP = '192.168.137.12' then
        begin
          z := 1;
        end
 ......
   Assegna i dati (FLastData) a qualche contenitore indicizzato da Z ed elabora, oppure li usi negli altri Thread

Ciao
:) Ogni alba è un regalo, ogni tramonto è una conquista :)

Diego1981

  • Full Member
  • ***
  • Post: 169
  • Karma: +0/-0
Re:Synapse e Domotica
« Risposta #16 il: Luglio 19, 2022, 01:45:46 pm »
Ciao Drago
una curiosità visto che mi sembra tu utilizzi molto la gestione dei socket per quella tipologia di "lavoro" che sto provando a realizzare
A livello proprio di logica di programmazione, io utilizzo il form principale per gestire la grafica (luci accese/spente, porte finestre aperte/chiuse, ec..),poi ho un thread che gestisce "l'ascolto" e ricezione delle "stringhe" dai dispositivi(che sono 10 server TCP/IP) e le smista ad un altro thread che le elabora e invia le risposte ai server, in più ho un altro thread che invia dei comandi MODBUS (sono 8 dispositivi modbus rtu collegati ad un convertitore rs845/TCP) , secondo la tua esperienza potrebbe essere una gestione corretta ?
A livello di velocità non sono proprio contento e sono convinto che il processo inerente al modbus rallenti molto
grazie in anticipo


DragoRosso

  • Scrittore
  • Hero Member
  • *****
  • Post: 645
  • Karma: +12/-0
  • Prima ascoltare, poi decidere
Re:Synapse e Domotica
« Risposta #17 il: Luglio 19, 2022, 08:06:35 pm »
Ciao, io come te uso dispositivi di campo che usano sia seriali 485 (a 1 Mbit) che modbus TCP (senza convertitori).

La logica dei Thread mi pare corretta, e se usi i componenti corretti non dovresti avere "buchi" sulle prestazioni.

Per quello che riguarda il modbus TCP (sia esso diretto che tramite convertitori con finali RTU), l'importante e che usi socket non bloccanti, oppure in alternativa usi un componente (per esteso un socket) per ogni dispositivo.

Su rete Ethernet da 100 Mbit, purtroppo i dispositivi industriali sono ancora alla Fast Ethernet, io interrogando via modbus TCP una periferica modbus (in questo caso PLC con modbus TCP hardware integrato) ho tempi di risposte (inteso tra l'invio comando e la ricezione risposta) intorno ai 2 o 3 millisecondi. Con altri dispositivi, dove ci sono convertitori di mezzo o non sono modbus hardware, difficilmente riesco a raggiungere velocità inferiori ai 80 ms. (in modo costante, diciamo facendo i test con 1000 invii / ricezioni).

In TCP il numero di dati che scambi è ininfluente sulla velocità, in RS485 (o RS232) il tempo di scambio dipende dal numero di dati che scambi e dalla velocità ... se hai una rete a 100 Mbit, ma la seriale del dispositivo è a 38400 baud (cioè 0,0384 Mbit) .... la differenza è decisamente apprezzabile.

Se vuoi, monitora i tempi con l'unità di diagnostica che allego (se non esiste già nell'ultima versione di Lazarus):
Codice: [Seleziona]
//Uso, aggiungi l'unità tra le Uses della tua Unità
Uses  Diagnostics;

//Puoi dichiarare quanti "timer" vuoi, anche come membri di classe, locali, ....
var HighTimer: TStopWatch;
.....

begin
  HighTimer := TStopWatch.StartNew;
  ...... //funzione da eseguire
  HighTimer.Stop;
  ShowMessage(fHighTimer.ElapsedMilliseconds.ToString); //In realtà puoi spingerti a misurare  multipli di 100 nanosecondi

  //Per eseguire un'altra misura
  HighTimer.Reset;
  HighTimer.Start;
  ...... //funzione da eseguire
  HighTimer.Stop;
  ShowMessage(fHighTimer.ElapsedMilliseconds.ToString);

end;

In questo modo puoi monitorare i tempi di ogni comunicazione e verificare dove stà il colle di bottiglia.
Puoi anche crearti un'array di timer, in modo da indicizzare tutte le tempistiche in un colpo solo (occhio al threading ovviamente, consiglio di utilizzare solo timer dichiarati nella propria unità).
:) Ogni alba è un regalo, ogni tramonto è una conquista :)

Diego1981

  • Full Member
  • ***
  • Post: 169
  • Karma: +0/-0
Re:Synapse e Domotica
« Risposta #18 il: Luglio 20, 2022, 01:34:02 pm »
Grazie della risposta
effettivamente i tempi di risposta sul Modbus sono molto superiori agli 80 ms
provo a dare un'occhiata ai tuoi suggerimenti

 

Recenti

How To

Utenti
Stats
  • Post in totale: 16486
  • Topic in totale: 2013
  • Online Today: 26
  • Online Ever: 900
  • (Gennaio 21, 2020, 08:17:49 pm)
Utenti Online
Users: 0
Guests: 16
Total: 16

Disclaimer:

Questo blog non rappresenta una testata giornalistica poiché viene aggiornato senza alcuna periodicità. Non può pertanto considerarsi un prodotto editoriale ai sensi della legge n. 62/2001.