Описание принципа работы: При загрузке карты сценарный маркер передает сообщение для ЧС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
|