При загрузке карты сценарный маркер передает сообщение для ЧС2 со служебной информацией, и в том числе со светофоров какого направления (четного или нечетного) обрабатывать "сигнал АЛСН".
альфа ЧС2-627 обрабатывает его так:
- Код: Выделить всё
EK_5_K517 = "vjlekm_'rn_17.01.27-2342" -- индикация модуля экт для команды К517 КЛУБа
------------------------------------------------------------
tMap = {
Type = 50,
Coordinate = "",
Station = "",
Display = "",
Integral = 0,
DelayTime = 1,
ConvertData = {1,2,3,4,5,6,7,8,9,0,"A","B","C","D","E"},
KLUBFlag = "M",
StationFlag = "E"
}
------------------------------------------------------------
function OnCustomSignalMessage(ConsistMessage)
local messageFlag = string.sub(ConsistMessage, 1, gMarkerKeyLen) -- gMarkerKeyLen = 1 (по умолчанию) или 10 (если конфиг файл сигналки содержит параметр USE_RS07_TAG)
tALS:GetSignal(ConsistMessage, gMarkerKeyLen)
tMap:SetStation(ConsistMessage, messageFlag)
end
------------------------------------------------------------
function tMap:SetStation(ConsistMessage, messageFlag)
if messageFlag == tMap.StationFlag then -- определение значения для индикаци названия станции на КЛУБе
tMap.Station = string.lower(string.sub(ConsistMessage, gMarkerKeyLen + 1))
end
if messageFlag == tMap.KLUBFlag then -- расшифровка маркера настройки КЛУБа при загрузке сценария
tALS.GetFrom = string.sub(ConsistMessage, gMarkerKeyLen + 1, gMarkerKeyLen + 1) -- с какого направления получать сигнал АЛсН
tALS.Receiver = tonumber(string.sub(ConsistMessage, gMarkerKeyLen + 2, gMarkerKeyLen + 2)) -- установленная частота АЛС на КЛУБе при загрузке сценария
if tALS.Receiver == 4 then tALS.ControlName = "ALS-EN" end -- переопределение контрола для АЛС-ЕН
ConsistMessage = string.sub(ConsistMessage, gMarkerKeyLen + 1)
TableK522[6] = "r:" .. string.sub(ConsistMessage, 3, 6) -- получение номера ЭК
TableK6_1[1] = tonumber(string.sub(ConsistMessage, 7, 13)) or TableK6_1[1] -- получение начальной координаты
TableK6_2[1] = tonumber(string.sub(ConsistMessage, 14, 14)) or TableK6_2[1] -- получение признака правильности изменения координаты
tMap.Station = string.lower(string.sub(ConsistMessage, 15, 22)) or "" -- получение начальной станции
if string.len(ConsistMessage) == 24 then -- получение номера пути и признака правильности
TableP_2[1] = tonumber(string.sub(ConsistMessage, 24, 24))
local track = string.sub(ConsistMessage, 23, 23)
for k, v in ipairs(tMap.ConvertData) do
if track == tostring(v) then TableP_1[1] = tonumber(k) break end
end
end
end
end
Почти все что касается локомотивной сигнализации (без комментариев в коде, т.к. в значительной степени совпадает с АЛСН RSv06)
- Код: Выделить всё
------------------------------------------------------------
BVU_4_K773 = "07.03.17_14.56"
------------------------------------------------------------
tALS = {
Receiver = 2,
Emitter = false,
LastTime = 0,
OnCoil = {25, 50, 75, "ty"},
OnRail = {"*", "~", "=", "+" },
State = false,
Prev = 0,
Border = false,
Name = "",
Convert = {["!"] = 1 , ["@"] = 2 , ["#"] = 3 , ["$"] = 4 , ["%"] = 5 , ["^"] = 6 , ["&"] = 7},
Distance = "",
Limit = false,
ControlName = "ALSN",
ControlValue = 0,
GetFrom = 0,
SignalFlag = "",
Message = {["X"] = "", ["Y"] = ""},
Separator = {["X"] = "", ["Y"] = ""},
ID = ""
}
------------------------------------------------------------
function tALS:Controls(name, index, value)
if value == 1 and tPower.KLUB then
tBILSound.State = true
self.Receiver = self.Receiver + 1
if self.Receiver == 4 then
self.ControlName = "ALS-EN"
Call("SetControlValue", "ALSN" , 0, 0)
end
if self.Receiver == 5 then
self.Receiver, self.ControlName = 1, "ALSN"
Call("SetControlValue", "ALS-EN" , 0, 0)
end
tALS:Reset()
Call("SetControlValue", "btn_bilv_f", 0, 0)
end
end
------------------------------------------------------------
function tALS:Indication(t)
if tPower.KLUB then Call("Frequency:SetText", tMap.Type, 0) end
if tAutostop.State then
if gSimulationTime > self.LastTime + 2 then
self.Emitter, self.Message[self.GetFrom] = false, ""
--self:Reset()
end
if (not self.Emitter or self.Border) and self.ControlValue == 3 then
self.State, self.Name, self.Distance, self.ControlValue = true, "", "", 2
elseif not self.Emitter and self.ControlValue ~= 2 then
self.State, self.Name, self.Distance, self.ControlValue = true, "", "", 1
elseif self.Emitter and self.ControlValue ~= 2 and not K799_809 then
if self.State == 0 then self.ControlValue = 3
elseif self.State == 1 then self.ControlValue = 4
elseif self.State >= 2 then self.ControlValue = 5
if self.Receiver == 4 then
for i = 2, 4 do
if i <= (self.State - 1) then self.ControlValue = 4 + i end
end
end
end
end
if self.Border then self.Border = false end
if K799_809 then self.ControlValue = 1 end
else
if self.ControlValue > 0 then tALS:Reset() end
end
if self.Prev ~= self.ControlValue then
Call("SetControlValue", self.ControlName, 0 , self.ControlValue)
if self.Prev ~= 0 then tBILSound.State = true end
self.Prev = self.ControlValue
end
end
------------------------------------------------------------
function tALS:GetSignal(ConsistMessage, markerKey)
if markerKey == 1 then markerKey = 0 end
ConsistMessage = string.sub(ConsistMessage, markerKey + 1)
messageFlag = string.sub(ConsistMessage, 1, 1)
if messageFlag == "X" or messageFlag == "Y" then
if string.find (ConsistMessage, tALS.OnRail[self.Receiver]) then
self.Emitter = self.Receiver -- tALS.OnRail[self.Receiver]
tALS.Separator[messageFlag] = string.find(ConsistMessage, tALS.OnRail[self.Receiver])
tALS.Message[messageFlag] = ConsistMessage
end
if tAutostop.State and tALS.Emitter --[[== tALS.Receiver ]] then -- logfile:write("\n tAutostop.State and tALS.Emitter == tALS.Receiver")
if messageFlag == self.GetFrom then
tALS.LastTime = gSimulationTime
tALS.State = tonumber(string.sub(tALS.Message[messageFlag],2,3))
if tALS.State > 10 then tALS.State = 1 end
if tALS.Emitter ~= 4 and tALS.State > 2 and tALS.State < 10 then tALS.State = 2 end
tALS.Limit = tonumber(string.sub(tALS.Message[messageFlag], 4, 6))
if tALS.State == 0 then tALS.Limit = 20 end
local id = string.sub(tALS.Message[messageFlag], 11, tALS.Separator[messageFlag] - 1)
if self.ID ~= id and tALS.LastTime <= tAutostop.State + 2 then self.Border = true end
self.ID = id
end
if (TableK522[6] ~= "r:FFFF" and TableK522[6] ~= "r:0000") and not K799_809 then
local convertValue = tostring(tMap.ConvertData[ TableP_1[1] ])..tostring(TableP_2[1])
for k, v in pairs(self.Message) do
local data = ""
if string.len(v) > 0 then data = string.sub(v, self.Separator[k] + 1, self.Separator[k] + 2) end
if data == convertValue then
tMap.Type = "'r"
tALS.Distance = string.sub(tALS.Message[k], 7, 10)
tALS.Name = string.sub(v, 11, self.Separator[k] - 1)
local latin = string.sub(tALS.Name, 1, 1)
if latin == "!" or latin == "@" or latin == "#" or latin == "$" or latin == "%" or latin == "^" or latin == "&" then tALS.Name = string.sub(tALS.Name, 2) end
local latin = string.sub(tALS.Name, -1, -1)
if latin == "!" or latin == "@" or latin == "#" or latin == "$" or latin == "%" or latin == "^" or latin == "&" then
tALS.Name = string.gsub(tALS.Name, latin, tALS.Convert[latin])
end
break
else
tMap.Type = tALS.OnCoil[tALS.Receiver]
tALS.Distance, tALS.Name = "", ""
end
end
else
tMap.Type = tALS.OnCoil[tALS.Receiver]
tALS.Distance, tALS.Name = "", ""
end
end
end
end -- OnCustomSignalMessage
------------------------------------------------------------
function tALS:Reset()
self.Message, self.Separator, self.ID = {["X"] = "", ["Y"] = ""}, {["X"] = "", ["Y"] = ""}, ""
self.Emitter, self.State, self.Name, self.Distance, self.ControlValue, self.Prev = false, false, "", "", 0, -1
end