计算机联锁软件编制
1、 背景
由于计算机在逻辑功能和信息处理方面具有很强的功能,它非常适用于车站联锁。计算机联锁是用微型计算机和其他一些电子、继电器件以及各种计算机软件组成的具有故障-安全性能的实时监控系统。计算机联锁安全可靠,处理速度快,在安全性、可靠性、经济性等方面都具有独特的优点,而且在设计、施工、维修和使用方面大为方便。
一般来说,计算机联锁系统的软件应具有人机界面信息处理功能、联锁功能、自动检测与诊断功能等,本次项目的设计的重点主要是利用编程软件实现人机界面信息处理功能以及联锁功能。
2、 任务
(1) 联锁表的编制
联锁表应包括以下几项内容:方向栏、进路号码栏、进路栏、排列进路按下按钮栏、确定运行方向道栏、道岔栏、敌对信号栏、轨道区段栏、其他联锁栏。编写完成的联锁表在excel表格中进行展示。
(2) 静态站场界面绘制
根据车站信号平面布置图进行静态站场界面的绘制。要求站场中必须包括:
① 联锁区内的全部道岔、轨道电路、信号灯。
② 对集中道岔、股道、色灯信号机及道岔和无道岔轨道电路区段均需标出编号和名称。
③ 相应的进路始、终端按钮。
(3) 人机键鼠交互功能
实现键鼠交互功能,即可以完成按钮命令发送任务,从而使得计算机对于操作员的操作进行处理,形成有效的操作命令。该功能主要与进路排列、取消进路、人工解锁、引导信号等功能相结合体现,如以下几个方面:
① 实现菜单栏的显示(取消进路、人工解锁等)。
② 显示轨道区段和信号机的坐标位置。
(4) 进路排列
在静态站场界面按压进路始、终端按钮之后,可以实现进路排列功能。要求轨道区段以及信号灯作出相应的颜色变化。在进路排列之前,需要进行联锁条件检查,确保进路内的信号机、道岔和轨道电路处于安全状态,如是否存在敌对进路、道岔是否转换到相应的位置、轨道电路是否有车占用、敌对信号是否开放等都要考虑。
(5) 取消进路/人工解锁
对于取消进路,需要设置“总取消”按钮。而人工延时解锁则需要设置“总人解”按钮,在按下按钮后需要弹出输入密码的窗口,输入正确的密码才后,再单击要取消进路的“始端按钮”,才可以触发人工延时解锁。这两个过程中都需要体现轨道区段以及信号灯的变化。对于进路的解锁需要进行延时处理时,需要在界面中有所显示,如可以在界面上设置一个Text控件实现倒计时功能。
(6) 引导信号/引导总锁闭
需要设置“引导”按钮和“引导总锁闭”按钮,以及输入口令的窗口。类似于第五点任务,同样需要体现轨道区段以及信号灯的变化。
(7) 列车运行模拟
模拟列车在进路上行驶的过程,并显示轨道区段、信号灯、道岔的相应变化,包括:列车压入某进路时,防护该进路的信号机要由开放信号变为禁止灯光,进路内轨道区段被占用时有相应的占用显示,以及某轨道区段占用出清要符合“三点检查”要求。
(8) 故障设置
在故障设置部分,同学们可以自由发挥,设置相应的故障,如灯丝断丝故障、道岔转换故障等。故障设置合理即可。
3、 其他
(1) 项目过程参考:
(2) 对人工编写的联锁表进行数字化处理,用于计算机程序的联锁检查。
①道岔用“%ID#位置”来表示,如2道岔定位为“%202#1”。
②轨道区段用轨道区段的ID来表示,如“%303”而不用其属于轨道区段名称来描述。
③敌对信号用 ID 表示,如“%102”。
部分定义,供参考:
名称 含义 类型
ID 进路ID,唯一标识 Int型
Start 进路的始端信号机名称(或ID) CString型
End 进路的终端信号机名称(或ID) CString型
SwNum 进路涉及的道岔数量 Int型
SwLine 进路涉及的道岔位置信息 CString型
AntiSigNum 进路敌对信息的个数 Int型
AntiWayline 进路敌对信号的信号 CString型
SigColor 进路建立后信号开放颜色 Int型
BT_WayRoad 变通进路的标志 BOOL型
CJoint 进路涉及的超限绝缘标志 BOOL型
Long_D 进路长调车标志 BOOL型
Long_Num 长调车中短调车进路个数 Int型
LongDWay 短调车信息 CString型
FormTra 进路的接近区段ID Int型
RouteXZ 进路性质 Int型
4、 参考书籍
(1)《Visual C++程序》界面显示相关内容。
(2)《面向对象程序设计》相关内容。
(3)《数据结构》中链表的相关内容。
(4)杨扬,《车站信号自动控制》中进路及联锁表等相关
参考代码:
1. //读数据
2. if (file.Open(FileName, CFile::typeText | CFile::modeReadWrite), &e)
3. {
4. //初始化信号机数据
5. file.SeekToBegin();
6. CString str;
7. int idx;
8. for (int j = 0; j < SigNum; j++)
9. {
10. file.ReadString(str);
11. CString data[6];
12. for (int i = 0; i < 6; i++)
13. {
14. idx = str.Find(_T(" "), 0);
15. if (idx == -1)
16. {
17. data[i] = str;
18. }
19. else
20. {
21. data[i] = str.Left(idx);
22. }
23. str.Delete(0, idx + 1);
24. }
25. Sig[j].Sig_ID = data[0];
26. Sig[j].Sig_Type = _ttoi(data[1]);//1进站信号机,2出站信号机,34调车信号机(4斜向)
27. Sig[j].Sig_Dire = _ttoi(data[2]);
28. Sig[j].Sig_NF = _ttoi(data[3]);
29. Sig[j].Sig_Pos.x = _ttoi(data[4]);//x轴坐标
30. Sig[j].Sig_Pos.y = _ttoi(data[5]);//y轴坐标
31. Sig[j].error = false;
32. Sig[j].GreenError = false;
33. Sig[j].YellowError = false;
34.
35. if(Sig[j].Sig_Type == 1|| Sig[j].Sig_Type == 2)
36. Sig[j].Sig_State = 2;//进、出站信号机初始化为红灯
37. else if(Sig[j].Sig_Type == 3 || Sig[j].Sig_Type == 4)
38. Sig[j].Sig_State = 8;//调车信号机初始化蓝灯
39. }
40. file.Close();
41. }
42.
43. //初始化轨道电路
44. FileName = _T("data\\TrackData1.txt");
45. CStdioFile file2;
46. if (file2.Open(FileName, CFile::typeText | CFile::modeReadWrite), &e)
47. {
48. file2.SeekToBegin();
49. CString str;
50. int idx;
51. for (int j = 0; j < TraNum; j++)
52. {
53. file2.ReadString(str);
54. CString data[12];
55. for (int i = 0; i < 12; i++)
56. {
57. idx = str.Find(_T(" "), 0);
58. if (idx == -1)
59. {
60. data[i] = str;
61. }
62. else
63. {
64. data[i] = str.Left(idx);
65. }
66. str.Delete(0, idx + 1);
67. }
68. Tra[j].TraID = data[0];//编号
69. Tra[j].traStart.x = _ttoi(data[1]);//起点横坐标
70. Tra[j].traStart.y = _ttoi(data[3]);//起点纵坐标
71. Tra[j].traEnd.x = _ttoi(data[2]);//终点横坐标
72. Tra[j].traEnd.y = _ttoi(data[5]);//终点纵坐标
73. Tra[j].traType = _ttoi(data[4]);//类型,1干线,2无道岔区段,3单一道岔区段,4转折区段,5双道岔区段
74. Tra[j].cross_pos.x = _ttoi(data[6]);
75. Tra[j].cross_pos.y = _ttoi(data[7]);
76. Tra[j].cross_pos_2.x = _ttoi(data[8]);
77. Tra[j].cross_pos_2.y = _ttoi(data[9]);
78. Tra[j].m_pos.x = _ttoi(data[10]);
79. Tra[j].m_pos.y = _ttoi(data[11]);
80. Tra[j].traState = 0;
81. Tra[j].traCode = HU;
82. Tra[j].error = false;
83. Tra[j].lock = false;
84. Tra[j].lock1 = false;
85. Tra[j].lock2 = false;
86. Tra[j].Intrusion = false;
87. Tra[j].DefectiveShunting = false;
88. Tra[j].flag = false;
89. }
90.
91. file2.Close();
92. }
93.
94. //初始化道岔
95.
96. FileName = _T("data\\CrossingData1.txt");
97. CStdioFile file3;
98. if (file3.Open(FileName, CFile::typeText | CFile::modeReadWrite), &e)
99. {
100. file3.SeekToBegin();
101. CString str;
102. int idx;
103. for (int j = 0; j < CroNum; j++)
104. {
105. file3.ReadString(str);
106. CString data[10];
107. for (int i = 0; i < 10; i++)
108. {
109. idx = str.Find(_T(" "), 0);
110. if (idx == -1)
111. {
112. data[i] = str;
113. }
114. else
115. {
116. data[i] = str.Left(idx);
117. }
118. str.Delete(0, idx + 1);
119. }
120. Cro[j].Cro_Id = _ttoi(data[0]);
121. Cro[j].Cro_Pos.x = _ttoi(data[1]);
122. Cro[j].Cro_Pos.y = _ttoi(data[2]);
123. Cro[j].Cro_State = _ttoi(data[3]);
124. Cro[j].Cro_StateBegin = Cro[j].Cro_State;
125. Cro[j].Cro_type = _ttoi(data[4]);
126. Cro[j].Cro_Pos_2.x = _ttoi(data[5]);
127. Cro[j].Cro_Pos_2.y = _ttoi(data[6]);
128. Cro[j].direct = _ttoi(data[7]);
129. Cro[j].corner.x = _ttoi(data[8]);
130. Cro[j].corner.y = _ttoi(data[9]);
131. Cro[j].guzhang = 0;
132. Cro[j].suobi_D = 0;
133. }
134.
135. file3.Close();
136. }
137.
138. //联锁表信号机初始化
139. FileName = _T("data\\LockSigData.txt");
140. CStdioFile file4;
141. if (file4.Open(FileName, CFile::typeText | CFile::modeReadWrite), &e)
142. {
143. file4.SeekToBegin();
144. CString str;
145. int idx;
146. for (int j = 0; j < LockingNum; j++)
147. {
148. file4.ReadString(str);
149. CString data[3];
150. for (int i = 0; i < 3; i++)
151. {
152. idx = str.Find(_T(" "), 0);
153. if (idx == -1)
154. {
155. data[i] = str;
156. }
157. else
158. {
159. data[i] = str.Left(idx);
160. }
161. str.Delete(0, idx + 1);
162. }
163. Lock[j].StartSigID = data[0];
164. Lock[j].EndSigID = data[1];
165. Lock[j].Lock_SigState = _ttoi(data[2]);
166. }
167. file4.Close();
168. }
169.
170. FileName = _T("data\\InsulationData1.txt");
171. CStdioFile file8;
172. if (file8.Open(FileName, CFile::typeText | CFile::modeReadWrite), &e)
173. {
174. file8.SeekToBegin();
175. CString str;
176. int idx;
177. for (int j = 0; j < InsuNum; j++)
178. {
179. file8.ReadString(str);
180. CString data[3];
181. for (int i = 0; i < 3; i++)
182. {
183. idx = str.Find(_T(" "), 0);
184. if (idx == -1)
185. {
186. data[i] = str;
187. }
188. else
189. {
190. data[i] = str.Left(idx);
191. }
192. str.Delete(0, idx + 1);
193. }
194. Insu[j].I_type = _ttoi(data[0]);
195. Insu[j].I_pos.x = _ttoi(data[1]);
196. Insu[j].I_pos.y = _ttoi(data[2]);
197. }
198.
199. file8.Close();
200. }
201.
202.
203. //联锁表道岔初始化
204. FileName = _T("data\\LockCroData.txt");
205. CStdioFile file5;
206. if (file5.Open(FileName, CFile::typeText | CFile::modeReadWrite), &e)
207. {
208. file5.SeekToBegin();
209. CString str, data;
210. int idx, LockingCroNum, ndata;
211. //
212.
213. for (int j = 0; j < LockingNum; j++)
214. {
215. file5.ReadString(str);
216.
217. idx = str.Find(_T(" "), 0);
218. if (idx == -1)
219. {
220. data = str;
221. }
222. else
223. {
224. data = str.Left(idx);
225. }
226. str.Delete(0, idx + 1);
227.
228. LockingCroNum = _ttoi(data);
229. Lock[j].LockCroNum = LockingCroNum;
230.
231. for (int i = 0; i < 2 * LockingCroNum ; i++)
232. {
233. idx = str.Find(_T(" "), 0);
234. if (idx == -1)
235. {
236. data = str;
237. }
238. else
239. {
240. data = str.Left(idx);
241. }
242. str.Delete(0, idx + 1);
243. ndata = _ttoi(data);
244. if (i % 2 == 0)
245. {
246. Lock[j].Locking_Cro.push_back(ndata);//存需要检查的道岔
247. }
248. else
249. {
250. Lock[j].Locking_CroState.push_back(ndata);//存需要检查的道岔状态
251. }
252. }
253. }
254.
255. file5.Close();
256. }
全部代码见:https://download.csdn.net/download/weixin_44026026/77307309