1
1
@name OpenControl/Locomotive-Westinghouse-Airbrakes
2
2
@inputs Locomotive:entity BPAngleCockFRONT BPAngleCockREAR MU2A [AirMU_FrontIN AirMU_RearIN LOCOMOTIVE_PROCESSOR CONTROL_STAND_DATA CONFIGURATION_DATA ENGINE_SOUND_DATA]:array
3
- @outputs [AirMU_FrontOUT AirMU_RearOUT LOCOMOTIVE_AIRBRAKE_DATA]:array MainReservoir EqualizingReservoir BrakePipe BrakeCylinder AutomaticAFM IndependentAFM Compressor AirSpit AirMU BP_Open
3
+ @outputs [AirMU_FrontOUT AirMU_RearOUT LOCOMOTIVE_AIRBRAKE_DATA]:array MainReservoir EqualizingReservoir BrakePipe BrakeCylinder AutomaticAFM IndependentAFM Compressor AirSpit AirMU BP_Open IsLastLocomotive
4
4
@persist [E O W]:entity [SmoothTable]:table
5
5
@persist Compressor MainCharging MainCharged TopUpMainRes Interval Compressor_CFM MainReservoirVolume BrakePipingVolume LocomotiveBrakePipeLocalVolume CompressorTime PauseCOMP_EQing Equalized EqualizedHalfandHalf
6
6
@persist Discharging_EQ Discharging_BC EqualizedBC IndAFM IndAFMCapture IndAFMCapture2 AutoAFM AutoAFMCapture AutoAFMCapture2 IndependentAFM_Local AutomaticAFM_Local IndNotch BrakePipeLocalCutin TrainLine
7
7
@persist TotalBPVol BrakePipeLocalVol TrainlineEQ TLBP_Equal ERBP_Equal ERBP_EqualLOCKED BrakePipeLocal BrakePipe CompRefill BrakeLinePumpLoss MRCO EQCO TLCO TLDropToZero AirMU
8
8
@persist COMPEngineOn AirSpit IsLead BrakePipeAnglecock BP_Open NumRes NominalFlowPHYS AutoPressureSet TELocal LastCarCount HoldatZero FeedPressure MainResFeedPressure MainResRechargePressure
9
- @persist BPAC_AirMU
9
+ @persist BPAC_AirMU IsLastLocomotive BPAC_AirMU_Front BPAC_AirMU_Rear LocomotivePOS NextLocomotive
10
10
@trigger none
11
11
@model
12
12
13
-
14
13
if(dupefinished() | duped()){ reset() }
15
14
if(first()){
16
15
@@ -30,9 +29,9 @@ if(first()){
30
29
NumRes = 2.5
31
30
NominalFlowPHYS = 0.865
32
31
33
- MainReservoir = 140
34
- EqualizingReservoir = 90
35
- BrakePipeLocal = 90
32
+ MainReservoir = 0
33
+ EqualizingReservoir = 0
34
+ BrakePipeLocal = 0
36
35
BrakeCylinder = 65
37
36
38
37
FeedPressure = CONFIGURATION_DATA[53,number]
@@ -118,6 +117,63 @@ if(BPAngleCockREAR == 0 & BPAngleCockFRONT == 0){
118
117
}
119
118
120
119
120
+ if(!IsLead){
121
+ if((AirMU_FrontIN[7,number] > 0) | (AirMU_RearIN[7,number] > 0)){
122
+ LocomotivePOS = (AirMU_FrontIN[7,number]-1)
123
+ LocomotivePOS = (AirMU_RearIN[7,number]-1)
124
+ }
125
+ }
126
+ else{
127
+ LocomotivePOS = 74
128
+ }
129
+
130
+ IsLastLocomotive = (!IsLead & !(AirMU_FrontIN[1,string] == "opencontrol" & AirMU_RearIN[1,string] == "opencontrol")) ? 1 : 0
131
+
132
+ if(!IsLead){
133
+ if(IsLastLocomotive){
134
+ if(AirMU_FrontIN[7,number] > AirMU_RearIN[7,number]){
135
+ NextLocomotive = AirMU_FrontIN[7,number]
136
+ BPAC_AirMU_Front = BPAC_AirMU
137
+ }
138
+ else{
139
+ NextLocomotive = AirMU_RearIN[7,number]
140
+ BPAC_AirMU_Rear = BPAC_AirMU
141
+ }
142
+ }
143
+ else{
144
+ if(AirMU_FrontIN[7,number] > AirMU_RearIN[7,number]){
145
+ NextLocomotive = AirMU_FrontIN[7,number]
146
+ if(changed(AirMU_RearIN[6,number])){
147
+ BPAC_AirMU_Front = AirMU_RearIN[6,number]
148
+ BPAC_AirMU_Output = AirMU_RearIN[6,number]
149
+ BPAC_AirMU = AirMU_RearIN[6,number]
150
+ }
151
+ }
152
+ else{
153
+ NextLocomotive = AirMU_RearIN[7,number]
154
+ if(changed(AirMU_FrontIN[6,number])){
155
+ BPAC_AirMU_Rear = AirMU_FrontIN[6,number]
156
+ BPAC_AirMU_Output = AirMU_FrontIN[6,number]
157
+ BPAC_AirMU = AirMU_FrontIN[6,number]
158
+ }
159
+ }
160
+
161
+ }
162
+ }
163
+ else{
164
+ if(AirMU_FrontIN[1,string] == "opencontrol"){
165
+ BPAC_AirMU_Front = AirMU_FrontIN[6,number]
166
+ BPAC_AirMU_Output = AirMU_FrontIN[6,number]
167
+ BPAC_AirMU = AirMU_FrontIN[6,number]
168
+ }
169
+ elseif(AirMU_RearIN[1,string] == "opencontrol"){
170
+ BPAC_AirMU_Rear = AirMU_RearIN[6,number]
171
+ BPAC_AirMU_Output = AirMU_RearIN[6,number]
172
+ BPAC_AirMU = AirMU_RearIN[6,number]
173
+ }
174
+ }
175
+
176
+
121
177
CarCount = LOCOMOTIVE_PROCESSOR[1,number]
122
178
123
179
if(changed((ENGINE_SOUND_DATA[7,number] | ENGINE_SOUND_DATA[8,number]) == 1)&(ENGINE_SOUND_DATA[7,number] | ENGINE_SOUND_DATA[8,number]) == 1){
@@ -208,7 +264,7 @@ if(AirMU_FrontIN[1,string] == "opencontrol" | AirMU_RearIN[1,string] == "opencon
208
264
elseif(CONTROL_STAND_DATA[28,number] == 1 & MU2A == 0){ #MU2A - Lead
209
265
IsLead = 1
210
266
IndependantMU = BrakeCylinder
211
- PressureSetMU = CONTROL_STAND_DATA[3 ,number]
267
+ PressureSetMU = CONTROL_STAND_DATA[4 ,number]
212
268
MainResMU = MainReservoir
213
269
AirMU = 0
214
270
AutoPressureSet = CONTROL_STAND_DATA[4,number]
@@ -218,15 +274,15 @@ else{
218
274
if(CONTROL_STAND_DATA[28,number]){
219
275
IsLead = 1
220
276
IndependantMU = BrakeCylinder
221
- PressureSetMU = CONTROL_STAND_DATA[3 ,number]
277
+ PressureSetMU = CONTROL_STAND_DATA[4 ,number]
222
278
MainResMU = MainReservoir
223
279
AirMU = 0
224
280
AutoPressureSet = CONTROL_STAND_DATA[4,number]
225
281
}
226
282
}
227
283
228
- AirMU_FrontOUT = array("opencontrol",IndependantMU,PressureSetMU,MainResMU,IsLead)
229
- AirMU_RearOUT = array("opencontrol",IndependantMU,PressureSetMU,MainResMU,IsLead)
284
+ AirMU_FrontOUT = array("opencontrol",IndependantMU,PressureSetMU,MainResMU,IsLead,BPAC_AirMU_Front,LocomotivePOS )
285
+ AirMU_RearOUT = array("opencontrol",IndependantMU,PressureSetMU,MainResMU,IsLead,BPAC_AirMU_Rear,LocomotivePOS )
230
286
231
287
if(COMPEngineOn){
232
288
if(Compressor){
@@ -253,7 +309,6 @@ if(COMPEngineOn){
253
309
elseif(round(MainReservoir) == round(EqualizingReservoir)){
254
310
local SplitRate = (CompressorTime/NumRes)
255
311
EqualizingReservoir = EqualizingReservoir
256
- MainReservoir = MainReservoir
257
312
}
258
313
}
259
314
@@ -275,10 +330,6 @@ if(COMPEngineOn){
275
330
}
276
331
}
277
332
278
- #[
279
- CONTROL_STAND_DATA = array(IncreaseTrainBrake,DecreaseTrainBrake,BrakeNotch,AutomaticPressureSet,Suppression,Emergency,BrakeCutout,IncreaseLocoBrake,DecreaseLocoBrake,Independent_Bail,EmergencyBrake,
280
- DynamicNotch,DynamicsSetup,DynamicsPowerZone,DynamicUnlock,Reverser,ReverserRemoved,Notch,BatteryKnife,EngineRun,GenField,FuelPump,Control)
281
- ]#
282
333
if(HoldatZero == 0){
283
334
if(BrakePipeAnglecock == 1){
284
335
if(CarCount<2 & BPAC_AirMU){
@@ -357,9 +408,29 @@ if(COMPEngineOn){
357
408
elseif(round(BrakePipeLocal) > AutomaticPressureSet){
358
409
local FeedRate = (CompressorTime/NominalFlowPHYS)
359
410
BrakePipeLocal -= FeedRate
411
+ if(Compressor){
412
+ if(AirMU == 0){
413
+ if(MainReservoir<MainResFeedPressure){
414
+ MainReservoir += (CompressorTime/NumRes)
415
+ }
416
+ elseif(MainReservoir > MainResFeedPressure){
417
+ MainReservoir = MainResFeedPressure
418
+ }
419
+ }
420
+ }
360
421
}
361
422
elseif(round(BrakePipeLocal) == AutomaticPressureSet){
362
423
BrakePipeLocal = AutomaticPressureSet
424
+ if(Compressor){
425
+ if(AirMU == 0){
426
+ if(MainReservoir<MainResFeedPressure){
427
+ MainReservoir += (CompressorTime/NumRes)
428
+ }
429
+ elseif(MainReservoir > MainResFeedPressure){
430
+ MainReservoir = MainResFeedPressure
431
+ }
432
+ }
433
+ }
363
434
}
364
435
}
365
436
@@ -419,23 +490,6 @@ if(changed(CarCount)&CarCount){
419
490
LastCarCount = CarCount
420
491
}
421
492
422
- #[
423
- if(round(MainReservoir)<MainResFeedPressure & !MainCharged){
424
- Compressor = 1
425
- }
426
- elseif(round(MainReservoir) == MainResFeedPressure & !MainCharged){
427
- MainCharged = 1
428
- }
429
-
430
- if(round(MainReservoir)<MainResRechargePressure & MainCharged){
431
- Compressor = 1
432
- }
433
-
434
- if(round(MainReservoir) >= MainResFeedPressure){
435
- Compressor = 0
436
- }
437
- ]#
438
-
439
493
if(round(MainReservoir)<MainResRechargePressure){
440
494
Compressor = 1
441
495
}
@@ -490,8 +544,6 @@ BrakePipe = smooth((BrakePipeLocal),(15)+(CarCount*1),"brakepipe-smoothing",0)
490
544
IndependentAFM = smooth((IndependentAFM_Local*2),5,"IndAFMSmoothing",0)
491
545
AutomaticAFM = smooth((AutomaticAFM_Local*15),10,"AutoAFMSmoothing",0)
492
546
493
- #LOCOMOTIVE_CIRCUIT_DATA = array(CarCount,Load,MPH,TrainWeight,Braking_Loco,Braking_Train,V,E,O,W)
494
-
495
547
if(COMPEngineOn){
496
548
if(changed(Compressor)&Compressor){
497
549
Locomotive:soundPlay("aircompressor",0,CONFIGURATION_DATA[12,string])
@@ -544,3 +596,6 @@ if(AirMU == 0){
544
596
545
597
LOCOMOTIVE_AIRBRAKE_DATA = array(MainReservoir,EqualizingReservoir,BrakePipe,BrakeCylinder,AutomaticAFM,IndependentAFM,IndNotch,BrakePipeAnglecock,BrakePipeLocal,Compressor,BrakePipeAnglecock)
546
598
599
+ if(last()){
600
+ soundPurge()
601
+ }
0 commit comments