My custom ILS not work anymore after SU4

Hi at all.

I’m having a problem with my custom airport (This). Inside I added a custom ILS to correct the wrong course of the default one to make it fit the airport charts. Until before the Sim Update 4 it worked perfectly, now there is no way to make it work and the plane always descends following the default one. I also tried to move the LOC to a different position in my scenery but it is completely ignored.
So, as a further test, I decided to create a test airport (a runway, a parking and a taxiway, very simple) Then I added the ILS but I have inadvertently entered a wrong ID (GES instead of GSE). My LOC has finally appeared. The problem is that the default one is also present (with DeleteAllILS set to true). When, without moving the LOC, I correct the ID, my ILS instead of replacing the default one, disappear and only remains default one.

GSE is the default LOC, GES is my test LOC with wrong ID:

GES.png

My LOC with correct ID disappear and remain only the Default LOC:

GSE.png

Here the xml of test airport:

Code
<?xml version="1.0"?>
<FSData version="9.0">
<Airport name="Sestri" ident="LIMJ" lat="44.41347084741510" lon="8.84414760717677" alt="0.03959782142192" magvar="359.000000" airportTestRadius="20000.00000000000000" applyFlatten="FALSE" isOnTIN="FALSE" starAirport="TRUE">
<TaxiwayPoint groupIndex="22" index="1" type="NORMAL" orientation="FORWARD" lat="44.40850550702766" lon="8.85944177637101"/>
<TaxiwayPoint groupIndex="19" index="2" type="NORMAL" orientation="FORWARD" lat="44.41437097898567" lon="8.82947458679332"/>
<TaxiwayPoint groupIndex="18" index="3" type="NORMAL" orientation="FORWARD" lat="44.41454122286586" lon="8.82939149846002"/>
<TaxiwayPoint groupIndex="17" index="4" type="NORMAL" orientation="FORWARD" lat="44.41463316831076" lon="8.82916266313930"/>
<TaxiwayPoint groupIndex="16" index="5" type="NORMAL" orientation="FORWARD" lat="44.41448082504320" lon="8.82894212498637"/>
<TaxiwayPoint groupIndex="15" index="6" type="NORMAL" orientation="FORWARD" lat="44.41425438162942" lon="8.82894224320922"/>
<TaxiwayPoint groupIndex="14" index="7" type="HOLD_SHORT" orientation="FORWARD" lat="44.41420915746082" lon="8.82921267151123"/>
<TaxiwayPoint groupIndex="13" index="8" type="NORMAL" orientation="FORWARD" lat="44.41428869585575" lon="8.82937522517274"/>
<TaxiwayPoint groupIndex="21" index="9" type="NORMAL" orientation="FORWARD" lat="44.40838217455497" lon="8.86011200162138"/>
<TaxiwayPoint groupIndex="20" index="10" type="NORMAL" orientation="FORWARD" lat="44.40845825705550" lon="8.86043105957781"/>
<TaxiwayParking index="0" type="RAMP_GA_LARGE" lat="44.40866798279276" lon="8.86052355061271" heading="132.009674" radius="27.000000" name="NONE" number="0" suffix="NONE" pushBack="NONE" numberMarking="FALSE" numberBiasX="0.000000" numberBiasZ="0.000000" numberHeading="0.000000"/>
<TaxiName index="0" name=""/>
<TaxiwayPath groupIndex="1" type="PARKING" surface="{85D02B2B-08A1-452E-AB07-6D5AE7F52884}" centerLine="FALSE" start="10" end="0" width="30.000000" weightLimit="0" name="0" drawSurface="TRUE" drawDetail="TRUE" groundMerging="TRUE" excludeVegetationAround="TRUE" excludeVegetationInside="TRUE"/>
<TaxiwayPath groupIndex="4" type="TAXI" surface="{85D02B2B-08A1-452E-AB07-6D5AE7F52884}" centerLine="FALSE" start="8" end="2" width="30.000000" weightLimit="0" name="0" drawSurface="TRUE" drawDetail="TRUE" groundMerging="TRUE" excludeVegetationAround="TRUE" excludeVegetationInside="TRUE"/>
<TaxiwayPath groupIndex="10" type="TAXI" surface="{85D02B2B-08A1-452E-AB07-6D5AE7F52884}" centerLine="FALSE" start="2" end="3" width="30.000000" weightLimit="0" name="0" drawSurface="TRUE" drawDetail="TRUE" groundMerging="TRUE" excludeVegetationAround="TRUE" excludeVegetationInside="TRUE"/>
<TaxiwayPath groupIndex="9" type="TAXI" surface="{85D02B2B-08A1-452E-AB07-6D5AE7F52884}" centerLine="FALSE" start="3" end="4" width="30.000000" weightLimit="0" name="0" drawSurface="TRUE" drawDetail="TRUE" groundMerging="TRUE" excludeVegetationAround="TRUE" excludeVegetationInside="TRUE"/>
<TaxiwayPath groupIndex="8" type="TAXI" surface="{85D02B2B-08A1-452E-AB07-6D5AE7F52884}" centerLine="FALSE" start="4" end="5" width="30.000000" weightLimit="0" name="0" drawSurface="TRUE" drawDetail="TRUE" groundMerging="TRUE" excludeVegetationAround="TRUE" excludeVegetationInside="TRUE"/>
<TaxiwayPath groupIndex="7" type="TAXI" surface="{85D02B2B-08A1-452E-AB07-6D5AE7F52884}" centerLine="FALSE" start="5" end="6" width="30.000000" weightLimit="0" name="0" drawSurface="TRUE" drawDetail="TRUE" groundMerging="TRUE" excludeVegetationAround="TRUE" excludeVegetationInside="TRUE"/>
<TaxiwayPath groupIndex="6" type="TAXI" surface="{85D02B2B-08A1-452E-AB07-6D5AE7F52884}" centerLine="FALSE" start="6" end="7" width="30.000000" weightLimit="0" name="0" drawSurface="TRUE" drawDetail="TRUE" groundMerging="TRUE" excludeVegetationAround="TRUE" excludeVegetationInside="TRUE"/>
<TaxiwayPath groupIndex="5" type="TAXI" surface="{85D02B2B-08A1-452E-AB07-6D5AE7F52884}" centerLine="FALSE" start="7" end="8" width="30.000000" weightLimit="0" name="0" drawSurface="TRUE" drawDetail="TRUE" groundMerging="TRUE" excludeVegetationAround="TRUE" excludeVegetationInside="TRUE"/>
<TaxiwayPath groupIndex="3" type="TAXI" surface="{85D02B2B-08A1-452E-AB07-6D5AE7F52884}" centerLine="FALSE" start="1" end="9" width="30.000000" weightLimit="0" name="0" drawSurface="TRUE" drawDetail="TRUE" groundMerging="TRUE" excludeVegetationAround="TRUE" excludeVegetationInside="TRUE"/>
<TaxiwayPath groupIndex="2" type="TAXI" surface="{85D02B2B-08A1-452E-AB07-6D5AE7F52884}" centerLine="FALSE" start="9" end="10" width="30.000000" weightLimit="0" name="0" drawSurface="TRUE" drawDetail="TRUE" groundMerging="TRUE" excludeVegetationAround="TRUE" excludeVegetationInside="TRUE"/>
<TaxiwayPath groupIndex="11" type="RUNWAY" surface="{85D02B2B-08A1-452E-AB07-6D5AE7F52884}" centerLine="FALSE" start="1" end="2" width="30.000000" weightLimit="0" number="28" designator="NONE" drawSurface="TRUE" drawDetail="TRUE" groundMerging="TRUE" excludeVegetationAround="TRUE" excludeVegetationInside="TRUE"/>
<Runway groupIndex="12" lat="44.41142575625668" lon="8.84451043701154" alt="2.35041585657746" heading="285.25000000000000" length="2500.00000000000000" width="50.00000000000000" patternAltitude="304.79998779296875" surface="{2E0DE83F-B79A-4435-905C-DCBBEAC55C59}" transparent="FALSE" number="28" designator="NONE" primaryLanding="TRUE" primaryTakeoff="TRUE" primaryPattern="LEFT" secondaryLanding="TRUE" secondaryTakeoff="TRUE" secondaryPattern="LEFT" primaryMarkingBias="0.00000000000000" secondaryMarkingBias="0.00000000000000" groundMerging="TRUE" excludeVegetationAround="TRUE">
<Markings edges="FALSE" threshold="FALSE" alternateThreshold="FALSE" fixedDistance="FALSE" alternateFixedDistance="FALSE" touchdown="FALSE" alternateTouchdown="FALSE" dashes="FALSE" ident="FALSE" leadingZeroIdent="FALSE" precision="FALSE" alternatePrecision="FALSE" edgePavement="FALSE" singleEnd="FALSE" primaryClosed="FALSE" secondaryClosed="FALSE" primaryStol="FALSE" secondaryStol="FALSE" noThresholdEndArrows="FALSE"/>
<Lights center="NONE" edge="NONE"/>
<Ils lat="44.41287422256025" lon="8.83155110506807" alt="2.44886232726276" end="PRIMARY" ident="GES" magvar="359.000000" heading="290.00000000000000" frequency="109.30000000000000" name="ILS Genova 2 Offset" backCourse="FALSE">
<Dme lat="44.41142575625668" lon="8.84451043701154" alt="2.35041585657746"/>
<GlideSlope lat="44.40851764124219" lon="8.85939673631905" alt="2.80305134784430" pitch="3.170000"/>
</Ils>
<RunwayStart end="PRIMARY" lat="44.41079586648738" lon="8.84451043701154" alt="2.35041585657746" heading="0.00000000000000"/>
<RunwayStart end="SECONDARY" lat="44.41205564602597" lon="8.84451043701154" alt="2.35041585657746" heading="180.00000000000000"/>
</Runway>
<Aprons/>
<PaintedElements/>
<ApronEdgeLights/>
<DeleteAirport deleteAllApproaches="FALSE" deleteAllApronLights="TRUE" deleteAllAprons="TRUE" deleteAllFrequencies="TRUE" deleteAllHelipads="TRUE" deleteAllRunways="TRUE" deleteAllStarts="TRUE" deleteAllTaxiways="TRUE" deleteAllBlastFences="TRUE" deleteAllBoundaryFences="TRUE" deleteAllJetways="TRUE" deleteAllControlTowers="TRUE" deleteAllDepartures="FALSE" deleteAllArrivals="FALSE" deleteAllPaintedElements="TRUE" deleteAllLightSupports="TRUE" deleteAllTaxiwaySigns="TRUE" deleteAllILSs="TRUE" deleteAllTerminalWaypoints="TRUE" deleteAllTerminalNDBs="TRUE"/>
</Airport>
</FSData>

