This commit is contained in:
f1iwq2
2020-03-09 18:24:14 +01:00
parent 11cc298114
commit 0e52a60c2a
19 changed files with 2176 additions and 544 deletions

View File

@@ -78,16 +78,14 @@ type
OpenDialog: TOpenDialog;
N1: TMenuItem;
LireunfichierdeCV1: TMenuItem;
LireunaccessoireversunfichierdeCV1: TMenuItem;
SaveDialog: TSaveDialog;
N5: TMenuItem;
Quitter1: TMenuItem;
EditGenli: TEdit;
Button1: TButton;
Button2: TButton;
Config: TMenuItem;
Label1: TLabel;
LabelNbTrains: TLabel;
ButtonLitCV: TButton;
procedure FormCreate(Sender: TObject);
procedure MSCommUSBLenzComm(Sender: TObject);
procedure FormClose(Sender: TObject; var Action: TCloseAction);
@@ -134,11 +132,9 @@ type
procedure ButtonEcrCVClick(Sender: TObject);
procedure ButtonRepriseClick(Sender: TObject);
procedure LireunfichierdeCV1Click(Sender: TObject);
procedure LireunaccessoireversunfichierdeCV1Click(Sender: TObject);
procedure Quitter1Click(Sender: TObject);
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure ConfigClick(Sender: TObject);
procedure ButtonLitCVClick(Sender: TObject);
private
{ Déclarations privées }
@@ -156,7 +152,10 @@ tempoFeu = 100;
MaxAcc = 2048;
LargImg=50;HtImg=91;
const_droit=2;const_devieD=1; // positions transmises par la centrale LENZ
const_devieG=3;
const_devieG_CDM=3; // positions transmises par cdm
const_devieD_CDM=2; // positions transmises par cdm
const_droit_CDM=0; // positions transmises par cdm
MaxElParcours=4000;
@@ -171,7 +170,7 @@ type TBranche = record
Taiguillage = record
modele : integer; // 0=n'existe pas 1=aiguillage 2=TJD 3=TJS 4=aiguillage triple
position, // position actuelle : 1=dévié 2=droit
Adrtriple,
Adrtriple, // 2eme adresse pour un aiguillage triple
temps, // temps de pilotage (durée de l'impulsion en x 100 ms)
inversion : integer; // pilotage inversé 0=normal 1=inversé
vitesse : integer; // vitesse de franchissement de l"aiguillage en position déviée (60 ou 90)
@@ -205,9 +204,9 @@ TMA = (valide,devalide);
var ancien_tablo_signalCplx,EtatsignalCplx : array[0..MaxAcc] of word;
AvecInitAiguillages,tempsCli,combine,NbreFeux,pasreponse,AdrDevie,precedent ,
NombreImages,signalCpx,branche_trouve,Indexbranche_trouve,Actuel,Signal_suivant,
Nbre_recu_cdm,Tempo_chgt_feux,Adj1,Adj2,protocole : integer;
Nbre_recu_cdm,Tempo_chgt_feux,Adj1,Adj2 : integer;
Hors_tension2,traceSign,TraceZone,Ferme,parSocket,ackCdm,
NackCDM,MsgSim : boolean;
NackCDM,MsgSim,succes,recu_cv,
TraceListe,clignotant,nack,Maj_feux_cours : boolean;
branche : array [1..100] of string;
@@ -219,8 +218,9 @@ const
GrisF=$414141;
clOrange=$0077FF;
Feu_X=50;Feu_Y=91;
Max_Simule=1000;
couleurTrain : array[1..8] of Tcolor = (clYellow,clLime,clOrange,clAqua,clFuchsia,clLtGray,clred,clWhite);
var
FormPrinc: TFormPrinc;
ack,portCommOuvert,trace,AffMem,AfficheDet,CDM_connecte,parSocketCDM,
@@ -240,11 +240,12 @@ var
route : array[1..2000] of record
Mem1,Mem2 : integer;
end;
end;
Tablo_Simule : array[0..200] of
end;
Tablo_Simule : array[0..Max_Simule] of
record
tick : longint;
Detecteur,etat : integer ;
Detecteur,Aiguillage,etat : integer ;
end;
Route : array[1..2000] of record
Mem1,Mem2 : integer;
@@ -3719,6 +3720,8 @@ begin
suivant_alg3:=9999;exit;
end;
indexBranche_actuel:=IndexBranche_trouve;
branche_trouve_actuel:=branche_trouve;
Adr:=actuel;
Btype:=BrancheN[branche_trouve_actuel,indexBranche_actuel].Btype;
@@ -3967,10 +3970,11 @@ begin
trouve_element(adr,TypeEl); // branche_trouve IndexBranche_trouve
typeGen:=BrancheN[branche_trouve,IndexBranche_trouve].Btype;
suivant_alg3:=adr;
exit;
exit;
end;
end;
if (aiguillage[Adr].modele=2) or (aiguillage[Adr].modele=3) then // TJD ou TJS
begin
// récupérer les élements de la TJD/S
AdrTjdP:=aiguillage[Adr].Apointe; // 2eme adresse de la TJD/S
@@ -4122,43 +4126,108 @@ begin
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);
Affiche('139 - Erreur fatale - Aucun cas TJD/S : adr='+IntToSTR(Adr)+' '+intToSTR(AdrTJDP)+' prec='+IntTOSTR(prec),clred);
AfficheDebug('139 - Erreur fatale - Aucun cas TJD/S : adr='+IntToSTR(Adr)+' '+intToSTR(AdrTJDP)+' prec='+IntTOSTR(prec),clred);
suivant_alg3:=9999;exit;
end;
if (aiguillage[Adr].modele=4) then // aiguillage triple
begin
// aiguillage triple pris en pointe
Adr2:=aiguillage[Adr].AdrTriple;
// attention la lecture d'un aiguillage triple est différente suivant la connexion avec CDM
// ou avec l'interface
if ( CDM_connecte and (aiguillage[Adr].position=const_droit) ) 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 droit',clYellow);
typeGen:=aiguillage[Adr].AdroitBis+1;
//TSuiv=aiguillage[Adr].AdroitB;
Adr:=aiguillage[Adr].Adroit;
end;
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);
typeGen:=aiguillage[Adr].AdevieBis+1;
//TSuiv=aiguillage[Adr].AdevieB;
Adr:=aiguillage[Adr].Adevie;
end;
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);
typeGen:=aiguillage[Adr].Adevie2Bis+1;
//TSuiv=aiguillage[Adr].Adevie2B;
Adr:=aiguillage[Adr].Adevie2;
end;
if ((aiguillage[Adr].position<>const_droit) and (aiguillage[Adr2].position<>const_droit) ) then
AfficheDebug('139 - Erreur fatale - Aucun cas TJD/S : adr='+IntToSTR(Adr)+' '+intToSTR(AdrTJDP)+' prec='+IntTOSTR(prec),clred);
suivant_alg3:=9999;exit;
end;
if (aiguillage[Adr].modele=4) then // aiguillage triple
begin
Adr2:=aiguillage[Adr].AdrTriple;
if (aiguillage[adr].Apointe=prec) then
begin
// aiguillage triple pris en pointe
//Affiche('position='+intToSTR(aiguillage[Adr].position),clyellow);
if (aiguillage[Adr].position=const_droit) and (aiguillage[Adr2].position=const_droit) then
begin
if NivDebug=3 then AfficheDebug('Aiguillage triple pris en pointe droit',clYellow);
typeGen:=aiguillage[Adr].AdroitBis+1;
A:=aiguillage[Adr].AdroitB;
Adr:=aiguillage[Adr].Adroit;
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) and (aiguillage[Adr2].position=const_droit) then
begin
if NivDebug=3 then AfficheDebug('Aiguillage triple dévié1 (à gauche)',clYellow);
typeGen:=aiguillage[Adr].AdevieBis+1;
A:=aiguillage[Adr].AdevieB;
Adr:=aiguillage[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;
if (aiguillage[Adr].position=const_droit) and (aiguillage[Adr2].position<>const_droit) then
begin
if NivDebug=3 then AfficheDebug('Aiguillage triple dévié2 (à droite)',clYellow);
typeGen:=aiguillage[Adr].Adevie2Bis+1;
A:=aiguillage[Adr].Adevie2B;
Adr:=aiguillage[Adr].Adevie2;
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;
begin
s:='Aiguillage triple '+IntToSTR(Adr)+' : configuration des aiguilles interdite';
if CDM_connecte then s:=s+': '+IntToSTR(aiguillage[Adr].position);
AfficheDebug(s,clYellow);
Affiche(s,clRed);
suivant_alg3:=9999;exit; // pour échappement
end;
end
else
begin
if NivDebug=3 then AfficheDebug('Aiguillage triple pris en talon',clyellow);
if alg=2 then // on demande d'arreter si l'aiguillage en talon est mal positionné
begin
if (aiguillage[adr].position=const_droit) and (aiguillage[adr2].position=const_droit) then
begin
if prec<>aiguillage[Adr].Adroit then
begin
if NivDebug=3 then AfficheDebug('135.3 - Aiguillage '+intToSTR(adr)+'triple mal positionné',clyellow);
suivant_alg3:=9998;exit;
end
else
begin
if NivDebug=3 then AfficheDebug('135.4 - Aiguillage '+intToSTR(adr)+'triple bien positionné',clyellow);
end;
end;
if (aiguillage[adr].position<>const_droit) and (aiguillage[adr2].position=const_droit) then
begin
if prec<>aiguillage[Adr].Adevie then
begin
if NivDebug=3 then AfficheDebug('135.3 - Aiguillage '+intToSTR(adr)+'triple mal positionné',clyellow);
suivant_alg3:=9998;exit;
end
else
begin
if NivDebug=3 then AfficheDebug('135.4 - Aiguillage '+intToSTR(adr)+'triple bien positionné',clyellow);
end;
end;
if (aiguillage[adr].position=const_droit) and (aiguillage[adr2].position<>const_droit) then
begin
if prec<>aiguillage[Adr].Adevie2 then
begin
if NivDebug=3 then AfficheDebug('135.3 - Aiguillage '+intToSTR(adr)+'triple mal positionné',clyellow);
suivant_alg3:=9998;exit;
end
else
begin
if NivDebug=3 then AfficheDebug('135.4 - Aiguillage '+intToSTR(adr)+'triple bien positionné',clyellow);
end;
end;
end;
A:=aiguillage[Adr].ApointeB;
Adr:=aiguillage[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
@@ -5122,8 +5191,6 @@ begin
Signal_direction(AdrFeu);
exit;
end;
etat:=etat_signal_suivant(AdrFeu,1) ; // état du signal suivant + adresse du signal suivant dans Signal_Suivant
etat:=etat_signal_suivant(AdrFeu,1) ; // état du signal suivant + adresse du signal suivant dans Signal_Suivant
@@ -5508,7 +5575,7 @@ begin
end;
if Traceliste then AfficheDebug('--------------------- détecteur '+intToSTR(Adresse)+' à '+intToSTR(etat01)+'-----------------------------',clOrange);
//if etat then Mem[Adresse]:=true; // mémoriser l'état à 1
ancien_detecteur[Adresse]:=detecteur[Adresse];
@@ -5517,7 +5584,7 @@ begin
// mise a jour du tableau evt de fronts descendants
if ancien_detecteur[Adresse] and not(detecteur[Adresse]) and (N_Event_det<20) then
begin
begin
//Affiche('front descendant',clyellow);
inc(N_event_det);
event_det[N_event_det]:=Adresse;
@@ -5529,6 +5596,12 @@ begin
begin
inc(N_Event_tick);
// event_det_tick[N_event_tick].train:=0;
event_det_tick[N_event_tick].tick:=tick;
event_det_tick[N_event_tick].detecteur[Adresse]:=etat01;
// Affiche('stockage de '+intToSTR(N_event_tick)+' à '+intToSTR(etat01),clyellow);
end;
// Mettre à jour le TCO
if AvecTCO then
begin
@@ -5564,11 +5637,16 @@ begin
afficheDebug(s,clyellow);
end;
event_det_tick[N_event_tick].train:=N_trains;
end;
end;
}
end;
end;
end;
}
end;
// évènement d'aiguillage
procedure Event_Aig(adresse,pos : integer);
begin
if (N_Event_tick<Max_Event_det_tick) then
begin
inc(N_Event_tick);
event_det_tick[N_event_tick].tick:=tick;
event_det_tick[N_event_tick].aiguillage:=adresse;
@@ -5706,25 +5784,25 @@ begin
end;
// état de l'aiguillage
if bitsITT=$00 then // module d'aiguillages, N=1
if bitsITT=$00 then // module d'aiguillages, N=1
begin
adraig:=((adresse * 4)+1 ); // *4 car N=1, c'est le "poids fort"
if (valeur and $C)=$8 then
begin
aiguillage[adraig+3].position:=2 ; // état aiguillage haut
Event_Aig(adraig+3);
Event_Aig(adraig+3,2);
if trace then begin s:='accessoire '+intToSTR(adraig+3)+'=2';Affiche(s,clYellow);end;
end;
if (valeur and $C)=$4 then
begin
aiguillage[adraig+3].position:=1 ; // état aiguillage haut
Event_Aig(adraig+3);
Event_Aig(adraig+3,1);
if trace then begin s:='accessoire '+intToSTR(adraig+3)+'=1';Affiche(s,clYellow);end;
end;
if (valeur and $3)=$2 then
begin
aiguillage[adraig+2].position:=2; // état aiguillage bas
Event_Aig(adraig+2);
Event_Aig(adraig+2,2);
if trace then begin s:='accessoire '+intToSTR(adraig+2)+'=2';Affiche(s,clYellow);end;
end;
if (valeur and $3)=$1 then
@@ -5766,25 +5844,25 @@ begin
end;
end;
if bitsITT=$00 then // module d'aiguillages
if bitsITT=$00 then // module d'aiguillages
begin
adraig:=(adresse * 4)+1;
if (valeur and $C)=$8 then
begin
aiguillage[adraig+1].position:=2 ; // état aiguillage haut
Event_Aig(adraig+1);
Event_Aig(adraig+1,2);
if trace then begin s:='accessoire '+intToSTR(adraig+1)+'=2';Affiche(s,clYellow);end;
end;
if (valeur and $C)=$4 then
begin
aiguillage[adraig+1].position:=1 ; // état aiguillage haut
Event_Aig(adraig+1);
Event_Aig(adraig+1,1);
if trace then begin s:='accessoire '+intToSTR(adraig+1)+'=1';Affiche(s,clYellow);end;
end;
if (valeur and $3)=$2 then
begin
aiguillage[adraig].position:=2; // état aiguillage bas
Event_Aig(adraig);
Event_Aig(adraig,2);
if trace then begin s:='accessoire '+intToSTR(adraig)+'=2';Affiche(s,clYellow);end;
end;
if (valeur and $3)=$1 then
@@ -5855,7 +5933,7 @@ end;
end;
end;
end;
Xdecode_chaine_retro:=chaineint;
Xdecode_chaine_retro:=chaineint;
end;
// décodage d'une chaine simple de la rétrosignalisation
@@ -5867,7 +5945,7 @@ begin
msg:='';
ack:=true;nack:=false;
// décodage du 3eme octet de la chaîne
if chaineINT[1]=#1 then
if chaineINT[1]=#1 then
begin
case chaineINT[2] of // page 13 doc XpressNet
#1 : begin nack:=true;msg:='erreur timout transmission';end;
@@ -5909,17 +5987,19 @@ begin
end;
if nack then affiche(msg,clred) else affiche(msg,clyellow);
delete(chaineINT,1,2);
decode_chaine_retro:=chaineINT;
decode_chaine_retro:=chaineINT;
exit;
end;
if ((chaineINT[1]=#$63) and (chaineINT[2]=#$14)) then // V3.6 uniquement
begin
if ((chaineINT[1]=#$63) and (chaineINT[2]=#$14)) then // V3.6 uniquement
begin
// réception d'un CV. DocXpressNet p26 63 14 01 03 chk
delete(chaineInt,1,2);
delete(chaineInt,1,2);
cvLoc:=ord(chaineINT[1]);
//Affiche('Réception CV'+IntToSTR(cvLoc)+' à '+IntToSTR(ord(chaineINT[2])),clyellow);
if cvLoc>255 then Affiche('Erreur Recu CV>255',clRed)
else
begin
tablo_cv[cvLoc]:=ord(chaineINT[2]);
inc(N_Cv); // nombre de CV recus
@@ -6067,7 +6147,7 @@ begin
{$J-}
procedure connecte_USB;
begin
begin
// initialisation de la comm USB
if NumPort<>0 then
begin
@@ -6168,8 +6248,8 @@ begin
// lecture fichier de configuration config.cfg
lit_config;
// TCO
if avectco then
// TCO
if avectco then
begin
//créée la fenêtre TCO
FormTCO:=TformTCO.Create(Self);
@@ -6203,14 +6283,14 @@ begin
end
end;
end;
if portCommOuvert or parsocket then
With Formprinc do
begin
ButtonEcrCV.Enabled:=true;
LireunfichierdeCV1.enabled:=true;
ButtonLitCV.Enabled:=true;
end
end
else
With Formprinc do
begin
@@ -6226,6 +6306,7 @@ begin
for i:=1 to NbreFeux do
begin
cree_image(i); // et initialisation tableaux signaux
end;
Tempo_init:=10; // démarre les initialisation des signaux et des aiguillages dans 1 s
// initialisation de la chronologie des évènements détecteurs
@@ -6236,14 +6317,13 @@ begin
event_det_tick[i].detecteur[j]:=-1; // initialiser les détecteurs à -1
event_det_tick[i].traite:=false ; // non traité
end;
I_Simule:=0;
tick:=0;
N_Event_tick:=0 ; // dernier index
NombreImages:=0;
// énumération des ports USB
// énumération des ports USB
//EnumerateDevices;
//for i:=1 to NumLine do
@@ -6253,11 +6333,10 @@ begin
//essai
// event_det[1]:=527;
// event_det[2]:=520;
// N_event_det:=2;
//aiguillage[20].Position:=const_droit+1;
//aiguillage[12].Position:=const_droit+1;
//traceDet:=true;
// N_event_det:=2;
//aiguillage[20].Position:=const_droit+1;
//aiguillage[12].Position:=const_droit+1;
//traceDet:=true;
// calcul_zones;
//maj_feu(201);
// formdebug.Show;
@@ -6275,10 +6354,8 @@ begin
//i:=Aiguille_deviee(176);
//signal_direction(372);
//FormDebug.show;
//NivDebug:=3;
//NivDebug:=3;
//test_memoire_zones(218);
//Affiche(' Adj1='+intToStr(Adj1)+' Adj2='+intToStr(Adj2),clyellow);
//Det_Adj(520);
//Affiche(' Adj1='+intToStr(Adj1)+' Adj2='+intToStr(Adj2),clyellow);
//trace:=true;
@@ -6408,14 +6485,25 @@ begin
TpsRecuCom:=6;
end;
if (not(Maj_feux_cours) and (Tempo_chgt_feux=1)) then Maj_feux(); // mise à jour des feux sur chgt aiguillage
if (not(Maj_feux_cours) and (Tempo_chgt_feux=1)) then Maj_feux(); // mise à jour des feux sur chgt aiguillage
if (not(Maj_feux_cours) and (Tempo_chgt_feux>0)) then dec(Tempo_chgt_feux);
//simulation
if index_simule<>0 then
begin
if index_simule<>0 then
begin
if not(MsgSim) then begin Affiche('Simulation en cours ',Cyan);MsgSim:=true;end;
while tick=Tablo_simule[i_simule+1].tick do
begin
inc(I_simule);
// evt détecteur ?
if Tablo_simule[i_simule].detecteur<>0 then
begin
Affiche('Simulation tick='+IntToSTR(tick)+' det='+intToSTR(Tablo_simule[i_simule].detecteur)+'='+IntToSTR(Tablo_simule[i_simule].etat),Cyan);
Event_Detecteur(Tablo_simule[i_simule].detecteur, Tablo_simule[i_simule].etat=1); // créer évt détecteur
end;
// evt aiguillage ?
if Tablo_simule[i_simule].aiguillage<>0 then
begin
Affiche('Simulation tick='+IntToSTR(tick)+' aig='+intToSTR(Tablo_simule[i_simule].aiguillage)+'='+IntToSTR(Tablo_simule[i_simule].etat),Cyan);
@@ -6441,7 +6529,19 @@ procedure TFormPrinc.ButtonCommandeClick(Sender: TObject);
s:=checksum(s);
envoi(s);
end;
// bouton de commande d'un accessoire
procedure TFormPrinc.ButtonCommandeClick(Sender: TObject);
var adr,valeur,erreur : integer;
begin
val(EditAdresse.text,adr,erreur);
if (erreur<>0) or (adr<1) or (adr>2048) then
begin
EditAdresse.text:='1';
exit;
end;
val(EditVal.Text,valeur,erreur);
if (erreur<>0) or (valeur<0) or (valeur>255) then
begin
EditVal.text:='1';
@@ -6595,7 +6695,6 @@ begin
Hors_tension2:=false;
end;
end;
procedure TFormPrinc.MenuDeconnecterEthernetClick(Sender: TObject);
begin
@@ -6603,8 +6702,6 @@ begin
end;
function cde_cdm(s : string) : string;
var i : integer;
begin
var i : integer;
begin
i:=length(s)-1;
@@ -6626,16 +6723,23 @@ begin
s:='Dét '+intToSTR(Adresse_detecteur[j])+'=';
if Detecteur[adresse_detecteur[j]] then s:=s+'1' else s:=s+'0';
s:=s+' Mem=';
if Mem[adresse_detecteur[j]] then s:=s+'1' else s:=s+'0';
if Mem[adresse_detecteur[j]] then s:=s+'1' else s:=s+'0';
Affiche(s,clYellow);
end;
end;
procedure TFormPrinc.Etatdesaiguillages1Click(Sender: TObject);
var i : integer;
var i,j,model : integer;
s : string;
begin
Affiche('les positions des aiguillages BIS sont les mêmes que leurs homologues non bis',Cyan);
for i:=1 to MaxAcc do
begin
model:=aiguillage[i].modele ;
if model<>0 then
begin
s:='Aiguillage '+IntToSTR(i)+' : '+intToSTR(aiguillage[i].position);
if aiguillage[i].position=1 then s:=s+' (dévié)' else s:=s+' (droit)';
if model=4 then
begin
j:=aiguillage[i].AdrTriple;
@@ -6696,8 +6800,8 @@ begin
end;
procedure TFormPrinc.ClientSocketLenzConnect(Sender: TObject;Socket: TCustomWinSocket);
begin
begin
Affiche('Lenz connecté ',clYellow);
AfficheDebug('Lenz connecté ',clYellow);
parSocket:=True;
@@ -6717,7 +6821,7 @@ end;
parSocketCDM:=True;
MenuConnecterUSB.enabled:=false;
DeConnecterUSB.enabled:=false;
ConnecterCDMRail.enabled:=false;
ConnecterCDMRail.enabled:=false;
end;
@@ -6756,14 +6860,50 @@ begin
if i+5-j>0 then begin Delete(recuCDM,j,i+5-j) ;end else
begin
Affiche('Erreur 95',clred);
Affiche('j='+IntToSTR(j)+' i='+intToSTR(i),clred);
Nbre_recu_cdm:=0;
Affiche(recuCDM,clred);
exit;
end;
val(ss,etat,erreur);
// Affiche('Aiguillage CDM'+intToSTR(adr)+'='+IntToStr(etat),clLime);
// conversion en position :
// CDM: 0=droit 1=droite 3=gauche
// logiciel : 1=dévié 2=droit
// aiguillage normal
if aiguillage[adr].modele=1 then
begin
if etat=0 then etatAig:=2 else etatAig:=1;
aiguillage[adr].position:=etatAig;
aiguillageB[adr].position:=etatAig;
Event_Aig(adr,etatAig);
end;
// TJD TJS
if (aiguillage[adr].modele=2) or (aiguillage[adr].modele=3) then
begin
adr2:=aiguillage[adr].Apointe; // 2eme adresse de la TJD
case etat of
1 : begin etatAig:=1;EtatAig2:=2;end;
4 : begin etatAig:=1;EtatAig2:=1;end;
5 : begin etatAig:=2;EtatAig2:=1;end;
0 : begin etatAig:=2;EtatAig2:=2;end;
end;
aiguillage[adr].position:=etatAig;aiguillage[adr2].position:=etatAig2;
Event_Aig(adr,etatAig);
Event_Aig(adr2,etatAig2);
end;
if aiguillage[adr].modele=4 then // aiguillage triple
begin
// état de l'aiguillage 1
if (etat=0) or (etat=2) then etatAig:=2;
if etat=3 then etatAig:=1;
aiguillage[adr].Position:=etatAig;
// état de l'aiguillage 2
adr2:=aiguillage[adr].AdrTriple;
if (etat=0) or (etat=3) then etatAig2:=2;
Nbre_recu_cdm:=0;
Affiche(recuCDM,clred);
exit;
end;
val(ss,etat,erreur);
if etat=2 then etatAig2:=1;
// conversion en position : 1=dévié (CDM envoie 2 ou 1) 2=droit (CDM envoie 0)
aiguillage[adr2].Position:=etatAig2;
Event_Aig(adr,etatAig);
Event_Aig(adr2,etatAig2);
end;
@@ -6874,7 +7014,7 @@ 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(' changement dynamique des feux en cliquant sur son image',clLime);
Affiche('Version 1.11 : compatibilité pour la rétrosignalisation non XpressNet (intellibox)',clLime);
Affiche('Version 1.11 : compatibilité pour la rétrosignalisation non XpressNet (intellibox)',clLime);
Affiche(' verrouillages routes pour trains consécutifs',clLime);
Affiche('Version 1.2 : Renforcement de l''algorithme de suivi des trains',clLime);
Affiche('Version 1.3 : Décodeur Unisemaf fonctionnel - Lecture/écriture des CV',clLime);
@@ -6886,25 +7026,29 @@ end;
procedure TFormPrinc.ClientSocketLenzDisconnect(Sender: TObject;
Socket: TCustomWinSocket);
begin
parSocket:=False;
parSocket:=False;
end;
var i,j,etat : integer;
s : string;
procedure TFormPrinc.ChronoDetectClick(Sender: TObject);
var i,j,etat : integer;
s : string;
begin
for i:=1 to N_Event_tick do
begin
trouve:=false;
for j:=1 to 1100 do
for j:=1 to 1100 do
begin
etat:=event_det_tick[i].detecteur[j];
if etat<>-1 then
etat:=event_det_tick[i].detecteur[j];
if etat<>-1 then
begin
//s:=s+' Train n°'+intTostr(event_det_tick[i].Train);
s:=IntToSTR(i)+' Tick='+IntToSTR(event_det_tick[i].tick);
s:=s+' Det='+IntToSTR(j)+'='+intToSTR(etat);
s:=s+' Det suiv='+intTostr(event_det_tick[i].suivant);
Affiche(s,clyellow);
end;
end;
etat:=event_det_tick[i].aiguillage;
if etat<>-1 then
begin
s:=IntToSTR(i)+' Tick='+IntToSTR(event_det_tick[i].tick);
@@ -6922,8 +7066,19 @@ var adr,valeur,erreur : integer;
//TraceListe:=true;
end;
procedure TFormPrinc.ButtonEcrCVClick(Sender: TObject);
var adr,valeur,erreur : integer;
s : string;
begin
// doc XpressNet page 55
val(EditAdresse.text,adr,erreur);
if (erreur<>0) or (Adr>255) or (Adr<0) then
var adr,valeur,erreur : integer;
begin
EditAdresse.Text:='1';
exit;
end;
val(EditVal.Text,valeur,erreur);
if (erreur<>0) or (valeur<0) or (valeur>255) then
begin
EditAdresse.text:='1';
@@ -6996,7 +7151,7 @@ begin
end;
end;
procedure TFormPrinc.LireunfichierdeCV1Click(Sender: TObject);
begin
Lire_fichier_CV;
@@ -7005,66 +7160,56 @@ begin
procedure TFormPrinc.ButtonLitCVClick(Sender: TObject);
var s,sa: string;
fte : textfile;
i,cv,valeur,erreur : integer;
i,cv,valeur,erreur : integer;
begin
s:=GetCurrentDir;
//s:='C:\Program Files (x86)\Borland\Delphi7\Projects\Signaux_complexes_GL';
N_Cv:=0; // nombre de CV recus à 0
s:=GetCurrentDir;
//s:='C:\Program Files (x86)\Borland\Delphi7\Projects\Signaux_complexes_GL';
N_Cv:=0; // nombre de CV recus à 0
sa:='';
//for cv:=1 to 255 do
begin
cv:=3;
trace:=true;
sa:='';
Affiche('Lecture CV',clyellow);
val(EditAdresse.Text,cv,erreur);
if (erreur<>0) or (cv>255) or (cv<0) then
s:=#$22+#$18+Char(cv); //CV de 1 à 255 + 1024 (V3.6)
s:=checksum(s);
// envoi(s); // envoi de la trame et attente Ack, la premiere trame fait passer la centrale en mode programmation (service)
envoi_ss_ack(s);
Tempo(1);
begin
s:=#$21+#$10+Char(cv); // demande d'envoi du résultat du mode service
s:=checksum(s);
//envoi(s);
envoi_ss_ack(s);
Tempo(1);
// attente de la réponse de la centrale
tablo_CV[cv]:=0;
i:=0;
repeat
Tempo(2); // attend 200 ms
inc(i);
// N_cv:=cv;
until (N_cv=cv) or (i>4);
if (i>4) then
begin
Affiche('Erreur attente trop longue CV',clred);
exit;
end;
//tablo_cv[cv]:=123;
sa:=sa+'Cv'+IntToSTR(cv)+'='+IntToSTR(Tablo_cv[cv])+' ';
EditAdresse.Text:='1';
exit;
end;
//trace:=true;
begin
s:=#$22+#$15+Char(cv); //CV de 1 à 256 (V3.0)
//s:=#$22+#$18+Char(cv); //CV de 1 à 255 + 1024 (V3.6)
s:=checksum(s);
// envoi de la trame : fait passer la centrale en mode programmation (service)
envoi_ss_ack(s);
// attendre la trame 01 04 05 (env 1s)
succes:=false;i:=0;
repeat
Application.processMessages;
end;
end;
Affiche(sa,clyellow);sa:='';
with FormPrinc.SaveDialog do
begin
Sleep(100);
inc(i);
until succes or (i>20);
if succes then
begin
recu_cv:=false;
//Affiche('reçu trame succes',clyellow);
s:=#$21+#$10; // demande d'envoi du résultat du mode service
s:=checksum(s);
//envoi(s);
envoi_ss_ack(s);
Tempo(1);
// attente de la réponse de la centrale
i:=0;
title:='Ecrire un nom de fichier dans lequel sauvegarder les CV';
DefaultExt:='txt';
Filter:='Fichiers texte (*.txt)|*.txt|Tous fichiers (*.*)|*.*';
if Execute then
begin
s:=FileName;
assignFile(fte,s);
rewrite(fte);
Writeln(fte,'cv valeur');
repeat
Tempo(2); // attend 200 ms
inc(i);
begin
until recu_cv or (i>4);
if (i>4) then
begin
Affiche('Erreur attente trop longue CV',clred);
exit;
end;
sa:=sa+'Cv'+IntToSTR(cv)+'='+IntToSTR(Tablo_cv[cv])+' ';
Affiche(sa,clyellow);sa:='';
@@ -7073,25 +7218,6 @@ begin
Affiche('Pas de réponse de l''interface',clOrange);
end;
procedure TFormPrinc.Quitter1Click(Sender: TObject);
begin
close;
end;
procedure TFormPrinc.Button1Click(Sender: TObject);
var s : string;
begin
s:=EditGenli.text; //+#13+#10+#10;
terminal:=true;
if portCommOuvert then
begin
Affiche('Envoi a genli de '+ EditGenli.text,clorange);
envoi_ss_ack(s);
end;
end;
procedure TFormPrinc.Button2Click(Sender: TObject);
procedure TFormPrinc.Quitter1Click(Sender: TObject);
begin
@@ -7100,5 +7226,7 @@ begin
procedure TFormPrinc.ConfigClick(Sender: TObject);
begin
Tformconfig.create(self);
formconfig.showmodal;
formconfig.close;
end;