codesys【轴组】SM3_Robotics

1搭建轴组

   SM3_Robotics

1 【Application】右键,添加对象【轴组】
2 【虚轴】拖入【轴组】轴臂内。
3 【软轴总线】优先级,低于Main

轴组12108故障:PRG程序要在MainTask下。
急停    stop
暂停    halt

PRG管理用FBD
轴组模型显示坐标在CNC里

按住虚轴拖入轴组模型。 

 

 点动Jog2

jog2 : SMC_GroupJog2 := ();  // 点动

CODESYS软件集团

见 Robotics_Jogging.project 安装目录下的示例项目
 CODESYS 在下面 ..\CODESYS SoftMotion\Examples.
此示例演示如何使用 SMC_GroupJog2 宝。
激活轴组(状态 0)
配置工具(状态 5)
配置 MCS(状态 6)
开始慢跑(状态 10)

Forward : ARRAY[0..5] OF BOOL ;        '正转,对应0~5轴,点正'
   Backward : ARRAY[0..5] OF BOOL ;    '反转,对应0~5轴,点反'
输入:
     AxisGroup    AXIS_GROUP_REF_SM3    对一组轴的引用
     【1】Enable                             【True】
     【2】Forward                            正点动。'0~5轴,点正转'
     【3】Backward                           反点动。
         MaxLinearDistance                   单次最大【线距离】
         MaxAngularDistance                  单次最大【角度】
     Velocity                            速度
     Acceleration                        加速度
     Deceleration                        减速度
     Jerk                                【冲击速度】

    VelFactor                            速度系数【100%】
    AccFactor                            加速系数【100%】
    JerkFactor                           冲击系数【100%】
    TorqueFactor                         扭矩系数【100%】

    CoordSystem                         【坐标系统】
    ABC_as_ACS                          【1】混合运动,【0】笛卡尔 'ABC_as_ACS = FALSE'

输出:
     Busy                 BOOL           FB忙
     Error                BOOL           错误
     ErrorID              SMC_ERROR      错误码
     CurrentPosition      SMC_POS_REF    轴组【当前位置】
    



2数据类型

VAR_IN_OUT
	AxisGroup: AXIS_GROUP_REF_SM3;
END_VAR

AXIS_GROUP_REF_SM3    '轴组类型'

【】MC_SetCoordinateTransform (FB)'坐标变换'
    PCS工件坐标
        MCS机械坐标
            ACS电机轴坐标
    SMC_POS_REF (UNION)          '空间坐标系oop'
    TRAFO.AXISPOS_REF            '机械轴坐标'【PCS工件坐标】【MCS笛卡尔】【ACS轴坐标】
    MC_COORD_REF (STRUCT)        '笛卡尔位置6'

MC_EXECUTION_MODE (ENUM)   执行模式
SMC_AXIS_GROUP_STATE     '轴组状态'
SMC_COORD_SYSTEM (ALIAS)    '坐标系统'
SMC_DYN_LIMITS (ALIAS)    '极限位保护'

SMC_AXIS_GROUP_CONTINUE_DATA (FB)    '中断运动'

 

3常用方法【FB】:

SMC_GroupPower (FB)     '轴组【上电】'【1】
MC_GroupEnable (FB)     '轴组【使能】'【2】
SMC_GroupJog2 (FB)      '    【点动】'【3】
MC_MoveLinearAbsolute (FB)    '【线性】绝对定位'【4 直线插补】

MC_GroupSetPosition (FB)'轴组【重置定位】'
MC_GroupStop (FB)     '【急停】'
MC_GroupHalt (FB)     '【暂停】'
MC_GroupReset (FB)    '【复位】'

MC_TrackConveyorBelt (FB)     '追踪 传送带 上的工件。'
MC_TrackRotaryTable (FB)      '追踪   转盘 上的工件。'

MC_MoveDirectAbsolute (FB)    '【直接】绝对定位'【点】
MC_MoveDirectRelative (FB)    '【直接】相对定位'

MC_MoveLinearAbsolute (FB)    '【线性】绝对定位'【线】
MC_MoveLinearRelative (FB)    '【线性】相对定位'

MC_MoveCircularAbsolute (FB)   '【圆弧】绝对定位'【圆弧】
MC_MoveCircularRelative (FB)   '【圆弧】相对定位'

