设备控制模式程序解析
机器人应用场景
分析机器模式转换的需求,通用的一些设备功能。
控制面板上面需要的操作按钮,一般有如下几种:
1/自动模式按钮
2/手动模式按钮
3/回原点模式按钮
4/复位模式按钮
5/单步运行模式按钮
6/运行按钮
7/停止按钮
通过这些按钮,定义变量,写按钮的逻辑
这些模式按钮按了之后,需要加一些逻辑条件
(比如,按自动按钮,想要输出自动按钮已经被按下去这个信号,需要没有急停信号,安全状态都符合才可以)
得出程序内逻辑输出结果。但是整个程序块的输出结果也需要,程序块的输出结果就是给其它程序块调用,其它地方需要用到手动,自动模式,就调用这个程序快既可以。
思路就是,程序内输出结果,再加上限制条件,即可得出程序快输出结果。
具体步奏如下:
Step1:ST编程方法,先定义一个控制面板控制模式(手动模式,自动模式,原点模式,单步模式,复位模式)按钮信号的结构
TYPE Machine_Mode_Control :
STRUCT bNOMODE_SELECTED:BOOL; bAUTO_SELECTED:BOOL; bMANUAL_SELECTED:BOOL; bHOME_SELECTED:BOOL; bSIGNAL_SELECTED:BOOL; bRESET_SELECTED:BOOL;
END_STRUCT
END_TYPE
这个结构对应的是控制面板按钮的信号,程序里就使用这些信号作逻辑处理。
Step2:定义一个枚举结构,对应控制面板控制模式按钮的程序内逻辑输出结果(如按手动按钮,则手动按钮选择这个信号被激活)。结构如下:
TYPE e_Machine_Mode_Select :( MODE_NOMODE_SELECTED, MODE_AUTO_SELECTED, MODE_MANUAL_SELECTED, MODE_HOME_SELECTED, MODE_SIGNAL_SELECTED, MODE_RESET_SELECTED):=MODE_NOMODE_SELECTED;
END_TYPE
这个结构和按钮信号逻辑对应,程序里需要加一些控制条件,得出这个结果。
Step3:定义一个枚举结构,程序内输出直接作为条件得到模块输出结果.
TYPE e_Machine_Mode :( MODE_NOMODE,
MODE_AUTO,
MODE_MANUAL,
MODE_HOME,
MODE_SIGNAL,
MODE_RESET):=MODE_NOMODE;
END_TYPE
这些变量直接给程序块外部调用,外部不需要写控制模式相关的逻辑程序了,用到即调用.
Step4:定义运行按钮和停止按钮结构。
TYPE Run_Control :
STRUCT
bSTART:BOOL;
bSTOP:BOOL;
END_STRUCT
END_TYPE
这个负责设备启动和停止,给个信号就行,不参与逻辑,所以不加到模式控制结构里。
到此为止程序需要的变量定义完成,开始编程,程序框架如下。
分为4段
第一段
(mode control)就是按钮信号,得出程序内逻辑结果.
第二段
(start select mode)这个结果为程序块输出结果,给外部调用。
第三段
(stop immediately request)停止按钮逻辑,按下立即停止
第四段
(cycle stop request)停止按钮逻辑,按下循环停止,即当前产品做完停止。
(*第一段######Mode control ######*)
IF
strModeControl.bNOMODE_SELECTED
##按钮无输入信号
THEN
eModeSelect:=MODE_NOMODE_SELECTED;
##则得出无模式的逻辑结果
ELSIF (strModeControl.bHOME_SELECTED) AND eMachineMode<>Mode_Home
##原点按钮
THEN
eModeSelect:=MODE_MANUAL_SELECTED;
##加上逻辑判断得出回原点模式ELSIF strModeControl.bMANUAL_SELECTED
THEN
eModeSelect:=MODE_AUTO_SELECTED;
ELSIF strModeControl.bAUTO_SELECTED
THEN
eModeSelect:=MODE_HOME_SELECTED;
ELSIF strModeControl.bRESET_SELECTED
THEN
eModeSelect:=MODE_SIGNAL_SELECTED;
ELSIF strModeControl.bSIGNAL_SELECTED
THEN
eModeSelect:=MODE_RESET_SELECTED;
END_IF
(*第二段######Start the select mode######*)
CASE eModeSelect OF MODE_NOMODE_SELECTED:
eMachineMode:=MODE_NOMOD;
(*注释为无效的选择模式*) MODE_AUTO_SELECTED: eMachineMode:=MODE_AUTO; MODE_MANUAL_SELECTED: eMachineMode:=MODE_MANUAL; MODE_HOME_SELECTED: eMachineMode:=MODE_HOME; MODE_SIGNAL_SELECTED: eMachineMode:=MODE_SIGNAL; MODE_RESET_SELECTED: eMachineMode:=MODE_RESET;
END_CASE
(*第三段#立即停止#*)
IF strRunControl.bSTOP
THEN
bStopImmediately:=TRUE;
END_IF
(*第四段#循环停止#*)
(*按停止按钮超过一秒钟时间*)
tDelayStop(IN:=strRunControl.bSTOP , PT:=t#1s , Q=> , ET=> );
IF tDelayStop.Q=TRUE
THEN
bAutoStopping:=TRUE;
END_IF
程序框架举例
大体思路完成,其它程序怎么调用看流程需求,后面给大家多分享模块化编程的思路,喜欢记得关注下,发文不易[呲牙]