前言
在某些场合我们需要知道当前的伺服的原点信号、正反极限是否有正常的接入到对应的伺服驱动中,或者需要知道当前的电机转速或者电流。一般情况下是可以通过ASDASoft 软件进行监控获取相关的信号或者值。可是在正常是设备中如果也想获取这些呢?如果采用默认的周期通信数据,那么有可能会过多的占用程序的同步周期。
正文
本功能块就是为了在不占用周期通信数据带宽的情况下,利用一个周期任务的程序去调动本功能块,从而实现对驱动的相关信息进行读取。
相关映射参数 自动SDO操作
- P0-17 16#0039 DI状态
- P0-18 16#0040 DO状态
- P0-19 16#0052 电机转速
- P0-20 16#0054 扭力%
- P0-21 16#0055 电流A
由于在自动SDO页面输入的是10进制,所以需要根据上面的自行转换一下。
相关读取参数
- P0-09
- P0-10
- P0-11
- P0-12
- P0-13
功能块变量声明
功能块程序
DMC_ReadParameterMotion[1](EN:= TRUE,Axis:= UsiAxisNumber,Index:= 16#2009,SubIndex:= 16#0);
DMC_ReadParameterMotion[2](EN:= TRUE,Axis:= UsiAxisNumber,Index:= 16#200a,SubIndex:= 16#0);
DMC_ReadParameterMotion[3](EN:= TRUE,Axis:= UsiAxisNumber,Index:= 16#200b,SubIndex:= 16#0);
DMC_ReadParameterMotion[4](EN:= TRUE,Axis:= UsiAxisNumber,Index:= 16#200c,SubIndex:= 16#0);
DMC_ReadParameterMotion[5](EN:= TRUE,Axis:= UsiAxisNumber,Index:= 16#200d,SubIndex:= 16#0);
CASE UiStep OF
1:
DMC_ReadParameterMotion[1].Execute := TRUE ;
UiStep := 10 ;
10:
IF DMC_ReadParameterMotion[1].Done THEN
DiDIStatus := UDINT_TO_DINT(In:= DMC_ReadParameterMotion[1].Data) ;
DMC_ReadParameterMotion[1].Execute := FALSE ;
UiStep := 2 ;
END_IF;
2:
DMC_ReadParameterMotion[2].Execute := TRUE ;
UiStep := 20 ;
20:
IF DMC_ReadParameterMotion[2].Done THEN
DiDOStatus := UDINT_TO_DINT(In:= DMC_ReadParameterMotion[2].Data) ;
DMC_ReadParameterMotion[2].Execute := FALSE ;
UiStep := 3 ;
END_IF;
3:
DMC_ReadParameterMotion[3].Execute := TRUE ;
UiStep := 30 ;
30:
IF DMC_ReadParameterMotion[3].Done THEN
DiActMotorSpeed := UDINT_TO_DINT(In:= DMC_ReadParameterMotion[3].Data) ;
DMC_ReadParameterMotion[3].Execute := FALSE ;
UiStep := 4 ;
END_IF;
4:
DMC_ReadParameterMotion[4].Execute := TRUE ;
UiStep := 40 ;
40:
IF DMC_ReadParameterMotion[4].Done THEN
DiActMotorTrq := UDINT_TO_DINT(In:= DMC_ReadParameterMotion[4].Data) ;
DMC_ReadParameterMotion[4].Execute := FALSE ;
UiStep := 5 ;
END_IF;
5:
DMC_ReadParameterMotion[5].Execute := TRUE ;
UiStep := 50 ;
50:
IF DMC_ReadParameterMotion[5].Done THEN
DiActMotorCur := UDINT_TO_DINT(In:= DMC_ReadParameterMotion[5].Data) ;
DMC_ReadParameterMotion[5].Execute := FALSE ;
UiStep := 1 ;
END_IF;
ELSE
DMC_ReadParameterMotion[1].Execute := FALSE ;
DMC_ReadParameterMotion[2].Execute := FALSE ;
DMC_ReadParameterMotion[3].Execute := FALSE ;
DMC_ReadParameterMotion[4].Execute := FALSE ;
DMC_ReadParameterMotion[5].Execute := FALSE ;
END_CASE;
在新程序中调用本功能块
程序-周期读取
程序变量声明
程序
IF NOT bMessageReturn THEN
AxisMessage.UiStep := 1 ;
bMessageReturn := TRUE ;
END_IF;
AxisMessage(UsiAxisNumber:= 1);
(*
AxisMessage.DiDIStatus
AxisMessage.DiDIStatus
AxisMessage.DiActMotorSpeed
AxisMessage.DiActMotorCur
AxisMessage.DiActMotorTrq
*)
功能块的相关输出都可以直接拿来运算或者传输到触摸屏显示的变量
结尾
通过新建任务 - 周期任务 - 调用程序 - 调用本功能块 即可实现前言中所需的功能。
Log:
2021-01-04 发布本文