From f537bbb01c28d29da5b0628bc272bcc2e0675817 Mon Sep 17 00:00:00 2001 From: f1iwq2 Date: Sat, 12 Dec 2020 09:36:46 +0100 Subject: [PATCH] V2.3 --- UnitConfig.dcu | Bin 55353 -> 55412 bytes UnitConfig.pas | 4 +- UnitDebug.dcu | Bin 16380 -> 16681 bytes UnitDebug.dfm | 83 +++--- UnitDebug.pas | 21 +- UnitPrinc.dcu | Bin 203985 -> 205836 bytes UnitPrinc.dfm | 29 ++- UnitPrinc.pas | 503 +++++++++++++++++++++---------------- UnitSimule.dcu | Bin 7819 -> 7823 bytes UnitTCO.dcu | Bin 134610 -> 134592 bytes page.txt | 624 ---------------------------------------------- verif_version.dcu | Bin 9468 -> 9477 bytes verif_version.pas | 2 +- versions.txt | 3 + 14 files changed, 367 insertions(+), 902 deletions(-) delete mode 100644 page.txt diff --git a/UnitConfig.dcu b/UnitConfig.dcu index 4463e346be672d1c42ff8edec337bad4f0a356c3..4c023b78225e22f1c20fb79dfd1011dbb1773876 100644 GIT binary patch delta 8548 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 diff --git a/UnitConfig.pas b/UnitConfig.pas index af575ef..924836b 100644 --- a/UnitConfig.pas +++ b/UnitConfig.pas @@ -219,7 +219,7 @@ TitreAig='Description de l''aiguillage '; var FormConfig: TFormConfig; - AdresseIPCDM,AdresseIP,PortCom,recuCDM : string; + AdresseIPCDM,AdresseIP,PortCom,recuCDM,residuCDM : string; portCDM,TempoOctet,TimoutMaxInterface,Valeur_entete,Port,protocole,NumPort, LigneCliquee,AncLigneCliquee : integer; clicliste : boolean; @@ -338,7 +338,9 @@ begin if pos('_ACK',recuCDM)<>0 then begin Id_CDM:=copy(recuCDM,5,2); // récupère l'ID reçu de CDM, à utiliser dans toutes les futures trames + recucdm:=''; s:='Connecté au serveur CDM rail avec l''ID='+Id_CDM; + Affiche(s,clYellow); AfficheDebug(s,clyellow); CDM_connecte:=true; diff --git a/UnitDebug.dcu b/UnitDebug.dcu index 1c542feb50d764d7a63eb89fc71707a40179cf4f..dc52bcd253a98029645cdde154f2b0bfb3a26723 100644 GIT binary patch delta 5739 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 delta 5430 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 LCc`9wB=i0s&KLbn diff --git a/UnitDebug.dfm b/UnitDebug.dfm index 4573fcb..9a6ff80 100644 --- a/UnitDebug.dfm +++ b/UnitDebug.dfm @@ -1,6 +1,6 @@ object FormDebug: TFormDebug - Left = 342 - Top = 80 + Left = 329 + Top = 122 Width = 842 Height = 762 Caption = 'Fen'#234'tre de d'#233'bug' @@ -13,7 +13,6 @@ object FormDebug: TFormDebug Font.Style = [] OldCreateOrder = False Position = poMainFormCenter - OnClose = FormClose OnCreate = FormCreate DesignSize = ( 826 @@ -22,7 +21,7 @@ object FormDebug: TFormDebug TextHeight = 13 object Label1: TLabel Left = 642 - Top = 7 + Top = 4 Width = 108 Height = 13 Anchors = [akTop, akRight] @@ -38,7 +37,7 @@ object FormDebug: TFormDebug end object Label2: TLabel Left = 474 - Top = 4 + Top = 2 Width = 131 Height = 18 Anchors = [akTop, akRight] @@ -52,7 +51,7 @@ object FormDebug: TFormDebug end object Label3: TLabel Left = 472 - Top = 168 + Top = 160 Width = 99 Height = 185 Anchors = [akTop, akRight] @@ -70,7 +69,7 @@ object FormDebug: TFormDebug end object EditNivDebug: TEdit Left = 754 - Top = 4 + Top = 2 Width = 49 Height = 21 Anchors = [akTop, akRight] @@ -86,7 +85,7 @@ object FormDebug: TFormDebug end object MemoEvtDet: TMemo Left = 578 - Top = 360 + Top = 344 Width = 239 Height = 225 Anchors = [akTop, akRight] @@ -105,7 +104,7 @@ object FormDebug: TFormDebug end object ButtonEcrLog: TButton Left = 474 - Top = 480 + Top = 464 Width = 97 Height = 29 Anchors = [akTop, akRight] @@ -127,7 +126,7 @@ object FormDebug: TFormDebug end object ButtonRazTampon: TButton Left = 474 - Top = 552 + Top = 536 Width = 97 Height = 33 Anchors = [akTop, akRight] @@ -138,7 +137,7 @@ object FormDebug: TFormDebug end object ButtonCherche: TButton Left = 474 - Top = 448 + Top = 432 Width = 97 Height = 25 Anchors = [akTop, akRight] @@ -148,7 +147,7 @@ object FormDebug: TFormDebug end object ButtonAffEvtChrono: TButton Left = 474 - Top = 408 + Top = 392 Width = 97 Height = 33 Anchors = [akTop, akRight] @@ -159,7 +158,7 @@ object FormDebug: TFormDebug end object ButtonCop: TButton Left = 474 - Top = 360 + Top = 344 Width = 97 Height = 41 Anchors = [akTop, akRight] @@ -176,7 +175,7 @@ object FormDebug: TFormDebug end object RichEdit: TRichEdit Left = 578 - Top = 168 + Top = 160 Width = 239 Height = 185 Anchors = [akTop, akRight] @@ -187,7 +186,7 @@ object FormDebug: TFormDebug end object ButtonRazLog: TButton Left = 474 - Top = 512 + Top = 496 Width = 97 Height = 33 Anchors = [akTop, akRight] @@ -197,10 +196,10 @@ object FormDebug: TFormDebug OnClick = ButtonRazLogClick end object GroupBox1: TGroupBox - Left = 474 - Top = 592 - Width = 343 - Height = 132 + Left = 472 + Top = 576 + Width = 353 + Height = 145 Anchors = [akTop, akRight] Caption = 'Fonctions primitives' Color = cl3DLight @@ -215,13 +214,13 @@ object FormDebug: TFormDebug object GroupBox3: TGroupBox Left = 8 Top = 16 - Width = 329 - Height = 57 + Width = 337 + Height = 73 Caption = 'Signal' TabOrder = 0 object Label4: TLabel - Left = 241 - Top = 26 + Left = 281 + Top = 10 Width = 32 Height = 13 Caption = 'Signal:' @@ -235,8 +234,8 @@ object FormDebug: TFormDebug object ButtonSigSuiv: TButton Left = 8 Top = 16 - Width = 65 - Height = 33 + Width = 57 + Height = 49 Hint = 'Etat du signal suivant' Caption = 'Etat signal suivant' ParentShowHint = False @@ -246,10 +245,10 @@ object FormDebug: TFormDebug OnClick = ButtonSigSuivClick end object ButtonCanSuivSig: TButton - Left = 72 - Top = 8 - Width = 81 - Height = 41 + Left = 64 + Top = 16 + Width = 65 + Height = 49 Hint = 'Renvoie l'#39'occupation du canton suivant le signal' Caption = 'Etat canton suivant signal' ParentShowHint = False @@ -259,8 +258,8 @@ object FormDebug: TFormDebug OnClick = ButtonCanSuivSigClick end object EditSigSuiv: TEdit - Left = 272 - Top = 24 + Left = 280 + Top = 32 Width = 41 Height = 21 Hint = 'Indiquer l'#39'adresse du signal ' @@ -269,20 +268,30 @@ object FormDebug: TFormDebug TabOrder = 2 end object Button1: TButton - Left = 152 - Top = 8 + Left = 128 + Top = 16 Width = 81 - Height = 41 + Height = 49 Caption = 'Etat 3 cantons pr'#233'c'#233'dents signal' TabOrder = 3 WordWrap = True OnClick = Button1Click end + object Button2: TButton + Left = 208 + Top = 16 + Width = 65 + Height = 49 + Caption = 'Cond Carr'#233' aiguillages' + TabOrder = 4 + WordWrap = True + OnClick = Button2Click + end end object GroupBox4: TGroupBox Left = 8 - Top = 72 - Width = 329 + Top = 88 + Width = 337 Height = 49 Caption = 'D'#233'tecteur suivant' TabOrder = 1 @@ -324,7 +333,7 @@ object FormDebug: TFormDebug end object GroupBox2: TGroupBox Left = 472 - Top = 24 + Top = 20 Width = 345 Height = 137 Anchors = [akTop, akRight] diff --git a/UnitDebug.pas b/UnitDebug.pas index e67432e..857fcae 100644 --- a/UnitDebug.pas +++ b/UnitDebug.pas @@ -43,7 +43,7 @@ type EditPrec: TEdit; EditActuel: TEdit; Button1: TButton; - procedure FormClose(Sender: TObject; var Action: TCloseAction); + Button2: TButton; procedure FormCreate(Sender: TObject); procedure ButtonEcrLogClick(Sender: TObject); procedure EditNivDebugKeyPress(Sender: TObject; var Key: Char); @@ -64,6 +64,7 @@ type procedure ButtonDetSuivClick(Sender: TObject); procedure ButtonCanSuivSigClick(Sender: TObject); procedure Button1Click(Sender: TObject); + procedure Button2Click(Sender: TObject); private { Déclarations privées } public @@ -117,13 +118,6 @@ begin FormDebug.MemoDebug.Lines.add(s); end; -procedure TFormDebug.FormClose(Sender: TObject; var Action: TCloseAction); -begin - //Action := TCloseAction.caNone; - //DebugOuv:=False; - //NivDebug:=0; -end; - procedure RE_ColorLine(ARichEdit : TRichEdit;ARow : Integer;AColor : TColor); begin with ARichEdit do @@ -371,4 +365,15 @@ begin NivDebug:=AncDebug; end; +procedure TFormDebug.Button2Click(Sender: TObject); +var Adr,erreur,ancdebug : integer ; +begin + Val(EditSigSuiv.Text,Adr,erreur); if erreur<>0 then exit; + ancdebug:=NivDebug; + NivDebug:=3; + Cond_Carre(Adr); + carre_signal(adr); + NivDebug:=AncDebug; +end; + end. diff --git a/UnitPrinc.dcu b/UnitPrinc.dcu index dc6265eb497819046882387e6e45182340042586..97dcbfa302ee75522e10a6aea09d98a8067fd642 100644 GIT binary patch delta 62079 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 vEi|<%i!P7Yo4S%5y^Q-^Z|X^i`^B95 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 J#e2uJ diff --git a/UnitPrinc.dfm b/UnitPrinc.dfm index eb39be6..71b5e25 100644 --- a/UnitPrinc.dfm +++ b/UnitPrinc.dfm @@ -816,7 +816,7 @@ object FormPrinc: TFormPrinc Visible = False end object Image3Dir: TImage - Left = 768 + Left = 840 Top = 136 Width = 49 Height = 25 @@ -894,8 +894,8 @@ object FormPrinc: TFormPrinc Visible = False end object Image4Dir: TImage - Left = 816 - Top = 128 + Left = 1064 + Top = 136 Width = 57 Height = 25 Picture.Data = { @@ -1080,8 +1080,8 @@ object FormPrinc: TFormPrinc Visible = False end object Image6Dir: TImage - Left = 808 - Top = 152 + Left = 872 + Top = 136 Width = 81 Height = 25 Picture.Data = { @@ -1204,7 +1204,7 @@ object FormPrinc: TFormPrinc object ListBox1: TListBox Left = 8 Top = 48 - Width = 616 + Width = 609 Height = 505 Style = lbOwnerDrawFixed Anchors = [akLeft, akTop, akRight, akBottom] @@ -1235,7 +1235,7 @@ object FormPrinc: TFormPrinc end object GroupBox1: TGroupBox Left = 631 - Top = 0 + Top = 5 Width = 249 Height = 129 Anchors = [akTop, akRight] @@ -1345,6 +1345,9 @@ object FormPrinc: TFormPrinc Top = 8 Width = 89 Height = 33 + Hint = + 'Mise '#224' jour des feux suivant les zones occup'#233'es et les aiguillag' + + 'es' Caption = 'Rafraichissement' TabOrder = 0 OnClick = BoutonRafClick @@ -1354,6 +1357,7 @@ object FormPrinc: TFormPrinc Top = 8 Width = 83 Height = 33 + Hint = 'Demande la version XpressNet '#224' la centrale' Caption = 'Dem version' TabOrder = 1 OnClick = BoutVersionClick @@ -1393,7 +1397,7 @@ object FormPrinc: TFormPrinc Top = 48 Width = 89 Height = 33 - Caption = 'Demande '#233'tat r'#233'trosignalisation' + Caption = 'Demande '#233'tat aiguillages' TabOrder = 5 WordWrap = True OnClick = ButtonTestClick @@ -1422,6 +1426,7 @@ object FormPrinc: TFormPrinc Top = 8 Width = 81 Height = 33 + Hint = 'Lance CDM Rail' Caption = 'Lance CDM rail' TabOrder = 8 OnClick = ButtonLanceCDMClick @@ -1520,12 +1525,12 @@ object FormPrinc: TFormPrinc object Interface1: TMenuItem Caption = 'Interface' object MenuConnecterUSB: TMenuItem - Caption = 'Connecter USB' + Caption = 'Connecter l'#39'interface en USB' Hint = 'Connecter l'#39'interface en USB' OnClick = MenuConnecterUSBClick end object DeconnecterUSB: TMenuItem - Caption = 'D'#233'connecter USB' + Caption = 'D'#233'connecter interface de l'#39'USB' Hint = 'D'#233'connecter l'#39'interface USB' OnClick = DeconnecterUSBClick end @@ -1533,12 +1538,12 @@ object FormPrinc: TFormPrinc Caption = '-' end object MenuConnecterEthernet: TMenuItem - Caption = 'Connecter Ethernet' + Caption = 'Connecter l'#39'interface en Ethernet' Hint = 'Connecter l'#39'interface par Ethernet' OnClick = MenuConnecterEthernetClick end object MenuDeconnecterEthernet: TMenuItem - Caption = 'D'#233'connecter Ethernet' + Caption = 'D'#233'connecter l'#39'interface de Ethernet' Hint = 'D'#233'connecter l'#39'interface par Ethernet' OnClick = MenuDeconnecterEthernetClick end diff --git a/UnitPrinc.pas b/UnitPrinc.pas index ce5f597..89a5f48 100644 --- a/UnitPrinc.pas +++ b/UnitPrinc.pas @@ -157,7 +157,7 @@ const titre='Signaux complexes GL '; tempoFeu=100; MaxAcc=2048; -LargImg=50;HtImg=91; +LargImg=50;HtImg=91; // image des feux const_droit=2;const_devie=1; // positions aiguillages transmises par la centrale LENZ const_devieG_CDM=3; // positions aiguillages transmises par cdm const_devieD_CDM=2; // positions aiguillages transmises par cdm @@ -175,7 +175,7 @@ EtatSign : array[0..13] of string[20] =('carr 'blanc','blanc cli','jaune','jaune cli','ral 30','ral 60','rappel 30','rappel 60'); NbDecodeur = 7; decodeur : array[0..NbDecodeur-1] of string[20] =('rien','digital Bahn','CDF','LDT','LEB','NMRA','Unisemaf'); - + type TBranche = record BType : integer ; // 1= détecteur 2= aiguillage 4=Buttoir Adresse : integer ; // adresse du détecteur ou de l'aiguillage @@ -197,7 +197,7 @@ type TBranche = record ADevie : integer ; // (TJD:identifiant extérieur) adresse de l'élément connecté en position déviée ADevieB : char; // caractère (D ou S)si aiguillage de l'élément connecté en position déviée - APointe : integer; // adresse de l'élément connecté en position droite ; + APointe : integer; // adresse de l'élément connecté en position droite ; APointeB : char; DDroit : integer; // destination de la TJD en position droite @@ -206,28 +206,28 @@ type TBranche = record DDevie : integer; // destination de la TJD en position déviée DDevieB : char ; - - tjsint : integer; + tjsint : integer; // pour TJS tjsintb : char ; // éléments connectés sur la branche déviée 2 (cas d'un aiguillage triple) Adevie2 : integer; Adevie2B : char ; - // modifié + // si modifié en mode config modifie : boolean ; end; Taccessoire = (aig,feu); TMA = (valide,devalide); -var ancien_tablo_signalCplx,EtatsignalCplx : array[0..MaxAcc] of word; +var + ancien_tablo_signalCplx,EtatsignalCplx : array[0..MaxAcc] of word; AvecInitAiguillages,tempsCli,NbreFeux,pasreponse,AdrDevie,fenetre, NombreImages,signalCpx,branche_trouve,Indexbranche_trouve,Actuel,Signal_suivant, Nbre_recu_cdm,Tempo_chgt_feux,Adj1,Adj2,NbrePN,ServeurInterfaceCDM, ServeurRetroCDM,TailleFonte,Nb_Det_Dist : integer; - - Hors_tension2,traceSign,TraceZone,Ferme,parSocket,ackCdm,PremierFD, + + Hors_tension2,traceSign,TraceZone,Ferme,parSocketLenz,ackCdm,PremierFD, NackCDM,MsgSim,succes,recu_cv,AffActionneur,AffAigDet,Option_demarrage, TraceListe,clignotant,nack,Maj_feux_cours,configNulle,LanceCDM : boolean; @@ -236,8 +236,8 @@ var ancien_tablo_signalCplx,EtatsignalCplx : array[0..MaxAcc] of word; FormPrinc: TFormPrinc; ack,portCommOuvert,trace,AffMem,AfficheDet,CDM_connecte,SocketCDM_connecte, - DebugOuv,Raz_Acc_signaux,AvecInit,AvecTCO,terminal,Srvc_Aig,Srvc_Det,Srvc_Act, - Srvc_PosTrain,Srvc_Sig : boolean; + Raz_Acc_signaux,AvecInit,AvecTCO,terminal,Srvc_Aig,Srvc_Det,Srvc_Act, + Srvc_PosTrain,Srvc_Sig,debugtrames : boolean; tablo : array of byte; // tableau rx usb Enregistrement,chaine_Envoi,chaine_recue,Id_CDM,Af, entete,suffixe,ConfStCom,LAY : string; @@ -249,9 +249,9 @@ var ancien_tablo_signalCplx,EtatsignalCplx : array[0..MaxAcc] of word; record etat : boolean; tempo : integer; - train : string; - end; - + train : string; + end; + Adresse_detecteur : array[0..60] of integer; // adresses des détecteurs par index mem : array[0..1024] of boolean ; // mémoire des états des détecteurs MemZone : array[0..1024,0..1024] of boolean ; // mémoires de zones @@ -354,6 +354,8 @@ function suivant_alg3(prec : integer;typeELprec : integer;var actuel : integer;t function detecteur_suivant_El(el1: integer;TypeDet1 : integer;el2 : integer;TypeDet2 : integer) : integer ; function test_memoire_zones(adresse : integer) : boolean; function PresTrainPrec(AdrFeu : integer) : boolean; +function cond_carre(adresse : integer) : boolean; +function carre_signal(adresse : integer) : boolean; implementation @@ -1324,7 +1326,7 @@ begin end; // par socket (ethernet) - if parSocket then Formprinc.ClientSocketLenz.Socket.SendText(s); + if parSocketLenz then Formprinc.ClientSocketLenz.Socket.SendText(s); end; // envoi d'une chaîne à la centrale Lenz par USBLenz ou socket, puis attend l'ack ou le nack @@ -1336,7 +1338,7 @@ begin envoi_ss_ack(s); // attend l'ack ack:=false;nack:=false; - if portCommOuvert or ParSocket then + if portCommOuvert or parSocketLenz then begin temps:=0; repeat @@ -1516,7 +1518,7 @@ begin if Acc=Aig then begin temps:=aiguillage[adresse].temps;if temps=0 then temps:=4; - if portCommOuvert or ParSocket then tempo(temps); + if portCommOuvert or parSocketLenz then tempo(temps); end; sleep(50); @@ -1552,7 +1554,7 @@ begin // si l'accessoire est un feu, fixer l tempo à 1 //if index_feu(adresse)<>0 then temps:=1; - //if portCommOuvert or ParSocket then tempo(temps); + //if portCommOuvert or parSocketLenz then tempo(temps); // pilotage à 0 pour éteindre le pilotage de la bobine du relais s:=#$52+Char(groupe)+char(fonction or $80); // désactiver la sortie s:=checksum(s); @@ -1562,7 +1564,7 @@ end; procedure vitesse_loco(loco : integer;vitesse : integer;sens : boolean); var s : string; begin - if portCommOuvert or parSocket then + if portCommOuvert or parSocketLenz then begin if sens then vitesse:=vitesse or 128; s:=#$e4+#$13+#$0+char(loco)+char(vitesse); @@ -3459,7 +3461,7 @@ end; procedure lit_config; var s,sa,chaine,SOrigine: string; c,paig : char; - tec,tjd,tjs,s2,trouve,triple,debugConfig,multiple,fini,finifeux,trouve_NbDetDist : boolean; + tec,tjd,tjs,s2,trouve,triple,debugConfig,multiple,fini,finifeux,trouve_NbDetDist,trouve_ipv4_PC : boolean; bd,virgule,i_detect,i,erreur,aig,aig2,detect,offset,index, adresse,j,position,temporisation,invers,indexPointe,indexDevie,indexDroit, ComptEl,Compt_IT,Num_Element,k,modele,adr,adr2,erreur2,l,t,Nligne,postriple, postjd,postjs,nv,it : integer; @@ -3508,6 +3510,7 @@ var s,sa,chaine,SOrigine: string; begin debugConfig:=false; trouve_NbDetDist:=false; + trouve_ipv4_PC:=false; Nb_Det_Dist:=3; // initialisation des aiguillages avec des valeurs par défaut for i:=1 to MaxAcc do @@ -3561,6 +3564,7 @@ begin if i<>0 then begin inc(nv); + trouve_ipv4_PC:=true; delete(s,i,length(sa)); i:=pos(':',s); if i<>0 then begin adresseIPCDM:=copy(s,1,i-1);Delete(s,1,i);portCDM:=StrToINT(s);end; @@ -3576,7 +3580,7 @@ begin delete(s,i,length(sa)); i:=pos(':',s); if i<>0 then begin adresseIP:=copy(s,1,i-1);Delete(s,1,i);port:=StrToINT(s);end - else begin adresseIP:='0';parSocket:=false;end; + else begin adresseIP:='0';parSocketLenz:=false;end; end; // configuration du port com @@ -3756,6 +3760,8 @@ begin begin s:='ERREUR: manque variables dans config-gl.cfg'; if not(trouve_NbDetDist) then s:=s+' : NB_DET_DIST'; + if not(trouve_ipv4_PC) then s:=s+' : IpV4_PC'; + affiche(s,clred); end; //Affiche('Valeurs d''initialisation des aiguillages',clyellow); @@ -4538,18 +4544,6 @@ begin Ancien_detecteur[adresse]:=detecteur[adresse].etat; end; -function virgule_prec(sl : string;o : integer) : integer; -var k : integer; -begin - o:=o-1; - for k:=o downto 1 do - begin - //Affiche(intToSTR(k)+'/'+sl[k],clGreen); - if sl[k]=',' then begin result:=k;exit;end; - end; - result:=0; -end; - // trouve un élément dans les branches à partir de la branche offset renvoie branche_trouve IndexBranche_trouve // el : adresse de l'élément TypeEL=(1=détécteur 2=aig 3=aig Bis 4=aig triple) procedure trouve_element(el, TypeEl, Offset : integer); @@ -4589,7 +4583,6 @@ begin end; - // renvoie élément suivant entre deux éléments quels qu'ils soient mais contigus // et en variables globales: typeGen le type de l'élément // s'ils ne sont pas contigus, on aura une erreur @@ -4602,7 +4595,6 @@ end; // 9998= arret sur aiguillage en talon mal positionnée // 9997: arrêt sur aiguillage dévié // 9996: arrêt sur position inconnue d'aiguillage -// 9995: TJD non résolue // typeGen : 1=detecteur 2=aiguillage 3=aiguillage bis function suivant_alg3(prec : integer;typeELprec : integer;var actuel : integer;typeElActuel : integer;alg : integer) : integer; var Btype,Adr,AdrPrec,BtypePrec,indexBranche_prec,branche_trouve_prec,indexBranche_actuel,branche_trouve_actuel, @@ -4848,19 +4840,19 @@ begin tjscourbe2:=((aiguillage[AdrTjdP].tjsintB='D') and (aiguillage[tjsc2].position=const_droit)) or tjscourbe2; end; + if NivDebug=3 then + begin + s:='137 - TJD '+intToSTR(Adr)+'/'+IntToSTR(AdrTjdP)+' pos='; + if aiguillage[Adr].position=const_droit then s:=s+'droit' + else if aiguillage[Adr].position=const_devie then s:=s+'dévié' + else s:=s+'inconnu' ; + if aiguillage[AdrTJDP].position=const_droit then s:=s+'/droit' + else if aiguillage[AdrTJDP].position=const_devie then s:=s+'/dévié' + else s:=s+'/inconnu' ; + AfficheDebug(s,clyellow); + end; - if NivDebug=3 then AfficheDebug('137 - TJD '+intToSTR(Adr)+'/'+IntToSTR(AdrTjdP),clYellow); - s:='adr='+IntToSTR(adr)+'='; - if aiguillage[Adr].position=const_droit then s:=s+'droit' - else if aiguillage[Adr].position=const_devie then s:=s+'dévié' - else s:=s+'inconnu' ; - s:=s+'/adrTjdP='+IntToSTR(adrTJDP)+'='; - if aiguillage[AdrTJDP].position=const_droit then s:=s+'droit' - else if aiguillage[AdrTJDP].position=const_devie then s:=s+'dévié' - else s:=s+'inconnu' ; - - - // rechercher le port de destination de la tjd + // rechercher le port de destination de la tjd Adr2:=0;A:=#0; if aiguillage[Adr].position=const_droit then begin @@ -4881,26 +4873,29 @@ begin adr2:=aiguillage[adr2].Adevie; //Affichedebug('element connecté:'+inttostr(adr)+A,clred); end - else + else if A='D' then begin A:=aiguillage[adr2].AdroitB; adr2:=aiguillage[adr2].Adroit; end - else - begin - s:='Erreur 1021 TJD '+intToSTR(adr)+' non résolue'; - affichedebug(s,clred); - affiche(s,clred); - suivant_alg3:=9996; - exit; - end; + else + begin + if aiguillage[adr].position<>9 then + begin + s:='Erreur 1021 TJD '+intToSTR(adr)+' non résolue'; + affichedebug(s,clred); + Affiche(s,clred); + suivant_alg3:=9996; + exit; + end; + end; if nivDebug=3 then AfficheDebug('tjd: '+s+' Suiv='+intToSTR(adr2)+A,clYellow); if A='Z' then typeGen:=1 else typeGen:=2; //TypeEL=(1=détécteur 2=aig 3=aig Bis) suivant_alg3:=adr2; exit; - + // determiner la position de la première section de la TJD (4 cas) // cas 1 : droit droit if (( aiguillage[AdrTJdP].position=const_droit) and @@ -5253,6 +5248,7 @@ procedure Det_Adj(adresse : integer); var Adr,BtypePrec,AdrFonc,Branche,BtypeFonc,AdrPrec,IndexBranche,i,Dir : integer; sortie : boolean; begin + if TraceListe then AfficheDebug('Det_Adj '+IntToSTR(adresse),clyellow); trouve_element(adresse,1,1); // branche_trouve IndexBranche_trouve if (IndexBranche_trouve=0) then begin @@ -5278,7 +5274,6 @@ begin begin Adr:=suivant_alg3(AdrPrec,BtypePrec,AdrFonc,BtypeFonc,2); // élément suivant mais arret sur aiguillage en talon mal positionnée end - else begin Adr:=AdrFonc;TypeGen:=BtypeFonc;end; if Adr>9990 then typeGen:=1; @@ -5292,6 +5287,7 @@ begin if (typeGen=1) and (Dir=2) then begin Adj2:=Adr;end; inc(dir); until dir=3; + if TraceListe then AfficheDebug('Fin Det_Adj ',clyellow); end; // renvoie l'adresse du détecteur suivant des deux éléments @@ -5465,6 +5461,7 @@ begin begin //s2:=s2+'A'+IntToSTR(feux[i].condcarre[l][k].Adresse)+feux[i].condcarre[l][k].PosAig+' '; AdrAig:=feux[i].condcarre[l][k].Adresse; + if nivDebug=3 then AfficheDebug('Contrôle aiguillage '+IntToSTR(AdrAig),clyellow); resultatET:=((aiguillage[AdrAig].position=const_devie) and (feux[i].condcarre[l][k].PosAig='S') or (aiguillage[AdrAig].position=const_droit) and (feux[i].condcarre[l][k].PosAig='D')) and resultatET; end; @@ -5477,7 +5474,7 @@ begin if NivDebug=3 then begin s:='Conditions de carré suivant aiguillages: '; - if ResultatOU then s:=s+'vrai' else s:=s+'faux'; + if ResultatOU then s:=s+'vrai : le signal doit afficher carré' else s:=s+'faux : le signal ne doit pas afficher de carré'; AfficheDebug(s,clyellow); end; cond_carre:=ResultatOU; @@ -5615,32 +5612,17 @@ begin // à la première itération, si "actuel" est déja un détecteur, ne pas faire de recherche sur le suivant if (j=1) and (TypeActuel=1) then begin - // AdrSuiv:=actuel; - // actuel:=prec; - // TypeActuel:=1; - // TypePrec:=1; - // if nivDebug=3 then AfficheDebug('Substitution precedent='+intToSTR(prec)+' Actuel='+IntToSTR(actuel),clyellow); + AdrSuiv:=actuel; end else begin //if nivDebug=3 then AfficheDebug('Engagement j='+IntToSTR(j)+' '+IntToSTR(prec)+'/'+IntToSTR(actuel),clyellow); AdrSuiv:=suivant_alg3(prec,TypePrec,actuel,TypeActuel,1); - {if (typeGen=2) then // si le précédent est une TJD/S et le suivant aussi - begin - if ((aiguillage[Adrsuiv].modele=2) or (aiguillage[AdrSuiv].modele=3)) and - ((aiguillage[actuel].modele=2) or (aiguillage[actuel].modele=3)) then - begin - if nivDebug=3 then AfficheDebug('507 - Détection Précédent=TJD/S Suivant=TJD/S',clyellow); - // subsituer la pointe - Actuel:=aiguillage[Actuel].APointe; - end; - end; } - if Nivdebug=3 then AfficheDebug('Suivant='+intToSTR(AdrSuiv),clyellow); prec:=actuel;TypePrec:=TypeActuel; actuel:=AdrSuiv;TypeActuel:=typeGen; - + if (AdrSuiv=9999) or (AdrSuiv=9996) then begin Etat_signal_suivant:=0; @@ -5670,7 +5652,7 @@ begin begin AdrFeu:=0;j:=10; // on ne trouve pas de suivant end; - + if (AdrFeu<>0) then // si l'adresse est <>0 begin if (Feux[i].Adr_el_suiv1<>prec) then // le feu est-il dans le bon sens de progression? @@ -5696,7 +5678,6 @@ begin etat_signal_suivant:=Etat; AdresseFeuSuivant:=Signal_suivant; if (NivDebug=3) and (adrFeu=0) then AfficheDebug('Pas Trouvé de feu suivant au feu Adr='+IntToSTR(ADresse),clOrange); - //TraceDet:=false; end; @@ -6049,6 +6030,7 @@ var PresTrain : boolean; j,i,Det_initial,Adr_El_Suiv,Btype_el_suivant,DetPrec1,DetPrec2,DetPrec3,DetPrec4 : integer; begin i:=index_feu(Adrfeu); + //memZone[518,520]:=true; if i=0 then begin Affiche('Erreur 602 - feu '+IntToSTR(adrFeu)+' non trouvé',clred); @@ -6106,7 +6088,7 @@ begin DetPrec4:=detecteur_suivant_El(DetPrec2,1,DetPrec3,1); if DetPrec4<1024 then begin - if AffSignal or (NivDebug=3) then AfficheDebug('les détecteurs précédents au feu '+IntToSTR(Adrfeu)+' sont:'+intToSTR(Det_initial)+' '+intToSTR(DetPrec1)+' '+intToSTR(DetPrec2)+' '+intToSTR(DetPrec3)+' '+intToSTR(DetPrec4),clyellow); + if AffSignal or (NivDebug=3) then AfficheDebug('Les détecteurs précédents au feu '+IntToSTR(Adrfeu)+' sont:'+intToSTR(Det_initial)+' '+intToSTR(DetPrec1)+' '+intToSTR(DetPrec2)+' '+intToSTR(DetPrec3)+' '+intToSTR(DetPrec4),clyellow); PresTrain:=MemZone[DetPrec4,detPrec3] or MemZone[DetPrec3,detPrec2] or MemZone[DetPrec2,detPrec1] or MemZone[DetPrec1,Det_initial] or presTrain ; if AffSignal or (NivDebug=3) then @@ -6115,7 +6097,7 @@ begin if MemZone[DetPrec3,detPrec2] then AfficheDebug('1.présence train '+IntToSTR(DetPrec3)+' '+IntToSTR(detPrec2),clyellow); if MemZone[DetPrec2,detPrec1] then AfficheDebug('2.présence train '+IntToSTR(DetPrec2)+' '+IntToSTR(detPrec1),clyellow); if MemZone[DetPrec1,det_initial] then AfficheDebug('3.présence train '+IntToSTR(DetPrec1)+' '+IntToSTR(det_Initial),clyellow); - //if PresTrain then AfficheDebug('présence train',clyellow) else afficheDebug('abscence train',clyellow); + if PresTrain then AfficheDebug('présence train',clyellow) else afficheDebug('abscence train',clyellow); end; end; //if AffSignal then AfficheDebug('MemZone'+intToSTR(DetPrec3)+' '+IntToSTR(detPrec2) = '+MemZone[DetPrec3,detPrec2] @@ -6125,9 +6107,9 @@ begin end; inc(j); until (j>=5); - if presTrain or (NivDebug=3) then + if AffSignal or (NivDebug=3) then begin - if AffSignal Then afficheDebug('présence train feu '+intToSTR(AdrFeu),clorange) + if presTrain Then afficheDebug('présence train feu '+intToSTR(AdrFeu),clorange) else AfficheDebug('Absence train feu '+intToSTR(AdrFeu),clorange); end; PresTrainPrec:=presTrain; @@ -6295,6 +6277,7 @@ end; Procedure Maj_feux; var i : integer; begin + //Affiche('MAJ FEUX',clOrange); Maj_feux_cours:=TRUE; for i:=1 to NbreFeux do begin @@ -6359,6 +6342,7 @@ var AdrFeu,AdrDetFeu,Nbre,Nouveau_Det,i,resultat,det1,det2,det3,AdrSuiv,TypeSuiv begin creer_tableau:=false; det3:=event_det[N_event_det]; // c'est le nouveau détecteur + if det3=0 then exit; // pas de nouveau détecteur FormDebug.MemoEvtDet.lines.add('Le nouveau détecteur est '+IntToSTR(det3)) ; if TraceListe then AfficheDebug('Le nouveau détecteur est '+IntToSTR(det3),clyellow) ; @@ -6446,8 +6430,8 @@ begin lines.add('Nouveau Tampon train '+intToStr(i)+'--------'); lines.add(intToSTR(event_det_train[i].det[1])); lines.add(intToSTR(event_det_train[i].det[2])); - end; - if TraceListe then + end; + if TraceListe then begin AfficheDebug('Nouveau Tampon train '+intToStr(i)+'--------',clyellow); AfficheDebug(intToSTR(event_det_train[i].det[1]),clyellow ); @@ -6484,7 +6468,7 @@ begin end; end; end; - + if TraceListe then AfficheDebug('Création Train n°'+intToSTR(i),clyellow); Formprinc.LabelNbTrains.caption:=IntToSTR(N_trains); event_det_train[N_trains].det[1]:=det3; @@ -6493,8 +6477,8 @@ begin begin lines.add('Nouveau Tampon train '+intToStr(N_trains)+'--------'); lines.add(intToSTR(event_det_train[N_trains].det[1])); - end; - if TraceListe then + end; + if TraceListe then begin AfficheDebug('Nouveau Tampon train '+intToStr(N_trains)+'--------',clyellow); AfficheDebug(intToSTR(event_det_train[N_trains].det[1]),clyellow ); @@ -6503,14 +6487,14 @@ end; -// demande l'état d'un accessoire à la centrale. Le résultat sera réceptionné sur réception des informations +// demande l'état d'un accessoire à la centrale. Le résultat sera réceptionné sur évènement des informations // de rétrosignalisation. procedure demande_info_acc(adresse : integer); var s : string; n : integer; begin // uniquement si connecté directement à la centrale - if portCommOuvert or ParSocket then + if portCommOuvert or parSocketLenz then begin // envoyer 2 fois la commande, une fois avec N=0 pour récupérer le nibble bas, // une autre fois avec N=1 pour récupérer le nibble haut @@ -6525,7 +6509,7 @@ begin s:=s+char(n or 1); // N=1 (bit 0) s:=checksum(s); envoi(s); - end; + end; end; // demande l'état de tous les accessoires par l'interface @@ -6622,6 +6606,15 @@ begin Formprinc.statictext.caption:=s; end; +procedure evalue; +begin + if not(configNulle) then + begin + //if CDM_connecte // and (length(recuCDM)<1000) then + Maj_feux; // on ne traite pas les calculs si CDM en envoie plusieurs + end; +end; + // traitement sur les évènements détecteurs procedure Event_Detecteur(Adresse : integer;etat : boolean;train : string); var i,AdrSuiv,AdrFeu,AdrDetfeu,TrainActuel,Etat01,typeSuiv,AdrPrec : integer; @@ -6636,7 +6629,7 @@ begin begin if (event_det_tick[N_event_tick].etat=etat01) and (event_det_tick[N_event_tick].detecteur=Adresse) then begin - //Affiche(IntToSTR(Adresse)+' déja stocké',clorange); + //Affiche(IntToSTR(Adresse)+' déja stocké',clorange); exit; // déja stocké end; end; @@ -6664,13 +6657,13 @@ begin N_Event_tick:=0; Affiche('Raz Evts détecteurs',clLime); end; - inc(N_Event_tick); + inc(N_Event_tick); event_det_tick[N_event_tick].tick:=tick; event_det_tick[N_event_tick].detecteur:=Adresse; event_det_tick[N_event_tick].etat:=etat01; if (n_Event_tick mod 10) =0 then affiche_memoire; // Affiche('stockage de '+intToSTR(N_event_tick)+' '+IntToSTR(Adresse)+' à '+intToSTR(etat01),clyellow); - + // détection front montant if not(ancien_detecteur[Adresse]) and detecteur[Adresse].etat then @@ -6689,20 +6682,20 @@ begin if AdrPrec=0 then begin If traceListe then AfficheDebug('Le feu '+IntToSTR(AdrFeu)+' est précédé d''un buttoir',clyellow); - MemZone[0,AdrDetFeu]:=true; + MemZone[0,AdrDetFeu]:=true; maj_feu(AdrFeu); - end; + end; end; - + end; - + end; // détection fronts descendants if ancien_detecteur[Adresse] and not(detecteur[Adresse].etat) and (N_Event_detAdresse then + //if event_det[N_event_det]<>Adresse then begin if AffFD then AfficheDebug('index='+intToSTR(N_event_tick)+' FD '+intToSTR(Adresse),clyellow); inc(N_event_det); @@ -6720,11 +6713,11 @@ begin AfficheDebug('Attention : position de l''aiguillage '+IntToSTR(i)+' inconnue',clred); end; end; - end; + end; end; premierFD:=True; - if not(configNulle) then calcul_zones; // en avant les calculs - end; + calcul_zones; + end; end; if (N_event_det>=Max_event_det) then @@ -6732,7 +6725,7 @@ begin Affiche('Débordement d''évènements FD - Raz tampon',clred); N_event_det:=0; FormDebug.MemoEvtDet.lines.add('Raz sur débordement'); - end; + end; // attention à partir de cette section le code est susceptible de ne pas être exécuté @@ -6746,18 +6739,21 @@ end; // évènement d'aiguillage procedure Event_Aig(adresse,pos,objet : integer); var s: string; + faire_event: boolean; begin // ------------------- traitement du numéro d'objet ------------------------- // init objet - if aiguillage[adresse].objet=0 then + if aiguillage[adresse].objet=0 then begin aiguillage[adresse].objet:=objet; //affiche('stockage Aiguillage '+intToSTR(adresse)+' objet='+intToSTR(objet),clYellow); - end; - + end; + + // ne pas faire l'évaluation si l'ancien état de l'aiguillage est indéterminée (9) + // car le RUN vient de démarrer + faire_event:=aiguillage[adresse].position<>9; aiguillage[adresse].position:=pos; - // ------------- stockage évènement aiguillage dans tampon event_det_tick ------------------------- if (N_Event_tick>=Max_Event_det_tick) then begin @@ -6785,7 +6781,7 @@ begin begin formTCO.Maj_TCO(Adresse); end; - Maj_feux; + if faire_event then evalue; end; @@ -7495,7 +7491,7 @@ begin N_Trains:=0; NivDebug:=0; TempoAct:=0; - DebugOuv:=True; + debugtrames:=false; AvecInit:=true; //&&&& Option_demarrage:=false; @@ -7508,6 +7504,7 @@ begin ferme:=false; CDM_connecte:=false; pasreponse:=0; + recuCDM:=''; Nbre_recu_cdm:=0; AffMem:=true; N_routes:=0; @@ -7549,7 +7546,7 @@ begin end; end; - if portCommOuvert or parsocket then + if portCommOuvert or parSocketLenz then With Formprinc do begin ButtonEcrCV.Enabled:=true; @@ -7574,7 +7571,7 @@ begin begin cree_image(i); // et initialisation tableaux signaux end; - Tempo_init:=10; // démarre les initialisation des signaux et des aiguillages dans 1 s + Tempo_init:=5; // démarre les initialisation des signaux et des aiguillages dans 1 s // initialisation de la chronologie des évènements détecteurs for i:=0 to Max_Event_det_tick do @@ -7606,10 +7603,9 @@ begin LabelEtat.Caption:=' '; Affiche_memoire; //--------------------------------- - { + { aiguillage[20].position:=const_droit; aiguillage[21].position:=const_droit; - NivDebug:=3; FormDebug.show; @@ -7697,7 +7693,7 @@ begin Affiche('Positionnement des aiguillages',clYellow); init_aiguillages; // initialisation des aiguillages end; - if (AvecInitAiguillages=0) and not(ferme) and (parSocket or portCommOuvert) then + if (AvecInitAiguillages=0) and not(ferme) and (parSocketLenz or portCommOuvert) then begin demande_etat_acc; // demande l'état des accessoires (position des aiguillages) end; @@ -7917,7 +7913,7 @@ begin rafraichit; end; -// erreur sur socket +// erreur sur socket Lenz procedure TFormPrinc.ClientSocketLenzError(Sender: TObject; Socket: TCustomWinSocket; ErrorEvent: TErrorEvent; var ErrorCode: Integer); @@ -7933,7 +7929,7 @@ begin end; affiche(s,clOrange); if nivDebug=3 then afficheDebug(s,clOrange); - parSocket:=false; + parSocketLenz:=false; ErrorCode:=0; end; @@ -7953,7 +7949,7 @@ begin affiche(s,ClOrange); afficheDebug(s,ClOrange); CDM_connecte:=false; - if (portCommOuvert=false) and (parsocket=false) then LabelTitre.caption:=titre; + if (portCommOuvert=false) and (parSocketLenz=false) then LabelTitre.caption:=titre; caption:=AF; ErrorCode:=0; end; @@ -7987,7 +7983,7 @@ begin Affiche('Ce programme pilote des signaux complexes de façon autonome ou avec CDM rail ',ClYellow); Affiche('En fonction des détecteurs mis à 1 ou 0 par des locomotives',ClYellow); Affiche('en circulation sur le réseau',ClYellow); - Affiche('Il est nécessaire de renseigner le fichier config.cfg',ClOrange); + Affiche('Il est nécessaire de renseigner les fichiers config.cfg et config-gl.cfg',ClOrange); Affiche('En vert : Trames envoyées à l''interface',ClWhite); Affiche('En blanc : Trames reçues de l''interface',ClWhite); Affiche('En violet : Trames brutes reçues de l''interface',ClWhite); @@ -8051,11 +8047,7 @@ begin cde_cdm:='0'+IntToSTR(i)+s; end; -procedure TFormPrinc.locoClick(Sender: TObject); -begin - // vitesse et direction 18 pas - vitesse_loco(3,20,true); -end; + procedure TFormPrinc.AffEtatDetecteurs(Sender: TObject); var j,adr,NBranche : integer; @@ -8143,7 +8135,7 @@ procedure TFormPrinc.ClientSocketLenzConnect(Sender: TObject;Socket: TCustomWinS begin Affiche('Lenz connecté ',clYellow); AfficheDebug('Lenz connecté ',clYellow); - parSocket:=True; + parSocketLenz:=True; ButtonEcrCV.Enabled:=true; ButtonLitCV.Enabled:=true; LireunfichierdeCV1.enabled:=true; @@ -8164,57 +8156,94 @@ begin DeConnecterCDMRail.enabled:=true; end; -procedure Interprete_trameCDM(recuCDM : string); +procedure Interprete_trameCDM(trame_CDM:string); var i,j,objet,posST,posAC,posDT,posSG,posXY,k,l,erreur, adr,adr2,etat,etataig, - vitesse,etatAig2,name,prv : integer ; + vitesse,etatAig2,name,prv,nbre,nbreVir,long : integer ; x,y,x2,y2 : longint ; - s,ss,train : string; + s,ss,train,commandeCDM : string; traite,sort : boolean; begin - //recuCDM:='S-E-08-0530-CMDTRN-SPDXY|063|07|NAME=BB16024;AD=3;SPEED=120;X=10521;Y=2867;X2=18915;Y2=3202;S-E-08-0531-CMDGEN-_STOP|000|'; - - AckCDM:=recuCDM<>''; - if pos('ACK',recuCDM)=0 then +{ + recuCDM:='S-E-52-6601-CMDACC-ST_TO|037|05|NAME=2;OBJ=2;AD=126;AD2=0;STATE=0;S-E-52-6602-CMDACC'; + recuCDM:=recuCDM+'-ST_TO|037|05|NAME=6;OBJ=6;AD=127;AD2=0;STATE=0;S-E-52-6603-CMDACC-ST_TO|039|05|NAME=10;OBJ=10;AD=128;AD2=0;STATE=0;S-E-52-6604-CMDACC-ST_TO|039|05|'; + recuCDM:=recuCDM+'NAME=14;OBJ=14;AD=129;OBJ=10;AD=128;AD2=0;STATE=0;S-E-52-6604-CMDACC-ST_TO|039|05|NAME=14;OBJ=14;AD=129;AD2=0;STATE=0;'; + } + AckCDM:=trame_CDM<>''; + if pos('ACK',trame_CDM)=0 then begin - if pos('ERR=200',recuCDM)<>0 then Affiche('Erreur CDM : réseau non chargé',clred); + if pos('ERR=200',trame_CDM)<>0 then Affiche('Erreur CDM : réseau non chargé',clred); end; + k:=0; + //Affiche('L='+InTToSTR(length(recuCDM)),clyellow); repeat + // trouver la longueur de la chaîne de paramètres + i:=pos('|',trame_CDM); + val(copy(trame_CDM,i+1,5),long,erreur); + //Affiche('long chaine param='+intToSTR(long),clyellow); + if long=0 then + begin + if debugTrames then Affiche('Longueur nulle',clYellow); + Nbre_recu_cdm:=0; + exit; + end; + + // trouver le nombre de paramètres + i:=posEx('|',trame_CDM,i+1); + if i=0 then + begin + if debugTrames then Affiche('0 paramètres '+trame_CDM,clyellow); + Nbre_recu_cdm:=0; + exit; + end; + + val(copy(trame_CDM,i+1,5),nbre,erreur); + //Affiche('nbre='+IntToSTR(nbre),clyellow); + // compter le nombre de virgules qui doit être égal au nombre de paramètres + NbreVir:=0; // nombre de virgules + repeat + i:=posEx(';',trame_CDM,i+1); + if i<>0 then inc(NbreVir); + until (i=0) or (NbreVir=nbre); + if i=0 then + begin + if debugTrames then Affiche('tronqué : '+trame_CDM,clyellow); + residuCDM:=trame_CDM; + Nbre_recu_cdm:=0; + exit; + end; + + CommandeCDM:=copy(trame_CDM,1,i); + if debugTrames then Affiche(commandeCDM,clorange); + Delete(trame_CDM,1,i); + // Affiche('K='+intToSTR(k)+' longueur='+intToSTR(length(recuCDM)),clyellow); // évènement aiguillage. Le champ AD2 n'est pas forcément présent - posST:=pos('CMDACC-ST_TO',recuCDM); + posST:=pos('CMDACC-ST_TO',commandeCDM); if posST<>0 then begin - //Affiche(recuCDM,cllime); + delete(commandeCDM,posST,12); objet:=0; - i:=posEx('OBJ=',recuCDM,posST);ss:=copy(recuCDM,i+4,10); - if i<>0 then val(ss,objet,erreur) else Affiche('Erreur pas d''objet ',clred); - - i:=posEx('AD=',recuCDM,posST);ss:=copy(recuCDM,i+3,10); //Affiche('j='+IntToSTR(j)+' i='+intToSTR(i),clred); - if i0 then begin val(ss,objet,erreur);delete(commandeCDM,i,6);end else Affiche('Erreur 95 : pas d''objet ',clred); + + i:=posEx('AD=',commandeCDM,posST);ss:=copy(commandeCDM,i+3,10); //Affiche('j='+IntToSTR(j)+' i='+intToSTR(i),clred); + if i=0 then begin Affiche('Erreur 96 : absence AD aig '+intToSTR(adr),clred);Affiche(commandeCDM,clyellow);end; + val(ss,adr,erreur);Delete(commandeCDM,i,4); + //Affiche(copy(recuCDM,j,i+80),clOrange); - i:=posEx('AD2=',recuCDM,i);ss:=copy(recuCDM,i+4,10); // Affiche('i='+intToSTR(i),clOrange); - if i0 then begin Delete(recuCDM,posST,i+5-posST) ;end else - begin - s:='Erreur 95 posST='+IntToSTR(posST)+' i='+intToSTR(i); - Affiche(s,clred); - Nbre_recu_cdm:=0; - Affiche(recuCDM,clred); - exit; - end; + i:=posEx('STATE=',commandeCDM,i);ss:=copy(commandeCDM,i+6,10); //Affiche('j='+IntToSTR(j)+' i='+intToSTR(i),clred); + if i=0 then begin Affiche('Erreur 98 : absence STATE aig '+intToSTR(adr),clred);Affiche(commandeCDM,clyellow);end; val(ss,etat,erreur); - //Affiche('Aiguillage CDM '+intToSTR(adr)+'='+IntToStr(etat)+' objet='+intToSTR(objet),clLime); - // conversion en position : - // CDM: 0=droit 1=droite 3=gauche - // logiciel : 1=dévié 2=droit + Delete(commandeCDM,i,7); + + //Affiche('Aig '+inttostr(adr)+' pos='+IntToSTR(etat),clyellow); + //Affiche(commandeCDM,clyellow); // aiguillage normal if aiguillage[adr].modele=1 then @@ -8257,26 +8286,30 @@ begin Event_Aig(adr,etatAig,objet); Event_Aig(adr2,etatAig2,objet); end; - - Tempo_chgt_feux:=10; // demander la mise à jour des feux - - //Affiche(recuCDM,CLOrange); - //if length(recuCDM)>80 then Affiche(copy(recuCDM,80,length(recuCDM)-80),clOrange); + // Tempo_chgt_feux:=10; // demander la mise à jour des feux end; + // évènement détecteur - posDT:=pos('CMDACC-ST_DT',recuCDM); + posDT:=pos('CMDACC-ST_DT',commandeCDM); if posDT<>0 then begin - i:=posEx('AD=',recuCDM,posDT);ss:=copy(recuCDM,i+3,10); - val(ss,adr,erreur); - i:=posEx('TRAIN=',recuCDM,posDT); - j:=PosEx(';',recuCDM,i); - train:=copy(recuCDM,i+6,j-i-6); + Delete(commandeCDM,posDT,12); + i:=posEx('AD=',commandeCDM,posDT); + if i<>0 then + begin + ss:=copy(commandeCDM,i+3,10);Delete(commandeCDM,i,4); + val(ss,adr,erreur); + end; + i:=posEx('TRAIN=',commandeCDM,posDT); + j:=PosEx(';',commandeCDM,i); + train:=copy(commandeCDM,i+6,j-i-6); + delete(commandeCDM,i,7); + //Affiche('Train=*'+Train+'*',clOrange); - i:=posEx('STATE=',recuCDM,posDT);ss:=copy(recuCDM,i+6,10); - val(ss,etat,erreur); - Delete(recuCDM,posDT,i+5-posDT); + i:=posEx('STATE=',commandeCDM,posDT);ss:=copy(commandeCDM,i+6,10); + val(ss,etat,erreur); Delete(commandeCDM,i,7); + if (train='_NONE') then train:=detecteur[Adr].train; Event_detecteur(Adr,etat=1,train); //Affiche(IntToSTR(adr)+' '+IntToSTR(etat),clyellow); @@ -8284,13 +8317,14 @@ begin end ; // évènement signal - non stocké ni interprété - posSG:=pos('CMDACC-ST_SG',recuCDM); + posSG:=pos('CMDACC-ST_SG',commandeCDM); if posSG<>0 then begin - i:=posEx('AD=',recuCDM,posDT);ss:=copy(recuCDM,i+3,10); + Delete(commandeCDM,posSG,12); + i:=posEx('AD=',commandeCDM,posDT);ss:=copy(commandeCDM,i+3,10); val(ss,adr,erreur); - i:=posEx('STATE=',recuCDM,posSG);ss:=copy(recuCDM,i+6,10); - Delete(recuCDM,posSG,i+5-posSG); + i:=posEx('STATE=',commandeCDM,posSG);ss:=copy(commandeCDM,i+6,10); + Delete(commandeCDM,posSG,i+5-posSG); val(ss,etat,erreur); //Affiche('SignalCDM '+intToSTR(adr)+'='+IntToStr(etat),clYellow); end ; @@ -8298,91 +8332,109 @@ begin // évènement actionneur // attention un actionneur qui repasse à 0 ne contient pas de nom de train //S-E-03-0157-CMDACC-ST_AC|049|05|NAME=0;OBJ=7101;AD=815;TRAIN=CC406526;STATE=1; - posAC:=pos('CMDACC-ST_AC',recuCDM); + posAC:=pos('CMDACC-ST_AC',commandeCDM); if posAC<>0 then begin - i:=posEx('AD=',recuCDM,posAC);ss:=copy(recuCDM,i+3,10); + Delete(commandeCDM,posAC,12); + i:=posEx('AD=',commandeCDM,posAC);ss:=copy(commandeCDM,i+3,10); val(ss,adr,erreur); - i:=posEx('NAME=',recuCDM,posAC);ss:=copy(recuCDM,i+5,10); + i:=posEx('NAME=',commandeCDM,posAC);ss:=copy(commandeCDM,i+5,10); val(ss,name,erreur); - i:=posEx('TRAIN=',recuCDM,posAC);l:=PosEx(';',recuCDM,i); - train:=copy(recuCDM,i+6,l-i-6); - i:=posEx('STATE=',recuCDM,posAC);ss:=copy(recuCDM,i+6,10); + i:=posEx('TRAIN=',commandeCDM,posAC);l:=PosEx(';',commandeCDM,i); + train:=copy(commandeCDM,i+6,l-i-6); + i:=posEx('STATE=',commandeCDM,posAC);ss:=copy(commandeCDM,i+6,10); val(ss,etat,erreur); - Delete(recuCDM,posAC,i-posAC); - i:=pos(';',recuCDM); - if i<>0 then Delete(recuCDM,1,i); + Delete(commandeCDM,posAC,i-posAC); + i:=pos(';',commandeCDM); + if i<>0 then Delete(commandeCDM,1,i); if AfficheDet then Affiche('Actionneur AD='+intToSTR(adr)+' Nom='+intToSTR(name)+' Train='+train+' Etat='+IntToSTR(etat),clyellow); Event_act(adr,etat,train); // déclenche évent actionneur end; // évènement position des trains - non stocké ni interprété - posXY:=pos('CMDTRN-SPDXY',recuCDM); + posXY:=pos('CMDTRN-SPDXY',commandeCDM); if posXY<>0 then begin - i:=posEx('AD=',recuCDM,posXY);l:=posEx(';',recuCDM,i); - ss:=copy(recuCDM,i+3,10); + Delete(commandeCDM,posXY,12); + i:=posEx('AD=',commandeCDM,posXY);l:=posEx(';',commandeCDM,i); + ss:=copy(commandeCDM,i+3,10); val(ss,adr,erreur); //Affiche('AD='+IntToSTR(adr),clyellow); - Delete(recuCDM,i,l-i+1); - - i:=posEx('NAME=',recuCDM,posXY);l:=posEx(';',recuCDM,i); - train:=copy(recuCDM,i+5,l-i-5); + Delete(commandeCDM,i,l-i+1); + + i:=posEx('NAME=',commandeCDM,posXY);l:=posEx(';',commandeCDM,i); + train:=copy(commandeCDM,i+5,l-i-5); //Affiche('Train='+train,clyellow); - Delete(recuCDM,i,l-i+1); + Delete(commandeCDM,i,l-i+1); - i:=posEx('SPEED=',recuCDM,posXY);l:=posEx(';',recuCDM,i); - ss:=copy(recuCDM,i+6,10); + i:=posEx('SPEED=',commandeCDM,posXY);l:=posEx(';',commandeCDM,i); + ss:=copy(commandeCDM,i+6,10); val(ss,vitesse,erreur); //Affiche('Vitesse='+intToSTR(vitesse),clyellow); - Delete(recuCDM,i,l-i+1); + Delete(commandeCDM,i,l-i+1); - i:=posEx('X=',recuCDM,posXY);l:=posEx(';',recuCDM,i); - ss:=copy(recuCDM,i+2,10); + i:=posEx('X=',commandeCDM,posXY);l:=posEx(';',commandeCDM,i); + ss:=copy(commandeCDM,i+2,10); val(ss,x,erreur); //Affiche('X='+IntTostr(x),clyellow); - Delete(recuCDM,i,l-i+1); + Delete(commandeCDM,i,l-i+1); - i:=posEx('Y=',recuCDM,posXY);l:=posEx(';',recuCDM,i); - ss:=copy(recuCDM,i+2,10); + i:=posEx('Y=',commandeCDM,posXY);l:=posEx(';',commandeCDM,i); + ss:=copy(commandeCDM,i+2,10); val(ss,y,erreur); //Affiche('Y='+IntTostr(y),clyellow);; - Delete(recuCDM,i,l-i+1); + Delete(commandeCDM,i,l-i+1); - i:=posEx('X2=',recuCDM,posXY);l:=posEx(';',recuCDM,i); - ss:=copy(recuCDM,i+3,10); + i:=posEx('X2=',commandeCDM,posXY);l:=posEx(';',commandeCDM,i); + ss:=copy(commandeCDM,i+3,10); val(ss,x2,erreur); //Affiche('X2='+IntTostr(x2),clyellow); - Delete(recuCDM,i,l-i+1); + Delete(commandeCDM,i,l-i+1); - i:=posEx('Y2=',recuCDM,posXY);l:=posEx(';',recuCDM,i); - ss:=copy(recuCDM,i+3,10); + i:=posEx('Y2=',commandeCDM,posXY);l:=posEx(';',commandeCDM,i); + ss:=copy(commandeCDM,i+3,10); val(ss,y2,erreur); //Affiche('Y2='+IntTostr(y2),clyellow); - Delete(recuCDM,i,l-i+1); + Delete(commandeCDM,i,l-i+1); - Delete(recuCDM,posXY,12); + Delete(commandeCDM,posXY,12); end; - + inc(k); - sort:=(k>200) or (posST=0) and (posDT=0) and (posAC=0) and (posSG=0); + //Affiche('k='+intToSTR(k),clyellow); + sort:=(length(trame_CDM)<10) or (k>=2000);// or (posST=0) and (posDT=0) and (posAC=0) and (posSG=0); until (sort); - //Affiche('Ligne traitée'+recuCDM,clLime); - if k>=200 then begin Affiche('Erreur 90 : Longrestante='+IntToSTR(length(recuCDM)),clred); Affiche(recuCDM,clred); end; + //Affiche('k='+IntToSTR(k)+' Ligne traitée '+recuCDM,clLime); + //if pos('_ACK',recuCDM)=0 then recuCDM:=''; // effacer la trame sauf si c'est une trame ACK car le trame est utilisée dans le process de connexion de cdm + if k>=2000 then begin Affiche('Erreur 90 : Longrestante='+IntToSTR(length(trame_CDM)),clred); Affiche(trame_CDM,clred); end; + Nbre_recu_cdm:=0; end; // réception d'un message de CDM rail procedure TFormPrinc.ClientSocketCDMRead(Sender: TObject;Socket: TCustomWinSocket); - var i,j,k,l,erreur, adr,adr2,etat,etataig,etatAig2,name : integer ; + var i,l,n : integer ; s,ss,train : string; traite,sort : boolean; begin - inc(Nbre_recu_cdm); - recuCDM:=ClientSocketCDM.Socket.ReceiveText; - if trace then begin Affiche('recu de CDM:',clWhite);Affiche(recuCDM,clWhite);end; + inc(Nbre_recu_cdm); + //if Nbre_recu_cdm>1 then Affiche('Empilement de trames CDM: '+RecuCDM,clred); + recuCDM:=residuCDM+ClientSocketCDM.Socket.ReceiveText; // commandeCDM est le morceau tronquée de la fin de la réception précédente + //if residuCDM<>'' then Affiche(recuCDM,clLime); + residuCDM:=''; + if trace then + begin + n:=80; + Affiche('recu de CDM Tick='+IntToSTR(tick)+' '+IntToSTR(length(recuCDM))+' car',clWhite);Affiche(copy(recuCDM,1,n),clWhite); + l:=length(recuCDM); + i:=1; + repeat + Affiche(copy(recuCDM,i*n,n),clWhite); + inc(i); + until l%{0MlU#CIA2c diff --git a/UnitTCO.dcu b/UnitTCO.dcu index 5f8b02c35c7d35204232150f040786ab8ab2886a..129679e72e2b4ce4f69fa88d0ae5fbe24e9b31bd 100644 GIT binary patch delta 1141 zcmXZaUuauZ90&08JE!;FY?rQUu-jVapS0pyVKk##F-W538l;r!@=#Er)FPr|2*NhO zZFH+?Cl2PQ6MmHyAg*XpzPzU*-?xO8#)xtYPTgsrq%b6R}b00r7Xrha1r z79YArXG!svKk2MV1vUSIp!I!=-?=S;cf#V;+jP`CeckZqcj%~$7Vc0=Q#W_trIaxT z4C{MzQtGEckhf=Pz?@lgcpQOu&T#TC8j$`!J||{Mt5|=R==IUFrR?~uESt)c9Nf(x)VAOgy0I=HV~&NTqy6qG1duE`La?rs-wPfqB|Py&RjTnnpQ+ zQ$cB0h5JEu_&eZro9|&;cnBoJBS2=kcb;}^omqD>C}hJ^U^aXcD4v|BM%jMR=fxb= zo4QGh_vR=h<%2#0Qr7zq^JI={%?EjlXHgiw$`yI4)om8<&P!f&xFb&?WT-Qkmqr8oLXctJ(C$SG7c zzwVRpX#v&EN#Op#ON&%X+qq^*ez%dMKyjB~246DV>*qfT+P%)dEy)pK;~WZfk)K+o z&?dEWEB1-(0gB&Trf9G(ZFeCZi|hmDl+E8R(?_!QnzYI0=t}8oK3So6b#{u=D^$Np zwQrNz(P#$CQqu&=Vg5h)a8XS#NO^FR)Ls>bPh*yGZ@hYEZK+`uS1oQC*pmyS!^mc)E sF9PIm7lnOZ0vu@3EpW(7);urjc4U{lj#6_-cfl!dA5i1>SLuH6KR&oj+5i9m delta 1118 zcmXBQe@NVQ7zgn0^Lg%{XC!N^WppX z{?PBa-0$&DTh`jk4;bs4z0s&Q=B1ITP4O?C5tn7GyY7Y@jS6|16${s=sE>W!21kFV zQ>JeL5B))>$ij%gc7XB9RSB2&82opYIyo`r#PMqq0;P=1HR|F(2jj#vb;%k2lX|%8 zNrMkG*t;0TGxRY(CE;5MrZ$Ziu8WTr;HJpoH=KwjQzkX-*4b(%JVj5^6U zl3cxfB}tu>KYZ*4jX60{?jGKLiw+U{VvN{r3azyU3*|wPiXkO=4`!BD^`3cO-4N_kii4jhKYgleV{kxe3JxkmC-L?iJ+aY@Yc&&`P?Et( zrSw(C_j6Rmfe#tCG@QTh#v}9OHz^l(&QlrlX-2yS`wK>|?(8~<*gTcf^O(}ocL0tQ zmGh++4g4wcZ#K6dl&eRpQ#lrMWR)MQX}v%faa1PdnFA@k`Lqjhsm<$!n3aa~i|&x0 z`K$w>J2KE;&)BD({Ye*kCCEffFjRnPEys|*AZ7eb)GSa1`?k2SPZ~1TyFg9k!L(Ey zA7|vHCHyOotdSu5ty+7xIna~V#||2Nts(x76Te6>Jc3kOUgxc5tY4Hy$b+Xv_U&-t zC2bu33Z2?W9C6_@ZNv>m7v+fl${V_~|B4HFOH@{5?{-&il=p9_t5r&E#xqM4T4x{U zHf;>mwJQeiF41eIwgz*u%ZURHR4!8$8MG|Z%N!3mFtSYk!p94mAC~bmp%x|Zog1?< z#_^jjY|2mxZ@u8g){J~WM}r)d&SQ3o8P(avXMa|t99IjU`&H@a$442eFf(b4X5_cn z5rco^JZ;CCEcw@2kz$#mZH>yoe8!Hfe3gZ_veas#J(v_XhYveby5C)&Rjj+Zo~fsj zRq~Y2(Yit08P`u~3Qf&%vQJTYbiWSneI~-AdYtVHd+@yHRxmmpsZc(f@ QT_?ir%9`OTEA)5K|0MiZZ2$lO diff --git a/page.txt b/page.txt deleted file mode 100644 index 6803315..0000000 --- a/page.txt +++ /dev/null @@ -1,624 +0,0 @@ - - - - - - - - - - - - - - - -Forum CDM-Rail • Voir le sujet - Client Graphique Signaux_complexes_GL - - - - - - - - - - - - - - - - - - - - - -
- -
- - - \ No newline at end of file diff --git a/verif_version.dcu b/verif_version.dcu index 5e3b9e8f99783ca7e5827cefa4566ec8ba1220c8..23fb69acf8e6be7c4502c95c9b4e821de3e1c057 100644 GIT binary patch delta 248 zcmez4+3Ll8pMim&Rh5BZSx4tYZdvA~9i1Ds0|kUnmsB*!FiHIf0u}}a1|vN~JOlJuj`+k5ip^Q79i_?>6eTJlUGZbiEn_3@3;VCy%yV{Gx>*YSqpNg#pH=Ha!iKClQ+o7FflM}J}slo%BVW|yW&SCUhd7W Olx!IpRVHhwTmb+F7*Xv2 delta 261 zcmZqm`s2xcpMin@j|u|=TUYZ$Zdqp5uI7!}fdWFEJ4+g5m?ZuK0W$*wgOQ%m=6(Sd zMn=cYQv{DOGA`U4E&Py;@xo+VDM>K_RtARd&_6GL>KM9P|NQ;`KdqbBU~-O>l$s4t z3L-xB2T;7%_0P@#m{3LykoCXxOU8`JYoyG?SHQ$~oPe=ji|tUE{8LJk(}fMB@|nv9%`kwR`_X0bwMjzVfhW^qZXLQbMWS!z*nW`3T+ d<|{JVtcASY!YI diff --git a/verif_version.pas b/verif_version.pas index 0c49ae3..e3ac772 100644 --- a/verif_version.pas +++ b/verif_version.pas @@ -23,7 +23,7 @@ var Lance_verif : integer; verifVersion,notificationVersion : boolean; -Const Version='2.21'; // sert à la comparaison de la version publiée +Const Version='2.3'; // sert à la comparaison de la version publiée implementation diff --git a/versions.txt b/versions.txt index c0d22e7..78e09ee 100644 --- a/versions.txt +++ b/versions.txt @@ -42,6 +42,9 @@ Version 2.2 : Correction d'un bug sur le verrouillage des signaux au carr Mise à jour du fichier de config.cfg si modification des signaux dans la configuration. version 2.21 : Paramétrage du nombre de détecteurs considérés comme trop distants Correction d'un bug de la 2.2 +version 2.3 : Changement de la méthode de réception des trames du protocole IPC de CDM-Rail + +
- - - - -
- -

Client Graphique Signaux_complexes_GL

- -
- - - - - - -
-
- -
-
- -
- -

Client Graphique Signaux_complexes_GL

-

Messagepar gily » 20 Janvier 2020, 21:25

- - -
Bonjour

attention ne gère plus les aiguillages BIS qui sont problématiques.
attention nécessite de nommer les variables du fichier config-gl.cfg - voir le fichier
attention changement de paramétrage des TJD

Version 2.11 du 15/11/2020
Vous trouverez ici la version graphique du programme signaux_complexes_GL, client de CDM rail mais qui fonctionne aussi de façon autonome si vous disposez d'une centrale LENZ ou compatible. Il permet également de piloter des fonctions F de locomotives et des passages à niveaux à plusieurs voies d'après des actionneurs. Il gère un TCO et peut lancer CDM rail automatiquement avec votre LAY et l'interface choisie. :mrgreen:

Ce logiciel nécessite une installation : faire clic droit en sélectionnant "exécuter en tant qu'administrateur" sur installeur.exe.
Vous pouvez voir les nouveautés de chaque version dans le fichier versions.txt.

Pour une mise à jour n'oubliez pas de sauvegarder vos deux fichiers de config (.cfg) avant de copier la nouvelle version ; vous pouvez ne copier que le fichier signaux_complexes_GL.exe.

Elle est téléchargeable depuis ce lien (droits en contrôle total)
-
signaux_complexes_V2.11.zip
-
(728.73 Kio) Jamais téléchargé
-
-


Notice: (cliquer dessus lance le téléchargement automatiquement)
https://github.com/f1iwq2/Signaux_complexes_GL/raw/master/Notice%20d'utilisation%20des%20signaux_complexes_GL_V2.11.pdf

Pour les programmeurs, le zip suivant contient les fichiers source en Delphi, une notice avancée et l'installeur.
https://github.com/f1iwq2/Signaux_complexes_GL/archive/master.zip

A bientot

-
scgl.jpg
-
-


-
ex_tco.jpg
-
-
- -
Dernière édition par gily le 15 Novembre 2020, 10:46, édité 105 fois au total.
- -
- -
-
- gily
- - -
 
- -
Messages: 755
Inscrit le: 25 Juillet 2014, 14:32
Localisation: nord
-
- - - -
-
- -
-
-
- -
- -

Re: Client Graphique Signaux_complexes_GL

-

Messagepar fredo94 » 22 Janvier 2020, 07:56

- - -
Bonjour.

Merci beaucoup.
Petite question est il utile de l utiliser si sur le réseau il n y a que du 2 ou 3 signaux et que comme c est actuellement,cela fonctionne très bien


Merci


Fred
- - -
- -
-
- fredo94
- - -
 
- -
Messages: 189
Inscrit le: 26 Mai 2019, 08:46
-
- - - -
-
- -
-
-
- -
- -

Re: Client Graphique Signaux_complexes_GL

-

Messagepar gily » 22 Janvier 2020, 08:27

- - -
Bonjour

Si tes signaux ne sont pas complexes (c'est à dire qu'ils n'affichent pas plus de 3 états rouge- vert - jaune)
cela n'a aucun intérêt en effet. Ce programme client ne sert que pour piloter les signaux non pilotables par CDM rail (qui s’appellent les signaux complexes et comportent au moins 4 feux)

Salutations
- - -
- -
-
- gily
- - -
 
- -
Messages: 755
Inscrit le: 25 Juillet 2014, 14:32
Localisation: nord
-
- - - -
-
- -
-
-
- -
- -

Re: Client Graphique Signaux_complexes_GL

-

Messagepar fredo94 » 22 Janvier 2020, 09:25

- - -
Merci je vais donc rester comme je suis là.
- - -
- -
-
- fredo94
- - -
 
- -
Messages: 189
Inscrit le: 26 Mai 2019, 08:46
-
- - - -
-
- -
-
-
- -
- -

Re: Client Graphique Signaux_complexes_GL

-

Messagepar DJEFF25 » 26 Janvier 2020, 19:49

- - -
Bonsoir,
j'ai plein de questions à ce sujet car je compte mettre une signalisation avec signaux complexes, mais je ne trouve pas (ou très peu de renseignement) comment placer les différents type de signaux.
Est-ce que l'un d'entre vous aurait une doc sur le sujet, ou bien m'aider à les placer sur mon réseau ?
J'ai déjà réalisé des décodeurs Unisemaf de Paco qui précise dans le pdf comment programmer les cv suivant le type de signal jusqu'à 9 feux.
Le client signaux complexes peut-il gérer ce décodeur car il fonctionne sous cdm rail configuré type signal "CDF" sur un signal 3 feux.
D'autre part j'ai essayé d'installer le programme signaux complexe GL impossible erreur
[img]f:\train\erreur%20GL[/img]
puis après validation de l'erreur
[img]f:\train\erreur%20GL-1[/img]
je pense que ce problème est du ressort de "gily" qui est le concepteur de ce programme.
Je m'arrête là pour aujourd'hui, d'autres questions sur le sujet sont à venir
Cordialement
J.F
- - -
- -
-
- DJEFF25
- - -
 
- -
Messages: 41
Inscrit le: 14 Février 2018, 20:40
-
- - - -
-
- -
-
-
- -
- -

Re: Client Graphique Signaux_complexes_GL

-

Messagepar Dominique76 » 26 Janvier 2020, 21:25

- - -
Bonsoir

Locorevue a publié un ' B-A-BA de la signalisation ferroviaire', en vente sur leur site, peut être y trouveras tu des réponses à tes questions?

Dominique
- - -
- -
-
- Dominique76
- - -
 
- -
Messages: 593
Inscrit le: 10 Avril 2017, 22:34
-
- - - -
-
- -
-
-
- -
- -

Re: Client Graphique Signaux_complexes_GL

-

Messagepar gily » 26 Janvier 2020, 21:27

- - -
Bonjour!!

je vais tenter de répondre aux questions:
Rapidement dit, les signaux complexes s'implantent avant les aiguillages (ou des grills) pour les protéger (par un carré) et/ ou annoncer un aiguillage dévié pour présenter le rappel de ralentissement, et dans le cas ce signal doit être précédé (sur le canton précédent) d'un autre signal complexe pouvant afficher un ralentissement.

Le décodeur Unisemaf de Paco n'est pas géré, je ne le connais même pas :? , il y a un fil sur ce forum qui en parle. Peux tu me donner un lien pour la documentation a télécharger.

Par contre je ne comprends pas l'erreur que tu décrits à l'installation?! Peux tu être plus précis et décrire ce que tu fais avant que l'erreur arrive.
Je vois dans ton message que tu a voulu charger une image mais tu as oublié de l'insérer dans le texte.
Pour information on peut installer le programme de 3 façons.
clic droit avec exécuter en tant qu'administrateur soit sur le fichier install.bat , install2.bat ou installeur.Exe.

Je prépare la version 1.1 qui gèrera les panneaux directionnels (6 feux maxi)

Salutations
- - -
- -
-
- gily
- - -
 
- -
Messages: 755
Inscrit le: 25 Juillet 2014, 14:32
Localisation: nord
-
- - - -
-
- -
-
-
- -
- -

Re: Client Graphique Signaux_complexes_GL

-

Messagepar DJEFF25 » 27 Janvier 2020, 10:02

- - -
Bonjour,

Concernant le décodeur de Paco voici le fichier le lien (impossible de le mettre en pièce jointe car : Désolé, la limite du nombre de pièce jointe sur le forum a été atteinte)
http://usuaris.tinet.cat/fmco/download/ ... manual.pdf

Ensuite je vais essayer de remettre les erreurs,
[img]f:\train\erreur%20gl.jpeg[/img]
[img]f:\train\erreur%20gl-1.jpeg[/img]

A+
JF
- - -
- -
-
- DJEFF25
- - -
 
- -
Messages: 41
Inscrit le: 14 Février 2018, 20:40
-
- - - -
-
- -
-
-
- -
- -

Re: Client Graphique Signaux_complexes_GL

-

Messagepar DJEFF25 » 27 Janvier 2020, 10:42

- - -
Re bonjour,

ça y est j'ai réussi à installer signaux complexes GL je m'était trompé de fichie zip pour les programmeurs.

JF
- - -
- -
-
- DJEFF25
- - -
 
- -
Messages: 41
Inscrit le: 14 Février 2018, 20:40
-
- - - -
-
- -
-
-
- -
- -

Re: Client Graphique Signaux_complexes_GL

-

Messagepar gily » 27 Janvier 2020, 11:14

- - -
bon ok bonne nouvelle pour l'installation :mrgreen:
oui pour les pièces jointes, c'est 1Mo maxi...
je vais regarder ce décodeur...
- - -
- -
-
- gily
- - -
 
- -
Messages: 755
Inscrit le: 25 Juillet 2014, 14:32
Localisation: nord
-
- - - -
-
- -
-
- -
- Suivant - -
- -
-
- -
- - - -
- -

Retourner vers Fonctionnement en réseau: Comm/IP

-
- -
- - - -
-
- -

Qui est en ligne ?

-

Utilisateurs parcourant actuellement ce forum : Aucun utilisateur inscrit et 1 invité

-
- - - -