# HSM_Creater **Repository Path**: code_killer_luke/hsm_creater ## Basic Information - **Project Name**: HSM_Creater - **Description**: No description available - **Primary Language**: C - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 4 - **Forks**: 0 - **Created**: 2021-03-28 - **Last Updated**: 2024-03-21 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # 层次状态机(HSM)的使用方法 ### 1、 建立Enterprise Architect工程 ##### (1) 新建工程 ​ 打开Enterprise Architect,新建工程 ##### (2) 创建状态机 ​ 点击Browser里面第二个图标image-20210324220142216,创建新package(选择Create Diagram)image-20210324220315898,在New Diagram界面Type栏选择UML-Behaviorimage-20210324220545024,出现的Diagram选择State Machineimage-20210324222118978 ##### (3) 绘制状态图 ​ image-20210324222451654在Toolbox里选择用到的元素 双击某个状态,选择Design-Editors-Features可以添加事件image-20210324222602122双击转换箭头可以添加触发事件,监护条件和动作等![image-20210324222911172](README.assets/image-20210324222911172.png) ##### (4) 导出 ​ 完成状态图后选择Publish-Publish-Other Formats ![image-20210324223833319](README.assets/image-20210324223833319.png) 选择UML 2.1 (XMI 2.1) image-20210324223958759 点击导出,得到XMI文件 ### 2、生成状态机的代码 ##### (1) 载入 打开StateMachineGenerator软件,load刚才的XMI文件 ![image-20210324224531058](README.assets/image-20210324224531058.png) ##### (2)生成 点击generate,自己命名,生成对应的.c和.h文件![image-20210325210214588](README.assets/image-20210325210214588.png) ### 3、使用方法 ##### (1) 开始HSM ``` TestStateMachine_HSM_Create(); TestStateMachine_HSM_Start(); ``` ##### (2)填写相应的监护条件和动作等 在StateMachineGenerator生成的.c文件中有各个事件对应的动作以及监护条件等,加入自己的动作和条件即可 ```c //监护条件 int battery_is_good(int id) { (void)id; if(battery == 1) { uprintf("HSM_RESULT_OK\n\r"); return HSM_RESULT_OK; } else { uprintf("HSM_RESULT_NOK\n\r"); return HSM_RESULT_NOK; } } //entry动作 void welcom(int id) { (void)id; uprintf("welcom\n\r"); } ``` ##### (3)事件转换 在有事件触发的地方使用: ``` TestStateMachine_HSM_onEvent(event); ``` ##### (4)查询状态 使用 ``` TestStateMachine_hsm_getCurrentState(void) ``` 来查询当前所处的状态,返回int型 ### 4、注意 ##### (1)重复定义问题 ​ ①在EventIDList和statelist里,MAX_EVENTS和MAX_STATEID会与别的文件重复定义,推荐加上下标_XXX(XXX为状态机名字) ​ ②有些guard和动作的函数的定义和声明会重复,只留下一个,其余注释掉就行