⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 module1.bas

📁 用vb写的数控仿真系统
💻 BAS
📖 第 1 页 / 共 3 页
字号:
Attribute VB_Name = "Module1"
Option Explicit
Public CurrentNX As Single, CurrentNY As Single, CurrentNZ As Single, CurrentNF As Single, CurrentNR As Single, CurrentNI As Single, CurrentNJ As Single, PauseRun As Boolean, TempX As Single, TempY As Single, TempZ As Single
Public VIEWXYZ As Boolean, OPX As Single, OPY As Single, OPZ As Single, FalsePoint As Boolean, MirrorX As Boolean, MirrorY As Boolean, CurrentGM As String
Dim RunFast As Integer, FirstPoint As Boolean, NOTX As Boolean, NOTIJ As Boolean, NEWZ As Single
Public StopRun As Boolean, SCALESIZE As Single, HowDC As Boolean, UserRTODC As Boolean, LineW As Integer
Sub G00(X As Single, Y As Single, Z As Single)   'G00过程
  frmmain.lblState.Caption = "快速定位到" & "X:" & X & " Y:" & Y & " Z:" & Z
  CurrentNX = X      '定位到当前坐标
  CurrentNY = Y
  CurrentNZ = Z
End Sub
Sub G01(X As Single, Y As Single, Z As Single)   'G01过程
  Dim X1 As Single, Y1 As Single, SPointX As Single, SPointY As Single, I As Single, L As Single
  On Error GoTo errhand
  If X = CurrentNX And Y = CurrentNY And Z = CurrentNZ Then
     Exit Sub
  End If
  If StopRun = True Then
    Exit Sub
  End If
  frmmain.lblState.Caption = "直线插补|" & "起点: X" & CurrentNX & " Y" & CurrentNY & " Z" & CurrentNZ & "终点: X" & X & " Y" & Y & " Z" & Z
  SPointX = CurrentNX
  SPointY = CurrentNY
  If X <> CurrentNX Then
     Dim K As Single
     K = (Y - CurrentNY) / (X - CurrentNX)
     For I = CurrentNX To X Step Sgn(X - CurrentNX)
        Y1 = SPointY + K * (I - SPointX)
        X1 = I
        Call DrawLine(CurrentNX, CurrentNY, X1, Y1)
        CurrentNX = X1
        CurrentNY = Y1
        CurrentNZ = Z
     Next I
  Else
     For I = CurrentNY To Y Step Sgn(Y - CurrentNY)
        Y1 = I
        X1 = CurrentNX
        Call DrawLine(CurrentNX, CurrentNY, X1, Y1)
        CurrentNX = X1
        CurrentNY = Y1
        CurrentNZ = Z
        If X = CurrentNX And Y = CurrentNY And Z = CurrentNZ Then
           Exit Sub
        End If
    Next I
  End If
  Exit Sub
errhand:
  If StopRun = False Then
  MsgBox "程序发生错误,请检查G代码!", vbOKOnly, "错误"
  End If
End Sub
Sub G03(X As Single, Y As Single, I As Single, J As Single)   'G03过程
frmmain.lblState.Caption = "逆圆插补|" & "起点: X" & CurrentNX & " Y" & CurrentNY & " Z" & CurrentNZ & "终点: X" & X & " Y" & Y & " Z" & CurrentNZ & "半径:" & CurrentNR & " 圆心:X" & I & " Y" & J
If HowDC = True Then
 Call DrawTCircle(X, Y, I, J, False)
Else
 Call DrawCircle(X, Y, I, J, False)
End If
End Sub
Sub G02(X As Single, Y As Single, I As Single, J As Single)   'G02过程
  frmmain.lblState.Caption = "顺圆插补|" & "起点: X" & CurrentNX & " Y" & CurrentNY & " Z" & CurrentNZ & "终点: X" & X & " Y" & Y & " Z" & CurrentNZ & "半径:" & CurrentNR & " 圆心:X" & I & " Y" & J
 If HowDC = True Then
  Call DrawTCircle(X, Y, I, J, True)
 Else
  Call DrawCircle(X, Y, I, J, True)
 End If