MC_GroupDisable (FB)    '轴组【关闭】'
SMC_GroupWait (FB)      '轴组【等待】'
SMC_GroupEnableResumeAfterError (FB)    '确认错误,继续运行'
SMC_StartupAxisGroup (FB) 【SMC启动轴组】

MC_AddAxisToGroup (FB)添加一个轴
MC_GroupDisable (FB)'关闭'
MC_GroupEnable (FB)'使能'
MC_GroupReset (FB)'复位'
MC_GroupSetPosition (FB)'重置坐标'
MC_RemoveAxisFromGroup (FB)删除一个轴
MC_UngroupAllAxes (FB)更新轴
SMC_GroupPower (FB)'电源'
SMC_GroupReadTool (FB)    【此FB用于读取刀具偏移。】
SMC_GroupSaveContinueData (FB)【保存连续数据。】
SMC_GroupSetLoad (FB) 负载
SMC_GroupSetPathTolerance (FB)设置用于新移动的路径公差。
SMC_GroupSetTool (FB) 配置新刀具。
SMC_GroupSetUnits (FB)国际单位的转换系数。

Computation'计算'
SMC_GroupUpdate (FB)此功能块可用于提前执行轴组的所有隐式计算。
SMC_SetMovementQueueBuffer (FB)用于引用外部缓冲区并给出其大小来修改内部使用的移动队列的大小。
【】SMC_TuneCPKernel (FB)此功能块可用于调整CP移动内核的行为。

Coordinate systems'坐标系统'
【】MC_SetCoordinateTransform (FB)坐标变换
MC_SetDynCoordTransform (FB)动态坐标变换耦合两个轴组。
【】MC_TrackConveyorBelt (FB)用于跟踪传送带上的工件。
【】MC_TrackRotaryTable (FB)用于跟踪转盘上的工件。
SMC_SetDynCoordTransformEx (FB)设置动态产品坐标系(PCS)。

Dynamics'运动'
MC_GroupSetOverride (FB)运动覆盖
SMC_GroupReadAxisLimitFactors (FB)限位
SMC_GroupSetAncillaryAxisLimits (FB)
SMC_GroupSetAncillaryPathLimits (FB)
SMC_GroupSetAxisLimitFactors (FB)
SMC_GroupSetDynamics (FB)
SMC_SetDynamicLimitFactors (FB)

Kinematics'运动学'
MC_SetKinTransform (FB)
SMC_KinConfigActivateAutomaticPeriods (FB)
SMC_SetKinConfiguration (FB)

Trigger'触发'
SMC_GroupPrepareTrigger (FB)
SMC_GroupReadTrigger (FB)
SMC_TRIGGER_ID (ALIAS)
SMC_TRIGGER_INFO (STRUCT)
SMC_TRIGGER_STATUS (ENUM)
SMC_TriggerPosition (UNION)
SMC_TriggerPositionType (ENUM)
SMC_TriggerPosition_Plane (STRUCT)

Diagnostics    '诊断'
MC_GroupReadActualAcceleration (FB)
MC_GroupReadActualPosition (FB)
MC_GroupReadActualVelocity (FB)
MC_GroupReadConfiguration (FB)
MC_GroupReadError (FB)
MC_GroupReadStatus (FB)
MC_ReadCoordinateTransform (FB)
MC_ReadKinTransform (FB)
SMC_GroupAddOffset (FB)
SMC_GroupConvertPosition (FB)
SMC_GroupGetContinuePosition (FB)
SMC_GroupGetContinueToolOffset (FB)
SMC_GroupReadPathDynamics (FB)
SMC_GroupReadPlanningStatistics (FB)
SMC_GroupReadPositionInMovement (FB)
SMC_GroupReadRemainingTrajectoryDuration (FB)
SMC_GroupReadSetAcceleration (FB)
SMC_GroupReadSetJerk (FB)
SMC_GroupReadSetPosition (FB)
SMC_GroupReadSetVelocity (FB)
SMC_GroupTargetPosition (FB)
SMC_ReadKinTransformForAxis (FB)

