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