RailUnion.net


http://railunion.net/blog/i2GR/%D0%A7%D0%A12627_%D0%B0%D0%BB%D1%8C%D1%84%D0%B0_RSv07_%D0%90%D0%9B%D0%A1%D0%9D_b-1519_sid-745efadada7ce2148e55cbe02bd1d53f.html

Автор:  i2GR [ 23.04.2017, 01:19 ]
Тема блога:  ЧС2-627 альфа, RSv07, АЛСН

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


Часовой пояс: UTC + 4 часа

Powered by phpBB © 2002, 2006 phpBB Group
www.phpbb.com

Blogs powered by User Blog Mod © EXreaction
www.lithiumstudios.org