Movement'移动'
GroupInterrupt 组中断
SMC_GroupInterruptAt (FB)
SMC_GroupInterruptPosition (UNION)
SMC_GroupInterruptPositionMvtRel (STRUCT)
MC_GroupContinue (FB)
MC_GroupHalt (FB)
MC_GroupInterrupt (FB)
MC_GroupStop (FB)
MC_MoveCircularAbsolute (FB)
MC_MoveCircularRelative (FB)
MC_MoveDirectAbsolute (FB)    '直接,绝对定位'
MC_MoveDirectRelative (FB)
MC_MoveLinearAbsolute (FB)
MC_MoveLinearRelative (FB)
SMC_GroupEnableResumeAfterError (FB)
SMC_GroupJog (FB)
SMC_GroupJog2 (FB)'点动'
SMC_GroupUpdateContinueData (FB)
SMC_GroupWait (FB)

SMC_GroupReadTool (FB)        '读取【刀具】偏置'
MC_TrackConveyorBelt (FB)    '皮带'
MC_TrackRotaryTable (FB)     '转盘'
SMC_SetDynCoordTransformEx (FB)'产品'

SMC_GroupSetTool (FB)
SMC_GroupSetUnits (FB)        '坐标单位转换'
MC_SetCoordinateTransform (FB)

SMC_GroupSaveContinueData (FB)    '保存【继续下一步】'
MC_GroupContinue (FB)
SMC_GroupUpdateContinueData (FB)
SMC_SetMovementQueueBuffer (FB)

SMC_StartupAxisGroup (FB)    '添加轴组'
MC_AddAxisToGroup (FB)       '添加单轴到轴组'
MC_SetDynCoordTransform (FB)    '耦合其他轴组'
MC_RemoveAxisFromGroup (FB)  '删除单轴'
MC_UngroupAllAxes (FB)       '删除所有轴'
SMC_GroupUpdate (FB)
SMC_GroupSetLoad (FB)

轴心国

  

PCS工件坐标
MCS机械臂坐标
ACS伺服轴坐标

轴组是单轴控制的进阶【实际可以直接学轴组】
轴组用法和单轴差不多,都是调用函数,但是函数名【不同】。
需要记关键字【power】【enable】等
输入助手里,也是输入关键字,再选取需要的FB

平时需要多看看库的函数名称,不用背下来,用多了,就熟悉了。

【使能】Enable

Power     电机使能【3个输入为True】        '上电'
Enable    轴组模型可用【2个输入为True】    '使能'
当用可视化时,FB输入必须悬空

轴组模型下,轴数不能超过模型总轴数。

相对定位

 MC_MoveDirectRelative (FB)

MC_MoveDirectRelative (FB)    '【直接】相对定位'

绝对定位

 CODESYS软件集团

MC_MoveDirectAbsolute (FB)    '【直接】绝对定位'

【1】Execute	        在上升边缘开始运动
【2】Position	        坐标系统'  SMC_POS_REF  '
MovementType	           PTP运动的类型。不再支持。
                           这种过时的输入将在未来的版本中删除。

【3】CoordSystem	    适用坐标系' SMC_COORD_SYSTEM.MCS '
【4】BufferMode	        定义FB相对于前一个块的时间顺序。
TransitionMode	          混合缓冲模式下的混合
TransitionParameter	      混合的参数

VelFactor	 	          【速度百分比】必须在[0,1]的范围内。
AccFactor	              【加速百分比】必须在[0,1]的范围内。
JerkFactor	              【冲击百分比】电机起跳速度%,该系数必须在[0,1]的范围内。
TorqueFactor	          【力矩百分比】扭矩乘以该系数,该系数必须在[0,1]的范围内。
                          必须使用SMC_GroupSetDynamics设置动态模型,此因素才会产生影响。

4坐标系统

定位MC_COORD_REF 笛卡尔坐标 

a:电机轴坐标,c:笛卡尔坐标(逆变换),v:坐标数组(电机组坐标)
SMC_POS_REF:在工具箱》合成器》然后拖到,输入SMC_POS_REF

 

SMC_TRAFO_5Axes(FB)// 五轴雕刻机【笛卡尔到电机

SMC_TRAFOF_5Axes(FB)// 五轴雕刻机【正计算可绑定可视化控件】电机到笛卡尔

a 电机坐标
c 笛卡尔坐标
v 轴组坐标【单电机坐标】' v轴组坐标: ARRAY [0..(SMC_RCNST.MAX_AXES - 1)] OF LREAL;  '
    SMC_IMPLICIT_POS  '隐藏的坐标'

