Attribute VB_Name = "CtrlCard"
'****************************运动控制模块 **************************

    '为了简单、方便、快捷地开发出通用性好、可扩展性强、
    
    '维护方便的应用系统，我们在控制卡函数库的基础上将
    
    '所有库函数进行了分类封装。下面的示例使用一块运动
    
    '控制卡

'*******************************************************************
Public Result As Long      '返回值
Public gCardIndex As Long    '卡号

Const MULTIPLE = 5           '倍率
Const INPB_AXISREG = 62            '//第二组插补轴寄存器
Const INPA_AXISREG = 63            ' //第一组插补轴寄存器



Public Const AINPA = 4
Public Const MAXAXIS = 4           '最大轴数



'******************************初始化函数***************************

    '该函数中包含了控制卡初始化常用的库函数，这是调用
    
    '其他函数的基础，所以必须在示例程序中最先调用
    
    '返回值<=0表示初始化失败，返回值>0表示初始化成功

'*******************************************************************
Public Function Init_Card() As Long
       
    Result = adt8949_initial()           '卡初始化
    
    If Result <= 0 Then
     
       Init_Card = Result
       
       Exit Function
       
    End If
       
    For i = 1 To MAXAXIS
    
         adt8949_set_command_pos 0, i, 0       ' //清逻辑计数器
        
        adt8949_set_actual_pos 0, i, 0 ';         //清实位计数器
        
        adt8949_set_startv 0, i, 0 ';             //设定起始速度
        
        adt8949_set_speed 0, i, 50 ';             //设定驱动速度
        
        adt8949_set_acc 0, i, 500 ';               //设定加速度
     
    Next i
    
    adt8949_set_startv 0, INPA_AXISREG, 0         ' //设定起始速度
    adt8949_set_speed 0, INPA_AXISREG, 20 ';          //设定驱动速度
    adt8949_set_acc 0, INPA_AXISREG, 500 ';            //设定加速度
    
    adt8949_set_startv 0, INPB_AXISREG, 0 ';          //设定起始速度
    adt8949_set_speed 0, INPB_AXISREG, 20 ';          //设定驱动速度
    adt8949_set_acc 0, INPB_AXISREG, 500  ';            //设定加速度
    
    adt8949_set_input_mode 0, 1, 0, 4, 0, 0 '//设定限位模式，设正负限位有效，低电平有效
    adt8949_set_input_mode 0, 1, 1, 5, 0, 0
    adt8949_set_input_mode 0, 2, 0, 6, 0, 0
    adt8949_set_input_mode 0, 2, 1, 7, 0, 0
    adt8949_set_input_mode 0, 3, 0, 8, 0, 0
    adt8949_set_input_mode 0, 3, 1, 9, 0, 0
    adt8949_set_input_mode 0, 4, 0, 10, 0, 0
    adt8949_set_input_mode 0, 4, 1, 11, 0, 0
    
    
    Init_Card = Result
       
End Function


'************************功能：停止驱动函数*************************

    '该函数用于停止驱动，分为立即停止和减速停止
    
    '参数: axis-轴号，mode: 0-立即停止，1-减速停止
    
    '返回值=0正确，返回值=1错误

'*******************************************************************
Public Function StopRun(ByVal axis As Long, ByVal mode As Long) As Long

    If mode = 0 Then             '立即停止
        
        Result = adt8949_sudden_stop(gCardIndex, axis)
        
    Else                         '减速停止
    
        Result = adt8949_dec_stop(gCardIndex, axis)
    
    End If

End Function


'************************设置位置计数器函数*************************

    '该函数用于设置逻辑位置和实际位置
    
    '参数: axis-轴号，pos-位置设置值
    
    '      mode： 0 - 设置逻辑位置      1 - 设置实际位置
    
    '返回值 = 0正确， 返回值 = 1错误

'*******************************************************************
Public Function Setup_Pos(ByVal axis As Long, ByVal pos As Long, ByVal mode As Long) As Long

    If mode = 0 Then
    
        Result = adt8949_set_command_pos(gCardIndex, axis, pos)
        
    Else
    
        Result = adt8949_set_actual_pos(gCardIndex, axis, pos)
        
    End If
    
End Function