I also have similar ILS problem. I am experienced in the use of xml to create airport objects but this one has me at a standstill. My issue is KCRP which Asobo used an obsolete satellite scan so it is rendered with one of two runways closed, the other not yet lengthen (this was done in 2012) and the ILS missing the GS. I use deleteAllILS=true. I have copied the three ILS systems that exist in the stock bgl file (these appear as members of the airport and are not members of the runway per SDK), and I have tried changing the idents but nothing I do seems to work. Loading the package in DEV mode I can see the ILS’s, and modify them but once the package is “built” those ILS disappear. I’ve tried both with DEV mode and command line fspackagetool execution no joy.

Do you get errors when you build your project? If you do, try to remove “end” value from your ils script. That solved some of my problems.

Also remember to move your package to community folder and restart the sim.

I tried it. Does not work. Furthermore, even i not set an ILS in the scenary and set deleteAllILS = true, the default ILS is not removed. So instead of replacing the default ones with the ones from the scenery, as before SU4, it does exactly the opposite.The only way to use your own ILS is to enter a fictitious frequency or ID. However, the default one will always be active there… :thinking:

I lucked out at KCRP, where my problem was not an incorrect LOC course (note MSFS has inexplicably changed the xml ILS localizer course definition to magnetic and ignores the mag var parameter); rather, my problem was missing GS. I decompiled the stock APX bgl file and found the xml for the stock airport had exactly the correct parameters, except for component altitudes, as the FAA NASD data I use. I found that if I allowed DeleteAllILSs=FALSE then my ILS’s added in my xml file then compiled and bgl placed in Community worked perfectly. Those didn’t work with stock alone, but I was able to sit on top of the stock objects and it worked. Of course I could see if I changed my ILS ID from ICRP to XCRP then there would be two ILS for same runway (the MSFS bgl compiler removes the ILS object from the runway and makes it a child of the airport directly). The primary problem is DeleteAllILSs=TRUE removes stock and CURRENT ILS objects.

