Ladder
- Loituma
- Мастер
- Сообщения: 512
- Зарегистрирован: 28 ноя 2011, 21:45
- Репутация: 57
- Контактная информация:
Re: Ladder
А как реализовать в программе удар? Представили себе пресс координатный, мы подтащили заготовку к месту и какой командой сделать удар?
G0 x100 y100
????????? --- команда удара
G0 x200 y200
????????? --- команда удара.
Понимаю, что можно как то реализовать, но как?
G0 x100 y100
????????? --- команда удара
G0 x200 y200
????????? --- команда удара.
Понимаю, что можно как то реализовать, но как?
- PKM
- Почётный участник
- Сообщения: 4263
- Зарегистрирован: 31 мар 2011, 18:11
- Репутация: 705
- Настоящее имя: Андрей
- Откуда: Украина
- Контактная информация:
Re: Ladder
Например через М-коды
То есть скажем М111 будет устанавливать в 1 (и потом сбрасывать в 0) некий пин, который даст команду бабахнуть
То есть скажем М111 будет устанавливать в 1 (и потом сбрасывать в 0) некий пин, который даст команду бабахнуть
- Loituma
- Мастер
- Сообщения: 512
- Зарегистрирован: 28 ноя 2011, 21:45
- Репутация: 57
- Контактная информация:
Re: Ladder
Гениальное просто, но как на это среагирует программа?
То есть: что бы матрице пуансону отработать требуется пол секунды минимум, как на это отреагируют оси? Они будут дожидаться пока будет выполнено или все таки придется делать кнопку "продолжить программу"
Тогда, программа принимает вид:
G0 x100 y100
m101 - установка пина на удар
m0
m102 - выключение пина
G0 x200 y200
m101 - установка пина на удар
m0
m102 - выключение пина
или сделать через ладдер, что то вроде: то есть логика: от кода m111 в ладдере устанавливается некое реле (на рис Y10) в 1 и таймер t1 встает на питание, и по переднему фронту сбрасывает реле Y10 в 0
чеж ладдер та такой кривой (((( вот бы в плк, я бы полдня бы и закончил ))))
То есть: что бы матрице пуансону отработать требуется пол секунды минимум, как на это отреагируют оси? Они будут дожидаться пока будет выполнено или все таки придется делать кнопку "продолжить программу"
Тогда, программа принимает вид:
G0 x100 y100
m101 - установка пина на удар
m0
m102 - выключение пина
G0 x200 y200
m101 - установка пина на удар
m0
m102 - выключение пина
или сделать через ладдер, что то вроде: то есть логика: от кода m111 в ладдере устанавливается некое реле (на рис Y10) в 1 и таймер t1 встает на питание, и по переднему фронту сбрасывает реле Y10 в 0
чеж ладдер та такой кривой (((( вот бы в плк, я бы полдня бы и закончил ))))
- PKM
- Почётный участник
- Сообщения: 4263
- Зарегистрирован: 31 мар 2011, 18:11
- Репутация: 705
- Настоящее имя: Андрей
- Откуда: Украина
- Контактная информация:
Re: Ladder
Можно сделать и в одной команде, мне кажется... установить пин и ждать, пока исполнительный механизм отработает и выдаст сигнал завершения. Но не уверен, как именно это сделать.
В крайнем случае после М111 добавить M66
В крайнем случае после М111 добавить M66
- Loituma
- Мастер
- Сообщения: 512
- Зарегистрирован: 28 ноя 2011, 21:45
- Репутация: 57
- Контактная информация:
Re: Ladder
эххх, ну ладно я это обойду кустарным методом и напишу методичку к написанию программы... Или напишу интерпретатор который формирует команды по координатам.
Есть другая проблема, которая мне кажется более ужасной:
Алгоритм работы станка:
Включили, захомили X, Захомили Y, а вот с Z то крутая проблема: перед тем как его захомить, нужно совершить ряд действий в автоматическом режиме, а именно отвести фиксаторы... РКМ, ты же делал смену инструмента, там же перед тем как выставить нулевой инструмент, надо как минимум фиксатор убрать или нет?
Есть другая проблема, которая мне кажется более ужасной:
Алгоритм работы станка:
Включили, захомили X, Захомили Y, а вот с Z то крутая проблема: перед тем как его захомить, нужно совершить ряд действий в автоматическом режиме, а именно отвести фиксаторы... РКМ, ты же делал смену инструмента, там же перед тем как выставить нулевой инструмент, надо как минимум фиксатор убрать или нет?
- PKM
- Почётный участник
- Сообщения: 4263
- Зарегистрирован: 31 мар 2011, 18:11
- Репутация: 705
- Настоящее имя: Андрей
- Откуда: Украина
- Контактная информация:
Re: Ladder
У меня ничего не нужно убирать.
А что за фиксаторы? Может просто убирать их при включении станка?
А что за фиксаторы? Может просто убирать их при включении станка?
- Loituma
- Мастер
- Сообщения: 512
- Зарегистрирован: 28 ноя 2011, 21:45
- Репутация: 57
- Контактная информация:
Re: Ladder
да вот фиг его знает, скорее не выйдет. ну допустим станок выключен, то как хомится? Выставлять фиксаторы при старте программы? опасно.... че то хрен его знает... Единственный выход который я пока вижу - это только делать физическую кнопку home z, ее запустить через внешний PLC и пока все условия не будут выполнены, он не даст сигнал на месу...
- PKM
- Почётный участник
- Сообщения: 4263
- Зарегистрирован: 31 мар 2011, 18:11
- Репутация: 705
- Настоящее имя: Андрей
- Откуда: Украина
- Контактная информация:
Re: Ladder
Можно все внутренней логикой HAL или classicladder сделать не хуже PLC.
Так что там за фиксаторы, они убираются автоматически? Какой алгоритм процесса?
Так что там за фиксаторы, они убираются автоматически? Какой алгоритм процесса?
- Loituma
- Мастер
- Сообщения: 512
- Зарегистрирован: 28 ноя 2011, 21:45
- Репутация: 57
- Контактная информация:
Re: Ladder
обычные штыри с двух сторон на пневмотяге...
логика такова: при нажатии хоум алл ну или хоум z хал должен подтянуть катушку которая управляет пневмораспределителем и проверить по датчикам, что выполненно. после этого захомить з и вставить штыри обратно и проверить что вставленны
логика такова: при нажатии хоум алл ну или хоум z хал должен подтянуть катушку которая управляет пневмораспределителем и проверить по датчикам, что выполненно. после этого захомить з и вставить штыри обратно и проверить что вставленны
- PKM
- Почётный участник
- Сообщения: 4263
- Зарегистрирован: 31 мар 2011, 18:11
- Репутация: 705
- Настоящее имя: Андрей
- Откуда: Украина
- Контактная информация:
Re: Ladder
Интересно, надо подумать. Наверное проще вручную кнопку ткнуть перед хомлением. А проверки сделать обязательно, да...
- Loituma
- Мастер
- Сообщения: 512
- Зарегистрирован: 28 ноя 2011, 21:45
- Репутация: 57
- Контактная информация:
Re: Ladder
Ладно, будем собирать и думать, что делать и кто виноват.
- Nick
- Мастер
- Сообщения: 22776
- Зарегистрирован: 23 ноя 2009, 16:45
- Репутация: 1735
- Заслуга: Developer
- Откуда: Gatchina, Saint-Petersburg distr., Russia
- Контактная информация:
Re: Ladder
А чем не понравился m64?Loituma писал(а):G0 x100 y100
m101 - установка пина на удар
m0
m102 - выключение пина
Код: Выделить всё
M64 P0 ; вкл удар
M66 P0 L1 Q10 ; ждем срабатывания пина готовности
M65 P0 ; выкл удар
Код: Выделить всё
M64 P0 ; вкл удар
G4 P0.1 ; ждем 0.1с
M65 P0 ; выкл удар
M66 P0 L1 Q10 ; ждем срабатывания пина готовности
Код: Выделить всё
O100 IF [#5399 EQ -1]
(DEBUG, Неисправность при ударе!)
M02
O100 ENDIF
O<punch> SUB, ну и потом как обычно O<punch> CALL.
- Nick
- Мастер
- Сообщения: 22776
- Зарегистрирован: 23 ноя 2009, 16:45
- Репутация: 1735
- Заслуга: Developer
- Откуда: Gatchina, Saint-Petersburg distr., Russia
- Контактная информация:
Re: Ladder
Сделай на ладдере кнопку для хуминга.Loituma писал(а):логика такова: при нажатии хоум алл ну или хоум z хал должен подтянуть катушку которая управляет пневмораспределителем и проверить по датчикам, что выполненно. после этого захомить з и вставить штыри обратно и проверить что вставленны
Которая сначала уберет все блокираторы, а потом выставит halui.joint.N.home в 1.
halui.joint.N.home bit in
pin for homing joint N
Только надо как-то стандартные кнопки хоуминга заблокировать.
...
О, можно проверять, если axis.N.homing активен, но блокиролвка не снята - то Авост.
axis.N.homing OUT BIT
TRUE if the joint is currently homing
- Loituma
- Мастер
- Сообщения: 512
- Зарегистрирован: 28 ноя 2011, 21:45
- Репутация: 57
- Контактная информация:
Re: Ladder
Ник, считай что ты со мной матом поговорил... мне это переваривать неделю )))
- Nick
- Мастер
- Сообщения: 22776
- Зарегистрирован: 23 ноя 2009, 16:45
- Репутация: 1735
- Заслуга: Developer
- Откуда: Gatchina, Saint-Petersburg distr., Russia
- Контактная информация:
Re: Ladder
Откуда начинать объяснять?
Что более не понятно, Gкод или хоуминг оси?
Что более не понятно, Gкод или хоуминг оси?
- Loituma
- Мастер
- Сообщения: 512
- Зарегистрирован: 28 ноя 2011, 21:45
- Репутация: 57
- Контактная информация:
Re: Ladder
ща прокачу станок, потом будем выяснять
- vovafed
- Мастер
- Сообщения: 1822
- Зарегистрирован: 08 фев 2013, 16:19
- Репутация: 325
- Настоящее имя: Владимир
- Откуда: башкортостан
- Контактная информация:
Re: Ladder
пока только пытаюсь разобраться в Ladder
есть револьверный магазин для инструмента на 8 ячеек
номер инструмента считывается 3 датчиками
вероятней всего в виде двоичного кода
вопрос такой как в Ladder сделать дешифратор двоичного кода в номер инструмента
станок этот http://www.cnc-club.ru/forum/viewtopic. ... 12#p234212
есть револьверный магазин для инструмента на 8 ячеек
номер инструмента считывается 3 датчиками
вероятней всего в виде двоичного кода
вопрос такой как в Ladder сделать дешифратор двоичного кода в номер инструмента
станок этот http://www.cnc-club.ru/forum/viewtopic. ... 12#p234212
-
- Мастер
- Сообщения: 8340
- Зарегистрирован: 28 ноя 2011, 00:25
- Репутация: 1589
- Контактная информация:
Re: Ladder
там может быть и код грея , но это не так существено( прояснить конечно необходимо))vovafed писал(а):вероятней всего в виде двоичного кода
есть вроде такой компонент (надо его поближе рассмотреть)
- N1X
- Мастер
- Сообщения: 3653
- Зарегистрирован: 16 фев 2015, 21:19
- Репутация: 1645
- Настоящее имя: Владимир
- Откуда: Беларусь, Гомель
- Контактная информация:
Re: Ladder
А скорее всего будет как обычно: индексация (начало отсчета), счет и фиксация (контроль зазима)
-
- Мастер
- Сообщения: 8340
- Зарегистрирован: 28 ноя 2011, 00:25
- Репутация: 1589
- Контактная информация:
Re: Ladder
пригодится-не пригодится,я оставлю здесь этот компонент:
он работает с кодом грея,двоичным кодом, index + position ...
Код: Выделить всё
component carousel """Orient a toolchanger carousel using various encoding schemes
.B loadrt toolchange pockets=\\fIN\\fR[,\\fIN\\fR]
.B encoding=\\fIssss\\fR[,\\fIsss\\fR]\\fB
.B num_sense=\\fIN\\fR[,\\fIN\\fR]
.B bidirectional=\\fIN\\fR[,\\fIN]
.RS 4
.TP
\\fBpockets\\fR The number of pockets in each toolchanger.
Use up to 8 numbers separated by commas to create multiple carousel components.
.TP
\\fBencoding\\fR The position encoding.
gray, binary, index or single. Default = 'gray'
.TP
\\fBnum_sense\\fR The number of position sense pins.
Default = 4.
.TP
\\fBdir\\fR Set to 1 for unidirectional or 2 for bidirectional operation.
Default = bidirectional
.RE""";
description """This component is intended to help operate various types of
carousel-type toolchangers.
The component can be configured to operate with binary or gray-coded position
feedback, with an individual sensor for each tool position or with a sensor at each
tool position and a separate index.
At the moment it is best-suited to Geneva-mechanism type systems where the
motor is either on or off.
Both unidirectional and bidirectional systems are supported.
The number of carousel component instances created depends on the number of
entries in the 'pockets' modparam. For example
.B loadrt carousel pockets=10,10,8
Would create 3 carousel instances with 10, 10 and 8 pockets. The other
parameters are optional. If absent then defaults will be used. Any missing
entry will assume the previous value.
When the enable pin is set to true the component will immediately set the
"active" pin to true and then (for a bidirectional instance) calculate the
shortest path to the requested pocket number. The appropriate motor direction
output pin will then be set.
The component will monitor the carousel position and, when the correct position
is reached, set the motor-control pins to 0, set "active" to 0 and set "ready"
to 1.
In index mode the behaviour is slightly different the first time that the "enable"
pin is set; the carousel will rotate forwards when first enabled until
both the index and pulse inputs are true. If there is no pulse line at the
index position then a HAL "or2" function can be used to allow the index sensor
to toggle both inputs. Setting "enable" low does not halt the homing move, so if
homing on first tool change is not needed then the enable pin can be toggled by
an axis homing pin or a script.
""";
pin in signed pocket-number "The pocket to move to when the .enable pin goes high";
pin in bit enable "Set this pin high to start movement. Setting it low will stop movement";
pin out bit active "indicates that the component is active";
pin out bit ready "This pin goes high when the carousel is in-position";
pin in bit sense-# [32:personality] """Carousel position feedback pins. In 'index' mode there
will be only 2 pins. sense-0 is the index and sense-1 is the pocket sensor.""";
pin out bit motor-fwd "Indicates the motor should run forwards (bigger numbers)";
pin out bit motor-rev "Indicates the motor should run reverse.";
pin out signed current-position "This pin indicates the current position feedback";
param r signed state = 0 "Current component state";
param r bit homing = 0 "Shows that homing is in progress. Only used for index mode";
param r bit homed = 0 "Shows that homing is complete. Only used in index mode";
option count_function;
option extra_setup;
license "GPL";
author "andy pugh";
variable int inst_sense;
variable int inst_dir;
variable int inst_pockets;
variable int inst_code;
variable int old_index = 0;
function _ nofp;
;;
int default_pockets = 8;
int default_code = 'G';
int default_dir = 2;
int default_sense = 4;
#define MAX_CHAN 8
static int pockets[MAX_CHAN] = {-1};
RTAPI_MP_ARRAY_INT(pockets, MAX_CHAN, "The number of pockets in each carousel")
static char *encoding[MAX_CHAN];
RTAPI_MP_ARRAY_STRING(encoding, MAX_CHAN, "Position feedback type")
static int dir[MAX_CHAN] = {-1};
RTAPI_MP_ARRAY_INT(dir, MAX_CHAN,
"set to 2 if the carousel is bidirectional")
static int num_sense[MAX_CHAN] = {-1};
RTAPI_MP_ARRAY_INT(num_sense, MAX_CHAN, "The number of sense pins to create")
FUNCTION(_){
int i;
int p = 0;
unsigned int mask;
switch inst_code{
case 'G': // Gray Code
for (i = 0; i < inst_sense ; i++) {
p += sense(i) << i;
}
for(mask = p >> 1 ; mask != 0 ; mask = mask >> 1){
p ^= mask;
}
break;
case 'B': // Straight Binary
for (i = 0; i < inst_sense ; i++) {
p += sense(i) << i;
}
break;
case 'S': // individual sensors
for (i = inst_sense - 1; sense(i) == 0 && i > 0 ; i--) {}
p = i;
break;
case 'I': // index + position.
p = current_position;
if (homed){
if ( !old_index && sense(1)){
if (motor_fwd){
p += 1;
if (p > inst_pockets) p -= inst_pockets;
}
if (motor_rev) {
p -= 1;
if (p < 1) p += inst_pockets;
}
}
old_index = sense(1);
}
break;
}
current_position = p;
switch (state){
case 0: // waiting at start
if (! enable) return ;
active = 1;
if (inst_code == 'I' && ! homed){
state = 10;
break;
}
state = 1;
ready = 0;
case 1: // choose direction
if (pocket_number < 1 || pocket_number > inst_pockets) return;
if (inst_dir == 2){
if (current_position < pocket_number){
if (pocket_number - current_position > (inst_pockets / 2)) {
motor_fwd = 0;
motor_rev = 1;
} else {
motor_fwd = 1;
motor_rev = 0;
}
} else {
if (current_position - pocket_number > (inst_pockets / 2)) {
motor_fwd = 1;
motor_rev = 0;
} else {
motor_fwd = 0;
motor_rev = 1;
}
}
} else {
motor_fwd = 1;
motor_rev = 0;
}
state = 2;
case 2: // moving
if ((current_position != pocket_number) && enable) return;
motor_fwd = 0;
motor_rev = 0;
state = 3;
active = 0;
if (enable) ready = 1;
case 3: //waiting for enable to go false
if (enable) return;
state = 0;
break;
case 10: // start of homing
homed = 0;
homing = 1;
motor_fwd = 1;
motor_rev = 0;
state = 11;
case 11: // waiting for index & pulse
if ( (! old_index) && (sense(0) && sense(1)) ){ // index found
p = 1;
homed = 1;
homing = 0;
active = 0;
state = 0;
}
old_index = (sense(0) && sense(1));
break; // So that we don't see the tool1 pulse twice
}
}
EXTRA_SETUP(){
if (pockets[extra_arg] > 0) default_pockets = pockets[extra_arg];
if (encoding[extra_arg] == NULL) {
//it's already default_code
} else if (strncmp(encoding[extra_arg], "binary", 6) == 0) {
default_code = 'B';
} else if (strncmp(encoding[extra_arg], "single", 6) == 0) {
default_code = 'S';
} else if (strncmp(encoding[extra_arg], "index", 5) == 0) {
default_code = 'I';
}
if (dir[extra_arg] > 0) default_dir = (dir[extra_arg] > 1)? 2:1;
if (default_code == 'I') {
default_sense = 2;
} else if (num_sense[extra_arg] > 0 ) {
default_sense = num_sense[extra_arg];
}
inst_pockets = default_pockets;
inst_code = default_code;
inst_dir = default_dir;
inst_sense = default_sense;
if (inst_code == 'S' && inst_sense < inst_pockets) inst_sense = inst_pockets;
personality = inst_sense;
return 0;
}
int get_count(void){
int i;
for (i = 0; pockets[i] != 0 && i < MAX_CHAN; i++){}
if (i == 0) return 1 ;
return i;
}