To solve the given optimization problem, we first need to translate the natural language description into a symbolic representation. This involves defining variables for the quantities of interest (chocolate and vanilla ice cream cones), formulating the objective function that represents the profit, and listing all constraints based on the given conditions.

Let's define:
- $x_1$ as the number of chocolate ice cream cones sold,
- $x_2$ as the number of vanilla ice cream cones sold.

The objective is to maximize profit. Given that the profit per chocolate ice cream cone is $2 and per vanilla ice cream cone is $1.50, the objective function can be written as:
\[ \text{Maximize: } 2x_1 + 1.5x_2 \]

Constraints are based on the minimum and maximum sales requirements for each type of cone and the total number of cones available:
1. Sell at least 30 chocolate ice cream cones: $x_1 \geq 30$
2. Cannot sell more than 50 chocolate ice cream cones: $x_1 \leq 50$
3. Sell at least 20 vanilla ice cream cones: $x_2 \geq 20$
4. Cannot sell more than 60 vanilla ice cream cones: $x_2 \leq 60$
5. Total number of cones sold cannot exceed 70: $x_1 + x_2 \leq 70$

All variables are non-negative since they represent quantities of items.

Thus, the symbolic representation of the problem is:
```json
{
    'sym_variables': [('x1', 'number of chocolate ice cream cones'), ('x2', 'number of vanilla ice cream cones')],
    'objective_function': '2*x1 + 1.5*x2',
    'constraints': ['x1 >= 30', 'x1 <= 50', 'x2 >= 20', 'x2 <= 60', 'x1 + x2 <= 70']
}
```

Now, let's implement this problem using Gurobi in Python:

```python
from gurobipy import *

# Create a new model
m = Model("Ice_Cream_Sales")

# Define variables
x1 = m.addVar(lb=30, ub=50, name="chocolate_cones")  # Number of chocolate ice cream cones
x2 = m.addVar(lb=20, ub=60, name="vanilla_cones")    # Number of vanilla ice cream cones

# Define the objective function
m.setObjective(2*x1 + 1.5*x2, GRB.MAXIMIZE)

# Add constraint for total number of cones
m.addConstr(x1 + x2 <= 70, name="total_cones")

# Optimize model
m.optimize()

# Print solution
if m.status == GRB.OPTIMAL:
    print("Optimal solution found:")
    print(f"Chocolate ice cream cones to sell: {x1.x}")
    print(f"Vanilla ice cream cones to sell: {x2.x}")
    print(f"Total profit: ${m.objVal:.2f}")
else:
    print("No optimal solution found")
```