'************************获取运动信息***********************
'该函数用于反馈轴当前的逻辑位置，实际位置和运行速度
'参数: axis -轴号, LogPos - 逻辑位置, actpos - 实际位置, speed - 运行速度
'返回值=0正确，返回值=1错误
'***********************************************************/
Public Function Get_CurrentInf(ByVal axis As Long, LogPos As Long, ActPos As Long, speed As Single) As Long

    Result = adt8949_get_command_pos(gCardIndex, axis, LogPos)
    
        adt8949_get_actual_pos gCardIndex, axis, ActPos
    
        adt8949_get_speed gCardIndex, axis, speed

    Get_CurrentInf = Result
    
End Function

'**********************功能:获取轴的错误停止信息********************

'该函数用于获取轴停止的信息   value:   0:无错误   非0：value为两个字节长度的值
     
'返回值＝0正确 返回值＝1错误

'*******************************************************************

Public Function Get_ErrorInf(ByVal axis As Long, Value As Long) As Long
 
   ' Result = get_stopdata(gCardIndex, axis, Value)

    Get_ErrorInf = Result
    
End Function

'***************************读取输入点******************************
'
'     该函数用于读取单个输入点
'
'     参数：number-输入点(0 ~ 39)
'
'     返回值：0 － 低电平，1 － 高电平，-1 － 错误
'
'*******************************************************************
Public Function Read_Input(ByVal number As Long) As Long
    
    Read_Input = adt8949_read_bit(gCardIndex, number)
    
End Function

'********************设置脉冲输出方式**********************
'
'    该函数用于设置脉冲的工作方式
'
'    参数：axis-轴号， value-脉冲方式 0－脉冲＋脉冲方式 1－脉冲＋方向方式
'
'    返回值=0正确，返回值=1错误
'
'    默认脉冲方式为脉冲+方向方式
'
'    本程序采用默认的正逻辑脉冲和方向输出信号正逻辑
'
'*********************************************************
Public Function Setup_PulseMode(ByVal axis As Long, ByVal Value As Long) As Long

    Setup_PulseMode = adt8949_set_pulse_mode(gCardIndex, axis, Value, 0, 0)
    
End Function

'********************设置限位信号方式**********************
'
'   该函数用于设定正/负方向限位输入nLMT信号的模式
'
'   参数:      axis -轴号
'              value1   0－正限位有效  1－正限位无效
'              value2   0－负限位有效  1－负限位无效
'              logic    0－低电平有效  1－高电平有效
'   默认模式为:    正限位有效,负限位有效,低电平有效
'
'   返回值=0正确，返回值=1错误
'  *********************************************************
Public Function Setup_LimitMode(ByVal axis As Long, ByVal value1 As Long, ByVal value2 As Long, ByVal logic As Long) As Long

    Setup_LimitMode = adt8949_set_limit_mode(gCardIndex, axis, value1, value2, logic)
    
End Function

'*********************输出单点函数******************************
'
'    该函数用于输出单点信号
'
'    参数： number-输出点(0 ~ 15)

'           value 0-低电平       1－高电平
'
'    返回值=0正确，返回值=1错误
'****************************************************************
Public Function Write_Output(ByVal number As Long, ByVal Value As Long) As Long

    Write_Output = adt8949_write_bit(gCardIndex, number, Value)
    
End Function
'********************获取版本信息************************
'
'    该函数用于获取函数库版本
'
'    参数:     libver -库版本号
'
'*********************************************************
Public Function Get_Version(libver As Long, hardwarever As Long) As Long

    Dim ver As Long
    
    ver = adt8949_get_lib_version()
    
    'libver = (ver)
    libver = ver
    
    hardwarever = adt8949_get_firmware_ver(gCardIndex)
    

    
End Function

'*********************单轴驱动函数**********************

    '该函数用于驱动单个运动轴运动
    
    '参数：axis-轴号，pulse-输出的脉冲数
    
    '返回值=0正确，返回值=1错误

'*******************************************************
Public Function Axis_Pmove(ByVal axis As Long, ByVal pulse As Single) As Long
    
    Result = adt8949_set_syncpos(0, Hex(1) * 2 ^ (axis - 1))   ';//同步接收缓冲计数器
    
    If (Result) Then GoTo Err
    Result = adt8949_pmove(gCardIndex, axis, pulse)
Err:
    
    Axis_Pmove = Rresult
    
End Function

'****************************连续驱动函数***************************

    '该函数用于驱动单个连续运动轴运动
    
    '参数：axis-轴号，value-输出的方向
    
    'value-0：正方向   1：负方向
    
    '返回值=0正确，返回值=1错误

