To tackle this problem, we first need to define the symbolic representation of the variables and then translate the natural language description into an algebraic form that can be solved using linear programming.

Let's denote:
- $x_1$ as the amount of enriched hay fed to each cow per day (in kilograms).
- $x_2$ as the amount of chicken scraps fed to each cow per day (in kilograms).

The objective function aims to minimize the total cost of feeding all 30 cows. The cost can be represented as:
\[200x_1 + 350x_2\]

However, since we're minimizing the cost for all 30 cows, the actual objective function should account for this:
\[30(200x_1 + 350x_2)\]
Simplifying gives us:
\[6000x_1 + 10500x_2\]

The constraints based on the nutritional requirements are as follows:

1. Each cow requires a minimum of 1.5 kilograms of protein per day.
   - Enriched hay contains 0.3 kilograms of protein per kilogram, and chicken scraps contain 0.6 kilograms of protein per kilogram.
   - Thus, we have: \[0.3x_1 + 0.6x_2 \geq 1.5\]

2. Each cow requires a minimum of 0.5 kilograms of minerals per day.
   - Enriched hay contains 0.15 kilograms of minerals per kilogram, and chicken scraps contain 0.05 kilograms of minerals per kilogram.
   - Thus, we have: \[0.15x_1 + 0.05x_2 \geq 0.5\]

3. Each cow can have at most 0.5 kilograms of vitamins per day.
   - Enriched hay contains 0.1 kilograms of vitamins per kilogram, and chicken scraps contain 0.2 kilograms of vitamins per kilogram.
   - Thus, we have: \[0.1x_1 + 0.2x_2 \leq 0.5\]

The symbolic representation in JSON format is:
```json
{
    'sym_variables': [('x1', 'amount of enriched hay'), ('x2', 'amount of chicken scraps')], 
    'objective_function': '6000*x1 + 10500*x2', 
    'constraints': ['0.3*x1 + 0.6*x2 >= 1.5', '0.15*x1 + 0.05*x2 >= 0.5', '0.1*x1 + 0.2*x2 <= 0.5']
}
```

Now, translating this into Gurobi code in Python:
```python
from gurobipy import *

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

# Define the variables
x1 = m.addVar(lb=0, name="enriched_hay")
x2 = m.addVar(lb=0, name="chicken_scraps")

# Set the objective function
m.setObjective(6000*x1 + 10500*x2, GRB.MINIMIZE)

# Add constraints
m.addConstr(0.3*x1 + 0.6*x2 >= 1.5, "protein_requirement")
m.addConstr(0.15*x1 + 0.05*x2 >= 0.5, "mineral_requirement")
m.addConstr(0.1*x1 + 0.2*x2 <= 0.5, "vitamin_limitation")

# Optimize the model
m.optimize()

# Print the results
if m.status == GRB.OPTIMAL:
    print(f"Optimal solution: x1 = {x1.x}, x2 = {x2.x}")
    print(f"Total cost: {m.ObjVal}")
else:
    print("No optimal solution found")
```