End Sub
Public Sub DrawCircle(X As Single, Y As Single, I As Single, J As Single, CircleTime As Boolean)   '无插补画圆
  Dim SPXY As Single, EPXY As Single, PointX(3) As Single, PointY(3) As Single, L As Single
  Dim CallFOR As Single
  On Error GoTo errhand
  If StopRun = True Then
     Exit Sub
  End If
  If (X - I) ^ 2 + (Y - J) ^ 2 <> CurrentNR ^ 2 And UserRTODC = False Then
       Dim ErrorR As Integer
       ErrorR = MsgBox("请检查你画圆的终点是否在圆周上!是否只以终点的X坐标作为标准?", vbYesNo, "错误")
       If ErrorR = vbNo Then
          StopRun = True
          Exit Sub
       End If
  End If
  If CircleTime = False Then
    CurrentNI = I
    CurrentNJ = J
    PointX(0) = I + CurrentNR
    PointY(0) = J
    PointX(1) = I
    PointY(1) = J + CurrentNR
    PointX(2) = I - CurrentNR
    PointY(2) = J
    PointX(3) = I
    PointY(3) = J - CurrentNR
  Else
    CurrentNI = I
    CurrentNJ = J
    PointX(0) = I + CurrentNR
    PointY(0) = J
    PointX(3) = I
    PointY(3) = J + CurrentNR
    PointX(2) = I - CurrentNR
    PointY(2) = J
    PointX(1) = I
    PointY(1) = J - CurrentNR
  End If
  SPXY = JudgePXY(CurrentNX, CurrentNY, I, J, CircleTime)
  EPXY = JudgePXY(X, Y, I, J, CircleTime)
  If SPXY <> EPXY Then
     If EPXY > SPXY Then
        For CallFOR = SPXY To EPXY
           If CallFOR + 1 < EPXY Then
            Call PXYTOGraphic(PointX(CallFOR + 1), PointY(CallFOR + 1), CallFOR, CallFOR + 1, CircleTime)
           Else
            Call PXYTOGraphic(X, Y, CallFOR, CallFOR + 1, CircleTime)
           End If
           If CallFOR + 1 = EPXY Then
             Exit For
           End If
        Next CallFOR
     ElseIf EPXY < SPXY Then
        If SPXY < 4 Then
            For CallFOR = SPXY To 3
               If CallFOR + 1 <> 4 Then
                Call PXYTOGraphic(PointX(CallFOR + 1), PointY(CallFOR + 1), CallFOR, CallFOR + 1, CircleTime)
               Else
                Call PXYTOGraphic(PointX(0), PointY(0), CallFOR, CallFOR + 1, CircleTime)
               End If
            Next CallFOR
        End If
        If EPXY = 1 Then
         Call PXYTOGraphic(X, Y, 4, 1, CircleTime)
        ElseIf EPXY > 1 Then
         Call PXYTOGraphic(PointX(1), PointY(1), 4, 1, CircleTime)
           For CallFOR = 1 To EPXY - 1
            If CallFOR + 1 = EPXY Then
              Call PXYTOGraphic(X, Y, CallFOR, CallFOR + 1, CircleTime)
              Exit For
            End If
            Call PXYTOGraphic(PointX(CallFOR + 1), PointY(CallFOR + 1), CallFOR, CallFOR + 1, CircleTime)
           Next CallFOR
        End If
      End If
  ElseIf EPXY = SPXY Then
    Dim TOX As Single, TOY As Single, StartX As Single, StartY As Single
    StartX = CurrentNX
    StartY = CurrentNY
   If CircleTime = False Then
         If SPXY = 1 Then
            If Y - CurrentNY > 0 Then
               For TOX = StartX To X Step -1
                 TOY = (CurrentNR ^ 2 - (TOX - CurrentNI) ^ 2) ^ 0.5 + CurrentNJ
                   Call DrawLine(CurrentNX, CurrentNY, TOX, TOY)
                 CurrentNX = TOX
                 CurrentNY = TOY
               Next TOX
            Else
               Call PXYTOGraphic(PointX(2), PointY(2), 1, 2, CircleTime)
               Call PXYTOGraphic(PointX(3), PointY(3), 2, 3, CircleTime)
               Call PXYTOGraphic(PointX(0), PointY(0), 3, 4, CircleTime)
               Call PXYTOGraphic(X, Y, 4, 1, CircleTime)
            End If
         ElseIf SPXY = 2 Then
            If Y - CurrentNY < 0 Then
               For TOX = StartX To X Step -1
                 TOY = (CurrentNR ^ 2 - (TOX - CurrentNI) ^ 2) ^ 0.5 + CurrentNJ
                   Call DrawLine(CurrentNX, CurrentNY, TOX, TOY)
                 CurrentNX = TOX
                 CurrentNY = TOY
               Next TOX
            Else
              Call PXYTOGraphic(PointX(3), PointY(3), 2, 3, CircleTime)
              Call PXYTOGraphic(PointX(0), PointY(0), 3, 4, CircleTime)
              Call PXYTOGraphic(PointX(1), PointY(1), 4, 1, CircleTime)
              Call PXYTOGraphic(X, Y, 1, 2, CircleTime)
            End If
         ElseIf SPXY = 3 Then
            If Y - CurrentNY < 0 Then
               For TOX = StartX To X
                 TOY = -(CurrentNR ^ 2 - (TOX - CurrentNI) ^ 2) ^ 0.5 + CurrentNJ
                   Call DrawLine(CurrentNX, CurrentNY, TOX, TOY)
                 CurrentNX = TOX
                 CurrentNY = TOY
               Next TOX
            Else
               Call PXYTOGraphic(PointX(0), PointY(0), 3, 4, CircleTime)
               Call PXYTOGraphic(PointX(1), PointY(1), 4, 1, CircleTime)
               Call PXYTOGraphic(PointX(2), PointY(2), 1, 2, CircleTime)
               Call PXYTOGraphic(X, Y, 2, 3, CircleTime)
            End If
        ElseIf SPXY = 4 Then
            If Y - CurrentNY > 0 Then
               For TOX = StartX To X
                 TOY = -(CurrentNR ^ 2 - (TOX - CurrentNI) ^ 2) ^ 0.5 + CurrentNJ
                   Call DrawLine(CurrentNX, CurrentNY, TOX, TOY)
                 CurrentNX = TOX
                 CurrentNY = TOY
               Next TOX
            Else
               Call PXYTOGraphic(PointX(1), PointY(1), 4, 1, CircleTime)
               Call PXYTOGraphic(PointX(2), PointY(2), 1, 2, CircleTime)
               Call PXYTOGraphic(PointX(3), PointY(3), 2, 3, CircleTime)
               Call PXYTOGraphic(X, Y, 3, 4, CircleTime)
            End If
        End If
  Else
         If SPXY = 1 Then
            If Y - CurrentNY < 0 Then
               For TOX = StartX To X Step -1
                 TOY = -(CurrentNR ^ 2 - (TOX - CurrentNI) ^ 2) ^ 0.5 + CurrentNJ
                   Call DrawLine(CurrentNX, CurrentNY, TOX, TOY)
                 CurrentNX = TOX
                 CurrentNY = TOY
               Next TOX
            Else
               Call PXYTOGraphic(PointX(2), PointY(2), 1, 2, CircleTime)
               Call PXYTOGraphic(PointX(3), PointY(3), 2, 3, CircleTime)
               Call PXYTOGraphic(PointX(0), PointY(0), 3, 4, CircleTime)
               Call PXYTOGraphic(X, Y, 4, 1, CircleTime)
            End If
         ElseIf SPXY = 2 Then
            If Y - CurrentNY > 0 Then
               For TOX = StartX To X Step -1
                 TOY = -(CurrentNR ^ 2 - (TOX - CurrentNI) ^ 2) ^ 0.5 + CurrentNJ
                   Call DrawLine(CurrentNX, CurrentNY, TOX, TOY)
                 CurrentNX = TOX
                 CurrentNY = TOY
               Next TOX
            Else
              Call PXYTOGraphic(PointX(3), PointY(3), 2, 3, CircleTime)
              Call PXYTOGraphic(PointX(0), PointY(0), 3, 4, CircleTime)
              Call PXYTOGraphic(PointX(1), PointY(1), 4, 1, CircleTime)
              Call PXYTOGraphic(X, Y, 1, 2, CircleTime)
            End If
         ElseIf SPXY = 3 Then
            If Y - CurrentNY > 0 Then
               For TOX = StartX To X
                 TOY = (CurrentNR ^ 2 - (TOX - CurrentNI) ^ 2) ^ 0.5 + CurrentNJ
                   Call DrawLine(CurrentNX, CurrentNY, TOX, TOY)
                 CurrentNX = TOX
                 CurrentNY = TOY
               Next TOX
            Else
               Call PXYTOGraphic(PointX(0), PointY(0), 3, 4, CircleTime)
               Call PXYTOGraphic(PointX(1), PointY(1), 4, 1, CircleTime)
               Call PXYTOGraphic(PointX(2), PointY(2), 1, 2, CircleTime)
               Call PXYTOGraphic(X, Y, 2, 3, CircleTime)
            End If
        ElseIf SPXY = 4 Then
            If Y - CurrentNY < 0 Then
               For TOX = StartX To X
                 TOY = (CurrentNR ^ 2 - (TOX - CurrentNI) ^ 2) ^ 0.5 + CurrentNJ
                   Call DrawLine(CurrentNX, CurrentNY, TOX, TOY)
                 CurrentNX = TOX
                 CurrentNY = TOY
               Next TOX
            Else
               Call PXYTOGraphic(PointX(1), PointY(1), 4, 1, CircleTime)
               Call PXYTOGraphic(PointX(2), PointY(2), 1, 2, CircleTime)
               Call PXYTOGraphic(PointX(3), PointY(3), 2, 3, CircleTime)
               Call PXYTOGraphic(X, Y, 3, 4, CircleTime)
            End If
        End If
  End If
 End If
 Exit Sub