'*******************************************************************
Public Function Axis_Cmove(ByVal axis As Long, ByVal Value As Long) As Long

    Result = adt8949_continue_move(gCardIndex, axis, Value)
    
    Axis_Cmove = Result

End Function

'*****************************插补函数**************************

    '该函数用于驱动任意2-4轴进行插补运动
        
    '移动的相对距离   value1=pulse1,value2=pulse2-对应轴的输出脉冲数
    
    '返回值=0正确，返回值=1错误

'*******************************************************************
Public Function Interp_Move(ByVal value1 As Single, ByVal value2 As Single, ByVal value3 As Single, ByVal value4 As Single, ByVal fifo As Long) As Long

    Dim Result As Long
    Dim i As Long ';//len,
    If (fifo = 0) Then
    
        Result = adt8949_set_precount(0, fifo) '              //不缓冲
        If (Result) Then
        
            Interp_Move = Result
        
        End If
        
        Result = adt8949_set_syncpos(0, 15) '//同步接收缓冲计数器
        If (Result) Then
        
            Interp_Move = Result
            End If
            
        
        Result = adt8949_inp_move4(0, 0, value1, value2, value3, value4)
        If (Result) Then
        
            Interp_Move = Result
        
        Else
        
            Interp_Move = Result
        End If
            
        
    ElseIf (fifo > 0) Then
    
        Result = adt8949_set_precount(0, fifo) '             //缓冲fifo段
        If (Result) Then
        
            Interp_Move = Result
            End If
            
        
        Result = adt8949_set_syncpos(0, 15) ';//同步接收缓冲计数器
        If (Result) Then
        
            Interp_Move = Result
            End If
        
        For i = 0 To fifo
        '{//加工缓冲段数据
          '  //  if (!get_fifo_len(0,&len) && len!=0)//0:未满，1：满//读取缓存是否满
            Result = adt8949_inp_move4(0, 0, value1, value2, value3, value4)
            If (Result) Then
            
                MsgBox ("错误")
                Interp_Move = Result
            
            'i = i + 1
            End If
            
          Next i
          
    
    Else
    
        MsgBox ("输入数据错误")
        Interp_Move = Result
    End If
    
    Interp_Move = Result
    'return 0;

End Function

'*****************************绝对插补函数**************************

    '该函数用于驱动任意2-4轴进行插补运动
        
    '移动的相对距离   value1=pulse1,value2=pulse2-对应轴的输出脉冲数
    
    '返回值=0正确，返回值=1错误

'*******************************************************************
Public Function InterpABS_Move(ByVal axismap As Long, ByVal value1 As Single, ByVal value2 As Single, ByVal value3 As Single, ByVal value4 As Single, ByVal fifo As Long) As Long
   Dim Result As Long
    Dim i As Long ';//len,
    If (fifo = 0) Then
    
    
        Result = adt8949_set_precount(0, fifo) '              //不缓冲
        If (Result) Then
        
            InterpABS_Move = Result
        
        End If
        
        Result = adt8949_set_syncpos(0, 15) '//同步接收缓冲计数器
        If (Result) Then
        
            InterpABS_Move = Result
            End If
            
        
        Result = adt8949_inp_abs_move4(0, 0, axismap, value1, value2, value3, value4)
        If (Result) Then
        
            InterpABS_Move = Result
        
        Else
        
            InterpABS_Move = Result
            End If
            
        
    ElseIf (fifo > 0) Then
    
        Result = adt8949_set_precount(0, fifo) '             //缓冲fifo段
        If (Result) Then
        
            InterpABS_Move = Result
            End If
            
        
        Result = adt8949_set_syncpos(0, 15) ';//同步接收缓冲计数器
        If (Result) Then
        
            InterpABS_Move = Result
            End If
        
        For i = 0 To fifo
        '{//加工缓冲段数据
          '  //  if (!get_fifo_len(0,&len) && len!=0)//0:未满，1：满//读取缓存是否满
            Result = adt8949_inp_abs_move4(0, 0, axismap, value1, value2, value3, value4)
            If (Result) Then
            
                MsgBox ("错误")
                InterpABS_Move = Result
            
            'i = i + 1
            End If
            
          Next i
          
    
    Else
    
        MsgBox ("输入数据错误")
        InterpABS_Move = Result
    End If
    
    InterpABS_Move = Result
    'return 0;
End Function