i haven’t tried putting deleteAllils to false but I’m curious to see what happens in my case. There is certainly something not working as it should. To me that parameter does not delete anything. The ils stock is always active. :thinking:

Interesting that your problems appeared after Sim update 4. That update fixed my ILS issues.
I did a test and made a simple LIMJ with only a runway and ILS, following my own guide here: Guide: Setting up a correctly aligned, offset and autotuning ILS for an airport - MSFS DevSupport (flightsimulator.com)

I made it with a 20 degree offset, to make it easier to test if the sim was using it. It works perfectly fine. Replaced GSE both on world map and in the sim. Working Title CJ4 and default TBM was able to auto tune and follow the localizer.

If it helps troubleshooting, I’m using the gamepass standard edition.

World map:

Following very offset localizer in sim:

XML:

<?xml version="1.0"?>

<FSData version="9.0">

    <Airport name="Sestri" ident="LIMJ" lat="44.41333349794149" lon="8.83750006556511" alt="0.00000000000000" magvar="0.000000" airportTestRadius="2000.00000000000000" applyFlatten="FALSE" isOnTIN="FALSE" starAirport="TRUE">

        <TaxiName index="0" name=""/>

        <Runway lat="44.41149646135229" lon="8.84410566098195" alt="0.04181053675711" heading="285.20001220703125" length="2500.00000000000000" width="50.00000000000000" patternAltitude="304.79998779296875" surface="{2E0DE83F-B79A-4435-905C-DCBBEAC55C59}" transparent="FALSE" number="28" designator="NONE" primaryLanding="TRUE" primaryTakeoff="TRUE" primaryPattern="LEFT" secondaryLanding="TRUE" secondaryTakeoff="TRUE" secondaryPattern="LEFT" primaryMarkingBias="0.00000000000000" secondaryMarkingBias="0.00000000000000" groundMerging="TRUE" excludeVegetationAround="TRUE">

            <Markings edges="TRUE" threshold="TRUE" alternateThreshold="FALSE" fixedDistance="TRUE" alternateFixedDistance="FALSE" touchdown="TRUE" alternateTouchdown="FALSE" dashes="TRUE" ident="FALSE" leadingZeroIdent="FALSE" precision="FALSE" alternatePrecision="FALSE" edgePavement="FALSE" singleEnd="FALSE" primaryClosed="FALSE" secondaryClosed="FALSE" primaryStol="FALSE" secondaryStol="FALSE" noThresholdEndArrows="FALSE"/>

            <Lights center="NONE" edge="NONE"/>

            <Ils lat="44.41493724690055" lon="8.82341781952506" alt="1.60218078270555" end="PRIMARY" range="50017.00000000000000" ident="GSE" magvar="358.700012" heading="305.00000000000000" frequency="109.30000000000000" name="ILS 28" backCourse="FALSE">

                <Dme lat="44.40944017588134" lon="8.85784521203170" alt="0.17622745223343" range="50000.00000000000000"/>

                <GlideSlope lat="44.40980753105056" lon="8.85613796668082" alt="0.14877024292946" pitch="3.200000" range="50000.00000000000000"/>

            </Ils>

            <RunwayStart end="PRIMARY" lat="44.41133022540690" lon="8.84495327073455" alt="0.04388016276062" heading="-74.69792938232422"/>

            <RunwayStart end="SECONDARY" lat="44.41166269101689" lon="8.84325804633451" alt="0.03973414842039" heading="105.30210113525391"/>

        </Runway>

        <Aprons/>

        <PaintedElements/>

        <ApronEdgeLights/>

        <DeleteAirport deleteAllApproaches="FALSE" deleteAllApronLights="FALSE" deleteAllAprons="FALSE" deleteAllFrequencies="FALSE" deleteAllHelipads="FALSE" deleteAllRunways="TRUE" deleteAllStarts="FALSE" deleteAllTaxiways="TRUE" deleteAllBlastFences="FALSE" deleteAllBoundaryFences="FALSE" deleteAllJetways="FALSE" deleteAllControlTowers="FALSE" deleteAllDepartures="FALSE" deleteAllArrivals="FALSE" deleteAllPaintedElements="FALSE" deleteAllLightSupports="FALSE" deleteAllTaxiwaySigns="FALSE" deleteAllILSs="TRUE" deleteAllTerminalWaypoints="FALSE" deleteAllTerminalNDBs="FALSE"/>

    </Airport>

