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

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

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

  • Ищите входная строка для продвижения обнуляет, десятичная точка и e.

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

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

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

Экспортируйте данные о строке от Stateflow до C

Можно использовать оператор str2ascii, чтобы преобразовать данные о строке в массив, который можно экспортировать от диаграммы Stateflow до пользовательской функции кода С.

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

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

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

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

extern void searchfun(int* n, 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(Aout,Astr,y0,y1,y2):

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

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

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

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

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

Смотрите также

| | | |

Похожие темы