errhand:
If StopRun = False Then
  MsgBox "程序发生错误,请检查G代码!", vbOKOnly, "错误"
End If
End Sub
Public Sub PICDRAWCLS()       '重画坐标轴
  frmmain.PicDraw.Cls
  frmmain.PicDraw.DrawWidth = 1
 If VIEWXYZ = False Then
    frmmain.PicDraw.Line (0, frmmain.PicDraw.ScaleTop - 300)-(0, 0), &HC0FFFF
    frmmain.PicDraw.Line (0, 0)-(frmmain.PicDraw.ScaleWidth / 2 - 300, 0), &HC0FFFF
    frmmain.lblXYZ0(0).Top = -100
    frmmain.lblXYZ0(0).Left = frmmain.PicDraw.ScaleWidth / 2 - 400
    frmmain.lblXYZ0(1).Top = frmmain.PicDraw.ScaleTop - 300
    frmmain.lblXYZ0(1).Left = -150
    frmmain.lblXYZ0(3).Top = -100
    frmmain.lblXYZ0(3).Left = 10
    frmmain.lblXYZ0(2).Visible = False
 Else
    frmmain.PicDraw.Line (0, frmmain.PicDraw.ScaleTop - 300)-(0, 0), &HC0FFFF
    frmmain.PicDraw.Line (0, 0)-(frmmain.PicDraw.ScaleWidth / 2 - 300, 0), &HC0FFFF
    frmmain.PicDraw.Line (0, 0)-(2000 * Cos(225 * 6.28 / 360), 2000 * Sin(225 * 6.28 / 360)), &HC0FFFF
    frmmain.lblXYZ0(2).Visible = True
    frmmain.lblXYZ0(0).Top = 2000 * Sin(225 * 6.28 / 360)
    frmmain.lblXYZ0(0).Left = 2000 * Cos(225 * 6.28 / 360)
    frmmain.lblXYZ0(2).Top = frmmain.PicDraw.ScaleTop - 300
    frmmain.lblXYZ0(2).Left = -150
    frmmain.lblXYZ0(1).Top = -100
    frmmain.lblXYZ0(1).Left = frmmain.PicDraw.ScaleWidth / 2 - 400
    frmmain.lblXYZ0(3).Top = -100
    frmmain.lblXYZ0(3).Left = 10
 End If
 frmmain.PicDraw.DrawWidth = LineW
