* * * *

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.
Novembre 21, 2024, 12:46:00 pm

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

99 Visitatori, 1 Utente
 

Autore Topic: Synapse e Domotica  (Letto 11655 volte)

Diego1981

  • Full Member
  • ***
  • Post: 180
  • Karma: +0/-0
Synapse e Domotica
« il: Giugno 05, 2022, 04:47:59 pm »
Ciao A tutti
è da un bel po' che non entro nel forum ma vedo che è sempre molto attivo...
volevo avere il parere di qualcunche usa synapse.
visto che il mio vecchio impianto è saltato con un bel fulmine ho ammodernato le schede di domotica e ora è tutto over IP
ho probelmi con una scheda che utilizza le "stringhe" esadecimali ma il problema è che non riesco a ricevere tutti i byte che dovrei, ho utilizzato anche altri software e con quelli ricevo tutto correttamente
come libreria usa synapse e il codice che uso è molto semplice
PER INVIARE (E FIN QUI TUTTO OK)

procedure.........invo
var
  HexString,StrChr:String;
  Str,i:Integer;
begin
HexString:='5E0123C001000000000000000000000000000000000000000000000000000000000000000000000000000000FF';
    StrChr:='';
    Str:=0;
    i:=1;
    while i<=Length(HexString)do
      begin
        Str:=Hex2Dec(HexString+HexString[i+1]);
        StrChr:=StrChr+Chr(Str);
        i:=i+2;
      end;
    ArrSckt[ScktIndx].Sckt.SendString(StrChr); 
end;

QUESTA è LA "STRINGA CHE RICEVO"
5E0123C011000000000000000000000000000000000000000000000000000000000000000000000000000000FF

con questa procedura (semplificata)

procedure....ricezione
var
  Str,Nome,Val,StrElab:AnsiString;
  i,n,Posiz:Integer;
begin

Str:=ArrSckt.Sckt.RecvPacket(ArrSckt.Timeout);

StrElab:=str;
for n:=1 to Length(Str) do //converto la stringa ricevuta da char a hex
StrElab:=StrElab+IntToHex((Ord(Str[n])),2);
end;

MA LA STRINGA CHE DOVREI RICEVERE è QUESTA
5E0123C011000000000000000000000000000000000000000000000000000000000000000000000000000000FF00000000000000000101010001010101

in sostanza dopo FF ho lo stato degli input digitali ma da li in poi non ho più nulla

pensavo al timeout troppo corto ma anche portandolo ad un secondo le cose non cambiano
oppure al fatto che le variabili di tipo stringa non possano contenere tutto quello che devo ricevere ma mi sembra molto strano
altra possibilità è che il recvpacket (Str:=ArrSckt.Sckt.RecvPacket(ArrSckt.Timeout)) non sia la scelta migliore
grazie in anticipo a tutti
« Ultima modifica: Giugno 05, 2022, 04:51:39 pm da Diego1981 »

xinyiman

  • Administrator
  • Hero Member
  • *****
  • Post: 3273
  • Karma: +12/-0
Re:Synapse e Domotica
« Risposta #1 il: Giugno 06, 2022, 10:38:20 pm »
Se posti un sorgente da compilare e lanciare proviamo a darti una mano nel debug del problema.
Ieri è passato, domani è futuro, oggi è un dono...

Diego1981

  • Full Member
  • ***
  • Post: 180
  • Karma: +0/-0
Re:Synapse e Domotica
« Risposta #2 il: Giugno 07, 2022, 09:38:45 am »
Ciao Xiny
dammi un'idea di come fare per favore perchè il sorgente completo ha i collegamenti al DB e credo che senza le schede a cui connetterti sia difficile avere un'idea di quello che succede (non che non voglia mandarlo)
Ho cercato di estrapolare il codice inerente alla comunicazione TCP per chiedervi supporto, forse non sono siuscito a farvi capire il problema?

xinyiman

  • Administrator
  • Hero Member
  • *****
  • Post: 3273
  • Karma: +12/-0
Re:Synapse e Domotica
« Risposta #3 il: Giugno 07, 2022, 01:07:37 pm »
Il problema l'ho capito, ma per aiutare a risolvere abbiamo bisogno di test che replichino il problema.
Ieri è passato, domani è futuro, oggi è un dono...

Diego1981

  • Full Member
  • ***
  • Post: 180
  • Karma: +0/-0
