To solve this problem, we need to define the decision variables, objective function, and constraints. Let's denote:

- $M$ as the amount invested in the mining industry,
- $L$ as the amount invested in the logging industry.

The town has $100,000 available for investment, so we have:
\[ M + L \leq 100,000 \]

The town wants to invest a minimum of 30% in the mining industry, which translates to:
\[ M \geq 0.3 \times 100,000 \]
\[ M \geq 30,000 \]

And they want to invest at most 55% in the logging industry, which gives us:
\[ L \leq 0.55 \times 100,000 \]
\[ L \leq 55,000 \]

The return on investment for the mining industry is 9%, and for the logging industry, it's 5%. The total return can be calculated as:
\[ \text{Return} = 0.09M + 0.05L \]

We aim to maximize this return.

Now, let's translate these constraints and the objective function into Gurobi code in Python:

```python
from gurobipy import *

# Create a model
m = Model("Investment_Optimization")

# Define decision variables
M = m.addVar(name="Mining_Investment", lb=30000)  # Minimum investment in mining is $30,000
L = m.addVar(name="Logging_Investment", ub=55000)  # Maximum investment in logging is $55,000

# Objective function: Maximize return on investment
m.setObjective(0.09*M + 0.05*L, GRB.MAXIMIZE)

# Constraint: Total investment should not exceed $100,000
m.addConstr(M + L <= 100000, name="Total_Investment")

# Optimize the model
m.optimize()

# Print results
if m.status == GRB.OPTIMAL:
    print("Optimal solution found:")
    print(f"Invest ${M.x:.2f} in mining")
    print(f"Invest ${L.x:.2f} in logging")
    print(f"Total return: ${0.09*M.x + 0.05*L.x:.2f}")
else:
    print("No optimal solution found")

```