Подключаем наши девайсы к компьютеру. Обсуждаются: порты, протоколы, драйвера, языки программирования и т.д.
Ответить

Состояние 3D принтера, как получить

Вт окт 10, 2017 13:58:09

Привет всем. Возникла проблема, необходимо контроkлировать текущее состояние 3д принтера, а именно: понять выполняет он сейчас перемещение по осям или находится в простое.
Например отправляю команду G0 X100 F50, то есть перемещаюсь по оси Х до координаты 100 мм с медленной скорость (50 мм/мин), необходимо привязать событие в ПО к моменту когда закончится перемещение в эту точку.
Есть ли какая-нибудь команда G-кода, возвращающая что-то типо состояние занят/свободен? или может кто-нибудь знает как по-другому программными средствами контроллировать?

Использую принтер с прошивкой Marlin.

Re: Состояние 3D принтера, как получить

Вт окт 10, 2017 20:31:06

http://reprap.org/wiki/G-code
Ищи

Re: Состояние 3D принтера, как получить

Ср окт 11, 2017 13:58:18

Flasher, спасибо за ссылку))

В общем один из способов контроля состояния перемещения я нашёл исходя из команды M114, на возврат от которой получаем текущие координаты и координаты в которые перемещение происходит. Путём их сравнения можно понять достиг требуемой точки или нет (то есть происходит движение или находится в простое).

Вот пример кода как организовать задержку на время выполнения перемещения на с# (код набросан на скорую руку и получился корявый, но если кто-то заинтересуется, то алгоритм становится понятен).


public void GetDelayTest() //делает задержку потока пока принтер не вышел в заданную координату
{
string ReadedLine; //строка для чтения команд с порта
char[] delimiterChars = {':', ' ', ':', ' ',':', ' ', ':', ' ', ':', ' ', ':', ' ', ':', ' ',}; //разделители строки, подробнее на MSDN в описании метода Split

string[] words; //массив для полученных после операции Split

bool ReadPosition=false;
bool done=false;

string CurrentX="";
string NeedX="";

string CurrentY="";
string NeedY="";

string CurrentZ="";
string NeedZ="";

SendingCommand = "M114\r\n";


while (done==false)
{
PositionerPort.Write(SendingCommand);

while (ReadPosition==false)
{
ReadedLine =PositionerPort.ReadLine();
//Пример прочитанной строки : X:50.00 Y:0.00 Z:0.00 E:0.00 Count X: 17.00 Y:0.00 Z:0.00<LF>

words = ReadedLine.Split(delimiterChars);
if (words[0]=="X"Шутливо //это проверка является ли прочитанная строкой подходящей нам
{
ReadPosition =true; //заканчиваем чтение строк
CurrentX=words[11]; //считываем текущий Х
NeedX=words[1]; //считываем необхдимый Х

CurrentY=words[13];//считывыем текущий Y
NeedY=words[3]; //считываем необходимый Х

CurrentZ=words[15]; //считывыем текущий Z
NeedZ=words[5]; //считываем необходимый Х


}
else
{
Thread.Sleep(100); //задержка 100 мс, чтобы слишком часто порт не опрашивало
}

}

if (CurrentX==NeedX && CurrentY==NeedY && CurrentZ==NeedZ) //если текущая координата совпадает с ребуемой
{
done=true; //заканчиваем задержку
}
else
{
ReadPosition=false; //обратно начинаем читать строки
}


}

}

Опробовал, всё работает нормально. Хотя вижу сразу недостаток в том, что если от принтера придёт другая команда, то она будет прочитана и проигнорирована, пока не придёт ответ именно от команды M114. Решается данный недостаток более качественным парсингом приходящих команд.

Re: Состояние 3D принтера, как получить

Пн окт 23, 2017 07:11:05

Код:
if (words[0]=="X"Шутливо //это проверка является ли прочитанная строкой подходящей нам


Скобку не закрыл.
Ответить