Страница 2 из 10
Re: AG-400. Пересадка мозга.
Добавлено: 23 июл 2013, 01:28
Serg
Nick писал(а):Может тогда что-то вроде max(in1,in2) надо сделать?
В смысле самому написать? Можно конечно, но пока лениво.
Nick писал(а):А начальные параметры какие были?
Может ему надо было дать по больше подергаться?
P=1, остальные 0. В том-то и дело, что кроме первого раза так и не смог запустить автонастройку.
Nick писал(а):вот такие пины есть:
Ну да, за эти и дёргал, только видимо не в том порядке, потому и засомневался. Правда дёргал не долго - уже очень хотелось домой ужинать.

Re: AG-400. Пересадка мозга.
Добавлено: 23 июл 2013, 03:50
Сергей Саныч
UAVpilot писал(а):Ну если на любом входе есть float отличный от нуля, то он должен появится и на выходе.
А как поступать с отрицательными значениями? Или они не предполагаются?
Re: AG-400. Пересадка мозга.
Добавлено: 23 июл 2013, 06:11
asutpka
UAVpilot писал(а):Новые мозги хоть и меньше по объёму, но гораздо умнее

вопрос по компоновке- если предполагается герметичный, ну или пылезашитный корпус шкафа , то по моему стремление прибить электронику в шкафу повыше неминуемо приведёт к перегреву, дело времени. проверено на личном опыте и госденьгах

.
Re: AG-400. Пересадка мозга.
Добавлено: 23 июл 2013, 10:45
Serg
Serg-tmn писал(а):А как поступать с отрицательными значениями? Или они не предполагаются?
отрицательные не исключение. В принципе по одному из входов можно ограничить только одной полярностью.
asutpka писал(а):вопрос по компоновке- если предполагается герметичный, ну или пылезашитный корпус шкафа
Ну социалистические инженеры-конструкторы дураками точно небыли.

На последней фотке с двумя импульсниками виден штатный вентилятор на задней стенке. В дне этой "коробки" стоят два пылевых фильтра.
P.S. Вся электрическая часть станка (трансформаторы, усилители, реле) охлаждается штатным кондиционером с фреоном и т.п.
Re: AG-400. Пересадка мозга.
Добавлено: 23 июл 2013, 12:22
Сергей Саныч
UAVpilot писал(а):отрицательные не исключение. В принципе по одному из входов можно ограничить только одной полярностью
Хорошо, а если на одном входе минус сколько-нибудь, а на другом - плюс какой нибудь,
где должен быть командир какое значение должно быть на выходе - оба отличны от нуля?
Re: AG-400. Пересадка мозга.
Добавлено: 23 июл 2013, 12:48
Serg
Знал ведь, что этот вопрос возникнет, но поленился сразу написать: по условиям задачи такого не будет. Если на выходе уже есть какое-то значение, то подавать что-то на второй вход нет смысла, да и не дойдёт до этого.
Re: AG-400. Пересадка мозга.
Добавлено: 23 июл 2013, 23:15
Serg
UAVpilot писал(а):Ну да, за эти и дёргал, только видимо не в том порядке, потому и засомневался. Правда дёргал не долго - уже очень хотелось домой ужинать.