End Sub
Public Sub DrawLine(X1 As Single, Y1 As Single, X2 As Single, Y2 As Single)    '画线过程
  Dim LX1 As Single, LX2 As Single, LY1 As Single, LY2 As Single, L As Single
  If StopRun = True Then   '判断是否按了停止
   Exit Sub
  End If
  If X1 = X2 And Y1 = Y2 And CurrentNZ = NEWZ Then
    Exit Sub
  End If
  Do While PauseRun = True    '暂停控制
    For L = 0 To 10000
      DoEvents
    Next L
  Loop
  If VIEWXYZ = True Then
   LX1 = X1 * Sin(45 * 6.28 / 360) * Cos(225 * 6.28 / 360) + Y1
   LX2 = X2 * Sin(45 * 6.28 / 360) * Cos(225 * 6.28 / 360) + Y2
   LY1 = X1 * Sin(45 * 6.28 / 360) * Sin(225 * 6.28 / 360) + CurrentNZ
   LY2 = X2 * Sin(45 * 6.28 / 360) * Sin(225 * 6.28 / 360) + NEWZ
   frmmain.Line1.X1 = LX2 * SCALESIZE
   frmmain.Line1.X2 = frmmain.Line1.X1
   frmmain.Line1.Y1 = LY2 * SCALESIZE
   frmmain.Line1.Y2 = frmmain.Line1.Y1 + 300
    If CurrentNZ = NEWZ Then
     frmmain.PicDraw.Line (LX1 * SCALESIZE, LY1 * SCALESIZE)-(LX2 * SCALESIZE, LY2 * SCALESIZE), vbGreen
    Else
     frmmain.PicDraw.Line (LX1 * SCALESIZE, LY1 * SCALESIZE)-(LX2 * SCALESIZE, LY2 * SCALESIZE), &HC00000
    End If
   CurrentNZ = NEWZ
  Else
   frmmain.Shape1.Left = X2 * SCALESIZE - 35
   frmmain.Shape1.Top = Y2 * SCALESIZE + 50
   frmmain.PicDraw.Line (X1 * SCALESIZE, Y1 * SCALESIZE)-(X2 * SCALESIZE, Y2 * SCALESIZE)
  End If
   For L = CurrentNF * 20 To 20000   '速度控制
     DoEvents
   Next L
