[CDR X5-X8] Нужна помощь в создании кода для кнопки макроса

  • Автор темы Автор темы elshad66
  • Дата начала Дата начала
этот код из enumport
Код:
Option Explicit

Type DCB
    DCBlength As Long
    BaudRate As Long
    fBitFields As Long
    wReserved As Integer
    XonLim As Integer
    XoffLim As Integer
    ByteSize As Byte
    Parity As Byte
    StopBits As Byte
    XonChar As Byte
    XoffChar As Byte
    ErrorChar As Byte
    EofChar As Byte
    EvtChar As Byte
    wReserved1 As Integer
End Type

Type COMMCONFIG
    dwSize As Long
    wVersion As Integer
    wReserved As Integer
    dcbx As DCB
    dwProviderSubType As Long
    dwProviderOffset As Long
    dwProviderSize As Long
    wcProviderData As Byte
End Type
Public Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)
Declare Function GetDefaultCommConfig Lib "kernel32" _
    Alias "GetDefaultCommConfigA" (ByVal lpszName As String, _
             lpCC As COMMCONFIG, lpdwSize As Long) As Long
            
 Function EnumSerPorts(Port As Integer) As Long 'Функция вернет  1 , если порт есть
    Dim cc As COMMCONFIG, ccsize As Long
    ccsize = LenB(cc)     '
    EnumSerPorts = GetDefaultCommConfig("COM" + Trim(str(Port)) + Chr(0), cc, ccsize)
End Function


Function SearchSerPort(ByVal TimeSleep As Integer) As Boolean  'Перебор номеров портов от 1 до 255
    Dim Port_ As Integer, ok As Boolean
    
        For Port_ = 1 To 255
        ok = PortCom(Port_, TimeSleep)
            If ok Then
                SearchSerPort = True
                Exit Function
            End If
        Next Port_
      SearchSerPort = False  'Возвращаем False если ни один порт не ответил
End Function

Function PortCom(ByVal Port_ As Integer, ByVal TimeSleep As Integer) As Boolean  'Проверка определенного порта
    UserForm.GRBLAnswerFlag = False
    If EnumSerPorts(Port_) Then
         UserForm.MSComm.CommPort = Port_
         UserForm.MSComm.Settings = "115200,N,8,1"
         UserForm.MSComm.InputLen = 0
         UserForm.MSComm.PortOpen = True
                DoEvents    'Отдаем обработку событиям
                Sleep (TimeSleep)  'Засыпаем
                DoEvents    'Отдаем обработку событиям
                If UserForm.GRBLAnswerFlag Then  'GRBLAnswerFlag=True когда событие comEvReceive в MSComm_OnComm получило "GRBL"
                    PortCom = True  'Порт подключили и он ответил Grbl
                    UserForm.PortNum = Port_
                    Exit Function
                End If
            
         UserForm.MSComm.PortOpen = False ' Если время вышло (порт не ответил grbl)
                                          'Отключаемся от него и переходим к следующему порту
    End If
 PortCom = False
End Function
 
Этот код ничто никуда не шлет - судя по всему это просто проверка готовности порта при инициализации
 
там всего 2 кода 1 из uzerform второй из enumport а третий модуль старт
последний из enumport , да проверка , выше глянь там код из форм
 
Последнее редактирование:
Код из форм просто загружает переменную textcode из файла
Где код, отправляющий ее на COMпорт?
 
все что есть в макросе я выложил, может это?
Код:
Private Static Sub CommandButtonStart_Click()
    CommandButtonStart.Enabled = False
    
    If FlagFirstRun Then  ' Первый запуск
        CommandButtonPausa.Enabled = True
        TextArr = Split(TextCode.Text, vbCrLf) 'Получаем массив строк . в TextCode.Text содержиться g code
        LineRun = 0
        FlagFirstRun = False
        TextOut.Text = ""
    End If
        
    If UBound(TextArr) < LineRun Then
        LineRun = 0
        FlagFirstRun = True
        CommandButtonPausa.Enabled = False
        CommandButtonStart.Enabled = True
        Exit Sub
    Else
        TextOut.Text = TextOut.Text & LineRun & " | " & TextArr(LineRun) & " => "
        TextOut.SetFocus
        Send TextArr(LineRun)
        LineRun = LineRun + 1
    End If
End Sub
 
вот все три
 

Вложения

  • bandicam 2021-07-31 21-06-15-515.jpg
    bandicam 2021-07-31 21-06-15-515.jpg
    369.3 КБ · Просм.: 204
Вроде да но этот код посылает только одну строку как я понимаю
Он или не полон или где то должен быть цикл по всем строкам TextArr
 
Последнее редактирование:
есть еще клас поин
Код:
Private x_ As Double
Private y_ As Double

Property Get X() As Double
X = x_
End Property
Property Let X(ByVal Value As Double)
x_ = Value
End Property
Property Get Y() As Double
Y = y_
End Property
Property Let Y(ByVal Value As Double)
y_ = Value
End Property
т но там автор начал но не закончил ,как я понимаю генератор кода,вот
 
Нет
У вас метод CommandButtonStart_Click по коду парсит gcode и посылает одну строку
То есть или весь gcode состоит из одной строки и послание захлебывается или где то должен быть цикл из которого вызывается CommandButtonStart_Click
Я понятно излагаю?
 
я понял ,но станок работает читая код ,вот здесь автор описал что можно отправлять гкод на станок
я скачал по второй ссылке ,по первой только подключаеться и можно отправить только одну строку , и то ее надо вставить в окошко
вот гкод ,он читает все подряд?
 

Вложения

  • bandicam 2021-07-31 21-30-34-437.jpg
    bandicam 2021-07-31 21-30-34-437.jpg
    316.3 КБ · Просм.: 197
Последнее редактирование:
Вы меня совсем запутали - он сейчас у вас одну строку отправляет или весь файл? У вас при чтении из файла он на строки разбивается то есть по коду что вы привели должен только одну строку отправить. А у вас как?
 
щяс глянул ,код для CommandButtonStart_Click в другом ,такой же один к одному

вот здесь что ,про буфер заполнения
Код:
Private Sub MSComm_OnComm()
 
   Select Case MSComm.CommEvent
  
          Case comEventBreak   'Получен сигнал Break.
                MsgBox "comEventBreak"
          Case comEventFrame   ' Framing Error ошибка кадрирования
                MsgBox "comEventFrame"
          Case comEventOverrun   ' Data Lost. Потерянные Данные
                MsgBox "comEventOverrun"
          Case comEventRxOver   ' Receive buffer overflow.Переполнение буфера приема.
                MsgBox "comEventRxOver"
          Case comEventRxParity   ' Parity Error.ошибка четности
                MsgBox "comEventRxParity"
          Case comEventTxFull   ' Transmit buffer full.Буфер передачи заполнен.
                MsgBox "comEventTxFull"
          Case comEventDCB   ' Unexpected error retrieving DCB Непредвиденная ошибка при получении DCB
                MsgBox "comEventDCB"
          Case comEvCTS  ' Change in the CTS line.
                MsgBox "comEvCTS"
          Case comEvDSR  ' Change in the DSR line.
                MsgBox "DSR Signal"
          Case comEvReceive   ' Received RThreshold # of chars.  получение текстовых символов
              GRBLAnswerText = MSComm.Input
                        If InStr(GRBLAnswerText, "Grbl") Then
                           GRBLAnswerFlag = True 'Порт подключили и он ответил Grbl
                        Else
                            TextOut.Text = TextOut.Text & GRBLAnswerText ' & vbCrLf
                            TextOut.SetFocus
                            GRBLAnswerText = ""
                            If FlagFirstRun = False And LineRun > 0 Then
                                CommandButtonStart_Click
                            End If
                        End If
    End Select
End Sub
 
То есть у вас работает именно этот код?
Судя по нему это обработчик сигнала от COM порта - в зависимости от MSComm.CommEvent или ошибку выдает или следующую строку посылает
Вроде все похоже на правильную обработку но непонятно от чего захлебывается тогда?
 
Приложенный фрагмент кода именно занимается тем что
после отправки одной строки она получает ответ от станка ,что комманда выполнена ,потом посылает следующюю строку кода,
Можно попробовать скажем, задержку поставить, будет примерно как по шине постучать ;)
Например после CommandButtonStart_Click вставьте Sleep (1000)
 
Последнее редактирование:
куда поставить, попробую
видео пытаюсь загрузить ,не получается , в mp4 1мб ,загружается но при открытии звук есть изображения нет
 
1000 много ,вообще зависает поставил 10 , работает завтра протестирую , отпишусь
 

Вложения

  • bandicam 2021-07-31 23-06-25-464.jpg
    bandicam 2021-07-31 23-06-25-464.jpg
    294.4 КБ · Просм.: 184
Ну я с запасом поставил, чтобы можно было сказать наверняка - если при такой огромной задержке буфер не успевает разгребать значит чтото еще не так