'  SMC_POS_REF  '
'  SMC_COORD_SYSTEM.MCS  '

5从轴跟随

轴组会用到主从关系【X1和X2】
我的思路是: 虚轴【主】》X1【从】

X2是X1的从轴。
因为X1实际位置有波动,那X2也必须跟随。要不然机械上扭大梁,尤其是双齿条X轴大梁,会损坏机械。
【X2伺服需要配置成 力矩位置混合模式  PRT模式 】

从轴1: SMC_TrackAxis(            //移动轴
	Master:=SM_Drive_Virtual_1 , //'主'
	Slave:= x1, //从
	bExecute:= 1, //【上升沿】块工作
	Velocity:= , //最大速度[u/s]。
	Acceleration:= , //最大加速度,单位为[u/s²]。
	Deceleration:= , //最大减速度,单位为【u/s²】。
	Jerk:= , // 起跳速度,单位为【u/s²】。【冲击速度】
	bBusy=> , //TRUE:功能块的执行尚未完成。
	bCommandAborted=> , //TRUE:命令已被另一个命令中止。
	bError=> , //TRUE:功能块内发生错误。
	iErrorID=> , //错误码
	bInSync=> );//轴是否与给定的设定值同步。

从轴2:SMC_ControlAxisByPos(
	Axis:= x1, //目标轴
	iStatus:= ,// SMC_Interpolator实例的状态
	bEnable:= , //TRUE:开始执行
	bAvoidGaps:= , //TRUE:开始监测位置
	fSetPosition:= SM_Drive_Virtual_1, //在[u]中设置轴的位置。
	fGapVelocity:= , //跳过的速度,单位为[u/s]
	fGapAcceleration:= , //跳过的加速度[u/s2]
	fGapDeceleration:= , //跳跃绕过的减速[u/s2]
	fGapJerk:= , //在[u/s3]中跳过跳跃的跳跃
	bBusy=> , //TRUE:功能块运行
	bCommandAborted=> , //TRUE:执行被另一个在轴上操作的功能块实例中断。
	bError=> , //TRUE:出现错误
	iErrorID=> , //错误码
	bStopIpo=> );//TRUE:速度或位置发生跳跃,并且正在运行对新位置的适应。

6二次开发:

变量

FUNCTION_BLOCK FB_Group轴组
VAR_IN_OUT
	AxisGroup1: AXIS_GROUP_REF_SM3;//【轴组】
END_VAR
VAR_INPUT
	u1电源:BOOL;
	u1使能:BOOL;
	u1关闭:BOOL;
	u1复位:BOOL;
	
	u1急停:BOOL;
	u1暂停:BOOL;
	u1中断:BOOL;
	u1继续:BOOL;
	
	u1点动:BOOL;
	lf速度:LREAL:=5.0;
	lf加速:LREAL:=5.0;
	lf减速:LREAL:=5.0;
	lf冲击速:LREAL:=5.0;
	lf速度百分比:LREAL:=1.0;
	lf加速百分比:LREAL:=1.0;
	lf冲击速百分比:LREAL:=1.0;
	lf减速百分比:LREAL:=1.0;
	lf力矩百分比:LREAL:=1.0;
	
	u1直线插补绝对:BOOL;
	u1直线插补相对:BOOL;
	u1圆弧插补绝对:BOOL;
	u1圆弧插补相对:BOOL;
	u1立即绝对:BOOL;
	u1立即相对:BOOL;
	
	
	
	
END_VAR
VAR_OUTPUT
	u1完成:BOOL;
	u1忙碌: BOOL;
	u1错误: BOOL;
	u16故障码: SMC_ERROR;
	u64当前轴数:udint;
END_VAR

VAR
	SMC_GroupPower_0: SM3_Robotics.SMC_GroupPower;// 电源
	MC_GroupEnable_0: SM3_Robotics.MC_GroupEnable;// 使能
	MC_GroupDisable_0: SM3_Robotics.MC_GroupDisable;// 关闭
	MC_GroupReset_0: SM3_Robotics.MC_GroupReset;// 【复位】
	
	MC_GroupStop_0: SM3_Robotics.MC_GroupStop;//【急停】
	MC_GroupHalt_0: SM3_Robotics.MC_GroupHalt;//【暂停】
	
	SMC_GroupJog2_0: SMC_GroupJog2;// 点动
	
	
	
	
	
	MC_AddAxisToGroup_0: MC_AddAxisToGroup;
	MC_RemoveAxisFromGroup_0: MC_RemoveAxisFromGroup;
	oop坐标: SMC_POS_REF;
	
	oop刀头坐标: SMC_COORD_SYSTEM;
	MC_MoveDirectAbsolute_0: MC_MoveDirectAbsolute;
	MC_MoveDirectRelative_0: MC_MoveDirectRelative;
	MC_UngroupAllAxes_0: MC_UngroupAllAxes;
	虚0轴地址: POINTER TO SM3_Basic.AXIS_REF_VIRTUAL_SM3;
	虚1轴地址: POINTER TO SM3_Basic.AXIS_REF_VIRTUAL_SM3;
	虚2轴地址: POINTER TO SM3_Basic.AXIS_REF_VIRTUAL_SM3;
	虚3轴地址: POINTER TO SM3_Basic.AXIS_REF_VIRTUAL_SM3;
	虚4轴地址: POINTER TO SM3_Basic.AXIS_REF_VIRTUAL_SM3;
	虚5轴地址: POINTER TO SM3_Basic.AXIS_REF_VIRTUAL_SM3;
	BufferMode: SM3_Robotics.MC_BUFFER_MODE;
	MC_GroupSetPosition_0: MC_GroupSetPosition;
	SMC_TRAFO_5Axes_0: SMC_TRAFO_5Axes;
	SMC_TRAFOF_5Axes_0: SMC_TRAFOF_5Axes;
	v轴组坐标: ARRAY [0..(SMC_RCNST.MAX_AXES - 1)] OF LREAL;
	imp: SMC_IMPLICIT_POS;// 隐式坐标
	MC_TrackConveyorBelt_0: MC_TrackConveyorBelt;
	MC_MoveLinearAbsolute_0: MC_MoveLinearAbsolute;
	MC_MoveLinearRelative_0: MC_MoveLinearRelative;
END_VAR

程序

练习: 

1轴组对象:  AXIS_GROUP_REF_SM3 (FB)

 