End Sub
Public Sub G04() 'G04过程
   frmmain.lblState.Caption = "暂停"
   PauseRun = True
End Sub
Public Sub G28() 'G28过程
   frmmain.lblState.Caption = "回到参考点"
   TempX = CurrentNX
   TempY = CurrentNY
   TempZ = CurrentNZ
   Call G00(0, 0, 0)
End Sub
Public Sub G29()  'G29过程
   frmmain.lblState.Caption = "由参考点返回"
   Call G00(TempX, TempY, TempZ)
End Sub
Public Sub G40()   'G40过程
   frmmain.lblState.Caption = "取消刀具补偿"
   frmmain.LblLR.Caption = "关"
End Sub
Public Sub G41()   'G41过程
   frmmain.lblState.Caption = "打开左刀补"
   frmmain.LblLR.Caption = "左"
End Sub
Public Sub G42()    'G42过程
   frmmain.lblState.Caption = "打开右刀补"
   frmmain.LblLR.Caption = "右"
End Sub
Public Sub G54()    'G54过程
   frmmain.lblState.Caption = "工件坐标系选择"
   OPX = 0
   OPY = 0
   OPZ = 0
   frmmain.TXTOR(0) = frmmain.txtTrue(0)
   frmmain.TXTOR(1) = frmmain.txtTrue(1)
   frmmain.TXTOR(2) = frmmain.txtTrue(2)
End Sub
Public Sub G90()    'G90过程
   frmmain.lblState.Caption = "绝对值编程"
   FalsePoint = False
End Sub
Public Sub G91()   'G91过程
   frmmain.lblState.Caption = "相对值编程"
   FalsePoint = True
End Sub
Public Sub M02()   'M02过程
   frmmain.lblState.Caption = "程序停止"
   StopRun = True
End Sub
Public Sub M2()   'M02过程
   frmmain.lblState.Caption = "程序停止"
   StopRun = True
End Sub
Public Sub M03()   'M03过程
   frmmain.lblState.Caption = "主轴正转启动"
   frmmain.lblRotate.Caption = "正"
End Sub
Public Sub M3()   'M03过程
   frmmain.lblState.Caption = "主轴正转启动"
   frmmain.lblRotate.Caption = "正"
End Sub
Public Sub G43()   'G43过程
   frmmain.lblState.Caption = "刀具长度正向补偿"
   FalsePoint = True
End Sub
Public Sub G44()   'G44过程
   frmmain.lblState.Caption = "刀具长度负向补偿"
   FalsePoint = True
End Sub
Public Sub M06()   'M06过程
   frmmain.lblState.Caption = "换刀"
   FalsePoint = True
End Sub
Public Sub M6()   'M06过程
   frmmain.lblState.Caption = "换刀"
   FalsePoint = True
End Sub
Public Sub M04()    'M04过程
   frmmain.lblState.Caption = "主轴反转启动"
   frmmain.lblRotate.Caption = "反"
End Sub
Public Sub M4()    'M04过程
   frmmain.lblState.Caption = "主轴反转启动"
   frmmain.lblRotate.Caption = "反"

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -