Макрос безопасности на кнопку cycle start

Mach, популярные и не очень CAD, CAM. Обсуждение и разработка программ для управления станками.
wormball
Новичок
Сообщения: 20
Зарегистрирован: 03 сен 2019, 22:33
Репутация: 0
Контактная информация:

Макрос безопасности на кнопку cycle start

Сообщение wormball »

Здравствуйте!

Сегодня сломал две фрезы. Одну сломал, ибо цанга задела деревяшку. А вторую сломал, когда поменял фрезу и хотел запустить программу сначала, но у мача было иное мнение по этому вопросу. Как вы уже догадались, он втихаря стал продолжать незаконченную программу, даже не потрудившись включить шпиндель.

Так вот, об чём это я. Я тут подумал, что хватит это терпеть, и хорошо бы иметь макрос на кнопке cycle start, который бы проверял, находится ли программа в процессе исполнения, и спрашивал бы, действительно ли я хочу её продолжить, ещё и напоминал, что неплохо было бы включить шпиндель.

А также было бы неплохо, чтобы он спрашивал, хочу ли я сбросить g52, ибо порою я вырезаю много деталей за раз при помощи означенного кода, и ежели остановить программу посередине, начать другую и не сбросить таковой код, то это слегонца чревато.

Быть может, у вас уже есть означенные макросы? Или вы знаете, какие функции использовать?

И кстати говоря, ежели я заменю макрос на кнопке на экране, то будет ли он исполняться по нажатию соответствующей комбинации клавиш?

Заранее благодарен.
wormball
Новичок
Сообщения: 20
Зарегистрирован: 03 сен 2019, 22:33
Репутация: 0
Контактная информация:

Re: Макрос безопасности на кнопку cycle start

Сообщение wormball »

Оказывается, у этой паскуды нельзя поменять кнопку cycle start. Точнее, можно, но только посредством редактора экрана. Произвёл означенную процедуру при помощи Mach3Screen.exe , теперь все экраны кривые, на кнопке cycle start ничего не написано, так ещё и оная кнопка отказывается работать, ежели загрузить г-код (причём до некоторого момента работало!) и не говорит ни одной ошибки, даже ежели соответствующий код запустить через редактор кода. Правда, на рабочей машине ещё не пробовал и screen4 также не пробовал.

Пока что вот такой код получается:

Код: Выделить всё

is_g52 = GetOemLed(10)
is_offset = GetOemLed(75)

g52_x = GetOEMDRO(184)
g52_y = GetOEMDRO(185)
g52_z = GetOEMDRO(186)
g52_a = GetOEMDRO(187)
g52_b = GetOEMDRO(188)
g52_c = GetOEMDRO(189)

off_x = GetOEMDRO(830)
off_y = GetOEMDRO(831)
off_z = GetOEMDRO(832)
off_a = GetOEMDRO(833)
off_b = GetOEMDRO(834)
off_c = GetOEMDRO(835)

current_line = GetOEMDRO(816)

' MachMsg( "G52 offsets: " & vbNewLine & g52_x & vbNewLine & g52_y & vbNewLine & g52_z & vbNewLine & " Fixture offsets: " & vbNewLine & off_x & vbNewLine & off_y & vbNewLine & off_z & vbNewLine  & " Current line of code: " & current_line, "Start", 2)

MachMsg( "G52 offsets: " & " " & g52_x & " " & g52_y & " " & g52_z & " " & " Fixture offsets: " & " " & off_x & " " & off_y & " " & off_z & " "  & " Current line of code: " & current_line, "Start", 2)

 
DoOemButton(1000)
Пока что ничего не делает, чисто выводит координаты. Но уже эффект г52 налицо и строчка кода правильная показывается, что не может не радовать. Правда, непонятно, будет ли она соответствовать той строчке, которая на экране, или той, на которой прервалось исполнение.
wormball
Новичок
Сообщения: 20
Зарегистрирован: 03 сен 2019, 22:33
Репутация: 0
Контактная информация:

Re: Макрос безопасности на кнопку cycle start

Сообщение wormball »

Вощем поборол (почти) мача при помощи screen4.

Вот такой получается скрипт:

Код: Выделить всё

vbCrLf = Chr(13) & Chr(10) 
vbNewLine = vbCrLf
' Define some constants for MachMsg dialog types
MachMsgTypeOK = 0
MachMsgTypeOKCancel = 1
MachMsgTypeAbortRetryIgnore = 2
MachMsgTypeYesNoCancel = 3
MachMsgTypeYesNo = 4
MachMsgTypeRetryCancel = 5
MachMsgTypeCancelTryAgainContinue = 6
' Define some constants for MachMsg return codes
MachMsgReturnOK = 1
MachMsgReturnCancel = 2
MachMsgReturnAbort = 3
MachMsgReturnRetry = 4
MachMsgReturnIgnore = 5
MachMsgReturnYes = 6
MachMsgReturnNo = 7
MachMsgReturnTryAgain = 10
MachMsgReturnContinue = 11 