2轴组使能SMC_GroupPower(电机使能MC_GroupEnable(轴组使能)

power用于电机【上电】,enable用于轴组模型【可操作】。

先电机使能,再轴组使能。

电机群使能:SMC_GroupPower    (3个bool为True)
电机群脱机:SMC_GroupPower    (bRegulatorOn为电机群开关)另2个bool为True

轴组使能:MC_GroupEnable      (使能下,才能控制轴组运动)
轴组关闭:MC_GroupDisable

2轴组状态MC_GroupReadStatus () 

可配置:移动,回零,错停,待命,停止,关闭

绝对定位:MC_MoveDirectAbsolute    

https://content.helpme-codesys.com/en/libs/SM3_Robotics/Current/SM3_Robotics/fld-SM3_Robotics.html

MC_MoveCircularAbsolute      绝对【圆弧插补】
MC_MoveCircularRelative      相对【圆弧插补】

MC_MoveDirectAbsolute    绝对【点到点】
MC_MoveDirectRelative    相对【点到点】

MC_MoveLinearAbsolute    绝对【直线插补】
MC_MoveLinearRelative    相对【直线插补】

SMC _ GroupEnableResumeAfterError   复位故障
SMC_GroupUpdateContinueData         下一个坐标
SMC_GroupWait            运动间隔(秒)

点动:  SMC_GroupJog2

保存轴位置: SMC_GroupSaveContinueData 

继续:  MC_GroupContinue

暂停:  MC_GroupHalt   (暂停)

中断:  MC_GroupInterrupt

MC_GroupInterrupt    运动中断(运动突然停止)
MC_GroupInterruptAt,在特定位置执行停止【中断】

 急停:  MC_GroupStop  (急停)

脱机:  MC_GroupDisable

电机上电:        SMC_GroupPower 

轴组使能:    MC_GroupEnable 

复位:  MC_GroupReset 

零点坐标设置:    MC _ group set position

增一个轴:   MC _ AddAxisToGroup

删一个轴:   MC_RemoveAxisFromGroup

 刀具偏移:  SMC _ group read tool     SMC_GroupSetTool

传送带工件:  MC _ trackcelpetorbelt        MC_TrackConveyorBelt

转盘上工件:   MC _ TrackRotaryTable 

 活动坐标工件:    SMC_SetDynCoordTransformEx

附加轴:  获取附加轴坐标:  SMC_POSINFO (STRUCT)

 刀具修正:

CNC加工流程:

1  SMC_CNC_REF            实例对象
2  SMC_NCDecoder          G代码解析(存储在SMC_OUTQUEUE)
3  SMC_Interpolator       插补器
xp:ARRAY[1..2] OF REAL:= [100,50];
yp:ARRAY[1..2] OF REAL:= [0,100];
PROGRAM Path
VAR
        iState : INT;
        QUEUE : SMC_OUTQUEUE;
        BUF : ARRAY[0..49] OF SMC_GEOINFO;
                // Memory allocation
        GEO : SMC_GEOINFO:=(dT1:=0, dT2:=1, dToolRadius:=0, dVel:=100, dVel_End:=100, dAccel:=200, dDecel:=500, iObj_Nr:=0);
                // Initial path element
        n : INT := 0;
        QUEUE.nSize := SIZEOF(BUF);
END_VAR

CASE iState OF
0:
        QUEUE.pbyBuffer := ADR(BUF[0]);
                // Initialize QUEUE
        SMC_SetQueueCapacity(ADR(QUEUE), SIZEOF(BUF));
        iState := iState + 1;

1:
        // Fill QUEUE
        WHILE NOT QUEUE.bFull DO
                // When QUEUE is full, wait until it has been processed by the following FBs
                n := n + 1;
                GEO.iSourceLine_No := n;
                GEO.piStartPos := GEO.piDestPos;
                        // Copying last destination
                GEO.iMoveType := LIN;
                        // Generating linear movement
                GEO.iObjNo := GEO.iObjNo + 1;
                        // Calculating number
                GEO.piDestPos.dX := xp[n];
                        // Generatint position
                GEO.piDestPos.dY := yp[n];
                SMC_CalcLengthGeo(pg := ADR(GEO));
                        // Calculating length of object with the help of the standard function
                SMC_AppendObj(poq:=ADR(QUEUE), pgi:=ADR(GEO));
                        // Appending object to QUEUE
                IF n = SIZEOF(xp)/SIZEOF(xp[1]) THEN
                        // All target positions processed
                        QUEUE.bEndOfList := TRUE;
                        n := 0;
                        iState := 2;
                        EXIT;
                END_IF
        END_WHILE

2:
        //Done
        ;
END_CASE

CheckVel(bExecute:=TRUE , poqDataIn:=ADR(queue)); // Preprocessing

获取单轴坐标

这个是伺服坐标,取出后要做倍率计算。

ui上的坐标实际可以直接提取,在402轴对象Axis对象 内

io映射,实际就是对象,它存储在内存地址上。
dsp402_statemachine.axis.fsetPosition缩放UI坐标
                   .axis.diSetPosition伺服目标坐标32bit, ±214米

问题:

总线任务挂不上: 

【不要勾选】带命名空间。
或者,点击【虚轴】拖入轴组内。

从轴对象句柄:

虚0轴地址: POINTER TO SM3_Basic.AXIS_REF_VIRTUAL_SM3;
	虚1轴地址: POINTER TO SM3_Basic.AXIS_REF_VIRTUAL_SM3;
	虚2轴地址: POINTER TO SM3_Basic.AXIS_REF_VIRTUAL_SM3;
	虚3轴地址: POINTER TO SM3_Basic.AXIS_REF_VIRTUAL_SM3;
	虚4轴地址: POINTER TO SM3_Basic.AXIS_REF_VIRTUAL_SM3;
	虚5轴地址: POINTER TO SM3_Basic.AXIS_REF_VIRTUAL_SM3;

u64当前轴数:=axisgroup.trafo.NumAxes;

虚0轴地址:=ADR(SM_Drive_Virtual);
虚1轴地址:=ADR(SM_Drive_Virtual_1);
虚2轴地址:=ADR(SM_Drive_Virtual_2);
虚3轴地址:=ADR(SM_Drive_Virtual_3);
虚4轴地址:=ADR(SM_Drive_Virtual_4);
虚5轴地址:=ADR(SM_Drive_Virtual_5);

  • 3
    点赞
  • 34
    收藏
    觉得还不错? 一键收藏
  • 8
    评论
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值