Re:Synapse e Domotica
« Risposta #4 il: Giugno 07, 2022, 03:13:55 pm »
Ciao Xiny
stavo provando a scriverti il codice come mi chiedevi ma estrapolandolo e usandolo in una semplice form buttata li funziona  :-[ :-X :o
(figura di M...)
Ora provo a capire se mi perdo qualcosa nel programma passandolo da un thread all'altro
Azz..

xinyiman

  • Administrator
  • Hero Member
  • *****
  • Post: 3273
  • Karma: +12/-0
Re:Synapse e Domotica
« Risposta #5 il: Giugno 07, 2022, 04:27:32 pm »
Nessuna figura stai tranquillo. Estrapolare un test che serve ad aiutare serve proprio per capire dove possa stare il problema.
Ieri è passato, domani è futuro, oggi è un dono...

Diego1981

  • Full Member
  • ***
  • Post: 180
  • Karma: +0/-0
Re:Synapse e Domotica
« Risposta #6 il: Giugno 11, 2022, 02:19:00 pm »
giusto per continuare l'esplorazione sono tornato (ma lo immaginavo) ;D
ora che riceve le "stringhe" ho il problema che queste si accumulano ad ogni richiesta come da immagine
qui il codice ridotto all'osso

procedure TForm1.BT_ReqStatoClick(Sender: TObject);
var
  n,Str1:Integer;
  StrElab,str,CRC,HexString,StrChr:String;
begin
  repeat
    HexString:=Edit2.Text;
    CRC:=CalCrc16(HexString);
    HexString:=HexString+RightStr(Crc,2)+LeftStr(Crc,2);
    StrChr:='';
    n:=1;
    while n<=Length(HexString) do
      begin
        Str1:=Hex2Dec(HexString[n]+HexString[n+1]);
        StrChr:=StrChr+Chr(Str1);
        n:=n+2;
      end;
    c.SendString(StrChr);
    Str:='';
    Str := c.RecvPacket(timeout); //timeout è 200 millisecondi
    for n:=1 to Length(Str) do //converto la stringa ricevuta da char a hex
      StrElab:=StrElab+IntToHex((Ord(Str[n])),2);
    Memo1.Append('Stringa RX:'+StrElab);
    Application.ProcessMessages;
    //Sleep(1000);
  until ferma=true ;
end;     

grazie in anticipo per ogni aiuto

Dimenticavo, nel caso in cui il tutto non sia in un ciclo repeat la cosa non succede
« Ultima modifica: Giugno 11, 2022, 02:21:11 pm da Diego1981 »

DragoRosso

  • Scrittore
  • Hero Member
  • *****
  • Post: 1395
  • Karma: +44/-0
  • Prima ascoltare, poi decidere
Re:Synapse e Domotica
« Risposta #7 il: Giugno 12, 2022, 10:35:04 am »
giusto per continuare l'esplorazione sono tornato (ma lo immaginavo) ;D
ora che riceve le "stringhe" ho il problema che queste si accumulano ad ogni richiesta come da immagine
qui il codice ridotto all'osso

    .......
    for n:=1 to Length(Str) do //converto la stringa ricevuta da char a hex
      StrElab:=StrElab+IntToHex((Ord(Str[n])),2);
   ........

grazie in anticipo per ogni aiuto

Dimenticavo, nel caso in cui il tutto non sia in un ciclo repeat la cosa non succede

la stringa "StrElab" non viene mai "svuotata" e quindi hai l'accumulo continuo.

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

Diego1981

  • Full Member
  • ***
  • Post: 180
  • Karma: +0/-0
Re:Synapse e Domotica
« Risposta #8 il: Giugno 12, 2022, 08:59:07 pm »
ciao drago,
grazie dopo qualche prova me ne sono accorto ma il problema mi permane nel programma principale dove ci sono 10 schede (quindi 10 socket) collegate e li cominciano a sommarsi eppure la procedura è la stessa
Potrebbe essere un problema di velocità con cui vengono inviate le stringhe?
grazie

DragoRosso

  • Scrittore
  • Hero Member
  • *****
  • Post: 1395
  • Karma: +44/-0
  • Prima ascoltare, poi decidere
Re:Synapse e Domotica
« Risposta #9 il: Giugno 12, 2022, 10:38:40 pm »
ciao drago,
grazie dopo qualche prova me ne sono accorto ma il problema mi permane nel programma principale dove ci sono 10 schede (quindi 10 socket) collegate e li cominciano a sommarsi eppure la procedura è la stessa
Potrebbe essere un problema di velocità con cui vengono inviate le stringhe?
grazie
Io non uso Synapse, quindi non saprei darti una soluzione. Ho usato quasi sempre Indy, a parte alcune funzionalità dove uso i socket con API del sistema operativo.

In genere, in ogni socket la lettura del buffer dati ricevuti (più o meno aggiornato all'ultimo microsecondo  :o ) genera automaticamente la sua cancellazione, quindi "accumuli" non devono esserci.

L'unica "cosa" che mi viene in mente è che nei tuoi thread ci sia qualcosa che "disturbi" Synapse.

La velocità non è un problema, almeno io non ne ho mai avuti con flussi di pacchetti continui anche a frequenze al di sotto del millisecondo, ovvio che dipende da cosa usi ... se usi un Z80 magari si, la velocità può essere un problema.
Usi socket UDP o TCP ? Ambiente Windows, Linux o altro ? Versioni di Lazarus e FPC ?

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

xinyiman

  • Administrator
  • Hero Member
  • *****
  • Post: 3273
  • Karma: +12/-0
Re:Synapse e Domotica
« Risposta #10 il: Giugno 13, 2022, 11:22:47 am »
Se il problema è l'accumulo, ti consiglio di fare una prova. Fai mandare ai dieci socket dei pacchetti strutturati come
[SCN-000001]
[SCN-000002]
...
[SCN-00000N]

Dove SCN è l'identificativo del socket SC0, SC1, SC2 ecc
mentre per il progressivo si tratta del progressivo del singolo socket.
Guarda cosa ricevi e identifichi il problema. So che è scomodo, ma almeno puoi fare debug e tarare lo strumento.
Ieri è passato, domani è futuro, oggi è un dono...

Diego1981

  • Full Member
  • ***
  • Post: 180
  • Karma: +0/-0
Re:Synapse e Domotica
« Risposta #11 il: Giugno 13, 2022, 08:33:35 pm »
Drago e Xiny grazie
ho poco tempo in questi giorni ma cerco di fare qualche prova e vi saprò dire

Diego1981

  • Full Member
  • ***
  • Post: 180
  • Karma: +0/-0
Re:Synapse e Domotica
« Risposta #12 il: Giugno 18, 2022, 02:18:26 pm »
Ho fatto diverse prove un po' come mi avevate detto e sono giunto alla conclusione che:

la scheda è configurata come server e quindi di suo invia le stringhe ad ogni cambio di stato degli I/O se in quel preciso momento chiedo manualmente lo stato delgi I/O le stringhe si accodano altrimenti le stringhe arrivano correttamente
Non so se questo è da considerarsi corretto dal punto di vista della scheda che utilizzo ma da quel che vedo sembra proprio cosi, non credo siano problemi di synapse o di lazarus
Drago scusami l'ultima volta non ti ho risposto, uso socket TCP, Windows 10, Lazarus 2.2.0 e FPC 3.2.2

DragoRosso

  • Scrittore
  • Hero Member
  • *****
  • Post: 1395
  • Karma: +44/-0
  • Prima ascoltare, poi decidere
Re:Synapse e Domotica
« Risposta #13 il: Giugno 18, 2022, 10:06:24 pm »
Allora il problema potrebbe essere la logica.

Normalmente un server non agisce in autonomia, o agisce usando due canali.

Un Server agisce in risposta ad un preciso comando, e quando ad ogni "comando" (o interrogazione) è necessaria una sua risposta occorre fare attenzione ai flussi che sono già in opera. L'esempio tipico è un server che "streamma" e che sullo stesso canale invia anche le "risposte ai comandi.
Suddividere i dati di flusso dalle risposte non è così semplice e scontato, tanto che normalmente queste tipologie di server usano due canali: uno per il flusso e uno per i comandi.

L'alternativa è impachettare i dati con una intestazione (tipo di pacchetto e sua lunghezza) necessaria a distinguere i vari flussi contemporanei (contemporanei si fà per dire ovviamente).

Come dici tu non c'è un vero e proprio "bug": manca  il coordinamento tra le comunicazioni.

Sono convinto che la risoluzione ora che sono state capite le problematiche sarà agevole. Una abbastanza semplice è il leggere i dati per blocchi, immagino che la lunghezza si fissa e che quindi si possa usare quella per gestire le letture anche se "accodate".

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

Diego1981

  • Full Member
  • ***
  • Post: 180
  • Karma: +0/-0
Re:Synapse e Domotica
« Risposta #14 il: Giugno 19, 2022, 10:17:30 pm »
Drago grazie come sempre.
un consiglio, è meglio ache ogni soket(e quindi ogni dispositivo) abbia una porta diversa o è indifferente?

 

Recenti

How To

Utenti
  • Utenti in totale: 803
  • Latest: maXim.FI
Stats
  • Post in totale: 19169
  • Topic in totale: 2286
  • Online Today: 117
  • Online Ever: 900
  • (Gennaio 21, 2020, 08:17:49 pm)
Utenti Online
Users: 1
Guests: 99
Total: 100

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.