• codesys虚轴


    虚轴

    1. Act 回馈
    2. Offset 末端设置
    3. SM_Drive_Virtual_1.fActPosition '电机反馈位置'
    4. SM_Drive_Virtual_1.fLastActVelocity '电机反馈速度'
    5. SM_Drive_Virtual_1.fLastPositionOffset '刀具末端位置偏置'
    6. SM_Drive_Virtual_1.fSetPosition '设置虚轴位置 LF'

                    SM3_Basic.AXIS_REF_VIRTUAL_SM3

                                       AXIS_REF_SM3【父类】

    1. 【虚轴】是codesys的标准参考轴。
    2. 就跟房子的单位【平方】一样。
    3. 手轮/计数io/【自由编码器】--------|-----【虚轴】【凸轮】-----|--【自由编码器】
    4. 【虚轴】-------------| |--【虚轴】
    5. 【实轴ECAT】---------| |--【实轴ECAT】
    6. 【实轴CAN】----------| |--【实轴CAN】
    7. 【位置控制驱动器】----| |--【位置控制驱动器】
    8. 【虚轴】》齿轮比,凸轮等》【虚轴】
    9. 【虚轴】》【实轴】 //这个一般用于一拖多
    10. 【虚轴】》【脉冲轴】 //这个要看固件功能
    11. SMC_AXIS_STATE (ENUM) 状态:
    12. power_off 0 PLCopen calls this state: “Disabled”
    13. errorstop 1
    14. stopping 2
    15. standstill 3 '准备'
    16. discrete_motion 4
    17. continuous_motion 5
    18. synchronized_motion 6
    19. homing 7

    成员

    SM_Drive_Virtual_1.fLastActPosition              最后电机反馈位置  12.3456

    SM_Drive_Virtual_1.fLastPositionOffset   刀具末端位置偏移【父1215参数】

     SM_Drive_Virtual.fLastActVelocity                  最后电机反馈速度  0.00

    修改虚轴坐标

     SM_Drive_Virtual_1.AXIS_REF_SM3.fActPosition

    概述:codesys里有3个轴:

    1. 自由编码器 SM3_Basic.FREE_ENCODER_REF
    2. 【位置】.diEncoderPosition
    3. 禾川编码器 hsi_cnt.diCurCountValue; //编码器位置
    4. 虚轴 SM3_Basic.AXIS_REF_VIRTUAL_SM3
    5. 【位置】.fLastActPosition 'fActPosition'
    6. 【速度】.fLastActVelocity
    7. 实轴ECAT SM3_Drive_ETC_DS402_CyclicSync.AXIS_REF_ETC_DS402_CS;
    8. 【位置】.fLastActPosition fActPosition
    9. 【速度】.fLastActVelocity
    10. 实轴CAN _3SCOS.CANRemoteDevice

    流程:【高速输入:采集AB脉冲带》自由编码器带》虚轴带》实轴】 

    1虚轴:

    1. 用法和实轴一样。一般用于,一拖多。
    2. 【手轮/高速输入/自由编码器】--------|-----【虚轴】-----|--【自由编码器】
    3. 【虚轴】-------------| |--【虚轴】
    4. 【实轴ECAT】---------| |--【实轴ECAT】
    5. 【实轴CAN】----------| |--【实轴CAN】
    6. 【位置控制驱动器】----| |--【位置控制驱动器】

     2编码器带虚轴:

    3虚轴带实轴:

    GearIn和JOG必须在ecat线程内运行。【因为采集周期】

    【1】计数io---位置:

            【计数采集自由编码器虚轴》实轴】

    采集的值由硬件完成,所以放哪个线程内不会影响采集精度。 

    1. // QQ750273008 // 禾川Q---高速计数器
    2. // 硬件引脚:【A】【B】【Z】【锁存】 // Falling下降沿
    3. // 功能:【比较】【脉冲密度】【锁存】【重载】 //[Z]引脚用于重载值刷新
    4. // 输出:【密度值】【当前计数值】【锁存值】【计数器状态字】
    5. hsi_cnt(
    6. //【1】通道
    7. wDriveID:= 0, //【WORD】通道0~7,hsi_cnt到【hsi_cnt_7】
    8. //【2】计数总开关
    9. bCounterEnable:= 1 , //【BOOL】计数器功能使能位,高电平有效
    10. diCntMinValue:= -10000, //【DINT】 【当前计数值最小值 】
    11. diCntMaxValue:= 10000, //【DINT】 【当前计数值最大值 】
    12. // 计数模式
    13. wCountMode:= 2#0000,//【模式0】 //【WORD】计数模式与计数极性设置, bit[3] : 计数极性配置 ,bit[2:0] : 计数模式配置
    14. //[0]AB脉冲1倍速【A高电平时:B上升沿加,B下降沿减】
    15. //[1]AB脉冲2倍速
    16. //[2]AB脉冲4倍速
    17. //[3]【B脉冲加,A脉冲减 】 // 1相位2输入脚【上升沿】
    18. //[4]B脉冲,【引脚A低加高减】 // 1相位1硬件模式输入脚【B负责脉冲,A负责加减方向】
    19. //[5]B脉冲,【bSoftDirection标志位,低加高减】 // 1相位1软件模式输入脚
    20. bSoftDirection:= , //【BOOL】计数模式[5]时有效,低加高减
    21. //【3】比较值事件
    22. bEventEnable:=0 , //【BOOL】比较事件触发使能位,高电平有效 【产品打包计数】
    23. diEventCmpValue:= , //【DINT】比较值【比较计数值】,diEventCmpValue==diCurCountValue时, 将触发计数器比较一致事件
    24. //【4】脉冲密度
    25. bDspdEnable:=1 , //【BOOL】脉冲密度使能位,高电平有效,,,脉冲密度测量,单位时间设置【单位ms】
    26. wMeasureUnitTime:=1000 , //【WORD】脉冲密度测量,单位时间设置【单位ms】 // 单位时间内,获取脉冲数量
    27. //【5】锁存引脚 【和】Z脉冲脚
    28. bLatchEnable:=1 , //【BOOL】锁存开关,高电平有效,硬件脚触发,标记计数位置
    29. wHardTrgMethod:=2#00010001 , //【WORD】硬件触发端子,bit[6:4]: Latch【锁存端子】检查设置 ,bit[2:0]: 【Z相端子】检查设置
    30. // [0]边沿检测失能 【关闭】
    31. // [1]上升沿触发有效 【0001】
    32. // [2]下降沿触发有效 【0010】
    33. // [3]升降沿触发有效
    34. //【注:】Z脉冲用于刷新重载值
    35. bSoftPreTrg:= , //【BOOL】触发【重载】 当该位由0->1时,diSoftPreValue将被写入到diCurCountValue
    36. //【重载值】:填编码器圈脉冲 // [0]校零,解决脉冲干扰
    37. diSoftPreValue:=0 , //【DINT】计数【重载值】 ,当前计数预置值,Z相或【bSoftPreTrg】预置触发后, 该数值将被写入diCurCountValue
    38. BZport_sel:= 6, //【BYTE】 Z相端子选择
    39. // 0 : X0将被选择作为Z相端子
    40. // 1 : X1将被选择作为Z相端子
    41. // ........
    42. // 15 : X15将被选择作为Z相端子
    43. Blatch_sel:= 7, //【BYTE】 锁存端子选择
    44. // 0 : X0将被选择作为【锁存】端子
    45. // 1 : X1将被选择作为【锁存】端子
    46. // ........
    47. // 15 : X15将被选择作为【锁存】端子 // 16为其他端子
    48. //【6】备用
    49. wCmpoutCtrlword:= , //【WORD】 // 预留,v103版本支持
    50. //【7】状态字
    51. wStatus_clr:= , //【WORD】状态位清除字
    52. // bit0 预留
    53. // bit1 预留
    54. // bit2 锁存完成标记清除
    55. // bit3 硬件预置数触发完成标记清除
    56. // bit4 软件预置数触发完成标记清除
    57. // bit5 计数器下溢标记清除
    58. // bit6 计数器上溢标记清除
    59. // bit7 预留
    60. // bit8 比较中断触发标记清除
    61. // bit9 脉冲密度测量完成标记清除
    62. //
    63. bTabCmpEnable:= , //【BOOL】
    64. wStartNum:= , //【WORD】
    65. wEndNum:= , //【WORD】
    66. //========================================
    67. // C1脉冲密度:DINT;
    68. // C2当前计数值:DINT;
    69. // C3锁存值:DINT;
    70. // C4计数器状态字:WORD;
    71. diDspdFreqValue=> C1脉冲密度, //【DINT】 脉冲密度测量值
    72. diCurCountValue=> C2当前计数值 , //【DINT】 当前计数值
    73. diLatchData=> C3锁存值, //【DINT】 锁存值
    74. wCounterStatus=> C4计数器状态字); //【WORD】 计数器状态字
    75. //bit0: 计数器工作状态
    76. //bit1: 预留
    77. //bit2: 锁存完成标记
    78. //bit3: 硬件预置数触发完成
    79. //bit4: 软件预置数触发完成
    80. //bit5: 计数器下溢标记
    81. //bit6: 计数器上溢标记
    82. //bit7: 当前计数方向
    83. //bit8: 比较中断触发标记
    84. //bit9: 脉冲密度测量完成标记
    85. //
    86. SMC_FreeEncoder.diEncoderPosition:=hsi_cnt.diCurCountValue; //编码器位置
    87. //SMC_FreeEncoder.diEncoderPosition:=GVL.电位器1;
    88. // IoConfig_Globals.hsi_cnt.bSoftPreTrg ; // 编码器手动校零【 := True 】 // 解决编码器干扰

    【2】位置---自由编码器

    SMC_FreeEncoder.diEncoderPosition:=hsi_cnt.diCurCountValue;			//编码器位置	

    1. 【增量】比【应用单元】
    2. 10005 // 作用是给编码器赋值1000,编码器导程是5mm
    3. 【模数】这个不起作用,只是用于可视化,转多少mm后,电机转一圈。默认360mm后转一圈。

    【3】自由编码器---虚轴

    1. 虚轴【JOG】等函数,不能放在ecat线程内????? '放在MainTask'
    2. 同样只有【模数】这一个选项,用于导程mm
    3. 虚轴的作用是【一拖多】

    【4】虚轴---实轴Ecat

    每秒转速 := 每分钟转速 x 导程5 ÷ 60秒

    125对应1500转        500对应6000转

    1. SMC_TrackAxis '跟随'
    2. MC_CamIn '电子凸轮'
    3. MC_GearIn '电子齿轮'
    4. 没加ecat总线时,【JOG】【POWER】函数在main线程内。
    5. 加了ecat后,【JOG】只能在ecat线程内运行
    6. Master/Slave '主/从 轴'
    7. MC_CamIn (FB) '电子凸轮'
    8. MC_CamOut (FB)
    9. MC_GearIn (FB) '电子齿轮'
    10. MC_GearInPos (FB) 指定位置切入同步
    11. MC_GearOut (FB)
    12. MC_Phasing (FB) 修改主从轴【相位】
    13. Direct '直接'
    14. SMC_FollowPosition (FB)
    15. SMC_FollowPositionVelocity (FB)
    16. SMC_FollowSetValues (FB)
    17. SMC_FollowVelocity (FB)
    18. SMC_SetTorque (FB)
    19. SMC_TrackAxis (FB)
    20. SMC_TrackSetValues (FB)
    21. Direct Axis Control '直接轴控制'
    22. SMC_ControlAxisByPos (FB) 位置
    23. SMC_ControlAxisByPosVel (FB) 位置速度
    24. SMC_ControlAxisByVel (FB) 速度

    【5】位置---脉冲轴

    1. 编码器采集【位置】带【脉冲轴】无法实现,可变齿轮。
    2. 解决思路是:
    3. 【编码器】【自由编码器】【虚轴】{齿轮比}【虚轴】【脉冲轴】

    【6】虚轴带---can轴

    回零后,再按下stop 

    先按stop后,再按【点动】

     变量:

    1. FUNCTION_BLOCK FB_CAN轴
    2. VAR_IN_OUT
    3. can轴输入: _3SCOS.CANRemoteDevice;
    4. //ecat实轴输入:SM3_Drive_ETC_DS402_CyclicSync.AXIS_REF_ETC_DS402_CS;
    5. //axis: _3SCOS.CANRemoteDevice;//
    6. //编码器轴:SM3_Basic.FREE_ENCODER_REF;
    7. END_VAR
    8. VAR_INPUT
    9. f_齿轮比:REAL:=10000;// 齿轮比【圈脉冲】
    10. u1_电源:BOOL:=FALSE;// h6040
    11. u1_点正:BOOL:=FALSE;
    12. u1_点反:BOOL:=FALSE;
    13. u1_停止:BOOL:=FALSE;
    14. u1_复位:BOOL:=FALSE;
    15. u1_回零:BOOL:=FALSE;
    16. lf_零点偏置:LREAL:=1234;
    17. u1_速度模式:BOOL:=FALSE;
    18. u1_绝对模式:BOOL:=FALSE;
    19. u1_相对模式:BOOL:=FALSE;
    20. f_速度:REAL:=10;// h6081
    21. f_加速度:REAL:=10;// h6083
    22. f_减速度:REAL:=10;// h6084
    23. f_目标速度:REAL:=10;// h60FF
    24. f_绝对坐标:REAL:=5;// h607A
    25. f_相对坐标:REAL:=5;// h607A
    26. //=====================================
    27. // g6041:UINT:=16#250;//状态字
    28. // g6061:SINT;//模式
    29. // g6064:DINT;//位置
    30. // g606C:DINT;//速度
    31. // g6077:UINT;//力矩
    32. END_VAR
    33. VAR_OUTPUT
    34. //=============================================
    35. b伺服通信状态 :BOOL;
    36. e轴运行状态 :SMC_AXIS_STATE;
    37. e轴故障代码 :MC_ERROR_CO;
    38. f轴当前位置 :LREAL;
    39. f轴当前速度 :lREAL;
    40. f轴当前转矩 :REAL;
    41. END_VAR
    42. VAR
    43. //=======================
    44. x6041:UINT;// 状态字
    45. x6061:SINT;// 模式
    46. x6064:DINT;// 电机位置
    47. x606C:DINT;// 电机速度
    48. x6077:INT;// 电机力矩
    49. y6040:UINT;//控制字
    50. y6060:SINT;//模式
    51. y6081:UDINT;//速度
    52. y6083:UDINT;//加速
    53. y6084:UDINT;//减速
    54. y607A:DINT;//绝对坐标
    55. y60FF:DINT;//模式:速度
    56. y6071:INT;//模式:力矩
    57. y607C:DINT;//原点【偏置】
    58. //=====================================
    59. //AXIS: _3SCOS.CANRemoteDevice;// :=ADR(DMA882_CAN);
    60. Axis1: AXIS_REF_CO ; // 局部变量
    61. //==============================================
    62. MC_Power_CO :MC_Power_CO;
    63. MC_Home_CO :MC_Home_CO;
    64. MC_Reset_CO :MC_Reset_CO;
    65. MC_Stop_CO :MC_Stop_CO;
    66. MC_MoveVelocity_CO :MC_MoveVelocity_CO;//【速度模式】
    67. MC_MoveAbsolute_CO :MC_MoveAbsolute_CO;//【绝对定位】
    68. MC_MoveRelative_CO :MC_MoveRelative_CO;//【相对定位】
    69. MC_Jog_CO :MC_Jog_CO;//【点动】
    70. TON_0: ton;//【刷新定位】
    71. u16线程count: UINT;
    72. END_VAR

    程序:

    1. u16线程count:=u16线程count+1;
    2. axis1.pDevice:= ADR(can轴输入); //axis1.pDevice:= ADR(axis);
    3. axis1.In.wStatusWord:=x6041; // 状态字
    4. axis1.In.sActMode:=x6061; // 模式
    5. axis1.In.dActPosition:=x6064;// 电机位置
    6. axis1.In.dActVelocity:=x606C;// 电机速度
    7. axis1.In.dActTorque:=x6077; // 电机力矩
    8. // 修改0x6041默认值0x0250
    9. // IF gvl.h6041 = 16#0200
    10. // OR gvl.h6041 = 16#8270
    11. // OR gvl.h6041 = 16#0270
    12. //axis1.In.wStatusWord
    13. IF Axis1.In.wStatusWord =16#200 //【雷赛】默认0x0200,要改成 0x0250
    14. OR (Axis1.In.wStatusWord AND 16#0F) =16#00 // 8670,【xxx0】
    15. THEN
    16. Axis1.In.wStatusWord := 16#250;
    17. END_IF
    18. A00_功能块调用();
    19. y6040:=axis1.Out.wControlWord;
    20. y6060:=axis1.Out.sSetMode;
    21. y6083:=axis1.Out.dProfileAcc;
    22. y6084:=axis1.Out.dProfileDec;
    23. y607A:=axis1.Out.dTargetPos;
    24. y6081:=axis1.Out.dProfileVel;
    25. y60ff:=axis1.Out.dTargetVel;
    26. y6071:=axis1.Out.dTargetTor;//【力矩】
    27. y607C:=axis1.Out.dHomeOffset;// 原点偏置
    28. // 显示结果
    29. b伺服通信状态 :=Axis1.bCommunication; //---读取从站通信状态
    30. e轴运行状态 :=Axis1.nAxisState; //---读取轴运行状态
    31. e轴故障代码 :=Axis1.eErrorID[0]; //---读取当前的轴故障代码
    32. f轴当前位置 :=Axis1.fActPosition; //---读取伺服 反馈位置
    33. f轴当前速度 :=Axis1.fActVelocity; //---读取伺服 反馈速度
    34. f轴当前转矩 :=Axis1.fActTorque; //---读取伺服 反馈转矩

  • 相关阅读:
    【虚拟机】Vmware虚拟机桥接 Destination Host Unreachable 问题解决
    腾讯云镜像TencentOS Server操作系统介绍、性能稳定性测评
    Hive面试题系列第七题-同时在线问题
    Linux 环境部署
    Vue ElementUI el-tooltip 全局样式修改
    unity基础2-编辑器拓展
    Vue_安装vue脚手架
    springboot和vue:五、RESTful服务+HTTP状态码+swagger配置
    国内最受欢迎的电商API接口调用京东商品详情数据
    腾讯云相同配置8核16G的云服务器和轻量服务器该如何选择?
  • 原文地址:https://blog.csdn.net/cfqq1989/article/details/133131292