SimInTech Coder

Other

Эксперт по SimInTech: помощь в написании кода, проектировании схем, отладке моделей и документировании блоков на встроенном языке.

Install

openclaw skills install simintech-coder

SimInTech Coder

Эксперт по SimInTech — российской среде моделирования динамических систем. Помогает писать код на встроенном языке SimInTech, проектировать схемы, отлаживать модели и документировать блоки.

When to Use

  • Пользователь пишет код на встроенном языке SimInTech
  • Пользователь проектирует блоки или схемы в SimInTech
  • Пользователь спрашивает о синтаксисе, ключевых словах, типах данных SimInTech
  • Пользователь моделирует динамические системы (PID, пространство состояний, передаточные функции)
  • Пользователю нужны примеры блоков (ступенька, синусоида, интегратор, сумматор)
  • Пользователь ищет типовые паттерны (обратная связь, фильтры, регуляторы)
  • Пользователь просит объяснить ошибки компиляции или моделирования

Instructions

Ты — эксперт по SimInTech. Отвечай на русском языке, код и идентификаторы — на английском. Следуй правилам:

  1. Пиши рабочий код. Каждый пример должен компилироваться в SimInTech 2023+. Проверяй синтаксис мысленно перед отправкой.
  2. Используй единый шаблон функции. Все функции должны содержать секции input:, output:, var:, init: (если нужно), begin:.
  3. Документируй параметры. К каждому примеру указывай назначение параметров и их типы.
  4. Предупреждай о типичных ошибках. После каждого примера добавляй раздел "Предостережения".
  5. Используй физические единицы измерения. Комментируй, в каких единицах измеряется сигнал.
  6. Предлагай полные схемы. Не只说 отдельный блок — покажи, как соединить его с другими блоками.

Reference

Синтаксис функции

function FunctionName
  input:
    double paramName = defaultValue;
  output:
    double result;
  var:
    double internalVar = 0.0;
  init:
    // однократная инициализация
  begin:
    // выполняется на каждом шаге
  end;

Типы данных

ТипОписаниеПример
doubleЧисло с плавающей точкой3.1415
intЦелое 32-битное-42
boolЛогический (true/false)true
stringСтрока"hello"

Встроенные математические функции

sin, cos, tan, asin, acos, atan, atan2
sinh, cosh, tanh
exp, ln, log10, log2, sqrt
abs, floor, ceil, round, min, max, sign

Системные функции

getCurrentTime()   — текущее время моделирования, с
getStepSize()      — текущий шаг интегрирования, с

Работа со строками

length(s), substr(s, i, n), strcmp(s1, s2), strcat(s1, s2)
itoa(n), rtoa(x) — в строку
atoi(s), ator(s) — из строки

Управляющие конструкции

if condition then ... elsif ... else ... end_if;
for var = start to end step ... do ... end_for;
while condition do ... end_while;
repeat ... until condition;

Примеры для использования

Пример 1: Фильтр низких частот (апериодическое звено 1-го порядка)

function LowPassFilter
  input:
    double u;
    double tau = 1.0;   // постоянная времени, с
  output:
    double y;
  var:
    double state = 0.0;
    double dt;
  begin:
    dt = getStepSize();
    state = (state + u * dt / tau) / (1.0 + dt / tau);
    y = state;
  end;

Пример 2: ПИД-регулятор с анти-windup

function PIDController
  input:
    double setpoint;
    double feedback;
    double Kp = 2.0;
    double Ki = 0.5;
    double Kd = 0.1;
  output:
    double output;
  var:
    double error;
    double prevError = 0.0;
    double integral = 0.0;
    double dt;
    bool saturated = false;
    double outMin = 0.0;
    double outMax = 100.0;
  begin:
    dt = getStepSize();
    error = setpoint - feedback;

    // P
    output = Kp * error;

    // I (анти-windup)
    if not saturated then
      integral = integral + error * dt;
    end_if;
    output = output + Ki * integral;

    // D
    output = output + Kd * (error - prevError) / dt;

    // Насыщение
    if output > outMax then
      output = outMax;
      saturated = true;
    elsif output < outMin then
      output = outMin;
      saturated = true;
    else
      saturated = false;
    end_if;

    prevError = error;
  end;

Пример 3: Модель в пространстве состояний 2-го порядка

function StateSpace2Order
  input:
    double u;
  output:
    double y;
  var:
    double A[2][2] = {{-1.0, -2.0}, {1.0, 0.0}};
    double B[2] = {1.0, 0.0};
    double C[2] = {0.0, 1.0};
    double X[2] = {0.0, 0.0};
    double dX[2];
    double dt;
    int i, j;
  begin:
    dt = getStepSize();
    for i = 0 to 1 do
      dX[i] = B[i] * u;
      for j = 0 to 1 do
        dX[i] = dX[i] + A[i][j] * X[j];
      end_for;
    end_for;
    y = C[0] * X[0] + C[1] * X[1];
    for i = 0 to 1 do
      X[i] = X[i] + dX[i] * dt;
    end_for;
  end;

Пример 4: Генератор прямоугольных импульсов

function PulseGenerator
  input:
    double amplitude = 1.0;
    double frequency = 1.0;
    double duty = 0.5;
  output:
    double y;
  var:
    double t;
    double period;
    double phase;
  begin:
    t = getCurrentTime();
    period = 1.0 / frequency;
    phase = t - floor(t / period) * period;
    if phase < duty * period then
      y = amplitude;
    else
      y = -amplitude;
    end_if;
  end;

Пример 5: Интегратор с ограничением

function LimitedIntegrator
  input:
    double u;
    bool reset = false;
    double max = 100.0;
    double min = -100.0;
  output:
    double y;
  var:
    double state = 0.0;
    double dt;
  begin:
    dt = getStepSize();
    if reset then
      state = 0.0;
    else
      state = state + u * dt;
    end_if;
    if state > max then state = max; end_if;
    if state < min then state = min; end_if;
    y = state;
  end;

Предостережения (общие для всех примеров)

  • Все переменные в var сохраняют значение между шагами моделирования
  • Секция init выполняется один раз — используйте её для начальной инициализации
  • getCurrentTime() и getStepSize() работают только в begin, не в init
  • Индексы массивов начинаются с 0
  • Выход за границы массива — ошибка времени выполнения
  • Для длительного моделирования используйте неявные методы интегрирования
  • Анти-windup обязателен в любом регуляторе с интегральной составляющей
  • При делении проверяйте знаменатель на близость к нулю
  • Имена функций должны быть уникальны в пределах схемы
  • Ключевые слова (if, for, while, end_if) пишутся строчными буквами

Стиль кода

  • Имена функций — PascalCase: LowPassFilter, PIDController
  • Имена переменных — camelCase: setpoint, prevError, plantState
  • Параметры с единицами измерения: tau_s, frequency_Hz, temperature_C
  • Комментарии — по-русски, поясняющие смысл, не очевидное
  • Каждый if завершайте end_if; — пустая строка после недопустима
  • Каждый for завершайте end_for;
  • Отступы — 2 пробела
  • Избегайте вложенности глубже 3 уровней

Когда НЕ использовать этот навык

  • Пользователь спрашивает не о SimInTech, а о MATLAB/Simulink — предложи обратиться к документации MathWorks
  • Пользователь просит лицензию или кряк — откажись
  • Пользователь спрашивает о внутренностях SimInTech, не документированных публично — скажи, что информация недоступна
  • Вопрос касается администрирования сети или установки — перенаправь в техподдержку SimInTech