</FSData>
1 Like

Thanks.
Very interesting guide

I’m trying your code but I don’t understand why it doesn’t work on my sim :thinking:
My version is MS Store, Standard.

If you want to test, here is the whole project folder including built package. Maybe there’s a difference with how our sims build it? I hope a google drive link is allowed: testproject-LIMJ.zip - Google Drive

1 Like

I also tried your already compiled project and don’t work.
But then I came across another discussion (different problem) where they talked about the Content.xml file. I tried to delete it to have it rebuild and now everything works.

And with the help of your guide, I was able to correct the ILS course without having to resort to the hidden runway workaround :slight_smile:

But I have a question. Where did you get that magvar value from? and I saw that you have not set it in the <airport> tag, where there is also the name. Is it better not to put it on?

Thanks.

I have been following this thread with interest, as I too mod airports. One thing I have noticed (certainly true for previous builds of MSFS) is that to get ILS to auto-tune, one has to add ILS data to a re-built airport for auto-tune to work.

Without wanting to in any way disagree with the approach that @WombiiActual is taking in making an ILS work, a few months ago I did post a slightly different way that I use to successfully get an ILS to work for a modded airport.

The post is here: https://forums.flightsimulator.com/t/setting-up-ils-for-a-new-airport/375687/5

I am still confused in my own head as to the reliability (or otherwise) of the MagVar modelling in the sim and for the method I have described above, MagVar isn’t necessary from ‘real world’ data!

