Передача УП (gcode) по RS232 на C#
Добавлено: 28 янв 2025, 14:21
Добрый день!
Возможно кто-то сталкивался с такой задачей и имеет соображения/решения при решении похожих проблем (описание ниже).
Есть ЧПУ станок (FANUC Series 0i Mate-TC).
Задача - Загрузка управляющей программы (gcode) через интерфейс RS-232. Обычно такие задачи решаются с помощью DNC-сервера, но у Заказчика он отсутствует как класс и он не собирается его приобретать. Был написан веб-сервис на C# под IIS для возможности загрузки УП из MES-системы.
Загрузка производится с хоста на котором поднят веб-сервер. Веб-сервис открывает COM-порт, далее выполняется небольшая пауза для того, чтобы оператор открыл COM-порт на станке для возможности получения данных.
Это 1-ая проблема, хотелось бы как с FTP - просто загрузить программы и ВСЕ. Но станок не может(?) постоянно держать COM-порт открытым для приема данных. Опять же пауза: маленькая - не успеет нажать открытие порта и часть данных улетит в воздух, большая - трата времени при ожидании начала передачи. Может можно как-то узнать что принимающая сторона готова?
Далее происходит считывание данных локального файла в поток c последующей передачей их в открытый порт.
Проблема 2 - Я вижу, что все данные ушли в поток и закрываю COM-порт, но по факту они еще не все ушли и при закрытии порта происходит потеря "хвоста" файла. Для этого добавил еще паузу 2 мин. для гарантированной передачи данных. Ниже код, он рабочий, но явно г..нокод
Возможно кто-то сталкивался с такой задачей и имеет соображения/решения при решении похожих проблем (описание ниже).
Есть ЧПУ станок (FANUC Series 0i Mate-TC).
Задача - Загрузка управляющей программы (gcode) через интерфейс RS-232. Обычно такие задачи решаются с помощью DNC-сервера, но у Заказчика он отсутствует как класс и он не собирается его приобретать. Был написан веб-сервис на C# под IIS для возможности загрузки УП из MES-системы.
Загрузка производится с хоста на котором поднят веб-сервер. Веб-сервис открывает COM-порт, далее выполняется небольшая пауза для того, чтобы оператор открыл COM-порт на станке для возможности получения данных.
Это 1-ая проблема, хотелось бы как с FTP - просто загрузить программы и ВСЕ. Но станок не может(?) постоянно держать COM-порт открытым для приема данных. Опять же пауза: маленькая - не успеет нажать открытие порта и часть данных улетит в воздух, большая - трата времени при ожидании начала передачи. Может можно как-то узнать что принимающая сторона готова?
Далее происходит считывание данных локального файла в поток c последующей передачей их в открытый порт.
Проблема 2 - Я вижу, что все данные ушли в поток и закрываю COM-порт, но по факту они еще не все ушли и при закрытии порта происходит потеря "хвоста" файла. Для этого добавил еще паузу 2 мин. для гарантированной передачи данных. Ниже код, он рабочий, но явно г..нокод
Код: Выделить всё
//Загрузка программы ЧПУ в станок через RS232
[WebMethod]
public string uploadFile_viaRS232(int COMPort, int RS232BaudRate, int RS232DataBits, string RS232Parity, int RS232StopBits, string RS232Handshake, string fileName, int pause)
{
string Result = "OK";
string line;
// Задаем бит четности
Parity parity = (Parity)System.Enum.Parse(typeof(Parity), RS232Parity);
// Задаем стоповые биты
StopBits stopBits = (StopBits)System.Enum.Parse(typeof(StopBits), RS232StopBits.ToString());
// Объявляем порт
SerialPort port = new SerialPort("COM" + COMPort.ToString(), RS232BaudRate, parity, RS232DataBits, stopBits);
// Дополнительные настройки порта
port.Encoding = System.Text.Encoding.GetEncoding(1252);
port.DtrEnable = true;
port.RtsEnable = true;
port.Handshake = (Handshake)Enum.Parse(typeof(Handshake), RS232Handshake);
try
{
// Открываем порт
port.Open();
// Пауза для того, чтобы оператор подтвердил прием данных в ЧПУ
Thread.Sleep(pause);
// Считывает содержимое файла в поток
using (StreamReader streamReader = File.OpenText("c:/cnc_code/" + fileName))
{
while ((line = streamReader.ReadLine()) != null)
{
//port.Write(streamReader.ReadToEnd());
port.WriteLine(line);
}
}
// Пауза, иначе порт закрывается раньше, чем завершается передача
Thread.Sleep(120000);
// Закрываем порт
port.Close();
// Удаляем файл
File.Delete(@"c:/cnc_code/" + fileName);
}
catch (Exception ex) { Result = ex.ToString(); }
return Result;
}