Подёргал - разобрался. Надо одновременно включать сигналы spindle-cw и spindle-on и на spindle-speed-out подавать значение скорости.
А со складыванием аналоговых сигналов задачу упростил - применю мультиплексор, благо сигнал для его управления есть.
У станка есть две педали: разжим инструмента и разжим стола (поворотного). Поворотного стола с гидрозажимом точно не будет. Что полезного навесить на вторую педаль?
Re: AG-400. Пересадка мозга.
Добавлено: 28 июл 2013, 21:24
Serg
Так как всётаки посчитать перемещения осей?
Есть-ли какой сигнал, который появляется при начале движения оси? Сам я пока не нашёл...
Re: AG-400. Пересадка мозга.
Добавлено: 28 июл 2013, 21:38
Serg
Если кому интересно - переключение скоростей с проворотом шпинделя, если шестерёнки застрянут:
Код: Выделить всё
# Проворот шпинделя
#
# motion.spindle-speed-out >------------------------*---XXX---*---> spindle-vel-cmd
# | ___ |
# +->|mx | |
# 10.0 >---------------------------------------------->| |>-+
# +----|___|
# |
# motion.spindle-on >-------*---------------------+-*---XXX---*---> spindle-on
# | | | ___ |
# | | +--|1 | |
# | | | |--+
# | *----|___|
# | |
# motion.spindle-forward >--+---------------------+-*---XXX---*---> spindle-cw
# | | | ___ |
# | ____ | +--|1 | |
# | | T | | | |--+
# spindle-jog >-------------+------------|C |---*----|___|
# | 1 >-----|D | |
# | +--|R | +---------------> spindle-jog-proc
# | ___ | |____|
# +--|1 | |
# spindle-jog-off1 >-----------| |--+
# spindle-jog-off2 >-----------|___|
#
unlinkp motion.spindle-speed-out
unlinkp motion.spindle-on
unlinkp motion.spindle-forward
net t.sp-sout motion.spindle-speed-out => mx_sspeed.in0
setp mx_sspeed.in1 10.0
net spindle-vel-cmd <= mx_sspeed.out
net t.spon motion.spindle-on => or_spinon.in0 => or_sjogoff.in-00
net spindle-on <= or_spinon.out
net t.spfw motion.spindle-forward => or_spincw.in0
net spindle-cw <= or_spincw.out
net spindle-jog-proc ff_sjog.out => mx_sspeed.sel => or_spinon.in1 => or_spincw.in1
net spindle-jog => ff_sjog.clk
setp ff_sjog.data 1
net t.spjogr or_sjogoff.or => ff_sjog.reset
net spindle-jog-off1 => or_sjogoff.in-01
net spindle-jog-off2 => or_sjogoff.in-02
# Переключение диапазонов шпинделя
# ____
# band.1.turn >-------------|C T |
# _ | |--*----------------> band.1.set
# +--|_|o---|D | |
# band.1 >--------*---------|R | |
# | |____| |
# | ___ |
# +---------|_n_|---+----------------> spindle-jog-off1
# |___| | __ __
# +--|1 | |w1|
# | |---|5c|---> spindle-jog
# +--|__| |__|
# ____ |
# band.2.turn >-------------|C T | |
# _ | |--*----------------> band.2.set
# +--|_|o---|D |
# band.2 >--------*---------|R |
# | |____|
# | ___
# +---------|_n_|--------------------> spindle-jog-off2
# |___|
#
# 1 диапазон
net band.1.turn => ff_band1.clk
net band.1 => ff_band1.reset => not_band1t.in => os_sjog1.in
net band.1.set <= ff_band1.out => or_bandset.in0
net t.band1r not_band1t.out => ff_band1.data
net spindle-jog-off1 <= os_sjog1.out
setp os_sjog1.width 1
# 2 диапазон
net band.2.turn => ff_band2.clk
net band.2 => ff_band2.reset => not_band2t.in => os_sjog2.in
net band.2.set <= ff_band2.out => or_bandset.in1
net t.band2r not_band2t.out => ff_band2.data
net spindle-jog-off2 <= os_sjog2.out
setp os_sjog2.width 1
net t_sjogtd or_bandset.out => td_sjog.in
net spindle-jog <= td_sjog.out
setp td_sjog.on-delay 5
setp td_sjog.off-delay 0
Надо будет ещё дописать код для автонажатия e_stop, если не получится переключить за разумное время.
Re: AG-400. Пересадка мозга.
Добавлено: 28 июл 2013, 22:02
nkp
UAVpilot писал(а):Есть-ли какой сигнал, который появляется при начале движения оси
а момент появления не нулевой скорости - не оно?
Re: AG-400. Пересадка мозга.
Добавлено: 29 июл 2013, 00:52
Serg
Да, это подойдёт.
Ещё нужен какой-то накапливающий сумматор... Очень не хочется писать свой компонент, а хочется обойтись штатным набором.
Попробовать чтоль sample_hold с обратной связью?..
Re: AG-400. Пересадка мозга.
Добавлено: 29 июл 2013, 01:27
Nick
По первому вопросу, возможно edge + motion.current-vel
http://linuxcnc.org/docs/html/man/man9/edge.9.html
UAVpilot писал(а):Ещё нужен какой-то накапливающий сумматор...
integ не оно?
http://linuxcnc.org/docs/html/man/man9/integ.9.html
ЗЫ со шпинделем красиво написал, надо будет на досуге вчитаться/разобраться