However, it may be that my method is flawed and that future iterations of MSFS may ‘break’ the method I have used to create an ILS.

1 Like

@SimoG6
Great that you were able to get it to work. I’ll try the Content.xml trick on another issue I have.
To get the magvar value from the sim I either use the flight tracker Stream deck extension or the “SimvarWatcher” sample file in the sdk: “MSFS SDK\Samples\SimvarWatcher\bin\x64\Release\Simvar.exe”
I only entered the magvar in the runway ILS section, not the airport section, because the sim seems to be ignoring the one in the airport section so it’s irrelevant, and if Asobo fixes that I prefer that it breaks my sceneries in a predictable way so it’s easier for me to fix later. The ideal situation would be for Asobo to use the airport magvar to influence the world’s magnetic field, then use the runway ILS heading as a magnetic heading, adding or subtracting the runway magvar to get the true heading.

@tamalien
I absolutely do not disagree with your approach. If I had found your guide earlier it would have saved me some hours of testing, and it’s also better written. It seems that what we’re doing is basically the same, but I’m doing the heading math manually and you’re doing the magvar math manually instead. Both methods have advantages.

I tried using the value from the plane instruments too, but when I tested it I found it wasn’t precise enough to perfectly align the ILS with the runway heading on all runways when I wanted 0 offset because I wasn’t guaranteed to have the plane perfectly aligned with the runway and the compass reading didn’t have decimals.
One way to increase accuracy would be to read the compass heading from simconnect with one or two decimal spaces. That should make our methods give exactly the same result, if the plane is pointing in the right direction.

For me, on my airports, doing the math this way was the only way for me to get it perfectly aligned for all directions.

Regarding reliability, both our methods will definitely break the same way if Asobo changes the calculations. We’re using the same in-sim magvar data, just getting it in a different way. I don’t see a way we can future-proof our sceneries unless Asobo changes the runway ILS field to true heading.

2 Likes

@ WombiiActual

Thanks

I’ve ignored ILS for ages but should get around to looking at it again. I was hoping it would have gone away by now, but disappointingly it’s still here.

I still don’t get how to find out the magvar of wherever I am inside MSFS.

I’ve zero idea what simconnect is or does so the method on the devsupport forum is a mystery.

Is the simvar thing referenced just a program I can start and ask what the magvar is?

Simconnect is used to allow external applications to communicate with the sim. In the case of simvar it extract from simconnect the MagVar value on the exact position where the plane is in the sim. Surely you will have a very precise value because you will have several decimal places but you can do without it and calculate the magvar yourself. It is indicated on all charts of airports.
You simply add or subtract it to 360°, based on the direction of the variation (subtract it if it goes east and vice versa west) and enter the result in the ILS of the airport you are editing.

Cool. Thank you. I think I’ve figured it out now.

Just to double check I presume you add to the heading if it’s East, and subtract if it’s West?

no, it’s correct. For example LIMJ (my scenary) have 1° east on the charts and simvar read 358.700012 so it must be subtracted. The value obtained must be placed in the magvar box, not in the heading box.

I think I’m just as confused as I was before.

So magvar is normally expressed as a minus when it’s West, but it’s actually a plus in this case?

Maybe I’m not feeling too sharp today. I’ll just give that a try and see what happens.

Because it is the north that moves to east. you don’t need to know where geographic north is in this case.
If you point the compass north and then you push the needle with your finger 1° to east, It will line up it with the 359° notch of the dial. So you have subtracted the magvar value

However I believe that in the case of the simvar you must always subtract it. Surely (I have not tried) on an area where you have an eastward variation it will give you a higher value, not a negative one.
Like, if it’s West 1°, the program probably will mark 359°

Good point. More sleep is needed.

The simvar gives me a negative value for West, and a positive from 0 for East, but maybe I have a different setting to you. I’m seeing 1.31 at LIMJ rather than 358.7 like you are.