Ethernet контроллер для LinuxCNC (STM32, FPGA)

Обсуждение установки, настройки и использования LinuxCNC. Вопросы по Gкоду.
Аватара пользователя
MX_Master
Мастер
Сообщения: 7478
Зарегистрирован: 27 июн 2015, 19:45
Репутация: 3101
Настоящее имя: Михаил
Откуда: Алматы
Контактная информация:

Re: Плата развязки для LinuxCNC (Ethernet + STM32)

Сообщение MX_Master »

Попытался купить с таобао бюджетный STM32H750VBT6, пощупать H7. У трех единственных продавцов еще нет его в наличии. Но объявления уже развесили.

Ещё заметил, что на тао макетка NUCLEO-F767ZI, указанная выше, стоит также как и NUCLEO-H743ZI. При этом на второй установлен H7, который в 2 раза мощнее F7 с первой. Парадокс. Цена за этого зверя довольно приятная - 28$. На Али то же самое - минимум 37$. Загадка.

Желание пощупать H7 всё ещё есть. Попробую взять на тесты уже готовую макетку NUCLEO-H743ZI...
Аватара пользователя
Argon-11
Мастер
Сообщения: 2067
Зарегистрирован: 07 июн 2017, 17:48
Репутация: 461
Контактная информация:

Re: Плата развязки для LinuxCNC (Ethernet + STM32)

Сообщение Argon-11 »

MX_Master писал(а):На Али то же самое - минимум 37
На али тусуются полчища ex-ссср-цев с шопоголизмом. Вот хитрые китайцы этим и пользуются, добавляя доп. наценку.
Я ранее на али читал отзывы в попытке увидеть истину о товаре и продавце. Но, как выяснилось, если отзыв положительный - он бесполезный. Народ оставляет 4-5 звезд чаще всего сразу после получения, что ничего не говорит о качестве товара. Это следствие шопоголизма и показатель свойств основной аудитории :)
sergx99
Новичок
Сообщения: 35
Зарегистрирован: 27 фев 2016, 17:03
Репутация: 7
Настоящее имя: Сергей
Контактная информация:

Re: Плата развязки для LinuxCNC (Ethernet + STM32)

Сообщение sergx99 »

Проверил возможности STM32F407 (168MHz), на предмет полусофтовой генерации шагов.
Таймер 2MHz, максимальная частота на GPIO 990KHz, jitter ~1mksec.
3 stepgen загрузка процессора ~55%
5 stepgen ---------//---------- ~70%
6 stepgen ---------//---------- ~85%
7 stepgen не успеваю расчитать цикл(1ms)
GPIO любые пины в пределах одного порта.
Аватара пользователя
Argon-11
Мастер
Сообщения: 2067
Зарегистрирован: 07 июн 2017, 17:48
Репутация: 461
Контактная информация:

Re: Плата развязки для LinuxCNC (Ethernet + STM32)

Сообщение Argon-11 »

sergx99 писал(а):загрузка процессора ~55%
Как оцениваете загрузку МК? Измеряете время "простоя"?
sergx99
Новичок
Сообщения: 35
Зарегистрирован: 27 фев 2016, 17:03
Репутация: 7
Настоящее имя: Сергей
Контактная информация:

Re: Плата развязки для LinuxCNC (Ethernet + STM32)

Сообщение sergx99 »

Argon-11 писал(а):Как оцениваете загрузку МК? Измеряете время "простоя"?
Примерно да, цикл 1000мкс, на расчет массива уходит 550мкс, проигрывание TIMER - DMA - GPIO->BSRR.
Аватара пользователя
MX_Master
Мастер
Сообщения: 7478
Зарегистрирован: 27 июн 2015, 19:45
Репутация: 3101
Настоящее имя: Михаил
Откуда: Алматы
Контактная информация:

Re: Плата развязки для LinuxCNC (Ethernet + STM32)

Сообщение MX_Master »

