Here is a proof of concept of the thing working (details follow below):

I followed the steps above for the most part, naming the HUD "SentryHUD", and the right dial "SentryBDial". I didn't utilize the left dial because I think you uploaded the same dial twice (the right hand dial) instead of the one for the left. The left side should have the numbers reversed so that the right-side-up numbers are on the right (to fit through the aperture). But you can just expand on these steps to get that dial tied in and connected.
Image Prep
The HUD isn't cropped quite right... it had blank space above and below that was counting in the math of sizing/spacing and throwing off the way the tokens placed themselves. If you crop it right at the edge of the HUD overlay graphic and keep the wheels at half the width of the HUD, I think this will all line up better. As it is, you can see the dial doesn't *exactly* sit in the window, and you can see the dial around the edge of the HUD. But this can be corrected by trimming the images properly.
Token Setup
Name the tokens as mentioned. For SentryBDial, I put the maximum number of rounds it could hold in bar1 current (500) and the rounds remaining in bar3 (500). I didn't do current/max for a single bar because that would generate a colored bar over the token and ruin the effect of the floating HUD. In bar2 I put the rotation required to get the 000/500 position of the dial to line up in the window (121.5). You can play with that using a token-mod line like this:
!token-mod --set rotation|120
Select SentryADial and run that line, changing the 120 until you get a rotation that has 000 to the right. Put that number in SentryADial's bar2 current.
Required Scripts
You'll need TokenMod, ZeroFrame, and Fetch for the handling of the interface. If you utilize the IF logic for the sentry fire messages ("Sentry B fires 25 rounds..."), then you'll want APILogic, too. TokenMod is available from the one-click. The rest you'll have to get from my repo. This thread links to all of the sub-threads, which has links for them all.
TokenMod will require that you enable players to use the --ids argument, so run this line from chat once it is installed:
!token-mod --config players-can-ids
You will be also need a small custom event listener to handle coordinating the move of the dials and the HUD. Install this into another tab in your script order, give it a name that makes sense, and change the token id in the code to be the token ID of your HUD token, once you've added that token to your game:
// snippet to catch HUD moves
on('change:graphic', (obj, prev) => {
if (obj.id === '-MZxSB5CpRitlX7jjkck') {
let alignmacro = findObjs({type: 'macro',name:'AlignSentryDials'})[0];
sendChat('API', alignmacro.get('action'));
}
});
NOTE -- This is a band-aid to get you through your game; I would not release something coded specifically to your game or requiring you to edit the code yourself except that your time is short and I spent my time on the interface/action.
Macro Setup
I had three macros to animate this.
AlignSentryDials: Checks the position and rotation of the SentryBDial token (location based on the HUD's location and rotation based on the values of bar1, bar2, and bar3). Once you get the right image for SentryADial and get that token in and set up, you will have to add the mirror lines for handling its position and rotation.
!token-mod {{
--ignore-selected
--ids @(SentryBDial.token_id)
--set
rotation|=[\][\]@(SentryBDial.bar2)+(@(SentryBDial.bar1)-@(SentryBDial.bar3))*360/@(SentryBDial.bar1)\]\]
width|[\][\]@(SentryHUD.width)/2\]\]
height|[\][\]@(SentryHUD.height)\]\]
top|@(SentryHUD.top)
left|[\][\]@(SentryHUD.left)+@(SentryBDial.width)/2\]\]
}}
FireSentryB: This was a simple token-mod call to decrement the SentryB ammunition. I hard-coded it to 25, but you could query for the number and enter it ad hoc. It also uses APILogic to craft a custom message depending on the current state of the ammunition for SentryBDial. After firing, it runs the AlignSentryDials macro.
!{&if @(SentryBDial.bar3)>25}SentryB Fires 25 rounds...{&elseif @(SentryBDial.bar3)>0}SentryB fires @(SentryBDial.bar3) rounds and is empty.{&else}SentryB is out of ammunition{&end}{&simple}
!token-mod {{
--ignore-selected
--ids @(SentryBDial.token_id)
--set bar3|[\][\]{0,@(SentryBDial.bar3)-25}kh1\]\]
bar3_max|
}}
!#(AlignSentryDials)
ReloadSentryB: Another simple token-mod call to reset the ammunition supply of SentryBDial; queries for how many rounds it should have. It, too, runs the AlignSentryDials macro to properly rotate the dials.
!token-mod {{
--ignore-selected
--ids @(SentryBDial.token_id)
--set
bar3|?{Rounds to load|500}
bar3_max|
}}
!#(AlignSentryDials)
What's Left
These macros are heavy with meta-script interactions, so if you have any questions about what some of the syntax means as you look to mirror the effect for SentryA, post back and I'll try to explain what each part does. SentryA will require a "FireSentryA" macro, a "ReloadSentryA" macro, and it will need to be added to the "AlignSentryDials" macro to be nudged appropriately when the HUD is moved. You might also want a "FireBothSentries" macro that would trigger them firing, decrement their individual counts, and then call the Align macro one time.
Hopefully this gets you where you wanted to go!