RA3DCS Posted March 8, 2013 Share Posted March 8, 2013 Возникла необходимость (по убедительной просьбе любимого племянника) подключить к военному симулятору Lock On ГС-2 существующую железную кабину, которая работает под МФС. Что оказалось для меня совсем не простой задачей. Тем более, что программа управления кабиной должна находиться на другом компьютере. Но надеюсь с помощью коллег по симулятору эту проблему решить. 1 Link to comment Share on other sites More sharing options...
RA3DCS Posted March 8, 2013 Author Share Posted March 8, 2013 Как известно работа с этой программой обеспечивается за счет взаимодействия по протоколу TCP. Механизм работы примерно следующий : программа связи симулятора со внешними устройствами создает TCP «сервер» (ведущий процесс) , который ( упрощенно ) является областью в памяти компьютера . Эту область программа связи симулятора с внешними устройствами постоянно прослушивает. В свою очередь ЛокОн создает «клиент» ( то есть ведомый процесс ) который постоянно передает в эту область данные. Увидев наличие данных программа связи должна считать их, и преобразовав выдать во внешние устройства. Лок Он при запуске анализирует, создан ли сервер. Если сервер не создан, то Лок Он не будет передавать данные. Таким образом, для корректной работы необходимо СНАЧАЛА запустить программу связи (сервер), и только после этого ЛокОн. По совету Андрея (Lisa) попробуем применить такую схему: Lock On => Lua => TCP/IP => Sioc => клиент => приборы. SIOCиспользуется исключительно как сервер на который LockOn посылает данные. Для того , чтобы ЛокОн начал работать с созданным сервером необходимо : - объяснить программе, что она должна работать по TCP. - указать программе область памяти ( или сетевой адрес ) в который ей необходимо передавать данные. - указать программе объем данных ( параметры ), который необходимо передавать . После настройки программы: - сформировав сервер дождаться начала обмена данными . Эта последовательность действий обеспечивается следующим образом. 1. Вфайле ...\1C\Eagle Dinamics\LO\Config\Export\Config.lua найти строку EnableExportScript = false ( в принципе она одна там и есть )... и исправить её так :EnableExportScript = true Этим мы дадим знать ЛокОн что ему необходимо начать работать на передачу (экспорт) данных. 2. Заменитьфайл ...\1C\Eagle Dinamics\LO\Config\Export\Export.lua на одноименный файл , ( то есть с нашими данными ) Желательно старый файл не удалять а переименовать (на всякий случай ). В этом файле находятся : - настройки TCP ( номер порта и номер хоста ) - ----------------------------------------------------------- --процедурыоткрытияпорта functionLuaExportStart() package.path =package.path..";.\\LuaSocket\\?. lua"package.cpath =package.cpath..";.\\LuaSocket\\?.dll" socket =require("socket") host ="192.168.10.190"--сетевойадресSIOC port =8092– порт SIOC c = socket.try(socket.connect(host, port)) c:setoption("tcp-nodelay",true) c:settimeout(.01)end ------------------------------------------------------------------------------------ --значения"host"и"port"поумолчаниюдляSIOC host – сетевой адрес компьютера на котором установлен сервер. Запускаем SIOC сервер, затем LockOn, выбираем миссию. Компьютеры связаны по локальной сети. В строчке "Clientsconnecteds" должны увидеть, сколько клиентов подключены. Если соединение получилось уже хорошо. Link to comment Share on other sites More sharing options...
RA3DCS Posted March 8, 2013 Author Share Posted March 8, 2013 Теперь дальше получаемые данные полета. -- эта функция выполняется после отрисовки каждого кадра function LuaExportAfterNextFrame() local lSIOC_SendString = "" local TAS = LoGetTrueAirSpeed()* 3.6 -- получаем значение истинной скорости local IAS = LoGetIndicatedAirSpeed()* 3.6 -- получаем значение прибрной скорости local AOA = LoGetAngleOfAttack() -- угол атаки local Gp = LoGetAccelerationUnits() -- перегрузка local VV = LoGetVerticalVelocity() -- верт скорость local altBar = LoGetAltitudeAboveSeaLevel() local altRad = LoGetAltitudeAboveGroundLevel() local pitch, bank, yaw = LoGetADIPitchBankYaw() local Mach = LoGetMachNumber() local HSI = LoGetControlPanel_HSI() local engine = LoGetEngineInfo() local route = LoGetRoute() local PlaneID = LoGetPlayerPlaneId() local obj = LoGetObjectById(PlaneID) local myXCoord, myZCoord = getXYCoords(obj.LatLongAlt.Lat, obj.LatLongAlt.Long) local navi = LoGetNavigationInfo() R0 = TAS R1 = IAS R2 = AOA*ToDegree R3 = Gp.y R4 = VV R5 = altBar R6 = altRad -- округляем значение до целого R0 = math.floor(R0 + 0.5) R1 = math.floor(R1 + 0.5) R2 = math.floor(R2 + 0.5) R3 = math.floor(R3 + 0.5) R4 = math.floor(R4 + 0.5) R5 = math.floor(R5 + 0.5) R6 = math.floor(R6 + 0.5) -- формируем строчку номер переменной = значение R0 = "0="..R0..":" R1 = "1="..R1..":" R2 = "2="..R2..":" R3 = "3="..R3..":" R4 = "4="..R4..":" R5 = "5="..R5..":" R6 = "6="..R6..":" -- записываем строчку lSIOC_SendString = lSIOC_SendString..R0 lSIOC_SendString = lSIOC_SendString..R1 lSIOC_SendString = lSIOC_SendString..R2 lSIOC_SendString = lSIOC_SendString..R3 lSIOC_SendString = lSIOC_SendString..R4 lSIOC_SendString = lSIOC_SendString..R5 lSIOC_SendString = lSIOC_SendString..R6 -- отправляем if lSIOC_SendString ~= "" then socket.try(c:send("Arn.Resp:"..lSIOC_SendString.."\n")) end end -- процедуры закрытия порта function LuaExportStop() io.close() socket.try(c:send("quit")) -- to close the listener socket c:close() end ------------------------------------------------------------------ Link to comment Share on other sites More sharing options...
RA3DCS Posted March 8, 2013 Author Share Posted March 8, 2013 Первая часть задачи была решена, работают основные приборы и системы. Возникла необходимость обратной передачи данных от железной кабины (пульты управления, положение некоторых органов управления) в LockOn. Должна работать связка кабина ==>клиент==>Sioc==>Export.lua==>LockOn. Первая часть задачи послать данные от кабины в Sioc. Евгений (Shaman_2010) подсказал, как это сделать. Нужно отправить в SIOC пакет вида: Arn.Resp: номер переменной = значение переменной: номер переменной = значение переменной: и в конце закончить символами "#$D" "#$A". Например, для отправки данных из кабины резервируем переменные с номерами от 50 до 80, тогда процедура отправки данных в Sioc (в клиентской части) выглядит так. var Sioc_Send: string; begin Sioc_Send := 'Arn.Resp:'; Sioc_Send := Sioc_Send + '50=' + IntToStr(c1) + ':51=' + IntToStr(c1) + .... + ':'; Sioc_Send := SiocSend + #$D + #$A; ClientSocket.Socket.SendText(Sioc_Send); Sioc_Send := '': end; Однако, это только половина дороги. Теперь задача научить Export.Lua читать эти данные. Вот тут пока загвоздка! Знающие люди – подскажите!? Link to comment Share on other sites More sharing options...
RA3DCS Posted March 10, 2013 Author Share Posted March 10, 2013 Мало у нас тут людей интересуется железными кабинами! Судя по всему этим кодом в начале старта ЛокОна запрашиваются от СИОК переменные находящиеся в файле inputsTable с номерами те,что в квадратных скобках. local lSIOC_Var, i local lSIOC_SendString = "" -- Generate the init string to SIOC (to register with SIOC which parameters we are interested in) for lSIOC_Var,i in pairs(inputsTable) do lSIOC_SendString = lSIOC_SendString..lSIOC_Var..":" end -- Send the initstring socket.try(c:send("Arn.Inicio:"..lSIOC_SendString.."\n")) Link to comment Share on other sites More sharing options...
RA3DCS Posted March 10, 2013 Author Share Posted March 10, 2013 Тут каки е то операции с этими переменными: -- Works just before every simulation frame. -- Check for data/string from the SIOC server on the socket local inpst = c:receive() if inpst then for lSIOC_Param, lSIOCValue in SIOC_Parse(inpst) do if inputsTable[lSIOC_Param] ~= nil then inputsTable[lSIOC_Param][1](lSIOCValue, inputsTable[lSIOC_Param][2],inputsTable[lSIOC_Param][3],inputsTable[lSIOC_Param][4],inputsTable[lSIOC_Param][5]) end end -- io.flush() end Вот понять бы какие? Link to comment Share on other sites More sharing options...
RA3DCS Posted March 19, 2013 Author Share Posted March 19, 2013 http://code.google.com/p/dcsbsexport/ Насколько я понял, речь тут идет про кликабельные элементы и индикаторы. Т.е. те элементы управления, которые управляются щелчком на экране кнопкой мыши, но в ЛокОне таких элементов я не вижу. Скорее всего, в случае ЛокОна нужен другой подход. Link to comment Share on other sites More sharing options...
RA3DCS Posted March 19, 2013 Author Share Posted March 19, 2013 В файле inputsTable.lua формируем нужные нам переменные и назначаем им команды. например: -- General Format [sIOC Parameter Value] = {Function, input1, input2, input 3, input4} ------------------------------------------------------------- -- Примечание: Значение параметра SIOC должно быть 1 или 0, никакие другие значения недопустимы -- приведет к непредсказуемым результатам. ------------------------------------------------------------- inputsTable = { [50] = {TwoPositionSwitch, 309, 1, 1}, -- Запуск двигателя. [51] = {TwoPositionSwitch, 300, 1, 1}, -- Освещение кабины. [52] = {TwoPositionSwitch, 82, 1, 1}, -- Сброс подвесок. [53] = {TwoPositionSwitch, 310, 1, 1}, -- Останов двигателя. [54] = {TwoPositionSwitch, 430, 1, 1}, --Шасси выпустить. [55] = {TwoPositionSwitch, 431, 1, 1, 1}, -- Шасси убрать. [56] = {TwoPositionSwitch, 76, 1, 1, 1}, -- Сбросить тормозной парашют. [57] = {TwoPositionSwitch, 12, 1, 1, 1}, [58] = {TwoPositionSwitch, 12, 1, 1, 1}, [59] = {TwoPositionSwitch, 12, 1, 1, 1}, } Link to comment Share on other sites More sharing options...
RA3DCS Posted March 19, 2013 Author Share Posted March 19, 2013 В файле ExportSupport.lua в функции TwoPositionSwitch меняем строку GetDevice(pDevice):performClickableAction(pNumber + 3000, pValue * pOnValue) на строку LoSetCommand(pDevice) В файле Export.lua нужно прописать путь к файлам inputsTable и ExportSupport.lua --load the support functions dofile("./Config/Export/ExportSupport.lua") -- Load Sioc input definitions dofile "./Config/Export/SIOCConfig/inputsTable.lua" Link to comment Share on other sites More sharing options...
RA3DCS Posted March 19, 2013 Author Share Posted March 19, 2013 Как оказалась функция LoSetCommand(номер команды) реагирует на любое изменение переменной, т.е. независимо, что там 0 или 1. Что вызывает некоторые неудобства при начальной загрузке Локк Она. Link to comment Share on other sites More sharing options...
jazzymanserg Posted February 16, 2017 Share Posted February 16, 2017 Ra3DCS, ПОМОГИТЕ. Уже голову сломал. Задача. завести переменную, допустим 596 и повесить на неё функцию 430 - шасси. Потом ручками в консоли OPENSIOC поставить единичку и что б шасси выпустились. Взял с сайта летяга все луа, в inputstable.lua и siocconfig.lua добавил [596] = {TwoPositionSwitch, 430, 1, 1}, В ExpotrSupport.lua пробовал заменять GetDevice(pDevice):performClickableAction(pNumber + 3000, pValue * pOnValue) на LoSetCommand(pDevice) В общем результата 0. В сиоке меняется а в Сушке шасси не выезжают. (может так и должно быть ?) Хоть посоветуйте что то ПОЖАЛУЙСТА. Link to comment Share on other sites More sharing options...
Recommended Posts