OEM_Button_Start = 1000 



is_offset  = GetOemLed(75)  ' OEM LED Offset In Effect 75
is_running = GetOemLed(804) ' OEM LED Start
is_paused  = GetOemLed(805) ' OEM LED Pause Feed Hold

g52_x = GetOEMDRO(184)
g52_y = GetOEMDRO(185)
g52_z = GetOEMDRO(186)
g52_a = GetOEMDRO(187)
g52_b = GetOEMDRO(188)
g52_c = GetOEMDRO(189)

work_x = GetOEMDRO(178)
work_y = GetOEMDRO(179)
work_z = GetOEMDRO(180)
work_a = GetOEMDRO(181)
work_b = GetOEMDRO(182)
work_c = GetOEMDRO(183)

dif_x = work_x - g52_x
dif_y = work_y - g52_y
dif_z = work_z - g52_z
dif_a = work_a - g52_a
dif_b = work_b - g52_b
dif_c = work_c - g52_c

zero_dif = (dif_x = 0) and (dif_y = 0) and (dif_z = 0) and (dif_a = 0) and (dif_b = 0) and (dif_c = 0)


current_line = GetOEMDRO(816)


resume_ans = MachMsgReturnOK
g52_ans = MachMsgReturnOK

If is_offset or (not zero_dif) Then
    g52_ans = MsgBox ("Nonzero G52 offsets detected: " _
	& vbNewLine & vbNewLine & "X: " & Format(dif_x, "0.00") & vbNewLine & "Y: " & Format(dif_y, "0.00") & vbNewLine & "Z: " & Format(dif_z, "0.00") _
	& vbNewLine & "A: " & Format(dif_a, "0.00") & vbNewLine & "B: " & Format(dif_b, "0.00") & vbNewLine & "C: " & Format(dif_c, "0.00") _
	& vbNewLine & vbNewLine & "If you are not resuming interrupted work " & vbNewLine & "or not sure the coordinates are perfectly correct, " _
	& vbNewLine & "this will lead to unwanted results." & vbNewLine _
	& vbNewLine & "Issue G52x0y0z0a0b0c0 and set zero coordinates again" _
	& vbNewLine & "or push OK if you know what you are doing." _
	, 1, "This is dangerous")
End If

If (not (current_line = 0)) and (g52_ans = MachMsgReturnOK) Then
    resume_ans = MsgBox ("The mach3 said the current line is " & current_line & " ." _
	& vbNewLine & "It may mean you are about to resume the job at this line." _
	& vbNewLine & "However it can mean you simply scrolled the program," _
	& vbNewLine & "and the execution will start at line 0." _
	& vbNewLine & "Do you want to proceed?" _
	& vbNewLine & vbNewLine & "Do not forget to start the spindle!", 1, "This is dangerous!")
End If

If (resume_ans = MachMsgReturnOK) and (g52_ans = MachMsgReturnOK) Then
    ' MsgBox "Starting!"
    DoOemButton(OEM_Button_Start)
Else
    ' MsgBox "Not starting!"
End If

Вроде работает, только одно маленькое но - оно не отличает ситуации "пожата кнопка стоп" от "всё уже завершено либо ещё не начиналось, а человек просто перемотал г-код в окошке". А вот мач ещё как означенные ситуации отличает и в первом случае втихаря продолжает с того же места без запуска шпинделя, и выливается это отличие в сломанную фрезу и испорченную заготовку. Я ещё вот такие индикаторы нашёл в древнем манускрипте:

Код: Выделить всё

OEM LED Start 804
OEM LED Pause Feed Hold 805
OEM LED Optional Stop 65 
OEM LED Pause 80
, только вот они не помогли мне отличить означенные ситуации, хотя отличают ситуацию "процесс идёт" от "feed hold" и "стоп" (но вот два вышеуказанных вида стопа не отличают).

Ещё бы хорошо добавить проверку на вращение координат и иные смещения.

Также мне кажется слегонца подозрительным молчание в настоящем топике (и в гугле тоже, что характерно). Вроде полезная должна быть вещь, и наверняка должна была за эти десятилетия миллионам людей в голову прийти. Уж не означает ли это, что все, кроме меня, уже это попробовали, убедились, что это невозможно, а теперь запаслись попкорном и смотрят, как я буду наступать на грабли?
Ответить

Вернуться в «Windows / Mach»