Re: AG-400. Пересадка мозга.
Добавлено: 29 июл 2013, 01:50
Serg
Nick писал(а):integ не оно?
Не, надо что-то вроде сумматора с D-триггером, но для float.

sum2+sample_hold вроде подходит, если от закольцовывания им не поплохеет.
Nick писал(а):ЗЫ со шпинделем красиво написал, надо будет на досуге вчитаться/разобраться

Это я всячески пытаюсь избежать classiclader'а и изображаю из себя компилятор верилога.

Re: AG-400. Пересадка мозга.
Добавлено: 29 июл 2013, 11:16
Nick
UAVpilot писал(а):Не, надо что-то вроде сумматора с D-триггером, но для float.
А как оно работает? для меня все это незнакомые слова
sum2+sample_hold вроде подходит, если от закольцовывания им не поплохеет.
А чем им будет то

Re: AG-400. Пересадка мозга.
Добавлено: 29 июл 2013, 14:07
Serg
Так понятнее или ты хочешь словами?
Код: Выделить всё
_____
|shold|
start >------------------|hold |
____ | out|----*-------> result
s32 >-------|sum2| | | |
| |-------|in | |
+-|____| |_____| |
| |
+-------------------------+
А вообще задумался: нужно-ли периодичность смазки расчитывать на основе длинны перемещений по осям, не будет-ли правильнее учитывать только количество этих перемещений? Ведь если считать длину, то куча мелких перемещений может просто протереть дыру в одном месте без масла...