Этот способ, кстати, широко известен. Недавно читал статью. В ней паренёк тестировал новый STM32H7 точно таким же способом (: Массив он, правда, готовил только один раз. А дальше пытался выжать максимум частоты используя разные модули DMA в H7 (DMA, BDMA, MDMA).

Как видно, этот способ упирается только лишь в подготовку массива. Если юзать этот способ и дальше, надо заново изобрести сверх быструю готовку массива для DMA. Текущий способ будет работать чуть быстрее только на H7. Ну и заготовки массивов должны быть рассчитаны заранее.
Аватара пользователя
raddd
Почётный участник
Почётный участник
Сообщения: 1564
Зарегистрирован: 10 фев 2015, 08:50
Репутация: 539
Настоящее имя: Alexey Rodionov
Откуда: Беларусь Минский р-н
Контактная информация:

Re: Плата развязки для LinuxCNC (Ethernet + STM32)

Сообщение raddd »

Может это http://www.cnc-club.ru/forum/viewtopic. ... 93#p469593 сюда надо было закинуть?
||||||||||||
||||||||||||
Аватара пользователя
MX_Master
Мастер
Сообщения: 7478
Зарегистрирован: 27 июн 2015, 19:45
Репутация: 3101
Настоящее имя: Михаил
Откуда: Алматы
Контактная информация:

Re: Плата развязки для LinuxCNC (Ethernet + STM32)

Сообщение MX_Master »

raddd писал(а):Может это http://www.cnc-club.ru/forum/viewtopic. ... 93#p469593 сюда надо было закинуть?
Внизу страницы данные по максимальной частоте шагов https://github.com/KevinOConnor/klipper ... eatures.md. Если представить, что мы юзаем не 2-3 оси как в его тесте, а 5 осей + 5 энкодеров и ещё что-то рассчитываем на процессоре, то результаты по частотам будут даже ниже 100 КГц.
Аватара пользователя
raddd
Почётный участник
Почётный участник
Сообщения: 1564
Зарегистрирован: 10 фев 2015, 08:50
Репутация: 539
Настоящее имя: Alexey Rodionov
Откуда: Беларусь Минский р-н
Контактная информация:

Re: Плата развязки для LinuxCNC (Ethernet + STM32)

Сообщение raddd »

STM32F103 324K для 3х осей за 1.5$.
Очень неплохо.
||||||||||||
||||||||||||
Аватара пользователя
wldev
Мастер
Сообщения: 1641
Зарегистрирован: 24 янв 2012, 16:04
Репутация: 510
Настоящее имя: Сергей Бочаров
Откуда: Новосибирск
Контактная информация:

Re: Плата развязки для LinuxCNC (Ethernet + STM32)

Сообщение wldev »

sergx99 писал(а):Проверил возможности STM32F407 (168MHz), на предмет полусофтовой генерации шагов.
Таймер 2MHz, максимальная частота на GPIO 990KHz, jitter ~1mksec.
3 stepgen загрузка процессора ~55%
5 stepgen ---------//---------- ~70%
6 stepgen ---------//---------- ~85%
7 stepgen не успеваю расчитать цикл(1ms)
GPIO любые пины в пределах одного порта.
можно код посмотреть?
Новости: https://t.me/wldevruch
Обсуждения: https://t.me/wldevgr
Аватара пользователя
MX_Master
Мастер
Сообщения: 7478
Зарегистрирован: 27 июн 2015, 19:45
Репутация: 3101
Настоящее имя: Михаил
Откуда: Алматы
Контактная информация:

Re: Плата развязки для LinuxCNC (Ethernet + STM32)

Сообщение MX_Master »

raddd писал(а):STM32F103 324K для 3х осей за 1.5$.
Очень неплохо.
Алексей, ровно на этом же МК я делал до 1 МГц на 4-х осях (: процессор, грубо говоря, использовался только в сервопериоде, для смены частот. Можно и больше частот сделать, но на одну ось надо будет по два аппаратных таймера.

Так что у нас всё схвачено и мы впереди планеты всей. Остается только пожелать Клипперу успехов.
Аватара пользователя
raddd
Почётный участник
Почётный участник
Сообщения: 1564
Зарегистрирован: 10 фев 2015, 08:50
Репутация: 539
Настоящее имя: Alexey Rodionov
Откуда: Беларусь Минский р-н
Контактная информация:

Re: Плата развязки для LinuxCNC (Ethernet + STM32)

Сообщение raddd »

Здорово когда шариш!
Я вот только вникаю в это. Только времени с стройкой нет. На работе могу себе позволить немного развиватся в этом направлении.
И то пишу в platformio. Для дешевых СТМок и ЕСПишки.
||||||||||||
||||||||||||
Аватара пользователя
MX_Master
Мастер
Сообщения: 7478
Зарегистрирован: 27 июн 2015, 19:45
Репутация: 3101
Настоящее имя: Михаил
Откуда: Алматы
Контактная информация:

Re: Плата развязки для LinuxCNC (Ethernet + STM32)

Сообщение MX_Master »

Я, кстати, МК помощней не зря хочу. Планирую всю серво-логику stepgen'ов считать тоже на STM'ке. Драйвер LinuxCNC будет только отправлять/получать данные и забивать их в переменные HAL.
sergx99
Новичок
Сообщения: 35
Зарегистрирован: 27 фев 2016, 17:03
Репутация: 7
Настоящее имя: Сергей
Контактная информация:

Re: Плата развязки для LinuxCNC (Ethernet + STM32)

Сообщение sergx99 »

Bender писал(а):можно код посмотреть?
Чуть позже, его немного причесать надо.
Eсли расчитывать на максимальную частоту 500KHz то получил не более 60% при 8 stepgen.
Загрузка зависит от генерируемый в текущий момент частоты.

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

//таймер stepgen -> загрузка
//2MHz 1x500KHz -> 23%
//2MHz 2x500KHz -> 34%
//2MHz 3x500KHz -> 45%
//2MHz 4x500KHz -> 55%
//2MHz 5x500KHz -> 64%
//2MHz 6x500KHz -> 74%
//2MHz 7x500KHz -> 84%
//2MHz 8x500KHz -> 95%

//2MHz 1x900KHz + 7x100KHz -> 80%
//2MHz 2x900KHz + 6x100KHz -> 86%
//2MHz 3x900KHz + 5x100KHz -> 91%

//1MHz 8x100KHz -> 40%
//1MHz 8x500KHz -> 60%
MX_Master писал(а):Я, кстати, МК помощней не зря хочу ...
CORTEX-M7 400MHz + float precision + double precision. :thinking: ...
Аватара пользователя
MX_Master
Мастер
Сообщения: 7478
Зарегистрирован: 27 июн 2015, 19:45
Репутация: 3101
Настоящее имя: Михаил
Откуда: Алматы
Контактная информация:

Re: Плата развязки для LinuxCNC (Ethernet + STM32)

Сообщение MX_Master »

sergx99 писал(а):CORTEX-M7 400MHz + float precision + double precision. ...
Как говорят знатоки нашего форума: "а почему нельзя сразу взять самый мощный проц?". И вот, спустя время, я, наконец, понял смысл сего совета - сколько бы чип не стоил, софт будет намного дороже.
sergx99 писал(а):Eсли расчитывать на максимальную частоту 500KHz то получил не более 60% при 8 stepgen.
Загрузка зависит от генерируемый в текущий момент частоты.
У меня, кстати, вопрос. Вот я вижу, что опорная частота 2 МГц. Как получить при этом точную выходную частоту, скажем, 777 КГц?
Аватара пользователя
Serg
Мастер
Сообщения: 21923
Зарегистрирован: 17 апр 2012, 14:58
Репутация: 5181
Заслуга: c781c134843e0c1a3de9
Настоящее имя: Сергей
Откуда: Москва
Контактная информация:

Re: Плата развязки для LinuxCNC (Ethernet + STM32)

Сообщение Serg »

Думаю PLL (ФАПЧ) тебе поможет...
Я не Христос, рыбу не раздаю, но могу научить, как сделать удочку...
Аватара пользователя
selenur
Почётный участник
Почётный участник
Сообщения: 4604
Зарегистрирован: 21 авг 2013, 19:44
Репутация: 1621
Настоящее имя: Сергей
Откуда: Новый Уренгой
Контактная информация:

Re: Плата развязки для LinuxCNC (Ethernet + STM32)

Сообщение selenur »

MX_Master писал(а): Как говорят знатоки нашего форума: "а почему нельзя сразу взять самый мощный проц?". И вот, спустя время, я, наконец, понял смысл сего совета - сколько бы чип не стоил, софт будет намного дороже.
А ещё написав код на мощном проце куда проще оценить возможность переноса его на более слабый, просто снизив частоту, можно сразу проверить. ;-)
Мой сайт: http://selenur.ru
Исходники моих программ: https://github.com/selenur
Instagram https://www.instagram.com/zheigurov/
sergx99
Новичок
Сообщения: 35
Зарегистрирован: 27 фев 2016, 17:03
Репутация: 7
Настоящее имя: Сергей
Контактная информация:

Re: Плата развязки для LinuxCNC (Ethernet + STM32)

Сообщение sergx99 »

MX_Master писал(а):У меня, кстати, вопрос. Вот я вижу, что опорная частота 2 МГц. Как получить при этом точную выходную частоту, скажем, 777 КГц?
В примере выдаю частоты 10 КГц, 11 КГц, 12 КГц, 13 КГц,14 КГц, 105 КГц, 666КГц, 777 КГц, занятость 94%

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

/*
 * cnc_stepgen.cpp
 *
 *  Created on: 25 окт. 2018 г.
 *      Author: sergx99
 */

#include "stm32f4xx.h"
#include "stm32_dma_f4xx.h"
#include "stm32_tim.h"
#include "hw_conf.h"

/*
Table 94. TIMx Internal trigger connection
Slave TIM ITR0 (TS = 000) ITR1 (TS = 001) ITR2 (TS = 010) ITR3 (TS = 011)
TIM1 TIM5_TRGO TIM2_TRGO TIM3_TRGO TIM4_TRGO
TIM8 TIM1_TRGO TIM2_TRGO TIM4_TRGO TIM5_TRGO

Table 98. TIMx internal trigger connection
Slave TIM ITR0 (TS = 000) ITR1 (TS = 001) ITR2 (TS = 010) ITR3 (TS = 011)
TIM2 TIM1_TRGO TIM8_TRGO TIM3_TRGO TIM4_TRGO
TIM3 TIM1_TRGO TIM2_TRGO TIM5_TRGO TIM4_TRGO
TIM4 TIM1_TRGO TIM2_TRGO TIM3_TRGO TIM8_TRGO
TIM5 TIM2_TRGO TIM3_TRGO TIM4_TRGO TIM8_TRGO

Table 101. TIMx internal trigger connection
Slave TIM ITR0 (TS =’ 000’) ITR1 (TS = ‘001’) ITR2 (TS = ‘010’) ITR3 (TS = ’011’)
TIM9 TIM2_TRGO TIM3_TRGO TIM10_OC TIM11_OC
TIM12 TIM4_TRGO TIM5_TRGO TIM13_OC TIM14_OC
 */

/************************************************/
#define CNC_TIMER_2MHZ
/************************************************/

//STM32TPL https://github.com/antongus/stm32tpl
typedef STM32::DMA::Dma2Channel5 CNC_TxDmaStream;
typedef STM32::TIM::Timer<STM32::TIM::TIM_1> Timer;

#ifdef CNC_TIMER_2MHZ//
#define CNC_BUF_SIZE 2000
#define CNC_TIM_DIV  ((168 / 2) - 1)
#endif

#ifdef CNC_TIMER_1MHZ//
#define CNC_BUF_SIZE 1000
#define CNC_TIM_DIV  ((168) - 1)
#endif

//определение номера пина порта для stepgen
#define	PSET_0	0x00000001UL
#define	PSET_1	0x00000002UL
#define	PSET_2	0x00000004UL
#define	PSET_3	0x00000008UL
#define	PSET_4	0x00000010UL
#define	PSET_5	0x00000020UL
#define	PSET_6	0x00000040UL
#define	PSET_7	0x00000080UL

static uint32_t cnc_stepgen_buf[CNC_BUF_SIZE * 2];
static void cnc_dma_buf_clear();
static void timer_init();
static void dma_init();
static void cnc_dma_buf_next(uint32_t *ptr);

void cnc_stepgen_init(){
	cnc_dma_buf_clear();
	timer_init();
	dma_init();
	NVIC_EnableIRQ(DMA2_Stream5_IRQn);
}

extern "C" void DMA2_Stream5_IRQHandler(){
	if (CNC_TxDmaStream::ISR & CNC_TxDmaStream::DMA_MASK_HTIF){
		CNC_TxDmaStream::IFCR = CNC_TxDmaStream::DMA_MASK_HTIF;
		cnc_dma_buf_next(cnc_stepgen_buf);
	}
	if (CNC_TxDmaStream::ISR & CNC_TxDmaStream::DMA_MASK_TCIF){
		CNC_TxDmaStream::IFCR = CNC_TxDmaStream::DMA_MASK_TCIF;
		cnc_dma_buf_next(&cnc_stepgen_buf[CNC_BUF_SIZE]);
	}
}

static void timer_init(){
	Timer::EnableClocks();
	Timer::TIMx->DIER = TIM_DIER_UDE;
	Timer::TIMx->ARR = CNC_TIM_DIV;
	Timer::Enable();
}

static void dma_init(){
	CNC_TxDmaStream::EnableClocks();
	CNC_TxDmaStream::Disable();
	CNC_TxDmaStream::FCR &= ~(DMA_SxFCR_DMDIS | DMA_SxFCR_FTH);  // turn off FIFO
	CNC_TxDmaStream::CR = 0
			| STM32::DMA::DMA_CR_HTIE
			| STM32::DMA::DMA_CR_TCIE
			| STM32::DMA::DMA_CR_DIR_MEM_TO_PERITH  // From memory to peripheral
			| STM32::DMA::DMA_CR_CIRC				// circular mode
			| STM32::DMA::DMA_CR_MINC               // Memory increment mode
			| STM32::DMA::DMA_CR_MSIZE_32_BIT       // Memory size
			| STM32::DMA::DMA_CR_PSIZE_32_BIT       // Peripheral size
			| STM32::DMA::DMA_CR_PRIO_HIGH          // priority
			| STM32::DMA::DMA_CR_CHSEL_CH6			// select channel (only for F4xx devices)
			;

	CNC_TxDmaStream::IFCR = CNC_TxDmaStream::DMA_MASK_ALL;
	// set memory address and size
	CNC_TxDmaStream::PAR = (uint32_t)&GPIOE->BSRRL;
	CNC_TxDmaStream::MAR = (uint32_t)cnc_stepgen_buf;
	CNC_TxDmaStream::NDTR = CNC_BUF_SIZE * 2;
	CNC_TxDmaStream::Enable();
}

static void cnc_dma_buf_clear(){
	for(int ii = 0; ii < CNC_BUF_SIZE * 2; ii++){
		cnc_stepgen_buf[ii] = 0x00000000;
	}
}

#define CNCDIVSHIFT 16

typedef struct{
	uint32_t pos;
	uint32_t step;
	//	uint32_t port_dir;
	//	uint16_t pin_dir;
	//	uint16_t pin_step;
	int m_dir;
	//	int32_t abs_pos;
}T_CNC_AXIS;

T_CNC_AXIS axis[8];

static uint32_t cnc_dma_buf_item_init(T_CNC_AXIS *l_axis, int16_t puls, uint16_t lenght){
	uint32_t rc = 0;
	if(puls == 0){
		l_axis->step = 0;
		l_axis->pos = 0xFFFFFFFF;
	}else{
		if(puls > 0){
			axis->m_dir = 1;
		}else{
			axis->m_dir = 0;
			puls = -puls;
		}
		l_axis->step = (1 + (lenght << (CNCDIVSHIFT + 1)) / puls) >> 1;
		//axis->pos = axis->step / 2;
		l_axis->pos = 0;
	}
	return rc;
}

static inline void cnc_dma_buf_item(uint32_t count, uint32_t &data, int num, const uint32_t pset){
	if(count > (axis[num].pos)){
		axis[num].pos += axis[num].step;
		data = (data & (~(pset << 16))) | pset;
	}
}

static void cnc_dma_buf_next(uint32_t *ptr){
	uint32_t count;
	TE_LED::On();

	//тут задаю сколько импульсов выдать за цикл по каждаму каналу
	cnc_dma_buf_item_init(&axis[0], 10, CNC_BUF_SIZE);
	cnc_dma_buf_item_init(&axis[1], 11, CNC_BUF_SIZE);
	cnc_dma_buf_item_init(&axis[2], 12, CNC_BUF_SIZE);
	cnc_dma_buf_item_init(&axis[3], 13, CNC_BUF_SIZE);
	cnc_dma_buf_item_init(&axis[4], 14, CNC_BUF_SIZE);
	cnc_dma_buf_item_init(&axis[5], 105, CNC_BUF_SIZE);
	cnc_dma_buf_item_init(&axis[6], 666, CNC_BUF_SIZE);
	cnc_dma_buf_item_init(&axis[7], 777, CNC_BUF_SIZE);

	for(int ii = 0; ii < CNC_BUF_SIZE; ii++){
		ptr[ii] = 0xFFFF0000;		//clear only -> 5% 1MHz, 10% 2MHz
		count = ii << CNCDIVSHIFT;
		cnc_dma_buf_item(count, ptr[ii], 0, PSET_0);
		cnc_dma_buf_item(count, ptr[ii], 1, PSET_1);
		cnc_dma_buf_item(count, ptr[ii], 2, PSET_2);
		cnc_dma_buf_item(count, ptr[ii], 3, PSET_3);
		cnc_dma_buf_item(count, ptr[ii], 4, PSET_4);
		cnc_dma_buf_item(count, ptr[ii], 5, PSET_5);
		cnc_dma_buf_item(count, ptr[ii], 6, PSET_6);
		cnc_dma_buf_item(count, ptr[ii], 7, PSET_7);

		//2MHz 1x500KHz -> 23%
		//2MHz 2x500KHz -> 34%
		//2MHz 3x500KHz -> 45%
		//2MHz 4x500KHz -> 55%
		//2MHz 5x500KHz -> 64%
		//2MHz 6x500KHz -> 74%
		//2MHz 7x500KHz -> 84%
		//2MHz 8x500KHz -> 95%

		//2MHz 1x900KHz 7x100KHz -> 80%
		//2MHz 2x900KHz 6x100KHz -> 86%
		//2MHz 3x900KHz 5x100KHz -> 91%

		//1MHz 8x10KHz -> 35%
		//1MHz 8x100KHz -> 40%
		//1MHz 8x500KHz -> 60%
	}
	TE_LED::Off();
}
по вложениям, логический анализатор: D0 подключен к TE_LED, высокий уровень занят вычисленями. D[1-7] соответственно stepgen[1-7], Cnc_pulse[4-7]число импульсов на stepgen[4-7] за период(1мс).
Вложения
результат (2051 просмотр) <a class='original' href='./download/file.php?id=149594&sid=9f16433a9074918f9eb0328e405b4698&mode=view' target=_blank>Загрузить оригинал (198.19 КБ)</a>
результат
подробнее (2051 просмотр) <a class='original' href='./download/file.php?id=149595&sid=9f16433a9074918f9eb0328e405b4698&mode=view' target=_blank>Загрузить оригинал (172.83 КБ)</a>
подробнее
Аватара пользователя
MX_Master
Мастер
Сообщения: 7478
Зарегистрирован: 27 июн 2015, 19:45
Репутация: 3101
Настоящее имя: Михаил
Откуда: Алматы
Контактная информация:

Re: Плата развязки для LinuxCNC (Ethernet + STM32)

Сообщение MX_Master »

Как вариант - неплохо.

Но 2 тыщи циклов с кодом за сервопериод - это жесть. Отправка/получение данных по сети, энкодеры, ШИМки и прочий код можно удобно разместить в соседнем МК :hehehe:
Аватара пользователя
MX_Master
Мастер
Сообщения: 7478
Зарегистрирован: 27 июн 2015, 19:45
Репутация: 3101
Настоящее имя: Михаил
Откуда: Алматы
Контактная информация:

Re: Плата развязки для LinuxCNC (Ethernet + STM32)

Сообщение MX_Master »

Вспомнилось, кто-то хотел крепить плату развязки на DIN рейку. Есть вот такой простой и недорогой вариант

https://www.aliexpress.com/item/-/32825286219.html
https://www.aliexpress.com/item/-/32834853066.html
https://www.aliexpress.com/item/-/32624080359.html
2018-11-05_113222.png (1953 просмотра) <a class='original' href='./download/file.php?id=149817&sid=9f16433a9074918f9eb0328e405b4698&mode=view' target=_blank>Загрузить оригинал (577.97 КБ)</a>
2018-11-05_113238.png (1953 просмотра) <a class='original' href='./download/file.php?id=149816&sid=9f16433a9074918f9eb0328e405b4698&mode=view' target=_blank>Загрузить оригинал (265.6 КБ)</a>
2018-11-05_113522.png (1953 просмотра) <a class='original' href='./download/file.php?id=149818&sid=9f16433a9074918f9eb0328e405b4698&mode=view' target=_blank>Загрузить оригинал (797.53 КБ)</a>
Ответить

Вернуться в «LinuxCNC»