From d1613a75c612062dfb90d1bb16e3d096a7fa3d30 Mon Sep 17 00:00:00 2001 From: f1iwq2 Date: Thu, 30 Jan 2020 21:25:54 +0100 Subject: [PATCH] V1.11 --- Signaux_complexes_GL.cfg | 12 +- Signaux_complexes_GL.dof | 4 +- Signaux_complexes_GL.res | Bin 3008 -> 3008 bytes UnitDebug.dcu | Bin 7002 -> 7005 bytes UnitPilote.dcu | Bin 10911 -> 10923 bytes UnitPrinc.dcu | Bin 149468 -> 154196 bytes UnitPrinc.dfm | 4 +- UnitPrinc.pas | 666 ++++++++++++++++++++++++--------------- config.cfg | 189 ++++++----- configgily.cfg | 115 +++++++ verif_version.dcu | Bin 9258 -> 8970 bytes verif_version.pas | 26 +- 12 files changed, 634 insertions(+), 382 deletions(-) create mode 100644 configgily.cfg diff --git a/Signaux_complexes_GL.cfg b/Signaux_complexes_GL.cfg index c22c47f..096ce3f 100644 --- a/Signaux_complexes_GL.cfg +++ b/Signaux_complexes_GL.cfg @@ -31,12 +31,12 @@ -M -$M16384,1048576 -K$00400000 --LE"c:\program files\borland\delphi7\Projects\Bpl" --LN"c:\program files\borland\delphi7\Projects\Bpl" --U"c:\program files\borland\delphi7\Lib\Debug" --O"c:\program files\borland\delphi7\Lib\Debug" --I"c:\program files\borland\delphi7\Lib\Debug" --R"c:\program files\borland\delphi7\Lib\Debug" +-LE"c:\program files (x86)\borland\delphi7\Projects\Bpl" +-LN"c:\program files (x86)\borland\delphi7\Projects\Bpl" +-U"c:\program files (x86)\borland\delphi7\Lib\Debug" +-O"c:\program files (x86)\borland\delphi7\Lib\Debug" +-I"c:\program files (x86)\borland\delphi7\Lib\Debug" +-R"c:\program files (x86)\borland\delphi7\Lib\Debug" -w-UNSAFE_TYPE -w-UNSAFE_CODE -w-UNSAFE_CAST diff --git a/Signaux_complexes_GL.dof b/Signaux_complexes_GL.dof index 24aa8fd..e75e027 100644 --- a/Signaux_complexes_GL.dof +++ b/Signaux_complexes_GL.dof @@ -111,7 +111,7 @@ AutoIncBuild=1 MajorVer=1 MinorVer=0 Release=0 -Build=3 +Build=4 Debug=0 PreRelease=0 Special=0 @@ -122,7 +122,7 @@ CodePage=1252 [Version Info Keys] CompanyName= FileDescription= -FileVersion=1.0.0.3 +FileVersion=1.0.0.4 InternalName= LegalCopyright= LegalTrademarks= diff --git a/Signaux_complexes_GL.res b/Signaux_complexes_GL.res index 79d7e1bf2ab8062833d5d999bd88c09e08179e36..5261b6ff5f3bcfc8fb8a9475cd7544e09d6dd6b9 100644 GIT binary patch delta 28 hcmX>gen5Of11Bd70|+oOuuSgcyv}H{Igu-#5ddW@2B`o5 delta 28 hcmX>gen5Of11Bdl0|+oOFi-B}yv}I6Igu-#5ddWd2BrW2 diff --git a/UnitDebug.dcu b/UnitDebug.dcu index 61cb54b362884315fbf1ed86b47282c0220d8186..9063b508bfb454f66910892a04202c5ed847176e 100644 GIT binary patch delta 157 zcmca*cGryiJ_7@PtTY3IYP{V! zGH)t~bpFFW6GXSn1(9tFL1f2L5ZSd6L^5mzksEe`$-N+Q(?KwK5<~_bJPV?(T?CO2 UrYNK`DF`qy7!@*2){-^=0K(iNkN^Mx delta 83 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 Scgje-RDzZ%HcsD4`TqsmgLZfT diff --git a/UnitPrinc.dfm b/UnitPrinc.dfm index 1a62549..4d32b23 100644 --- a/UnitPrinc.dfm +++ b/UnitPrinc.dfm @@ -1,6 +1,6 @@ object FormPrinc: TFormPrinc - Left = 61 - Top = 202 + Left = 14 + Top = 184 BorderStyle = bsSingle Caption = 'Client TCP-IP CDM Rail ou USB - syst'#232'me LENZ' ClientHeight = 607 diff --git a/UnitPrinc.pas b/UnitPrinc.pas index 1f19f4b..8a1a76d 100644 --- a/UnitPrinc.pas +++ b/UnitPrinc.pas @@ -134,7 +134,8 @@ titre='Signaux complexes GL '; tempoFeu = 100; MaxAcc = 2048; LargImg=50;HtImg=91; -const_droit=2;const_devieD=2;const_devieG=3; // aiguillages en position +const_droit=2;const_devieD=1; // positions transmises par la centrale LENZ +const_devieG=3; MaxElParcours=40; EtatSign : array[0..13] of string[20] =('carré','sémaphore','sémaphore cli','vert','vert cli','violet', @@ -201,11 +202,11 @@ const Feu_X=50;Feu_Y=91; var FormPrinc: TFormPrinc; - ack,portCommOuvert,trace,AffMem,AfficheDet,Bis,CDM_connecte,parSocketCDM, + ack,portCommOuvert,trace,AffMem,AfficheDet,CDM_connecte,parSocketCDM, DebugOuv,Raz_Acc_signaux : boolean; tablo : array of byte; Enregistrement,AdresseIP,chaine_Envoi,chaine_recue,AdresseIPCDM,recuCDM,Id_CDM,Af : string; - maxaiguillage,detecteur_chgt,Temps,TpsRecuCom,NumPort,Tempo_init,Suivant, + maxaiguillage,detecteur_chgt,Temps,TpsRecuCom,NumPort,Tempo_init,Suivant,TypeGen, timerSimule,NbreImagePligne,Port,NbreBranches,Index2_det,branche_det,Index_det,portCDM : integer; Ancien_detecteur,detecteur : array[0..1024] of boolean; // anciens état des détecteurs et adresses des détecteurs et leur état Adresse_detecteur : array[0..60] of integer; // adresses des détecteurs par index @@ -2776,7 +2777,8 @@ procedure envoi_signal(Adr : integer); var i : integer; begin i:=index_feu(Adr); - case feux[i].decodeur of + if feux[i].aspect<10 then + case feux[i].decodeur of 0 : envoi_virtuel(Adr); 1 : envoi_signalBahn(Adr); 2 : envoi_CDF(Adr); @@ -2881,7 +2883,7 @@ var s,sa,chaine,SOrigine: string; c,paig : char; tec,bistec,tjd,tjs,s2,trouve,triple,debugConfig,multiple,fini,finifeux : boolean; bd,virgule,i_detect,i,erreur,aig,detect,offset,index, adresse,j,position,temporisation,invers,indexPointe,indexDevie,indexDroit, - ComptEl,Compt_IT,Num_Element,k,modele,aig2,adr,erreur2,l : integer; + ComptEl,Compt_IT,Num_Element,k,modele,aig2,adr,erreur2,l,t,bis : integer; function lit_ligne : string ; begin repeat @@ -2999,7 +3001,7 @@ begin enregistrement:=copy(s,1,virgule-1); // adresse de l'aiguillage [TRI] delete(s,1,virgule); triple:=pos('TRI',enregistrement)<>0; - bis:=pos('B',enregistrement)<>0; + if pos('B',enregistrement)<>0 then bis:=1 else bis:=0; tjd:=pos('TJD',enregistrement)<>0; tjs:=pos('TJS',enregistrement)<>0; // adresse de l'aiguillage @@ -3007,23 +3009,23 @@ begin if aig>maxaiguillage then maxaiguillage:=aig; if debugConfig then Affiche('Adresse='+IntToSTR(aig)+' enregistrement='+Enregistrement,clyellow); - if not(bis) then begin aiguillage[aig].AdroitB:='Z'; aiguillage[aig].AdevieB:='Z'; aiguillage[aig].ApointeB:='Z'; aiguillage[aig].Adevie2B:='Z';end + if bis=0 then begin aiguillage[aig].AdroitB:='Z'; aiguillage[aig].AdevieB:='Z'; aiguillage[aig].ApointeB:='Z'; aiguillage[aig].Adevie2B:='Z';end else begin aiguillageB[aig].AdroitB:='Z';aiguillageB[aig].AdevieB:='Z';aiguillageB[aig].ApointeB:='Z';aiguillageB[aig].Adevie2B:='Z';end ; if (triple) then aiguillage[aig].modele:=4; if (tjs) then begin - if not(bis) then aiguillage[aig].modele:=3 + if bis=0 then aiguillage[aig].modele:=3 else aiguillageB[aig].modele:=3; end; if (tjd) then begin - if not(bis) then aiguillage[aig].modele:=2 + if bis=0 then aiguillage[aig].modele:=2 else aiguillageB[aig].modele:=2; end; if not(tjs) and not(tjd) and not(triple) then begin - if not(bis) then aiguillage[aig].modele:=1 + if bis=0 then aiguillage[aig].modele:=1 else aiguillageB[aig].modele:=1; end; //if debugConfig then Affiche(s,clyellow); @@ -3055,16 +3057,16 @@ begin if erreur<>0 then delete(enregistrement,1,erreur-1); //if ((aig=0) and (erreur=0)) then Affiche('Erreur pas d''adresse dans section P: '+chaine,clRed); if (erreur=0) then enregistrement:=copy(s,1,virgule-1); - if not(bis) then aiguillage[aig].Apointe:=detect else aiguillageB[aig].Apointe:=detect; + if bis=0 then aiguillage[aig].Apointe:=detect else aiguillageB[aig].Apointe:=detect; if (erreur<>0) then // si erreur<>0 peut être un B ou un S ou un , begin if (enregistrement[1]='B') then begin - if not(bis) then aiguillage[aig].ApointeBis:=1 else aiguillageB[aig].ApointeBis:=1; + if bis=0 then aiguillage[aig].ApointeBis:=1 else aiguillageB[aig].ApointeBis:=1; delete(enregistrement,1,1); if (debugConfig) then affiche('connecté a aiguillage BIS'+s,clYellow); end; - if not(bis) then aiguillage[aig].ApointeB:=enregistrement[1] else aiguillageB[aig].ApointeB:=enregistrement[1]; + if bis=0 then aiguillage[aig].ApointeB:=enregistrement[1] else aiguillageB[aig].ApointeB:=enregistrement[1]; delete(enregistrement,1,1); Num_element:=Num_element+1; end; @@ -3085,18 +3087,18 @@ begin if debugconfig then Affiche(enregistrement,clyellow); //if ((aig=0) and (erreur=0)) then Affiche('Erreur pas d''adresse dans section D: '+chaine,clRed); if (erreur=0) then enregistrement:=''; - if not(bis) then aiguillage[aig].Adroit:=detect else aiguillageB[aig].Adroit:=detect; + if bis=0 then aiguillage[aig].Adroit:=detect else aiguillageB[aig].Adroit:=detect; if (erreur<>0) then // si erreur<>0 peut être un B ou un S ou un , begin if (enregistrement[1]='B') then begin - if not(bis) then aiguillage[aig].AdroitBis:=1 else aiguillageB[aig].AdroitBis:=1; + if bis=0 then aiguillage[aig].AdroitBis:=1 else aiguillageB[aig].AdroitBis:=1; delete(enregistrement,1,1); if (debugConfig) then affiche('connecté a aiguillage BIS'+s,clYellow); end; if (enregistrement[1]<>',') then // copier si c'est S P D begin - if not(bis) then aiguillage[aig].AdroitB:=enregistrement[1] else aiguillageB[aig].AdroitB:=enregistrement[1]; + if bis=0 then aiguillage[aig].AdroitB:=enregistrement[1] else aiguillageB[aig].AdroitB:=enregistrement[1]; delete(enregistrement,1,1); if (debugConfig) then affiche('connecté a aiguillage BIS'+s,clYellow); end; @@ -3118,7 +3120,7 @@ begin S2:=erreur<>0; if (S2) then delete(enregistrement,erreur,2); - erreur:=pos('S2',enregistrement); // description d'un rattachement à mla branche S2 d'un aiguillage triple + erreur:=pos('S2',enregistrement); // description d'un rattachement à la branche S2 d'un aiguillage triple tec:=erreur<>0; // ne supprimer que le 2 if (tec) then delete(enregistrement,erreur+1,1); @@ -3131,10 +3133,16 @@ begin c:='Z'; if (erreur<>0) then begin delete(enregistrement,1,erreur-1);c:=enregistrement[1];end; - if not(bis) and not(bistec) and not(S2) and not(tec) then begin aiguillage[aig].Adevie:=detect;aiguillage[aig].AdevieB:=c;end; - if not(bis) and not(bistec) and S2 and not(tec) then begin aiguillage[aig].Adevie2:=detect;aiguillage[aig].Adevie2B:=c;end; - if not(bis) and not(bistec) and S2 and tec then begin aiguillage[aig].Adevie2:=detect;aiguillage[aig].Adevie2B:='T';end; - if not(bis) and (bistec) and not(S2) and not(tec) then begin aiguillage[aig].Adevie:=detect;aiguillage[aig].AdevieBis:=1;aiguillage[aig].AdevieB:=c;end; + if (bis=0) and not(bistec) and not(S2) and not(tec) then begin aiguillage[aig].Adevie:=detect;aiguillage[aig].AdevieB:=c;end; + if (bis=0) and not(bistec) and S2 and not(tec) then begin aiguillage[aig].Adevie2:=detect;aiguillage[aig].Adevie2B:=c;end; + if (bis=0) and not(bistec) and S2 and tec then begin aiguillage[aig].Adevie2:=detect;aiguillage[aig].Adevie2B:='T';end; + if (bis=0) and (bistec) and not(S2) and not(tec) then begin aiguillage[aig].Adevie:=detect;aiguillage[aig].AdevieBis:=1;aiguillage[aig].AdevieB:=c;end; + + if (bis=1) and not(bistec) and not(S2) and not(tec) then begin aiguillageB[aig].Adevie:=detect;aiguillageB[aig].AdevieB:=c;end; + if (bis=1) and not(bistec) and S2 and not(tec) then begin aiguillageB[aig].Adevie2:=detect;aiguillageB[aig].Adevie2B:=c;end; + if (bis=1) and not(bistec) and S2 and tec then begin aiguillageB[aig].Adevie2:=detect;aiguillageB[aig].Adevie2B:='T';end; + if (bis=1) and (bistec) and not(S2) and not(tec) then begin aiguillageB[aig].Adevie:=detect;aiguillageB[aig].AdevieBis:=1;aiguillageB[aig].AdevieB:=c;end; + virgule:=pos(',',s);if virgule=0 then virgule:=length(s)+1; enregistrement:=copy(s,1,virgule-1); delete(s,1,virgule); @@ -3294,7 +3302,7 @@ begin Affiche('Ligne '+chaine,clred); Affiche('Nombre incorrect de description des aiguillages: '+intToSTR(k)+' pour '+intToSTR(l)+' feux directionnels',clred); end; - + end else // feu de signalisation @@ -3332,8 +3340,10 @@ begin if (j=3) then feux[i].Adr_det3:=adr; if (j=4) then feux[i].Adr_det4:=adr; //type de l'élément suivant (1=détecteur 2=aig ou TJD ou TJS 4=tri 5=bis + t:=0; if s[1]='A' then begin + t:=2; //Affiche('détecté aiguillage',clyellow); if (j=1) then feux[i].Btype_Suiv1:=2; if (j=2) then feux[i].Btype_Suiv2:=2; @@ -3344,6 +3354,7 @@ begin l:=pos('TRI',s); if l<>0 then begin + t:=4; delete(s,l,3); //Affiche('détecté aiguillage tri',clyellow); if (j=1) then feux[i].Btype_Suiv1:=4; @@ -3354,13 +3365,21 @@ begin l:=pos('B',s); if l<>0 then begin + t:=5; delete(s,l,1); - //Affiche('détecté aiguillage bis',clyellow); + //Affiche('détecté aiguillage bis',clyellow); if (j=1) then feux[i].Btype_Suiv1:=5; if (j=2) then feux[i].Btype_Suiv2:=5; if (j=3) then feux[i].Btype_Suiv3:=5; if (j=4) then feux[i].Btype_Suiv4:=5; end; + if t=0 then //détecteur + begin + if (j=1) then feux[i].Btype_Suiv1:=1; + if (j=2) then feux[i].Btype_Suiv2:=1; + if (j=3) then feux[i].Btype_Suiv3:=1; + if (j=4) then feux[i].Btype_Suiv4:=1; + end; Val(s,adr,erreur); //Affiche('Adr='+IntToSTR(Adr),clyellow); if (j=1) then feux[i].Adr_el_suiv1:=Adr; @@ -3411,7 +3430,7 @@ begin j:=1; repeat detect:=BrancheN[i][j].Adresse; - modele:=BrancheN[i][j].BType; //1= détecteur 2 ou 3 aiguillage + modele:=BrancheN[i][j].BType; // 1= détecteur 2= aiguillage 3=bis 4=Buttoir j:=j+1; until ( (modele=1) or (modele=2) or (modele=3) or ((modele=0) and (detect=0))); // trouvé un aiguillage et récupéré son adresse dans detect @@ -3489,7 +3508,8 @@ begin end; // trouve un élément dans les branches, renvoie branche_trouve IndexBranche_trouve -procedure trouve_element(el : integer;sibis : boolean); +// el : adresse de l'élément TypeEL=(1=détécteur 2=aig 3=aig Bis) +procedure trouve_element(el : integer;TypeEl : integer); var i,Btype,adr,Branche : integer ; s : string; sort : boolean; @@ -3504,9 +3524,9 @@ begin if ((adr=0) and (Btype=0)) then begin inc(Branche);i:=0;end; inc(i); sort:=(Branche>NbreBranches) or - ((adr=el) and sibis and (Btype=3)) or - ((adr=el) and not(sibis) and (Btype=2)) or - ((adr=el) and not(sibis) and (Btype=1)) ; + ((adr=el) and (TypeEl=3) and (Btype=3)) or + ((adr=el) and (TypeEl=2) and (Btype=2)) or + ((adr=el) and (TypeEl=1) and (Btype=1)) ; until (sort); if (adr=el) then begin @@ -3514,7 +3534,7 @@ begin IndexBranche_trouve:=i-1; end else begin s:='Erreur 175 - élément '+intToSTR(el); - if (sibis) then s:=s+'bis'; + if (TypeEl=3) then s:=s+'bis'; s:=s+' non trouvé';Affiche(s,clred); branche_trouve:=0; IndexBranche_trouve:=0; if NivDebug>=1 then AfficheDebug(s,clred); @@ -3524,27 +3544,36 @@ end; // renvoie élément suivant entre deux éléments quels qu'ils soient mais contigus -// et en variables globales: bis si c'est un aiguillage bis +// et en variables globales: typeGen le type de l'élément // s'ils ne sont pas contigus, on aura une erreur // alg= algorithme : // 1=arret sur suivant qu'il soit un détecteur ou un aiguillage // 2=arret sur aiguillage en talon mal positionné -// 3=arret sur un aiguillage pris en pointe dévié et AdrDevie contient l'adresse de l'aiguillage dévié ainsi que Bis +// 3=arret sur un aiguillage pris en pointe dévié et AdrDevie contient l'adresse de l'aiguillage dévié ainsi que typeGen // code de sortie : élément suivant ou: -// 9999=erreur fatale +// 9999=erreur fatale // 9998= arret sur aiguillage en talon mal positionnée // 9997: arrêt sur aiguillage dévié -function suivant_alg3(prec : integer;BisPrec : boolean;actuel : integer;BisActuel : boolean;alg : integer) : integer; +// typeGen : 1=detecteur 2=aiguillage 3=aiguillage bis +function suivant_alg3(prec : integer;typeELprec : integer;actuel : integer;typeElActuel : integer;alg : integer) : integer; var Btype,Adr,AdrPrec,BtypePrec,indexBranche_prec,branche_trouve_prec,indexBranche_actuel,branche_trouve_actuel, - tjsc1,tjsc2,AdrTjdP,Adr2 : integer; - Abis,tjscourbe1,tjscourbe2,tjd,tjs : boolean; + tjsc1,tjsc2,AdrTjdP,Adr2,Abis,TypeEl : integer; + tjscourbe1,tjscourbe2,tjd,tjs : boolean; A,Aprec,tjsc1B,tjsc2B: char; + s : string; label recommence; begin recommence: - if NivDebug=3 then AfficheDebug('Alg3 précedent='+intToSTR(prec)+' actuel='+intToSTR(actuel),clyellow); + if (TypeELPrec=0) or (typeElActuel=0) then + begin + s:='Erreur 800 - Types nuls : '+intToSTR(prec)+'/'+intToSTR(TypeElPrec)+' '+IntToSTr(actuel)+'/'+IntToSTR(typeElActuel) ; + Affiche(s,clred); + AfficheDebug(s,clred); + Suivant_alg3:=9999;exit; + end; + if NivDebug=3 then AfficheDebug('Alg3 précedent='+intToSTR(prec)+'/'+intToStr(TypeElprec)+' actuel='+intToSTR(actuel)+'/'+IntToSTR(typeElActuel),clyellow); // trouver les éléments du précédent - trouve_element(prec,BisPrec); // branche_trouve IndexBranche_trouve + trouve_element(prec,TypeELPrec); // branche_trouve IndexBranche_trouve if IndexBranche_trouve=0 then begin if NivDebug=3 then AfficheDebug('Element '+intToSTR(prec)+' non trouvé',clred); @@ -3556,13 +3585,13 @@ begin BtypePrec:=BrancheN[branche_trouve_prec,indexBranche_prec].Btype; // if BTypePrec=2 then aiguillage[prec].A - trouve_element(actuel,BisActuel); // branche_trouve IndexBranche_trouve + trouve_element(actuel,typeElActuel); // branche_trouve IndexBranche_trouve if IndexBranche_trouve=0 then begin if NivDebug=3 then AfficheDebug('Element '+intToSTR(actuel)+' non trouvé',clred); suivant_alg3:=9999;exit; end; - + indexBranche_actuel:=IndexBranche_trouve; branche_trouve_actuel:=branche_trouve; @@ -3579,8 +3608,7 @@ begin Aprec:=a; A:='Z'; Adr:=BrancheN[branche_trouve_actuel,indexBranche_actuel+1].Adresse; - Btype:=BrancheN[branche_trouve_actuel,indexBranche_actuel+1].Btype; - Bis:=Btype=3; + typeGen:=BrancheN[branche_trouve_actuel,indexBranche_actuel+1].Btype; if NivDebug=3 then AfficheDebug('41 - Le suivant est :'+intToSTR(adr)+'('+intToSTR(Btype)+')',clwhite); suivant_alg3:=adr; exit; @@ -3592,9 +3620,8 @@ begin Aprec:=a; A:='Z'; Adr:=BrancheN[branche_trouve_actuel,indexBranche_actuel-1].Adresse; - Btype:=BrancheN[branche_trouve_actuel,indexBranche_actuel-1].Btype; - Bis:=Btype=3; - if NivDebug=3 then AfficheDebug('43 - Le suivant est :'+intToSTR(adr)+'('+intToSTR(Btype)+')',clwhite); + typeGen:=BrancheN[branche_trouve_actuel,indexBranche_actuel-1].Btype; + if NivDebug=3 then AfficheDebug('43 - Le suivant est :'+intToSTR(adr)+'('+intToSTR(TypeGen)+')',clwhite); suivant_alg3:=adr; exit; end; @@ -3613,7 +3640,7 @@ begin if (Btype>=2) then // aiguillage ou bis ou buttoir begin - if ((aiguillage[Adr].modele=1) and (Btype=2) and not(BisActuel)) then // aiguillage normal non bis + if (aiguillage[Adr].modele=1) and (Btype=2) then // aiguillage normal non bis begin // aiguillage pris en pointe if (aiguillage[adr].Apointe=prec) then @@ -3622,19 +3649,21 @@ begin begin if NivDebug=3 then AfficheDebug('130 - aiguillage '+intToSTR(Adr)+' Pris en pointe droit',clyellow); AdrPrec:=Adr; - if Adr=0 then - begin + if Adr=0 then + begin Affiche('131 - Erreur fatale',clRed);suivant_alg3:=9999;exit; end; BtypePrec:=Btype; Aprec:=a; - ABis:=aiguillage[Adr].AdroitBis=1; + ABis:=aiguillage[Adr].AdroitBis; // Abis=1 si aiguillage bis A:=aiguillage[Adr].AdroitB; Adr:=aiguillage[Adr].Adroit; - trouve_element(adr,Abis); // branche_trouve IndexBranche_trouve - Btype:=BrancheN[branche_trouve,IndexBranche_trouve].Btype; - Bis:=Abis; - suivant_alg3:=adr;exit; + if A='Z' then TypeEl:=1 else TypeEL:=2; //TypeEL=(1=détécteur 2=aig 3=aig Bis) + if Abis=1 then TypeEl:=3; + trouve_element(adr,typeEl); // branche_trouve IndexBranche_trouve + typeGen:=BrancheN[branche_trouve,IndexBranche_trouve].Btype; + suivant_alg3:=adr; + exit; end; if aiguillage[Adr].position<>const_droit then begin @@ -3642,11 +3671,11 @@ begin AdrPrec:=Adr; if alg=3 then // on demande d'arreter si l'aiguillage pris en pointe est dévié begin - bis:=false; + typeGen:=0; AdrDevie:=Adr; suivant_alg3:=9997;exit; end; - if Adr=0 then + if Adr=0 then begin Affiche('134 - Erreur fatale',clRed); if NivDebug>=1 then AfficheDebug('134 - Erreur fatale',clRed); suivant_alg3:=9999;exit; @@ -3654,11 +3683,12 @@ begin BtypePrec:=Btype; Aprec:=A; A:=aiguillage[Adr].AdevieB; - ABis:=aiguillage[Adr].AdevieBis=1; + ABis:=aiguillage[Adr].AdevieBis; // Abis=1 si aiguillage bis Adr:=aiguillage[Adr].Adevie; - trouve_element(adr,Abis); // branche_trouve IndexBranche_trouve - Btype:=BrancheN[branche_trouve,IndexBranche_trouve].Btype; - Bis:=Abis; + if A='Z' then TypeEl:=1 else TypeEL:=2; //TypeEL=(1=détécteur 2=aig 3=aig Bis) + if Abis=1 then TypeEl:=3; + trouve_element(adr,TypeEl); // branche_trouve IndexBranche_trouve + typeGen:=BrancheN[branche_trouve,IndexBranche_trouve].Btype; suivant_alg3:=adr;exit; end; end @@ -3669,32 +3699,32 @@ begin begin if aiguillage[adr].position=const_droit then begin - if prec<>aiguillage[Adr].Adroit then - begin + if prec<>aiguillage[Adr].Adroit then + begin if NivDebug=3 then AfficheDebug('135.1 - Aiguillage '+intToSTR(adr)+' mal positionné',clyellow); suivant_alg3:=9998;exit; end else begin if NivDebug=3 then AfficheDebug('135.2 - Aiguillage '+intToSTR(adr)+' bien positionné',clyellow); - end; + end; end else begin - if prec<>aiguillage[Adr].Adevie then - begin + if prec<>aiguillage[Adr].Adevie then + begin if NivDebug=3 then AfficheDebug('Aiguillage '+intToSTR(adr)+' mal positionné',clyellow); suivant_alg3:=9998;exit; end else begin - if NivDebug=3 then AfficheDebug('Aiguillage '+intToSTR(adr)+' bien positionné',clyellow); + if NivDebug=3 then AfficheDebug('Aiguillage '+intToSTR(adr)+' bien positionné',clyellow); end; end; end; - + AdrPrec:=Adr; - if Adr=0 then + if Adr=0 then begin Affiche('136 - Erreur fatale',clRed); if NivDebug>=1 then AfficheDebug('136 - Erreur fatale',clRed); suivant_alg3:=9999;exit; @@ -3703,19 +3733,21 @@ begin APrec:=A; // Affiche('trouvé'+intToSTR(adr),clyellow); A:=aiguillage[Adr].ApointeB; - ABis:=aiguillage[Adr].ApointeBis=1; + ABis:=aiguillage[Adr].ApointeBis; Adr:=aiguillage[Adr].Apointe; - trouve_element(adr,Abis); // branche_trouve IndexBranche_trouve - Btype:=BrancheN[branche_trouve,IndexBranche_trouve].Btype; - Bis:=Abis; - suivant_alg3:=adr;exit; + if A='Z' then TypeEl:=1 else TypeEL:=2; //TypeEL=(1=détécteur 2=aig 3=aig Bis) + if Abis=1 then TypeEl:=3; + trouve_element(adr,TypeEl); // branche_trouve IndexBranche_trouve + typeGen:=BrancheN[branche_trouve,IndexBranche_trouve].Btype; + suivant_alg3:=adr; + exit; end; Affiche('138 - Erreur fatale - Aucun cas Aiguillage',clred); if NivDebug=3 then AfficheDebug('138 - Erreur fatale - Aucun cas Aiguillage',clred); suivant_alg3:=9999;exit; end; - if ((aiguillage[Adr].modele=1) and (Btype=3) and (BisActuel)) then // aiguillage normal bis + if (aiguillageB[Adr].modele=1) and (Btype=3) then // aiguillage normal bis begin // aiguillage pris en pointe if (aiguillageB[Adr].Apointe=Prec) then @@ -3724,57 +3756,94 @@ begin begin if NivDebug=3 then AfficheDebug('140 - Aiguillage '+intToSTR(adr)+' bis pris en pointe droit',clyellow); AdrPrec:=Adr; - if alg=3 then // on demande d'arreter si l'aiguillage pris en pointe est dévié - begin - bis:=true; - AdrDevie:=Adr; - suivant_alg3:=9997;exit; - end; if (Adr=0) then begin Affiche('141 - Erreur fatale',clred);suivant_alg3:=9999;exit;end; BtypePrec:=Btype; APrec:=A; A:=aiguillageB[Adr].AdroitB; - ABis:=aiguillageB[Adr].AdroitBis=1; + ABis:=aiguillageB[Adr].AdroitBis; Adr:=aiguillageB[Adr].Adroit; - trouve_element(Adr,ABis); // branche_trouve IndexBranche_trouve - Btype:=BrancheN[branche_trouve,IndexBranche_trouve].BType; - Bis:=ABis; - suivant_alg3:=Adr; exit; + if A='Z' then TypeEl:=1 else TypeEL:=2; //TypeEL=(1=détécteur 2=aig 3=aig Bis) + if Abis=1 then TypeEl:=3; + trouve_element(Adr,TypeEl); // branche_trouve IndexBranche_trouve + typeGen:=BrancheN[branche_trouve,IndexBranche_trouve].BType; + suivant_alg3:=Adr; + exit; end; - if (aiguillage[Adr].position<>const_droit) then + if (aiguillageB[Adr].position<>const_droit) then begin + if NivDebug=3 then AfficheDebug('142 - Aiguillage '+intToSTR(adr)+' bis pris en pointe dévié',clyellow); AdrPrec:=Adr; + if alg=3 then // on demande d'arreter si l'aiguillage pris en pointe est dévié + begin + typeGen:=3; + AdrDevie:=Adr; + suivant_alg3:=9997;exit; + end; if (Adr=0) then begin Affiche('144 - Erreur fatale',clred);suivant_alg3:=9999;exit;end; BtypePrec:=Btype; APrec:=A; A:=aiguillageB[Adr].AdevieB; - ABis:=aiguillageB[Adr].AdevieBis=1; - Adr:=aiguillageB[Adr].Adevie; - trouve_element(Adr,ABis); // branche_trouve IndexBranche_trouve - Btype:=BrancheN[branche_trouve,IndexBranche_trouve].BType; - Bis:=ABis; - suivant_alg3:=Adr;exit; + ABis:=aiguillageB[Adr].AdevieBis; + Adr:=aiguillageB[Adr].Adevie; + if A='Z' then TypeEl:=1 else TypeEL:=2; //TypeEL=(1=détécteur 2=aig 3=aig Bis) + if Abis=1 then TypeEl:=3; + trouve_element(Adr,TypeEl); // branche_trouve IndexBranche_trouve + typeGen:=BrancheN[branche_trouve,IndexBranche_trouve].BType; + suivant_alg3:=Adr; + exit; end; end else begin if (NivDebug=3) then AfficheDebug('145 - Aiguillage '+IntToSTR(adr)+' bis pris en talon',clyellow); + if alg=2 then // on demande d'arreter si l'aiguillage en talon est mal positionné + begin + if aiguillageB[adr].position=const_droit then + begin + if prec<>aiguillageB[Adr].Adroit then + begin + if NivDebug=3 then AfficheDebug('135.3 - Aiguillage '+intToSTR(adr)+'bis mal positionné',clyellow); + suivant_alg3:=9998;exit; + end + else + begin + if NivDebug=3 then AfficheDebug('135.4 - Aiguillage '+intToSTR(adr)+'bis bien positionné',clyellow); + end; + end + else + begin + if prec<>aiguillageB[Adr].Adevie then + begin + if NivDebug=3 then AfficheDebug('Aiguillage '+intToSTR(adr)+'bis mal positionné',clyellow); + suivant_alg3:=9998;exit; + end + else + begin + if NivDebug=3 then AfficheDebug('Aiguillage '+intToSTR(adr)+'bis bien positionné',clyellow); + end; + end; + end; AdrPrec:=Adr; - if (Adr=0) then begin AfficheDebug('146 - Erreur fatale',clred);suivant_alg3:=9999;exit;end; + if Adr=0 then + begin Affiche('139 - Erreur fatale',clRed); + if NivDebug>=1 then AfficheDebug('139 - Erreur fatale',clRed); + suivant_alg3:=9999;exit; + end; BtypePrec:=Btype; APrec:=A; - ABis:=aiguillageB[Adr].ApointeBis=1; // Affiche('trouvé'+intToSTR(adr),clyellow); - A:=aiguillage[Adr].ApointeB; - Adr:=aiguillageB[Adr].Apointe; // bug - trouve_element(Adr,ABis); // branche_trouve IndexBranche_trouve - Btype:=BrancheN[branche_trouve,IndexBranche_trouve].BType; - Bis:=ABis; - suivant_alg3:=Adr;exit; + A:=aiguillageB[Adr].ApointeB; + ABis:=aiguillageB[Adr].ApointeBis; + Adr:=aiguillageB[Adr].Apointe; + if A='Z' then TypeEl:=1 else TypeEL:=2; //TypeEL=(1=détécteur 2=aig 3=aig Bis) + if Abis=1 then TypeEl:=3; + trouve_element(adr,TypeEl); // branche_trouve IndexBranche_trouve + typeGen:=BrancheN[branche_trouve,IndexBranche_trouve].Btype; + suivant_alg3:=adr; + exit; end; end; - if (aiguillage[Adr].modele=2) or (aiguillage[Adr].modele=3) then // TJD ou TJS begin AdrTjdP:=aiguillage[Adr].Apointe; @@ -3805,18 +3874,22 @@ begin if aiguillage[AdrTjdP].Adroit=prec then begin A:=aiguillage[Adr].AdroitB; - if A='Z' then Btype:=1 else Btype:=2; Adr:=aiguillage[Adr].Adroit; - BisPrec:=aiguillage[Adr].AdroitBis=1; - suivant_alg3:=adr;exit; + Abis:=aiguillage[Adr].AdroitBis; + if A='Z' then typeGen:=1 else typeGen:=2; //TypeEL=(1=détécteur 2=aig 3=aig Bis) + if Abis=1 then typeGen:=3; + suivant_alg3:=adr; + exit; end; if aiguillage[Adr].Adroit=prec then begin A:=aiguillage[AdrTjdP].AdroitB; - if A='Z' then Btype:=1 else Btype:=2; Adr:=aiguillage[AdrTjdP].Adroit; - BisPrec:=aiguillage[AdrTjdP].AdroitBis=1; - suivant_alg3:=adr;exit; + Abis:=aiguillage[AdrTjdP].AdroitBis; + if A='Z' then typeGen:=1 else typeGen:=2; //TypeEL=(1=détécteur 2=aig 3=aig Bis) + if Abis=1 then typeGen:=3; + suivant_alg3:=adr; + exit; end; //Affiche('Erreur 1021 adrTJD='+IntToSTR(Adr)+' adrTJDPointe='+intToSTR(AdrTJDP)+' prec='+IntTOSTR(prec),clred); Suivant_alg3:=9999;exit; @@ -3829,17 +3902,19 @@ begin if aiguillage[AdrTjdP].Adroit=prec then begin A:=aiguillage[Adr].AdevieB; - if A='Z' then Btype:=1 else Btype:=2; Adr:=aiguillage[Adr].Adevie; - BisPrec:=aiguillage[Adr].AdevieBis=1; + Abis:=aiguillage[Adr].AdevieBis; + if A='Z' then typeGen:=1 else typeGen:=2; //TypeEL=(1=détécteur 2=aig 3=aig Bis) + if Abis=1 then typeGen:=3; suivant_alg3:=adr;exit; end; if aiguillage[Adr].Adevie=prec then begin A:=aiguillage[AdrTjdP].AdroitB; - if A='Z' then Btype:=1 else Btype:=2; Adr:=aiguillage[AdrTjdP].Adroit; - BisPrec:=aiguillage[AdrTjdP].AdroitBis=1; + Abis:=aiguillage[AdrTjdP].AdroitBis; + if A='Z' then typeGen:=1 else typeGen:=2; //TypeEL=(1=détécteur 2=aig 3=aig Bis) + if Abis=1 then typeGen:=3; suivant_alg3:=adr;exit; end; //Affiche('Erreur 1022',clred); @@ -3853,17 +3928,19 @@ begin if (aiguillage[AdrtjdP].Adevie=prec) then begin A:=aiguillage[AdrTjdP].AdroitB; - if A='Z' then Btype:=1 else Btype:=2; Adr:=aiguillage[Adr].Adroit; - BisPrec:=aiguillage[Adr].AdroitBis=1; + Abis:=aiguillage[Adr].AdroitBis; + if A='Z' then typeGen:=1 else typeGen:=2; //TypeEL=(1=détécteur 2=aig 3=aig Bis) + if Abis=1 then typeGen:=3; suivant_alg3:=adr;exit; end; if (aiguillage[Adr].Adroit=prec) then begin A:=aiguillage[Adr].AdevieB; - if A='Z' then Btype:=1 else Btype:=2; Adr:=aiguillage[Adr].Adevie; - BisPrec:=aiguillage[Adr].AdevieBis=1; + Abis:=aiguillage[Adr].AdevieBis; + if A='Z' then typeGen:=1 else typeGen:=2; //TypeEL=(1=détécteur 2=aig 3=aig Bis) + if Abis=1 then typeGen:=3; suivant_alg3:=adr;exit; end; //Affiche('Erreur 1023',clred); @@ -3877,17 +3954,19 @@ begin if aiguillage[AdrTjdP].Adevie=prec then begin A:=aiguillage[Adr].AdevieB; - if A='Z' then Btype:=1 else Btype:=2; Adr:=aiguillage[Adr].Adevie; - BisPrec:=aiguillage[Adr].AdevieBis=1; + Abis:=aiguillage[Adr].AdevieBis; + if A='Z' then typeGen:=1 else typeGen:=2; //TypeEL=(1=détécteur 2=aig 3=aig Bis) + if Abis=1 then typeGen:=3; suivant_alg3:=adr;exit; end; if aiguillage[Adr].Adevie=prec then begin A:=aiguillage[AdrtjdP].AdevieB; - if A='Z' then Btype:=1 else Btype:=2; Adr:=aiguillage[AdrtjdP].Adevie; - BisPrec:=aiguillage[AdrtjdP].AdevieBis=1; + Abis:=aiguillage[AdrtjdP].AdevieBis; + if A='Z' then typeGen:=1 else typeGen:=2; //TypeEL=(1=détécteur 2=aig 3=aig Bis) + if Abis=1 then typeGen:=3; suivant_alg3:=adr;exit; end; //Affiche('Erreur 1024',clred); @@ -3899,20 +3978,22 @@ begin begin if NivDebug=3 then AfficheDebug('cas tjs en courbe1',clYellow); A:=aiguillage[AdrTjdP].AdevieB; - if A='Z' then Btype:=1 else Btype:=2; Adr:=aiguillage[AdrTjdP].Adevie; - BisPrec:=aiguillage[AdrTjdP].AdroitBis=1; + ABis:=aiguillage[AdrTjdP].Adeviebis; + if A='Z' then typeGen:=1 else typeGen:=2; //TypeEL=(1=détécteur 2=aig 3=aig Bis) + if Abis=1 then typeGen:=3; suivant_alg3:=adr;exit; end; // cas 3 TJS prise dans sa 2eme position courbe if ((aiguillage[Adr].Adroit=Prec) and (aiguillage[Adr].AdroitB=Aprec) and (aiguillage[Adr].position=const_droit) and (aiguillage[AdrTjdP].position<>const_droit) and (tjs) and tjscourbe1 and tjscourbe2 ) then begin - if NivDebug=3 then AfficheDebug('cas1 tjs en courbe 2',clYellow); + if NivDebug=3 then AfficheDebug('cas1 tjs en courbe 2',clYellow); A:=aiguillage[AdrTjdP].AdevieB; - if A='Z' then Btype:=1 else Btype:=2; Adr:=aiguillage[AdrTjdP].Adevie; - BisPrec:=aiguillage[AdrTjdP].AdroitBis=1; + Abis:=aiguillage[AdrTjdP].AdevieBis; + if A='Z' then typeGen:=1 else typeGen:=2; //TypeEL=(1=détécteur 2=aig 3=aig Bis) + if Abis=1 then typeGen:=3; suivant_alg3:=adr;exit; end; Affiche('139 - Erreur fatale - Aucun cas TJD/S : adr='+IntToSTR(Adr)+' '+intToSTR(AdrTJDP)+' prec='+IntTOSTR(prec),clred); @@ -3929,23 +4010,23 @@ begin ( not(CDM_connecte) and (aiguillage[Adr].position=const_droit) and (aiguillage[Adr2].position=const_droit) ) then begin if NivDebug=3 then AfficheDebug('Aiguillage triple droit',clYellow); - BisPrec:=aiguillage[Adr].AdroitBis=1; + typeGen:=aiguillage[Adr].AdroitBis+1; //TSuiv=aiguillage[Adr].AdroitB; Adr:=aiguillage[Adr].Adroit; end; - if ( CDM_connecte and (aiguillage[Adr].position=const_devieG) ) or + if ( CDM_connecte and (aiguillage[Adr].position=const_devieG) ) or ( not(CDM_connecte) and (aiguillage[Adr].position<>const_droit) and (aiguillage[Adr2].position=const_droit) ) then begin if NivDebug=3 then AfficheDebug('Aiguillage triple dévié1 (gauche)',clYellow); - BisPrec:=aiguillage[Adr].AdevieBis=1; + typeGen:=aiguillage[Adr].AdevieBis+1; //TSuiv=aiguillage[Adr].AdevieB; Adr:=aiguillage[Adr].Adevie; end; - if ( CDM_connecte and (aiguillage[Adr].position=const_devieG) ) or + if ( CDM_connecte and (aiguillage[Adr].position=const_devieG) ) or ( not(CDM_connecte) and (aiguillage[Adr].position=const_droit) and (aiguillage[Adr2].position<>const_droit) ) then begin if NivDebug=3 then AfficheDebug('Aiguillage triple dévié2 (droit)',clYellow); - BisPrec:=aiguillage[Adr].Adevie2Bis=1; + typeGen:=aiguillage[Adr].Adevie2Bis+1; //TSuiv=aiguillage[Adr].Adevie2B; Adr:=aiguillage[Adr].Adevie2; end; @@ -3980,17 +4061,17 @@ end; // renvoie l'adresse du détecteur suivant des deux éléments contigus -function detecteur_suivant(prec : integer;BisPrec : boolean;actuel : integer;BisActuel : boolean) : integer ; +function detecteur_suivant(prec : integer;TypeElPrec : integer;actuel : integer;TypeElActuel : integer) : integer ; var AdrDet,actuelCalc,PrecCalc,etat,i,j,AdrSuiv : integer; - BisprecCalc,BisActuelCalc : boolean; + BisprecCalc,BisActuelCalc : integer; begin - if NivDebug>=2 then AfficheDebug('cherche détecteur suivant aux '+IntToSTR(prec)+'-'+intToSTR(actuel),clyellow); + if NivDebug>=2 then AfficheDebug('cherche détecteur suivant aux '+IntToSTR(prec)+'/'+IntToSTR(typeElPrec)+' - '+intToSTR(actuel)+'/'+intToSTR(TypeElActuel),clyellow); j:=0; PrecCalc:=prec; - bisprecCalc:=bisprec; + bisprecCalc:=TypeElprec; ActuelCalc:=actuel; - BisActuelCalc:=BisActuel; + BisActuelCalc:=TypeELActuel; // étape 1 trouver le sens repeat inc(j); @@ -3998,13 +4079,13 @@ begin precCalc:=actuelCalc; BisPrecCalc:=BisActuelCalc; actuelCalc:=AdrSuiv; - BisActuelCalc:=Bis; + BisActuelCalc:=typeGen; //Affiche('Suivant signalaig='+IntToSTR(AdrSuiv),clyellow); - until (j=10) or (AdrSuiv>512) or (AdrSuiv=0); // + until (j=10) or (AdrSuiv>512) or (AdrSuiv=0); // // si trouvé le sens, trouver le suivant if AdrSuiv=actuel then begin - AdrSuiv:=suivant_alg3(prec,BisPrec,actuel,BisActuel,1); + AdrSuiv:=suivant_alg3(prec,TypeElPrec,actuel,TypeElActuel,1); end; if NivDebug=3 then AfficheDebug('Le suivant est le '+intToSTR(AdrSuiv),clYellow); detecteur_suivant:=AdrSuiv; @@ -4012,17 +4093,17 @@ end; // renvoie l'adresse du détecteur suivant des deux éléments // Det1 et Det2 peuvent être séparés par des aiguillages -function detecteur_suivant_El(el1: integer;BisDet1 : boolean;el2 : integer;BisDet2 : boolean) : integer ; +function detecteur_suivant_El(el1: integer;TypeDet1 : integer;el2 : integer;TypeDet2 : integer) : integer ; var IndexBranche_det1,IndexBranche_det2,branche_trouve_det1,branche_trouve_det2,i, - j,AdrPrec,Adr,AdrFonc,Btype : integer; - BisPrec,BisFonc,BisSuiv,Sortie : boolean; + j,AdrPrec,Adr,AdrFonc,Btype,BisPrec,BisFonc,BisSuiv : integer; + Sortie : boolean; s : string; begin - if NivDebug>=2 then AfficheDebug('cherche détecteur_suivant_El aux '+IntToSTR(el1)+'-'+intToSTR(el2),clyellow); + if NivDebug>=2 then AfficheDebug('cherche détecteur_suivant_El aux '+IntToSTR(el1)+'/'+intToSTR(TypeDet1)+'-'+intToSTR(el2)+'/'+intToSTr(TypeDet2),clyellow); // traceDet=TRUE; // trouver détecteur 1 - trouve_detecteur(el1); // branche_trouve IndexBranche_trouve + trouve_element(el1,Typedet1); // branche_trouve IndexBranche_trouve if (IndexBranche_trouve=0) then begin Affiche('élément '+IntToSTR(el1)+' non trouvé',clred); @@ -4030,64 +4111,64 @@ begin end; IndexBranche_det1:=IndexBranche_trouve; branche_trouve_det1:=branche_trouve; - - // trouver détecteur 2 - trouve_detecteur(el2); // branche_trouve IndexBranche_trouve + + // trouver élément 2 + trouve_element(el2,TypeDet2); // branche_trouve IndexBranche_trouve if (IndexBranche_trouve=0) then begin Affiche('élément '+IntToSTR(el2)+' non trouvé',clred); detecteur_suivant_El:=2;exit; end; - + IndexBranche_det2:=IndexBranche_trouve; branche_trouve_det2:=branche_trouve; - + j:=1; // étape 1 : trouver le sens de progression (en incrément ou en décrément) repeat // boucle d'incrément décrément - if (NivDebug=4) then + if (NivDebug=3) then begin - s:='Test route en '; + s:='Test 1 route en '; if (j=1) then s:=s+'décrément ' else s:=s+'incrément '; - s:=s+'- départ depuis détecteur '+IntToSTR(el1);Affiche(s,clyellow); + s:=s+'- départ depuis détecteur '+IntToSTR(el1);AfficheDebug(s,clyellow); end; AdrPrec:=el1; - BisPrec:=FALSE; - Bis:=FALSE; + BisPrec:=typeDet1; if (j=1) then i:=IndexBranche_det1-1 else i:=IndexBranche_det1+1; //trouve_element(det1,FALSE); - Adr:=BrancheN[branche_trouve_det1,i].Adresse; + Adr:=BrancheN[branche_trouve_det1,i].Adresse; // élément suivant le det1 AdrFonc:=Adr; - Btype:=BrancheN[branche_trouve,i].BType; // élément suivant/précédent - BisFonc:=Btype=3; // bug si aiguillage bis + Btype:=BrancheN[branche_trouve_det1,i].BType; // élément suivant/précédent + BisFonc:=Btype; i:=0; if (el2<>Adr) then repeat Adr:=suivant_alg3(AdrPrec,BisPrec,AdrFonc,BisFonc,1); // donne l'élément suivant de AdrPrec à AdrFonc et dans Bis si c'est un aig bis - trouve_element(Adr,Bis); + if (NivDebug=3) then AfficheDebug('trouvé '+intToSTR(Adr)+' '+intToSTR(typeGen),clorange); + trouve_element(Adr,typeGen); Btype:=BrancheN[branche_trouve,IndexBranche_trouve].BType; - BisSuiv:=Btype=3; // si aiguillage bis + BisSuiv:=Btype; // si aiguillage bis //Affiche(intToSTR(adr)+'/'+intToStr(Btype),clorange); AdrPrec:=AdrFonc;AdrFonc:=Adr; - BisPrec:=BisFonc;BisFonc:=Bis; - i:=i+1; - sortie:=(Adr=El2) or (i=20) or (Adr=0) or ((Adr<>el2) and (btype=1)); + BisPrec:=BisFonc;BisFonc:=typeGen; + i:=i+1; + sortie:=(Adr=El2) or (i=20) or (Adr=0) or ((Adr<>el2) and (btype=1)); until (sortie) ; // boucle de parcours if (i=20) then begin Affiche('Erreur fatale 300 : Itération trop longue',clred); AfficheDebug('Erreur fatale 300 : Itération trop longue',clred); detecteur_suivant_el:=3;end; if ((Btype=1) and (Adr<>el2) and (NivDebug=3)) then AfficheDebug('N''est pas le détecteur attendu '+intToSTR(Adr)+' pour '+intToSTR(el2),clyellow); - inc(j); // changement de sens + inc(j); // changement de sens sortie:=(Adr=el2) or (j=3) or (Adr=0); until sortie; // si arret sur buttoir if Adr=0 then begin detecteur_suivant_el:=0;exit;end; - + if ((j=3) and (Adr<>el2)) then begin - if NivDebug=3 then AfficheDebug('Pas de suivant sur séquence '+IntToSTR(el1)+' à '+intToStr(el2),clyellow); + if NivDebug=3 then AfficheDebug('El - Pas de suivant sur séquence '+IntToSTR(el1)+' à '+intToStr(el2),clyellow); detecteur_suivant_el:=0;exit; end; @@ -4095,26 +4176,25 @@ begin if (Adr=el2) then begin // trouvé la route si j=2 : - si j=3 : + - if (NivDebug=3) then AfficheDebug('Route trouvée',clyellow); + if (NivDebug=3) then AfficheDebug('El - Route trouvée',clyellow); i:=0; AdrFonc:=Adr; - BisFonc:=FALSE; - BisSuiv:=FALSE; - Bis:=FALSE; + BisFonc:=1; + //typeGen:=0; //? repeat Adr:=suivant_alg3(AdrPrec,BisPrec,AdrFonc,BisFonc,1); - // if i=0 then El_suivant:=Adr; //??????? - trouve_element(Adr,Bis); + if NivDebug=3 then AfficheDebug('trouvé 2:'+intToSTR(Adr)+' '+intToSTR(typeGen),clorange); + trouve_element(Adr,typeGen); Btype:=BrancheN[branche_trouve,IndexBranche_trouve].BType; - BisSuiv:=Btype=3; // si aiguillage bis + BisSuiv:=Btype; // si aiguillage bis if (NivDebug=3) then AfficheDebug('Suivant='+IntToSTR(Adr)+ '('+intToSTR(Btype)+')',clyellow); AdrPrec:=AdrFonc;AdrFonc:=Adr; - BisPrec:=BisFonc;BisFonc:=Bis; + BisPrec:=BisFonc;BisFonc:=typeGen; inc(i); sortie:=(Btype=1) or (Adr=0) or (i=20); until sortie; if NivDebug>=2 Then AfficheDebug('Détecteur suivant='+intToSTR(Adr),clOrange); - if (bType=1) or (Adr=0) then detecteur_suivant_el:=Adr; + if (bType=1) or (Adr=0) then detecteur_suivant_el:=Adr; if (i=20) then begin if NivDebug=3 then AfficheDebug('Erreur fatale 201 : Itération trop longue',clred); Affiche('Erreur fatale 201 : Itération trop longue',clred);detecteur_suivant_el:=3;end; @@ -4126,8 +4206,8 @@ end; // renvoi vrai si les aiguillages au delà du signal sont mal positionnés function carre_signal(adresse : integer) : boolean; var - i,j,prec,AdrFeu,AdrSuiv,actuel : integer; - multi, sort, BisPrec,BisActuel : boolean; + i,j,prec,AdrFeu,AdrSuiv,actuel,TypeELPrec,TypeElActuel : integer; + multi, sort : boolean; s : string; begin if (NivDebug>=1) then AfficheDebug('Test si signal '+IntToSTR(adresse)+' doit afficher un carré si aiguillage avals mal positionnés',clyellow); @@ -4142,9 +4222,11 @@ begin // } j:=0; prec:=feux[i].Adr_det1; - BisPrec:=FALSE; + TypeElPrec:=1; actuel:=feux[i].Adr_el_suiv1; - BisActuel:=feux[i].Btype_suiv1=5; + if feux[i].Btype_suiv1=1 then TypeElActuel:=1; + if feux[i].Btype_suiv1=2 then TypeElActuel:=2; + if feux[i].Btype_suiv1=5 then TypeElActuel:=3; // le type du feu 1=détécteur 2=aig 5=bis multi:=feux[i].Adr_det2<>0; // trouver si une des voies présente un train if (multi) then @@ -4156,13 +4238,13 @@ begin //Affiche(IntToSTR(actuel),clyellow); repeat inc(j); - AdrSuiv:=suivant_alg3(prec,BisPrec,actuel,BisActuel,2); + AdrSuiv:=suivant_alg3(prec,typeElPrec,actuel,typeELActuel,2); if (AdrSuiv<>9998) then // arret sur aiguillage en talon mal positionnée begin prec:=actuel; - BisPrec:=BisActuel; + TypeElPrec:=TypeElActuel; actuel:=AdrSuiv; - BisActuel:=Bis; + TypeElActuel:=typeGen; end; // si le suivant est un détecteur comporte t-il un signal? AdrFeu:=0; @@ -4189,11 +4271,11 @@ end; // rang=1 pour feu suivant, 2 pour feu suivant le 1, etc function etat_signal_suivant(adresse,rang : integer) : integer ; var num_feu,AdrDet,etat,AdrFeu,i,j,prec,AdrSuiv : integer; - BisPrec,BisActuel : boolean; + BisPrec,BisActuel : integer; s : string; begin //traceDet:=true; - if NivDebug>=2 then + if NivDebug>=2 then AfficheDebug('Cherche état du signal suivant au '+IntToSTR(adresse),clyellow); i:=Index_feu(adresse); if feux[i].aspect>10 then @@ -4204,7 +4286,7 @@ begin etat_signal_suivant:=0; exit; end; - + if i=0 then begin Affiche('Erreur 600 - feu non trouvé',clred); @@ -4222,40 +4304,40 @@ begin etat_signal_suivant:=0; exit; end; - BisPrec:=false; + BisPrec:=1; // détecteur actuel:=feux[i].Adr_el_suiv1; - BisActuel:=feux[i].btype_suiv1=5; - + if feux[i].Btype_suiv1=1 then BisActuel:=1; + if feux[i].Btype_suiv1=2 then BisActuel:=2; + if feux[i].Btype_suiv1=4 then BisActuel:=2; // aiguillage triple + if feux[i].Btype_suiv1=5 then BisActuel:=3; // le type du feu 1=détécteur 2=aig 5=bis // si actuel est un détecteur, regarder si il ya un feu repeat inc(j); // à 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 (actuel>512) then begin - AdrSuiv:=actuel; + AdrSuiv:=actuel; actuel:=prec; - BisPrec:=FALSE; - BisActuel:=FALSE; + BisPrec:=0; + BisActuel:=0; end else AdrSuiv:=suivant_alg3(prec,BisPrec,actuel,BisActuel,1); - - if (AdrSuiv=9999) then + + if (AdrSuiv=9999) then begin Etat_signal_suivant:=0; exit; end; - if (AdrSuiv=0) then + if (AdrSuiv=0) then begin if NivDebug=3 then AfficheDebug('Le suivant est un buttoir',clyellow); Etat_signal_suivant:=carre_F; // faire comme si c'était un signal au carré exit; end; - prec:=actuel; - BisPrec:=BisActuel; - actuel:=AdrSuiv; - BisActuel:=Bis; + prec:=actuel;BisPrec:=BisActuel; + actuel:=AdrSuiv;BisActuel:=typeGen; // si le suivant est un détecteur comporte t-il un signal? AdrFeu:=0; @@ -4288,7 +4370,7 @@ begin until (j=10) or ((AdrFeu<>0) and (num_feu=rang)); if etat=0 then Signal_Suivant:=0; etat_signal_suivant:=Etat; - if NivDebug=3 then AfficheDebug('Pas Trouvé de feu suivant au feu Adr='+IntToSTR(ADresse),clOrange); + if (NivDebug=3) and (adrFeu=0) then AfficheDebug('Pas Trouvé de feu suivant au feu Adr='+IntToSTR(ADresse),clOrange); //TraceDet:=false; end; @@ -4298,7 +4380,7 @@ end; // adresse=adresse du signal function Aiguille_deviee(adresse : integer) : integer ; var AdrDet,AdrFeu,etat,i,j,prec,AdrSuiv,Actuel : integer; - BisPrec,BisActuel : boolean; + BisPrec,BisActuel : integer; s : string; begin //traceDet:=true; @@ -4306,9 +4388,12 @@ begin j:=0; i:=Index_feu(adresse); prec:=feux[i].Adr_det1; - BisPrec:=false; + BisPrec:=1; actuel:=feux[i].Adr_el_suiv1; - BisActuel:=feux[i].btype_suiv1=3; + if feux[i].Btype_suiv1=1 then BisActuel:=1; + if feux[i].Btype_suiv1=2 then BisActuel:=2; + if feux[i].Btype_suiv1=5 then BisActuel:=3; // le type du feu 1=détécteur 2=aig 5=bis + //Affiche(IntToSTR(actuel),clyellow); AdrFeu:=0; AdrDevie:=0; @@ -4316,19 +4401,19 @@ begin begin if (aiguillage[actuel].Apointe=prec) and (aiguillage[actuel].position<>const_droit) then Aiguille_deviee:=actuel; end; - + repeat inc(j); - // 3=demande si le suivant est un aiguillage en pointe dévié oui si AdrSuiv=9997 + // 3=demande si le suivant est un aiguillage en pointe dévié oui si AdrSuiv=9997 // dans ce cas la variable globale AdrDevie est mise à jour - AdrSuiv:=suivant_alg3(prec,BisPrec,actuel,BisActuel,3); + AdrSuiv:=suivant_alg3(prec,BisPrec,actuel,BisActuel,3); if NivDebug=3 then AfficheDebug('701 - Suivant signalaig='+IntToSTR(AdrSuiv),clyellow); if ADrSuiv<>9997 then begin prec:=actuel; BisPrec:=BisActuel; actuel:=AdrSuiv; - BisActuel:=Bis; + BisActuel:=typeGen; // si le suivant est un détecteur comporte t-il un signal? AdrFeu:=0; if (AdrSuiv>512) then @@ -4342,7 +4427,7 @@ begin if (AdrSuiv=9997) then begin s:='le signal '+intToSTR(adresse)+' doit afficher un rappel car l''aiguillage '+intToSTR(AdrDevie); - if bis then s:=s+'bis'; + if (typeGen=3) then s:=s+'bis'; s:=s+' est dévié'; if NivDebug=3 then AfficheDebug(s,clYellow); end; @@ -4361,7 +4446,7 @@ var i,j : integer; begin i:=index_feu(Adr); j:=feux[i].decodeur; - case j of + case j of // 0 : envoi_directionvirtuel(Adr,nbre); 1 : envoi_DirectionBahn(Adr,nbre); 2 : envoi_DirectionCDF(Adr,nbre); @@ -4411,8 +4496,9 @@ end; // a compléter par les 4 détecteurs.... function test_memoire_zones(adresse : integer) : boolean; var - ife,Detecteur_precedent,actuel,AdrDet,Etat,AdrFeu,i,j,prec,AdrSuiv : integer; - Pres_train,sort,BisPrec,BisActuel : boolean; + BisPrec,BisActuel,ife,Detecteur_precedent,actuel,AdrDet,Etat,AdrFeu,i,j,prec,AdrSuiv : integer; + Pres_train,sort : boolean; + begin if NivDebug>=1 then AfficheDebug('Cherche mémoire à 1 du signal '+intToSTR(adresse)+' au signal suivant ',clyellow); @@ -4424,16 +4510,37 @@ begin test_memoire_zones:=false; end; - Pres_train:=FALSE; ife:=1; // index feu de 1 à 4 pour explorer les 4 détecteurs d'un feu repeat j:=0; if NivDebug=3 then AfficheDebug('Boucle de test feu '+intToSTR(ife)+'/4',clred); - if (ife=1) then begin prec:=feux[i].Adr_det1;actuel:=feux[i].Adr_el_suiv1;BisActuel:=feux[i].Btype_suiv1=5;end; //détecteur sur le signal courant - if (ife=2) then begin prec:=feux[i].Adr_det2;actuel:=feux[i].Adr_el_suiv2;BisActuel:=feux[i].Btype_suiv2=5;end; // détecteur sur le signal courant - if (ife=3) then begin prec:=feux[i].Adr_det3;actuel:=feux[i].Adr_el_suiv3;BisActuel:=feux[i].Btype_suiv3=5;end; // détecteur sur le signal courant - if (ife=4) then begin prec:=feux[i].Adr_det4;actuel:=feux[i].Adr_el_suiv4;BisActuel:=feux[i].Btype_suiv4=5;end; // détecteur sur le signal courant + if (ife=1) then + begin prec:=feux[i].Adr_det1;actuel:=feux[i].Adr_el_suiv1; + if feux[i].Btype_suiv1=1 then BisActuel:=1; + if feux[i].Btype_suiv1=2 then BisActuel:=2; + if feux[i].Btype_suiv1=5 then BisActuel:=3; // le type du feu 1=détécteur 2=aig 5=bis + end; //détecteur sur le signal courant + if (ife=2) then + begin prec:=feux[i].Adr_det2;actuel:=feux[i].Adr_el_suiv2; + if feux[i].Btype_suiv1=1 then BisActuel:=1; + if feux[i].Btype_suiv1=2 then BisActuel:=2; + if feux[i].Btype_suiv1=5 then BisActuel:=3; // le type du feu 1=détécteur 2=aig 5=bis + end; // détecteur sur le signal courant + if (ife=3) then + begin + prec:=feux[i].Adr_det3;actuel:=feux[i].Adr_el_suiv3; + if feux[i].Btype_suiv1=1 then BisActuel:=1; + if feux[i].Btype_suiv1=2 then BisActuel:=2; + if feux[i].Btype_suiv1=5 then BisActuel:=3; // le type du feu 1=détécteur 2=aig 5=bis + end; // détecteur sur le signal courant + if (ife=4) then + begin + prec:=feux[i].Adr_det4;actuel:=feux[i].Adr_el_suiv4; + if feux[i].Btype_suiv1=1 then BisActuel:=1; + if feux[i].Btype_suiv1=2 then BisActuel:=2; + if feux[i].Btype_suiv1=5 then BisActuel:=3; // le type du feu 1=détécteur 2=aig 5=bis + end; // détecteur sur le signal courant Detecteur_precedent:=prec; if (prec=0) then @@ -4441,7 +4548,7 @@ begin test_memoire_zones:=Pres_train; exit; end; - BisPrec:=FALSE; + BisPrec:=1; repeat inc(j); @@ -4451,20 +4558,20 @@ begin begin AdrSuiv:=actuel; actuel:=prec; - BisPrec:=FALSE; - BisActuel:=FALSE; + BisPrec:=0; + BisActuel:=0; Pres_train:=MemZone[prec,actuel]; if Pres_Train and (NivDebug=3) then Affiche('Présence train de '+intToSTR(prec)+' à '+intToSTR(actuel),clyellow); Detecteur_precedent:=actuel; end else AdrSuiv:=suivant_alg3(prec,BisPrec,actuel,BisActuel,1); - + prec:=actuel; BisPrec:=BisActuel; actuel:=AdrSuiv; - BisActuel:=Bis; - + BisActuel:=typeGen; + if AdrSuiv=0 then begin // si c'est un buttoir @@ -4508,7 +4615,7 @@ begin end else begin - if (NivDebug=3) then AfficheDebug('Trouvé aiguillage '+intToSTR(AdrSuiv),clyellow); + if (NivDebug=3) then AfficheDebug('Trouvé aiguillage '+intToSTR(AdrSuiv),clyellow); end; sort:=(j=10) or (AdrFeu<>0) ; until (sort); @@ -4537,8 +4644,8 @@ var i,i1,i2,j,k, IndexBranche_det1,IndexBranche_det2,index_i1,index_i2, branche_trouve_det1,branche_trouve_det2,Adr,AdrPrec,position,Btype,BTypePrec, - AdrFonc : integer; - BisPrec,BisSuiv,BisFonc,sortie : boolean; + AdrFonc,BisPrec,BisSuiv,BisFonc : integer; + sortie : boolean; s : string; begin @@ -4560,7 +4667,7 @@ begin Affiche('détecteur '+IntToSTR(det2)+' non trouvé',clred); calcul_zones_det:=2;exit; end; - + IndexBranche_det2:=IndexBranche_trouve; branche_trouve_det2:=branche_trouve; @@ -4569,29 +4676,28 @@ begin repeat // boucle d'incrément décrément if (NivDebug=3) then begin - s:='Test route en '; + s:='Test 2 route en '; if (j=1) then s:=s+'décrément ' else s:=s+'incrément '; - s:=s+'- départ depuis détecteur '+IntToSTR(det1);Affiche(s,clyellow); + s:=s+'- départ depuis détecteur '+IntToSTR(det1);AfficheDebug(s,clyellow); end; AdrPrec:=det1; - BisPrec:=FALSE; - Bis:=FALSE; + BisPrec:=1; if (j=1) then i:=IndexBranche_det1-1 else i:=IndexBranche_det1+1; //trouve_element(det1,FALSE); Adr:=BrancheN[branche_trouve_det1,i].Adresse; AdrFonc:=Adr; - Btype:=BrancheN[branche_trouve,i].BType; // élément suivant/précédent - BisFonc:=Btype=3; // bug si aiguillage bis + Btype:=BrancheN[branche_trouve_det1,i].BType; // élément suivant/précédent + BisFonc:=Btype; i:=0; if (det2<>Adr) then repeat Adr:=suivant_alg3(AdrPrec,BisPrec,AdrFonc,BisFonc,1); // donne l'élément suivant de AdrPrec à AdrFonc et dans Bis si c'est un aig bis - trouve_element(Adr,Bis); + trouve_element(Adr,typeGen); Btype:=BrancheN[branche_trouve,IndexBranche_trouve].BType; - BisSuiv:=Btype=3; // si aiguillage bis + BisSuiv:=Btype; // si aiguillage bis //Affiche(intToSTR(adr)+'/'+intToStr(Btype),clorange); AdrPrec:=AdrFonc;AdrFonc:=Adr; - BisPrec:=BisFonc;BisFonc:=Bis; + BisPrec:=BisFonc;BisFonc:=typeGen; i:=i+1; sortie:=(Btype=1) or (Btype=4) or (i=20) or (Adr=0); until (sortie) ; // boucle de parcours @@ -4603,7 +4709,7 @@ begin inc(j); sortie:=((Adr=det2) and (Btype=1)) or (j=3); until sortie; - + if ((j=3) and (Adr<>det2)) then begin if (NivDebug=3) then AfficheDebug('Pas de suivant sur séquence '+IntToSTR(det1)+' à '+intToStr(det2),clyellow); @@ -4616,18 +4722,18 @@ begin if (NivDebug=3) then AfficheDebug('Route trouvée',clyellow); i:=0; AdrFonc:=Adr; - BisFonc:=FALSE; - BisSuiv:=FALSE; - Bis:=FALSE; + BisFonc:=1; + BisSuiv:=1; + //Bis:=1; ??? repeat Adr:=suivant_alg3(AdrPrec,BisPrec,AdrFonc,BisFonc,1); //if i=0 then El_suivant:=Adr; - trouve_element(Adr,Bis); + trouve_element(Adr,typeGen); Btype:=BrancheN[branche_trouve,IndexBranche_trouve].BType; - BisSuiv:=Btype=3; // si aiguillage bis + BisSuiv:=Btype; // si aiguillage bis if (NivDebug=3) then AfficheDebug('Suivant='+IntToSTR(Adr)+ '('+intToSTR(Btype)+')',clyellow); AdrPrec:=AdrFonc;AdrFonc:=Adr; - BisPrec:=BisFonc;BisFonc:=Bis; + BisPrec:=BisFonc;BisFonc:=typeGen; inc(i); sortie:=(Btype=1) or (Adr=0) or (i=20); until sortie; @@ -4702,7 +4808,7 @@ begin //sprintf(Affiche,"Aiguille 27=%d \r\n",aiguillage[27].position);Display(Affiche); // sprintf(Affiche,"Aiguille 31=%d \r\n",aiguillage[31].position);Display(Affiche); if ((aiguillage[28].position<>const_droit) and (aiguillage[29].position<>const_droit) and - (aiguillage[31].position=const_devieD)) then + (aiguillage[31].position=2)) then // attention spécial Maj_Etat_Signal(AdrFeu,blanc) else Maj_Etat_Signal(AdrFeu,violet); envoi_LEB(AdrFeu); exit; @@ -4715,7 +4821,7 @@ begin exit; end; - + if (Feux[i].aspect=2) then //or (feux[i].check<>nil) then // si carré violet begin if carre_signal(AdrFeu) and (Feux[i].aspect=2) then @@ -4745,19 +4851,41 @@ begin j:=1; repeat if NivDebug=3 then afficheDebug('Séquence '+IntToSTR(j)+' de recherche des 4 détecteurs précédents-----',clOrange); - if (j=1) then begin det_initial:=feux[i].Adr_det1;Adr_El_Suiv:=feux[i].Adr_el_suiv1; Btype_el_suivant:=feux[i].Btype_suiv1;end; - if (j=2) then begin det_initial:=feux[i].Adr_det2;Adr_El_Suiv:=feux[i].Adr_el_suiv2; Btype_el_suivant:=feux[i].Btype_suiv2;end; - if (j=3) then begin det_initial:=feux[i].Adr_det3;Adr_El_Suiv:=feux[i].Adr_el_suiv3; Btype_el_suivant:=feux[i].Btype_suiv3;end; - if (j=4) then begin det_initial:=feux[i].Adr_det4;Adr_El_Suiv:=feux[i].Adr_el_suiv4; Btype_el_suivant:=feux[i].Btype_suiv4;end; + if (j=1) then + begin det_initial:=feux[i].Adr_det1;Adr_El_Suiv:=feux[i].Adr_el_suiv1; + if feux[i].Btype_suiv1=1 then Btype_el_suivant:=1; + if feux[i].Btype_suiv1=2 then Btype_el_suivant:=2; + if feux[i].Btype_suiv1=5 then Btype_el_suivant:=3; // le type du feu 1=détécteur 2=aig 5=bis + end; + if (j=2) then + begin + det_initial:=feux[i].Adr_det2;Adr_El_Suiv:=feux[i].Adr_el_suiv2; + if feux[i].Btype_suiv1=1 then Btype_el_suivant:=1; + if feux[i].Btype_suiv1=2 then Btype_el_suivant:=2; + if feux[i].Btype_suiv1=5 then Btype_el_suivant:=3; // le type du feu 1=détécteur 2=aig 5=bis + end; + if (j=3) then + begin det_initial:=feux[i].Adr_det3;Adr_El_Suiv:=feux[i].Adr_el_suiv3; + if feux[i].Btype_suiv1=1 then Btype_el_suivant:=1; + if feux[i].Btype_suiv1=2 then Btype_el_suivant:=2; + if feux[i].Btype_suiv1=5 then Btype_el_suivant:=3; // le type du feu 1=détécteur 2=aig 5=bis + end; + if (j=4) then + begin + det_initial:=feux[i].Adr_det4;Adr_El_Suiv:=feux[i].Adr_el_suiv4; + if feux[i].Btype_suiv1=1 then Btype_el_suivant:=1; + if feux[i].Btype_suiv1=2 then Btype_el_suivant:=2; + if feux[i].Btype_suiv1=5 then Btype_el_suivant:=3; // le type du feu 1=détécteur 2=aig 5=bis + end; if (det_initial<>0) then begin - DetPrec1:=detecteur_suivant(Adr_El_Suiv,Btype_el_suivant=5,det_initial,false); + DetPrec1:=detecteur_suivant(Adr_El_Suiv,Btype_el_suivant,det_initial,1); if DetPrec1<>9999 then // route bloquée par aiguillage mal positionné - begin - DetPrec2:=detecteur_suivant_El(det_initial,False,DetPrec1,false); + begin + DetPrec2:=detecteur_suivant_El(det_initial,1,DetPrec1,1); if DetPrec2<>9999 then begin - DetPrec3:=detecteur_suivant_El(DetPrec1,false,DetPrec2,false); + DetPrec3:=detecteur_suivant_El(DetPrec1,1,DetPrec2,1); if DetPrec3<>9999 then begin //DetPrec4:=detecteur_suivant_det(DetPrec2,DetPrec3); @@ -5623,13 +5751,17 @@ begin //aiguillage[10].Position:=1; //traceDet:=true; // calcul_zones; - //carre_signal(358); //maj_feu(201); //etat_signal_suivant(201,1); //Aiguille_deviee(462); - //i:=detecteur_suivant(23,false,538,false); // donne l'élément suivant de AdrPrec à AdrFonc et dans Bis si c'est un aig bis - // i:=etat_signal_suivant(462,2); - //NivDebug:=3; + formdebug.Show; + NivDebug:=3; + aiguillageB[1].Position:=1; + i:=suivant_alg3(553,1,1,3,1); + Affichedebug(intToSTr(i),clred); + //test_memoire_zones(274); + //i:=detecteur_suivant_El(514,1,518,1); // donne l'élément suivant de AdrPrec à AdrFonc et dans Bis si c'est un aig bis + //i:=etat_signal_suivant(176,1); //Affiche(IntToSTR(detecteur_suivant_El(531,false,518,false)),clyellow); //i:=Aiguille_deviee(176); //signal_direction(372); @@ -6005,6 +6137,7 @@ begin afficheDebug(s,ClRed); CDM_connecte:=false; ErrorCode:=0; + LabelEtat.caption:=Titre; end; // lecture depuis socket @@ -6178,9 +6311,28 @@ begin end else s:=s+' absent'; - Affiche(s,clYellow); - + end; + + for i:=1 to MaxAiguillage do + begin + s:=IntToSTR(i)+'BIS'; + if aiguillageB[i].modele<>0 then + begin + if aiguillageB[i].modele=1 then s:=s+' Pointe='; + if aiguillageB[i].modele=2 then s:=s+' TJD: centre TJD='; + if aiguillageB[i].modele=3 then s:=s+' TJS:'; + if aiguillageB[i].modele=4 then s:=s+' Triple: Pointe='; + s:=s+IntToSTR(aiguillageB[i].APointe)+aiguillageB[i].APointeB+ + ' Dévie='+IntToSTR(aiguillageB[i].ADevie)+aiguillageB[i].ADevieB+ + ' Droit='+IntToSTR(aiguillageB[i].ADroit)+aiguillageB[i].ADroitB; + if aiguillageB[i].modele=4 then s:=s+' Dévié2='+intToSTR(aiguillageB[i].ADevie2)+aiguillageB[i].ADevie2B; + if aiguillageB[i].vitesse<>0 then s:=s+' Vitesse déviée='+intToSTR(aiguillageB[i].vitesse); + end + else + s:=s+' absent'; + + Affiche(s,clYellow); end; end; @@ -6249,7 +6401,7 @@ begin aiguillage[adr].position:=etatAig; aiguillageB[adr].position:=etatAig; Tempo_chgt_feux:=10; // demander la mise à jour des feux - Affiche('Aiguillage '+intToSTR(adr)+'='+IntToStr(etatAig),clYellow); + //Affiche('Aiguillage '+intToSTR(adr)+'='+IntToStr(etatAig),clYellow); //Affiche(recuCDM,CLOrange); //if length(recuCDM)>80 then Affiche(copy(recuCDM,80,length(recuCDM)-80),clOrange); end; @@ -6274,7 +6426,7 @@ begin event_det[N_event_det]:=adr; dem_calcul_zone:=true; end; - if AfficheDet then Affiche('Détecteur '+intToSTR(adr)+'='+IntToStr(etat),clYellow); + if AfficheDet then Affiche('Rétro Détecteur '+intToSTR(adr)+'='+IntToStr(etat),clYellow); end ; inc(k); @@ -6328,6 +6480,8 @@ begin if feux[i].aspect<10 then begin s:=s+' SIG Nombre de feux='+IntToSTR(feux[i].aspect)+' '; + s:=s+' El Suivant1='+IntToSTR(feux[i].Adr_el_suiv1)+' Type suivant1='+intToSTR(feux[i].Btype_suiv1); + if feux[i].decodeur=6 then s:=s+' Cible unisemaf='+intToSTR(feux[i].Unisemaf); end @@ -6358,13 +6512,13 @@ begin Affiche('Version 1.1 : gestion des tableaux indicateurs de direction',clLime); Affiche(' gestion du décodeur de signaux Unisemaf Paco (expérimental)',clLime); Affiche(' changemennt dynamique des feux en cliquant sur son image',clLime); - + Affiche('Version 1.11 : compatibilité pour la rétrosignalisation non XpressNet (intellibox)',clLime); end; procedure TFormPrinc.ClientSocketLenzDisconnect(Sender: TObject; Socket: TCustomWinSocket); begin - parSocket:=False; + parSocket:=False; end; end. diff --git a/config.cfg b/config.cfg index a2ee5a3..15fd99f 100644 --- a/config.cfg +++ b/config.cfg @@ -1,115 +1,112 @@ /****************************************** -/ fichier de configuration de signaux_complexes -/ gily - f1iwq - 2018 -/****************************************** +/ fichier de configuration de signaux complexes +/ cap de bouheyre avec signaux - 2018 +/**************************************** / Sans Log=0 / Avec Log=1 : génère un fichier log Log=0 / Affichage du débug du calcul des routes, et enregistrement dans le log si la variable précédente est à 1 TraceDet=0 -/ Envoie un 0 après le pilotage des décodeurs -/ Mettre 1 si utilisation de décodeurs LEB -RazSignaux=1 +/ si 1 envoie un 0 après le pilotage des décodeurs LEB +RazSignaux=0 / / modélisation des aiguillages : détermine les éléments connectés aux 3 branches des aiguilles (Pointe, Droit, Dévié (S) -/ adresse d'aiguillage,P=élément vers pointe D=élément vers Droit, S=élément vers dévié. -/ [60 ou 30 dans le cas d'un aiguillage en position déviée qui doit être fanchie à 30 ou 60] -/ Elément = détecteur (valeur uniquement numérique) ou aiguillage (adresse+branche de connexion (P S ou D) -/ Exemple : 1,P518,D523,S3P signifie : définition de l'aiguillage @1 : sur pointe relié au détecteur 518 +/ adresse d'aiguillage[B],P=élément vers pointe D=élément vers Droit, S=élément vers dévié +/ B pour adresse d'aiguillage déja utilisée +/ Elément = détecteur (valeur uniquement numérique) ou aiguillage (adresse [TRI,TJS,TJD]+branche de connexion (P S ou D) +/ Exemples : 1,P518,D523,S3P signifie : définition de l'aiguillage @1 : sur pointe relié au détecteur 518 / sur Droit relié au détecteur 518 / sur Dévié, relié à l'aiguillage 3 en pointe -/ Pour une TJD : 26TJD,D530,S529,P28 -/ P désigne l'autre adresse de la TJD -/ Aiguillage triple -/ +/ Voir la documentation des signaux complexes pour une description complete / S'il n'y a pas de détecteur connecté à une branche d'aiguillage, mettre 0. -1,P518,S3P,D523,30 -2,P12S,S5S,D519 -3,P1S,S5D,D4P -4,P3D,S514,D6S -5,P515,S2S,D3S -6,P516,S4D,D0 -7,P527,S520,D519 -8,P527,S522,D521 -9,P526,S515,D513,60 -10,P19P,S528,D29P,30 -11,P18P,D30D,S525 -12,P517,D20S,S2P -17,P525,D535,S528 -18,P11P,S517,D23P -19,P10P,S531,D22P -20,P520,D21P,S12D -21,P20D,S28D,D28D -22,P19D,S538,D537 -23,P18D,S534,D538 -24,P538,S533,D32S -25,P31S,D529,S27P -26TJD,D530,S529,P28 -28TJD,D21D,S21S,P26 -27,P25S,D530,S537 -29,P10D,S30S,D513,60 -30,P524,S29D,D11D -31,P534,S25P,D0 -32,P22S,S24D,D0 +1,P2P,D3P,S1BS +1B,P553,D16P,S1S +2,P1P,D4P,S2BS +2B,P521,D16D,S2S +3,P1D,D522,S5BP +4,P2D,D554,S6BP +5,P9P,S15P,D5BS +5B,P3S,S5D,D545 +6,P10P,S546,D6BS +6B,P4S,D545,S6D +7,P15S,D566,S565 +8,P20P,D566,S565 +9,P5P,D530,S17P +10,P6P,D530,S18P +13,P17S,D563,S564 +14,P18S,D563,S564 +15,P5S,D546,S7P +16,P1BD,S16BS,D2BD +16B,P0,S16S,D557 +17,P9S,D531,S13P +18,P10S,D562,S14P +20,P8P,D547,S0 +21,P25P,S537,D23S +22,P24P,S561,D25S +23,P569,S21D,D538 +24,P22P,S26P,D513 +25,P21P,S22D,D570 +26,P24S,S515,D514 +28,P30P,S29P,D570 +29,P28S,D516,S31P +30,P28P,D32S,S539 +31TRI,27,P28S,D518,S0,S2-517 +32,P571,D538,S30D 0 // / modélisation du réseau par branche -/ 1 ligne par branche - le sens de parcours de la branche est arbitraire. -/ Chaque ligne (branche) doit commmencer et finir par un aiguillage -/ Une ligne qui finit par un 0 signifie un heurtoir +/ 1 ligne par branche - le sens de parcours de la description n'a pas d'importance. +/ Chaque ligne (branche) doit comporter au moins un détecteur et au moins aiguillage / @ détecteur A=@aiguillage -/ Terminer par 0 -/ Exemple : 519 est un détecteur - A2 est l'aiguillage 2 +/ chaque ligne doit commencer par un aiguillage et se terminer par un aiguillage +/ Terminer par les brances par 0 +/ Exemple : 519 est un détecteur - A2 est l'aiguillage 2 - A1B est l'aiguillage 1bis / -A2,A12,517,A18,A11,A30,524,521,A8,527,A7,519,A2 -A7,520,A20,A12 -A1,A3,A4,514,522,A8 -A1,523,526,A9,513,A29,A10,A19,531,518,A1 -A9,515,A5 -A11,525,A17,528,A10 -A17,535,533,A24,538,A23 -A7,520,A20,A21,A28,A26,530,A27,A25,A31,534,A23,A18 -A26,529,A25 -A22,537,A27 -A22,A32,A24 -A6,516,0 -A31,0 +/ rouge - jaune +A20,547,561,A22,A24,A26,515,518,A31,A29,A28,A30,539,522,A3,A1,A2,A4,A6B,545,A5B,A3 +A26,514,517,A31 +A26,515,518,A31 +A24,513,516,A29 +/grande boucle extérieure départ de couche rouge: de 569 à 569 +A23,538,A32,571,553,A1B,A16,A2B,521,569,A23 +/ grande boucle intérieure +A21,A25,570,A28 +A4,554,537,A21 +/ couche jaune +A10,530,A9,A5,A15,546,A6 +A18,562,531,A17 +A14,563,A13 +A14,564,A13 +/ +A7,565,A8 +A7,566,A8 +A16B,557,0 0 -/ liste des adresses des signaux et leur forme, pour affichage de l'image correspondante , -/ avec ou sans bouton de commande pour le feu blanc, type de décodeur [, type de cible (pour les décodeurs Unisemaf uniquement)] +/ +/ liste des signaux / la liste doit être terminée par une adresse à 0 -/ forme : 2=2 feux(carré violet/blanc) / 3=3 feux / 4=4 feux / 5=5 feux (carré + blanc ou violet) -/ 7=7 feux (blanc ou violet + ralentissement / 9=9 feux (blanc ou violet + rappel ralentissement) -/ Dx : signal directionnel à x feux -/ type de décodeur : 1=digital Bahn 2=CDF 3=LDT 4=LEB 5=NMRA 6=Unisemaf +/ forme : 2=2 feux(carré violet/blanc) / 3=3 feux / 4=4 feux (carré) / 5=5 feux (carré + blanc) +/ 7=7 feux (carré+blanc + ralentissement / 9=9 feux (blanc ou violet + rappel ralentissement) +/ type de décodeur : 0=feu virtuel 1=digital Bahn 2=CDF 3=LDT 4=LEB +/ l'énumération des détecteurs ne nécessite pas de parenthèses si il est seul, mais il faut des parenthèses si +/ le signal concerne plusieurs voies (donc détecteurs) / Notation de chaque ligne: -/ adresse de base du signal, forme, avec ou sans bouton de commande du feu blanc, type de décodeur [, détecteur (det2, det3, ...) , élément suivant , -/ avec ou sans demande de verrouillage du feu au carré] -/ -176,7,0,1,(520,A20),1 -190,7,0,1,(523,526),1 -204,9,0,1,(527,A7),1 -218,7,0,1,(525,A17),1 -232,2,1,1,(516,A6),1 -260,9,1,1,(518,A1),1 -274,3,0,1,(524,521),1 -288,7,0,1,(522,A8),1 -302,9,0,1,(526,A9),1 -316,7,1,1,(515,A5),1 -330,7,0,1,(519,A2),1 -344,9,0,1,(528,A10),1 -358,9,0,1,(517,A18),1 -372,D3,1,(A10D)(A19S)(A19D,A22D)(A19D,A22S) -382,D3,1,(A29S,A10S)(A19S)(A19D,A22D)(A19D,A22S) -392,3,0,1,(535,533),1 -420,7,0,1,(529,A25,530,A27,537,A27),1 -448,7,0,1,(533,A24),1 -462,9,0,1,(513,A29),1 -476,9,0,1,(538,A23),1 -497,9,0,4,(531,A19),1 -600,7,0,0,(521,A8),1 -610,9,0,6,(520,A20),0,7 +/ adresse de base du signal, forme, réserve, type de décodeur [, (détecteur,..detecteur , élément suivant ..) , +/ avec ou sans demande de verrouillage du feu au carré (0 ou 1)] +161,4,0,4,(538,A32),0 +169,9,0,4,(539,A30),0, +177,9,0,4,(569,A23),0 +185,4,0,4,(570,A25),0 +193,4,0,4,(516,A29),0 +201,2,0,4,(517,31TRI,518,31TRI),0 +209,9,0,4,(561,547),0 +217,2,0,4,(514,A26,515,A26),0 +225,9,0,4,(516,A29),0 +233,4,0,4,(547,A20),0 +1001,3,0,0,(537,554),0 +1003,3,0,0,(553,A1B),0 +1005,3,0,0,(571,553),0 +1007,3,0,0,(554,A4),0 +1009,3,0,0,(522,539),0 +1011,3,0,0,(521,569),0 +1013,3,0,0,(565,A7),0 0 -/ - - - diff --git a/configgily.cfg b/configgily.cfg new file mode 100644 index 0000000..a2ee5a3 --- /dev/null +++ b/configgily.cfg @@ -0,0 +1,115 @@ +/****************************************** +/ fichier de configuration de signaux_complexes +/ gily - f1iwq - 2018 +/****************************************** +/ Sans Log=0 / Avec Log=1 : génère un fichier log +Log=0 +/ Affichage du débug du calcul des routes, et enregistrement dans le log si la variable précédente est à 1 +TraceDet=0 +/ Envoie un 0 après le pilotage des décodeurs +/ Mettre 1 si utilisation de décodeurs LEB +RazSignaux=1 +/ +/ modélisation des aiguillages : détermine les éléments connectés aux 3 branches des aiguilles (Pointe, Droit, Dévié (S) +/ adresse d'aiguillage,P=élément vers pointe D=élément vers Droit, S=élément vers dévié. +/ [60 ou 30 dans le cas d'un aiguillage en position déviée qui doit être fanchie à 30 ou 60] +/ Elément = détecteur (valeur uniquement numérique) ou aiguillage (adresse+branche de connexion (P S ou D) +/ Exemple : 1,P518,D523,S3P signifie : définition de l'aiguillage @1 : sur pointe relié au détecteur 518 +/ sur Droit relié au détecteur 518 +/ sur Dévié, relié à l'aiguillage 3 en pointe +/ Pour une TJD : 26TJD,D530,S529,P28 +/ P désigne l'autre adresse de la TJD +/ Aiguillage triple +/ +/ S'il n'y a pas de détecteur connecté à une branche d'aiguillage, mettre 0. +1,P518,S3P,D523,30 +2,P12S,S5S,D519 +3,P1S,S5D,D4P +4,P3D,S514,D6S +5,P515,S2S,D3S +6,P516,S4D,D0 +7,P527,S520,D519 +8,P527,S522,D521 +9,P526,S515,D513,60 +10,P19P,S528,D29P,30 +11,P18P,D30D,S525 +12,P517,D20S,S2P +17,P525,D535,S528 +18,P11P,S517,D23P +19,P10P,S531,D22P +20,P520,D21P,S12D +21,P20D,S28D,D28D +22,P19D,S538,D537 +23,P18D,S534,D538 +24,P538,S533,D32S +25,P31S,D529,S27P +26TJD,D530,S529,P28 +28TJD,D21D,S21S,P26 +27,P25S,D530,S537 +29,P10D,S30S,D513,60 +30,P524,S29D,D11D +31,P534,S25P,D0 +32,P22S,S24D,D0 +0 +// +/ modélisation du réseau par branche +/ 1 ligne par branche - le sens de parcours de la branche est arbitraire. +/ Chaque ligne (branche) doit commmencer et finir par un aiguillage +/ Une ligne qui finit par un 0 signifie un heurtoir +/ @ détecteur A=@aiguillage +/ Terminer par 0 +/ Exemple : 519 est un détecteur - A2 est l'aiguillage 2 +/ +A2,A12,517,A18,A11,A30,524,521,A8,527,A7,519,A2 +A7,520,A20,A12 +A1,A3,A4,514,522,A8 +A1,523,526,A9,513,A29,A10,A19,531,518,A1 +A9,515,A5 +A11,525,A17,528,A10 +A17,535,533,A24,538,A23 +A7,520,A20,A21,A28,A26,530,A27,A25,A31,534,A23,A18 +A26,529,A25 +A22,537,A27 +A22,A32,A24 +A6,516,0 +A31,0 +0 +/ liste des adresses des signaux et leur forme, pour affichage de l'image correspondante , +/ avec ou sans bouton de commande pour le feu blanc, type de décodeur [, type de cible (pour les décodeurs Unisemaf uniquement)] +/ la liste doit être terminée par une adresse à 0 +/ forme : 2=2 feux(carré violet/blanc) / 3=3 feux / 4=4 feux / 5=5 feux (carré + blanc ou violet) +/ 7=7 feux (blanc ou violet + ralentissement / 9=9 feux (blanc ou violet + rappel ralentissement) +/ Dx : signal directionnel à x feux +/ type de décodeur : 1=digital Bahn 2=CDF 3=LDT 4=LEB 5=NMRA 6=Unisemaf +/ Notation de chaque ligne: +/ adresse de base du signal, forme, avec ou sans bouton de commande du feu blanc, type de décodeur [, détecteur (det2, det3, ...) , élément suivant , +/ avec ou sans demande de verrouillage du feu au carré] +/ +176,7,0,1,(520,A20),1 +190,7,0,1,(523,526),1 +204,9,0,1,(527,A7),1 +218,7,0,1,(525,A17),1 +232,2,1,1,(516,A6),1 +260,9,1,1,(518,A1),1 +274,3,0,1,(524,521),1 +288,7,0,1,(522,A8),1 +302,9,0,1,(526,A9),1 +316,7,1,1,(515,A5),1 +330,7,0,1,(519,A2),1 +344,9,0,1,(528,A10),1 +358,9,0,1,(517,A18),1 +372,D3,1,(A10D)(A19S)(A19D,A22D)(A19D,A22S) +382,D3,1,(A29S,A10S)(A19S)(A19D,A22D)(A19D,A22S) +392,3,0,1,(535,533),1 +420,7,0,1,(529,A25,530,A27,537,A27),1 +448,7,0,1,(533,A24),1 +462,9,0,1,(513,A29),1 +476,9,0,1,(538,A23),1 +497,9,0,4,(531,A19),1 +600,7,0,0,(521,A8),1 +610,9,0,6,(520,A20),0,7 +0 +/ + + + diff --git a/verif_version.dcu b/verif_version.dcu index 339ced3721dc91a85cb6dd018bf2e553c1594150..76a1dd0e71723e389e43825951e3d8d3292cc240 100644 GIT binary patch delta 664 zcmX|;PiPZC6vk)X{z;S4CWM;ZY&U;5+LD%Hz(YY>5KX9uN(6KCP_xk>T4_n39>f+~ z!G=iM*Fr!qy-C%B24NEfMLdXj(3_y3_LQJP4v`j2iL+^wxqLIf_syGcX11qRW4+%A zvD-94gpJ9yUJv&kC!deZ+MUIjg+&FF78^VvBr+DkC-y3wc9%9C6$<;Kr3=m?uYTnS z(Obv$`~H0Nccso&Rpuu7Xti<*1<7X_XDFAb;(2KhW70Vq$AUCQb$l&dww?sDwr9jK zEC*=@r)9sGOEio{9`kYl3Ow%08a(1rbq@s}vl#8(xoG3?jAkxTKR}75!E7ma$o{Eo zV~rUry3gF%VTrcPSlxZo^~#T~G1_eNYb3wY*l)GUA;FAw0CR10CD(VB!53WHcy~{< zuPmFl+^jRd5oe`?80~dF+AQlGlr9LwLR#5I`l*1Il%qqeapwZdZ!#|9RmW+3>&$++ zjB$LRcwmRaXUYhBB>bXmU`Tb~MKwkv_)s0DknVSxcD83W1w+7_$NGhzt5SCyj76_zSi}?Z>Tv4?bJ* zZD4{{)`Rn+AC7?^@Ltdx)*%LQ-XVHnfR}mMwa`XKp~%_{>ZfhJD*#?Qf=#*c^VK%VEFEYUBItX76cL4jA;R(PqzTda%P#d&sCL;eR~C1zk{N??JN z8wtZVxEAvS48nDV8Z>gIF)2?gfdMmUWO9Nn&@Azzb7=q%-sC#e9DM*XK)M8tWRjL< fC;q{GGR($l1c;;Wits!Jiy}JdB@xE(XQS&cIk+75 diff --git a/verif_version.pas b/verif_version.pas index 006b3a2..731954b 100644 --- a/verif_version.pas +++ b/verif_version.pas @@ -22,7 +22,7 @@ var FormVersion: TFormVersion; Lance_verif : integer; -Const Version='1.1';// sert à la comparaison de la version publiée +Const Version='1.11';// sert à la comparaison de la version publiée implementation @@ -114,13 +114,13 @@ begin begin i:=pos('version ',s); trouve_version:=i<>0; - if trouve_version then s2:=s; // chaine contenant la version sur le site + if trouve_version then s2:=s; end; if not(trouve_zip) then begin i:=pos('.zip',s); trouve_zip:=i<>0; - if trouve_zip then s3:=s; // chaine de l'Id du zip à télécharger + if trouve_zip then s3:=s; end; // Aff(s) end; @@ -133,24 +133,10 @@ begin j:=pos(' ',s2); Version_p:=copy(s2,1,j-1); // version dans version_p // isoler l'url du zip - //'href="./download/file.php?id=12086&sid=9d0f759226f8c6e48671ab7c23cf36b4">Signaux_complexes_GL.zip'; - //'href="./download/file.php?id=12086">Signaux_complexes_GL.zip0 then - begin - // supprimer la chaine sid - i:=pos('&',s3); - j:=pos('"',s3); - delete(s3,i,j-1); - end - else - begin - j:=pos('"',s3); - s3:=copy(s3,1,j-1); - end; + j:=pos('"',s3); + s3:=copy(s3,1,j-1); i:=pos('.',s3); if i<>0 then delete(s3,i,1); // supprimer le . s3:='http://cdmrail.free.fr/ForumCDR'+s3 ; @@ -161,7 +147,7 @@ begin i:=pos('.',s);if i<>0 then s[i]:=','; s2:=version; i:=pos('.',s2);if i<>0 then s2[i]:=','; - + V_publie:=StrToFloat(s); V_utile:=StrToFloat(s2); if V_utile