I found a workaround to the problem. First, I define a macro with the set of coordinates of interest for the diagram. Then I created a macro that puts an invisible circle in a given point \limitCirc. This circle is then intersected with the line that has a "bump" and creates a coordinate \limitInter. Finally, I use this coordinate to create the line and I make use of the macro \railWEend and \railNSend created by @Qrrbrbirlbel. For the signals, I used tikz-timing package to create the "wave".
Here is the output of one of the scenarios:

MWE:
\documentclass{article}
\usepackage{tikz}
% ===================================
\usepackage[active,tightpage]{preview}
\PreviewEnvironment{tikzpicture}
\setlength\PreviewBorder{5pt}%
% ===================================
\usepackage{tikz-timing}
\begin{document}
\usetikzlibrary{shapes,arrows,decorations.pathreplacing,backgrounds,positioning}
\tikzstyle{rail}=[ultra thick]
\tikzstyle{movement}=[green!50!black,line width=2.5\pgflinewidth]
\tikzstyle{ttx}=[rectangle,draw,fill=green!30, minimum width=1cm, minimum height=0.6cm]
\tikzstyle{ter}=[rectangle,draw,fill=blue!30,minimum width=1cm, minimum height=0.6cm]
\newcommand{\feu}[1]{
node[inner sep=2pt,rectangle,rounded corners,draw,fill=white,thin]%
{\tikz \draw[fill=#1] circle (4pt);}
};
\newcommand{\feua}[1]{
\draw[semithick] (#1)--++(0,0.5)--++(0.7,0)\feu{red};
};
\newcommand{\sensa}[1]{
\draw[semithick] (#1)--++(0,-0.5)\feu{green}--++(-0.7,0)%
node[inner sep=2pt,rectangle,rounded corners,draw,fill=white,thin]%
{\tikz \timing[timing/slope=0.5,thick] {HlL};};
}
\newcommand*{\railWEend}{+ (-.3,0) -- + (.3,0) + (0,0)}
\newcommand*{\railNSend}{+ (0,.3) -- + (0,-.3) + (0,0)}
\newcommand{\zonetwo}{
\draw (12.5,4.2)\railWEend--++(-0.45,1)--++(-0.5,0)
node[draw,anchor=east,thin] {Zone 2};
}
\newcommand{\zonethree}{
\draw (7.5,-0.2)\railWEend--++(0.45,-1.3)--++(0.5,0)
node[draw,anchor=west,thin] {Zone 3};
}
\newcommand{\protectedzone}{
\draw [decoration=brace,decorate,thick,yshift=-5mm] (9.5,4) -- (3.5,4) node [pos=.42,below=1mm] {\textbf{Protected zone} $\approx 10km$};
}
\newcommand{\maintenancezone}{
\draw [decoration=brace,decorate,thick,yshift=5mm] (2.35,0) -- (10.65,0) node [pos=.7,above=1mm] {\textbf{Maintenance zone} $\approx 10km$};
}
\newcommand{\limitCirc}[1]{\node[circle,minimum width=0.5cm] (l#1) at (#1) {};}
\newcommand{\limitInter}[2]{ %
\limitCirc{#1}
\limitCirc{#2}
\coordinate(i#1) at (intersection 1 of l#1 and #1--#2);
\coordinate(i#2) at (intersection 1 of l#2 and #2--#1);
}
\newcommand{\coordinates}{
\coordinate (10) at (0,4);
\coordinate (1a) at (3.5,4);
\coordinate (1b) at (4.5,4);
\coordinate (1c) at (9.5,4);
\coordinate (1d) at (14,4);
\coordinate (1e) at (13.5,4);
\coordinate (20) at (0,0);
\coordinate (2a) at (2,0);
\coordinate (2b) at (6,0);
\coordinate (2c) at (11,0);
\coordinate (2d) at (13,0);
\coordinate (2e) at (12,0);
\node[anchor=west,draw] (head2) at (2d) {Head 2};
\draw [->,thick](14.5,-0.5) -- (13,-0.5);
\node[anchor=east,draw] (head1) at (10) {Head 1};
\draw [->,thick](-1.5,4.5) -- (0,4.5);
}
% ============= scenario 5 ================
\begin{tikzpicture}
\coordinates\zonetwo\zonethree\protectedzone
\sensa{11.8,0}
\feua{2.25,4}
\limitInter{2a}{1a}
\draw[rail] (i1a)\railWEend -- (2a) -- (20);
\limitInter{2a}{2b}
\draw[rail] (i2a)\railNSend -- (i2b)\railNSend;
\limitInter{1c}{2c}
\draw[rail] (1c) -- (2c)--(head2);
\limitInter{1e}{2e}
\draw[rail] (i1e)\railWEend -- (i2e)\railWEend;
\limitInter{1b}{2b}
\limitInter{2b}{2c}
\draw[rail] (i1b)\railWEend -- (2b) -- (i2c)\railNSend;
\draw[rail] (1c) -- (1d);
\node[ttx] (ttx2) at (1.5,4) {TTX2};
\node[ter,rotate=-70] (ter1) at (10.2,2) {TER};
\node[star,star points=10, star point ratio=2.25,fill=yellow,draw] (acci) at (7.5,4) {};
\draw[rail] (ttx2)--(head1);
\draw [-triangle 45,movement] (ttx2) -- (acci);
\draw [-triangle 45,movement,blue] (ter1) -- (1c)--(acci);
\end{tikzpicture}
\end{document}