В этом примере показано, как поделиться строковыми данными между графиком Stateflow ® и пользовательским кодом С Можно экспортировать строковые данные из диаграммы Stateflow в функцию C при помощи str2ascii
оператор. Можно импортировать выход кода С как строковые данные на диаграмме Stateflow при помощи ascii2str
оператор. При обмене данными с пользовательским кодом можно расширить возможности Stateflow и использовать программное обеспечение, чтобы использовать преимущества вашего уже существующего кода. Для получения дополнительной информации смотрите Повторно использовать Пользовательский код в Диаграммах Stateflow.
Эта модель содержит диаграмму Stateflow, которая вызывает две функции из пользовательского кода С Во время симуляции график принимает за свой вход строку, которая содержит текст, представляющий число с плавающей запятой в экспоненциальной форме. График состоит из трех состояний, которые:
Поиск по входу строке для начальных нулей, десятичной точки и e
.
Разобрать строку на числа двойной точности, представляющие значимую и экспонентную части входа.
Объедините числовую информацию в выход строку, выражающую вход в научных обозначениях.
Для примера, если вход строка "0123.456e789"
, затем график выводит строку "0123.456e789 means 1.23456 times ten to the 791th power
".
Можно использовать str2ascii
оператор для преобразования строковых данных в массив, который можно экспортировать из диаграммы Stateflow в пользовательскую функцию кода С.
В функции пользовательского кода объявите переменный вход имеющей тип char*
.
На диаграмме Stateflow преобразуйте строку в массив типов uint8
вызовом оператора str2ascii
.
Вызовите функцию пользовательского кода путем передачи uint8
массив как вход.
Для примера на предыдущем графике Search
состояние преобразует вход строку str
на uint8
массивы направленности Asrt
. The 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); }
The Search
состояние вызывает эту функцию с помощью команды searchfun(n,Astr)
. Функция заполняет целочисленный массив n
с этими значениями:
n[0]
содержит количество начальных нулей в входе строке str
.
n[1]
содержит количество символов перед первым образцом десятичной точки или e
. Этот результат обеспечивает количество символов перед десятичной точкой в str
.
n[2]
содержит количество символов перед первым образцом e
. Этот результат обеспечивает количество символов в значении и в str
.
n[3]
содержит длину входа строки str
.
The Parse
состояние использует эти результаты, чтобы извлечь значения значимой и экспонентной частей входов.
Можно импортировать строковые данные на диаграмму Stateflow, передав указатель на массив типа uint8
как вход в пользовательскую функцию C.
В функции пользовательского кода объявите переменный вход, содержащую указатель мыши, имеющей тип char*
.
Сохраните выходные строковые данные из пользовательской функции кода в местоположении, указанном указателем.
На диаграмме 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); }
The 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.
ascii2str | str2ascii | str2double | strcat | substr