Перейти к содержимому


Фотография

Передача УП (gcode) по RS232 на C#


  • Авторизуйтесь для ответа в теме
В этой теме нет ответов

#1 OFFLINE   Co_balt

Co_balt

    Абитуриент

  • Пользователи
  • Pip
  • 2 сообщений
  • Пол:Мужчина
  • Из:Москва

Отправлено 28 Январь 2025 - 17:31

Добрый день!
Возможно кто-то сталкивался с такой задачей и имеет соображения/решения при решении похожих проблем (описание ниже).
 
Есть ЧПУ станок (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;
    }

 


  • 0




Количество пользователей, читающих эту тему: 1

0 пользователей, 1 гостей, 0 анонимных