Re: AG-400. Пересадка мозга.
Добавлено: 29 июл 2013, 15:39
elephant007
а смысл? у тебя масла что-ли ограниченный запас? инъекция каждые n минут при поданном на привода питании. его там дозируется то всего ничего.
Re: AG-400. Пересадка мозга.
Добавлено: 29 июл 2013, 16:12
Serg
Сейчас так и работает, но при таких умных мозгах это кощунство.
Опять-же лишнее масло - лишняя грязь. В станке много мест, где есть масло и попадает пыль, а доступа для чистки нет.
Re: AG-400. Пересадка мозга.
Добавлено: 29 июл 2013, 17:18
elephant007
вот как раз в таких местах маслом всю грязь к фильтрам и смоет. типа как в ДВС.
Re: AG-400. Пересадка мозга.
Добавлено: 29 июл 2013, 23:19
Serg
С направляющих-то смоет, но останется там, куда смывает.
Я ж не выдумываю, а описываю как оно есть в реальности. И так станки через некоторое время покрываются тонкой плёнкой масляной грязи, а не везде есть доступ, чтоб её отмыть.
Re: AG-400. Пересадка мозга.
Добавлено: 07 авг 2013, 16:13
Serg
Родил смазку направляющих в зависимости от количества перемещения осей.
Код: Выделить всё
# Периодичность смазки направляющих (кол-во движени оси)
sets lube-period 10
loadrt logic names=or_lube_rst personality=0x203
addf or_lube_rst servo-thread
loadrt and2 names=and_lubelow
addf and_lubelow servo-thread
loadrt or2 names=or_lube
addf or_lube servo-thread
loadrt not names=not_xinpos,not_yinpos,not_zinpos
addf not_xinpos servo-thread
addf not_yinpos servo-thread
addf not_zinpos servo-thread
loadrt timedelay names=td_lubeerr,td_sjog
addf td_lubeerr servo-thread
addf td_sjog servo-thread
loadrt mux2 names=mx_sspeed
addf mx_sspeed servo-thread
loadrt adder names=add_xlube,add_ylube,add_zlube
addf add_xlube servo-thread
addf add_ylube servo-thread
addf add_zlube servo-thread
loadrt conv_u32_float names=uf_xlube,uf_ylube,uf_zlube
addf uf_xlube servo-thread
addf uf_ylube servo-thread
addf uf_zlube servo-thread
loadrt comp names=cmp_xlube,cmp_zlube,cmp_zlube
addf cmp_xlube servo-thread
addf cmp_ylube servo-thread
addf cmp_zlube servo-thread
loadrt message names=msg_lubelow,msg_lubeerr messages="Низкий уровень смазки,Отказ смазки"
addf msg_lubelow servo-thread
addf msg_lubeerr servo-thread
# Контроль уровня масла (если при включении уровень мал, то выключить)
net lube.low => and_lubelow.in0
net machine-on => and_lubelow.in1
net machine-offlube and_lubelow.out => msg_lubelow.trigger => or_machineoff.in-01
# Смазка направляющих
#
# lube-period >-------------------------------+
# _____ |
# _ | add | | ___
# axis.0.in-position >--|_|o-----|C |--U/F-+--| = |-+
# 1 >-----------|D | *--|___| |
# +--|R | | |
# | |_____| | |
# | _____ | | __
# _ | | add | | ___ +-|1 |
# axis.1.in-position >--|_|o--+--|C |--U/F-+--| = |---| |-+
# 1 >--------+--|D | *--|___| +-|__| |
# *--|R | | | |
# | |_____| | | |
# | _____ | | |
# _ | | add | | ___ | |
# axis.2.in-position >--|_|o--+--|C |--U/F-+--| = |-+ |
# 1 >--------+--|D | +--|___| |
# *--|R | |
# | |_____| |
# +---------------*-------------------------------+
# | __ ____ __
# lube.auto +--|1 | | T | |w1|
# | |-------|C |--*--|15|---> msg_lubeerr
# lube.manual >--|__| 1 >--|D | | |__|
# | | |
# lube.completed >----------|R | +---------> lube.on
# |____|
#
net _x.inpos axis.0.in-position => not_xinpos.in
net _x.move not_xinpos.out => add_xlube.clk
setp add_xlube.data 1
net _x.lubeout add_xlube.out => uf_xlube.in
net _x.lubefout uf_xlube.out => cmp_xlube.in0
net lube-period cmp_xlube.in1
setp cmp_xlube.hyst 1.0
net _x.lubeeq cmp_xlube.equal => or_lube_rst.in-00
net _y.inpos axis.1.in-position => not_yinpos.in
net _y.move not_yinpos.out => add_ylube.clk
setp add_ylube.data 1
net _y.lubeout add_ylube.out => uf_ylube.in
net _y.lubefout uf_ylube.out => cmp_ylube.in0
net lube-period cmp_ylube.in1
setp cmp_ylube.hyst 1.0
net _y.lubeeq cmp_ylube.equal => or_lube_rst.in-01
net _z.inpos axis.2.in-position => not_zinpos.in
net _z.move not_zinpos.out => add_zlube.clk
setp add_zlube.data 1
net _z.lubeout add_zlube.out => uf_zlube.in
net _z.lubefout uf_zlube.out => cmp_zlube.in0
net lube-period cmp_zlube.in1
setp cmp_zlube.hyst 1.0
net _z.lubeeq cmp_zlube.equal => or_lube_rst.in-02
net lube.auto or_lube_rst.or => or_lube.in0 add_xlube.reset add_ylube.reset add_ylube.reset
net lube.manual => or_lube.in1
net lube.shot or_lube.out => ff_lube.clk
setp ff_lube.data 1
net lube.completed => ff_lube.reset
net lube.on <= ff_lube.out => td_lubeerr.in
setp td_lubeerr.on-delay 15
setp td_lubeerr.off-delay 0
net lube.err td_lubeerr.out => msg_lubeerr.trigger
Правда как не изворачивался, но пришлось родить совственный HAL-компонент "накапливающий сумматор":
Код: Выделить всё
component adder "adder accumulator";
pin in u32 data_ "data input";
pin in bit clk "clock, rising edge added data to out";
pin in bit sub "FALSE - summation, TRUE subtraction";
pin in bit reset "when true, force out zero";
pin out u32 out "output";
option data adder_data;
function _ nofp;
license "GPL";
;;
typedef struct { int oldclk; } adder_data;
FUNCTION(_) {
int c;
c = clk;
if (reset) {
out = 0;
} else if ( c && ! data.oldclk ) {
if (sub)
out -= data_;
else
out += data_;
}
data.oldclk = c;
}