exponenta event banner

Совместное использование строковых данных с пользовательским кодом C

В этом примере показано, как совместно использовать строковые данные между диаграммой Stateflow ® и пользовательским кодом C. Можно экспортировать строковые данные из диаграммы Stateflow в функцию C с помощью str2ascii оператор. Можно импортировать выходные данные кода C в виде строковых данных в диаграмму Stateflow с помощью ascii2str оператор. Совместное использование данных с пользовательским кодом позволяет расширить возможности Stateflow и использовать программное обеспечение для использования преимуществ существующего кода. Дополнительные сведения см. в разделе Повторное использование пользовательского кода в диаграммах Stateflow.

Эта модель содержит диаграмму Stateflow, которая вызывает две функции из пользовательского кода C. Во время моделирования диаграмма принимает в качестве входных данных строку, содержащую текст, представляющий число с плавающей запятой в экспоненциальной форме. Диаграмма состоит из трех состояний, которые:

  • Поиск по входной строке начальных нулей, десятичной запятой и e.

  • Разбор строки на числа с двойной точностью, представляющие значительную и экспоненциальную части ввода.

  • Объедините числовую информацию в выходную строку, выражающую входные данные в научной нотации.

Например, если входная строка "0123.456e789", то диаграмма выводит строку "0123.456e789 means 1.23456 times ten to the 791th power".

Экспорт строковых данных из потока состояний в C

Вы можете использовать str2ascii для преобразования строковых данных в массив, который можно экспортировать из диаграммы Stateflow в пользовательскую функцию кода C.

  1. В функции пользовательского кода объявите входную переменную как имеющую тип char*.

  2. В диаграмме Stateflow преобразуйте строку в массив типа uint8 путем вызова оператора str2ascii.

  3. Вызовите функцию пользовательского кода, передав uint8 массив в качестве входных данных.

Например, на предыдущей диаграмме Search состояние преобразует входную строку str в uint8 множество Asrt. Search состояние передает этот массив как вход в пользовательскую функцию кода searchfun:

extern void searchfun(int* nout, char* strin)
{
   nout[0] = strspn(strin,"0");
   nout[1] = strcspn(strin,".e");
   nout[2] = strcspn(strin,"e");
   nout[3] = strlen(strin);
}

Search состояние вызывает эту функцию с помощью команды searchfun(n,Astr). Функция заполняет целочисленный массив n с этими значениями:

  • n[0] содержит число начальных нулей во входной строке str.

  • n[1] содержит число символов перед первым экземпляром десятичной запятой или e. Этот результат показывает количество символов перед десятичной запятой в str.

  • n[2] содержит количество символов перед первым экземпляром e. Этот результат обеспечивает количество символов в значимом str.

  • n[3] содержит длину входной строки str.

Parse состояние использует эти результаты для извлечения значений значимой и экспоненциальной частей входных данных.

Импорт строковых данных из C в Stateflow

Можно импортировать строковые данные в диаграмму Stateflow, передав указатель на массив типа uint8 как вход в пользовательскую функцию C.

  1. В функции пользовательского кода объявите входную переменную, содержащую указатель, как имеющую тип char*.

  2. Сохраните выходные строковые данные из пользовательской кодовой функции в местоположении, указанном указателем.

  3. В диаграмме Stateflow преобразуйте uint8 массив в строку путем вызова оператора ascii2str.

Например, на предыдущей диаграмме Merge состояние объединяет числовую информацию, полученную Parse состояние в выходную строку путем вызова пользовательской кодовой функции mergefun:

extern void mergefun(char* strout, char* strin, int in0, double in1, double in2)
{
   sprintf(strout, "%s means %1.*f times ten to the %dth power", strin, in0, in1, (int) in2);
}

Merge состояние вызывает mergefun функция с командой mergefun(Asout,Astr,y0,y1,y2):

  • Asout является массивом типа uint8 указывает на вывод пользовательской функции.

  • Astr является массивом типа uint8 соответствует входной строке диаграммы.

  • y0 - целое число, содержащее число цифр справа от десятичной запятой в значащем.

  • y1 и y2 - числа с двойной точностью, представляющие значительную и экспоненциальную части входного сигнала.

Функция mergefun вызывает функцию библиотеки C sprintf, объединение содержимого Astr, y1, и y2 и сохранение результата в ячейке памяти, указанной Aout. Диаграмма использует оператор ascii2str для преобразования выходных данных в строку sout. Таким образом, модель импортирует строку, созданную функцией пользовательского кода, обратно в Stateflow.

См. также

| | | |

Связанные темы