Hallo Easy,
ich bin vielleicht jetzt ein dreiviertel Jahr beim MBS. Deshalb kenne ich mich noch nicht hundertprozentig aus und entdecke immer wiedere neues. Da Programmieren meine Leidenschaft seit Jahrzenten ist, versuche ich meine Steuerung im MBS jetzt durch Lua-Scripte einzurichten. Damit du verstehst was ich mir darunter vorstelle, kopiere ich die beiden einzigen Ereignisse, die es für die Steurung von Straßenverkehr in meiner Vorstellung geben soll, die reagieren, wenn ein Kontakt betreten wird.
Ereignis 1:
Es reagiert nur wenn der Kontakt teil einer in einer Liste definierten Route ist.
-- Initialisierungskontakt - Initialization contact?
if string.sub(contact.name, 7, 7) == "I" then
if HasVehicleRoute(vehicle, contact) == false then return end
end
print("Weiter")
-- Zielkontakt - Destination contact?
if vehicle.variables["Contact"] ~= contact then return end
-- Dieser Kontakt ist der Zielkontakt - This contact is the target
-- Fahrtunterbrechung ohne Richtungswechsel - Driving break without direction change
if string.sub(contact.name, 7, 7) == "B" then
vehicle.engine.active = false
-- Weiterfahrt nach Wartezeit - Route to be continued after waiting time
$("BreakEnd"):invoke(contact, vehicle)
return
end
if string.sub(contact.name,7, 7) == "P" then
-- Fahrzeug wird geparkt, Richtungswechsel - Vehicle will be parked, drive direction change
vehicle.engine.active = false
vehicle.drivingDirection = -vehicle.drivingDirection
vehicle.target = GetNewDestination(vehicle)
-- Weiterfahrt nach Wartezeit - Route to be continued after waiting time
$("ParkingSlotExit"):invoke(contact, vehicle)
return
end
-- Richtungswechsel - Direction change
if string.sub(contact.name, 7, 7) == "R" then
vehicle.engine.active = false
vehicle.drivingDirection = -vehicle.drivingDirection
vehicle.target = GetNewDestination(vehicle)
$("DirectionChange"):invoke(contact, vehicle)
return
end
vehicle.target = GetNewDestination(vehicle)
Ereignis 2:
Es reagiert immer, wenn der Kontakt mit dem Schlagwort ServiceContact betreten wird.
-- 3-Ampel Steurung
if string.sub(contact.name, 7, 7) == "3" then
-- Fußgängerampeln auf rot - Switch pedestrian light to red
ThreePedLightRed(string.sub(contact.name, 9, 15))
$("ThreeTrafficLightSwitching"):invoke(string.sub(contact.name, 9, 18))
end
-- Ampel für gerade aus Verkehr schalten - Set traffic light for ahead traffic
if string.sub(contact.name, 7, 7) == "A" then
-- Fußgängerampeln auf rot - Switch pedestrian light to red
AheadTrafficPedLightRed(string.sub(contact.name, 9, 15))
$("AheadTrafficLightSwitching"):invoke(string.sub(contact.name, 9, 18))
end
-- "C" Zusammenstoß verhindern - "C" collision prevention
if string.sub(contact.name, 7, 7) == "C" then
local n = tonumber(string.sub(contact.name, 8, 9))
if $("Ereignisse").variables["ExitBlocked"][n] == nil then $("Ereignisse").variables["ExitBlocked"][n] = 0 end
$("Ereignisse").variables["ExitBlocked"][n] = $("Ereignisse").variables["ExitBlocked"][n] + 1
-- Kann gelöscht oder auskommentiert werden - Comment out or delete
$("DelayForCollisionPrevention"):invoke(n, tonumber(string.sub(contact.name, 11, 12)))
return
end
-- Zeit zwischen zwei Fahrzeugen messen und Geschwindigkeit für das zweite Fahrzeug einstellen
-- Get the time between two vehicles passing the contact and set speed for the second vehicle
if string.sub(contact.name, 7, 7) == "D" then
contact.variables["PreviousVehicle"] = contact.variables["CurrentVehicle"]
contact.variables["CurrentVehicle"] = Seconds
if contact.variables["CurrentVehicle"] - contact.variables["PreviousVehicle"] <= tonumber(string.sub(contact.name, 8, 9)) then
vehicle.currentSpeed = tonumber(string.sub(contact.name, 11, 12))
end
return
end
if string.sub(contact.name, 7, 7) == "H" then
local desVar = string.sub(contact.name, 12, 16)
local n = tonumber(string.sub(contact.name, 18, 19))
if $("Ereignisse").variables[desVar][n] > 0 then
vehicle.engine.active = false
$("Ereignisse").variables[desVar][n + 1] = $("Ereignisse").variables[desVar][n + 1] + 1
$("WaitForRouteContinue"):invoke(tonumber(string.sub(contact.name, 8, 10)), desVar, n, vehicle)
end
end
-- Geschwindigkeit setzen - Set speed
if string.sub(contact.name, 7, 7) == "S" then
vehicle.currentSpeed = tonumber(string.sub(contact.name, 8, 10))
end
-- Ampel für gerade aus Verkehr schalten - set traffic light for ahead traffic
if string.sub(contact.name, 7, 7) == "T" then
-- Fußgängerampeln auf rot - Switch pedestrian light to red
TurnTrafficPedLightRed(string.sub(contact.name, 9, 15))
$("TurnTrafficLightSwitching"):invoke(string.sub(contact.name, 9, 18))
end
if string.sub(contact.name, 7, 7) == "W" then
print("W")
local desVar = string.sub(contact.name, 11, 15)
print(desVar)
local n = tonumber(string.sub(contact.name, 17, 18))
$("Ereignisse").variables[desVar][n] = $("Ereignisse").variables[desVar][n] + 1
$("TF-Vorfahrt").text = $("Ereignisse").variables[desVar][n]
$("HaltNoRightOfWay"):invoke(tonumber(string.sub(contact.name, 8, 9)), desVar, n)
end
if string.sub(contact.name, 7, 7) == "U" then
n = tonumber(string.sub(contact.name, 8, 9))
if $("Ereignisse").variables["ExitBlocked"][n] > 0 then $("Ereignisse").variables["ExitBlocked"][n] = $("Ereignisse").variables["ExitBlocked"][n] - 1 end
end
Meine Vorstellung ist einen möglichst generischen Programmcode zu haben und über die Label der Kontakte festzulegen, was geschehen soll. Im Moment arbeite ich noch an einer Ampelsteurung. Das ist der komplizierteste Teil. Wenn ich damit fertig bin denke ich daran mein Projekt vorzustellen. Später möchte ich dann alles natürlich in einer Anlage einbauen. Ich wollte mit den Codeschnippseln nur meinen Lösungsansatz deutlich machen. Zum Verständnis, was da passiert braucht es vermutlich zusätzliche Erklärungen. Ich muss auc für michalles noch aufschreiben.
Viele Grüße
wkh