Я бродил, если это возможно (и это хорошо реализовано), мой следующий вопрос:
Я хочу поговорить с PL C через последовательную связь. Каждый раз, когда я отправляю данные на PL C, он отправляет мне данные обратно, и мы не знаем, сколько времени ему потребуется, чтобы отправить меня обратно (несколько миллисекунд, но не сколько).
Я хотел создать класс для последовательной связи (между P C и PL C) с разделенными методами:
- Open () -> Открывает последовательную связь с PL C
- Talk2PL C () -> Отправляет данные на PL C и ожидает получения данных назад и их чтения
- Закрыть ( ) -> Закрыть последовательную связь с PL C
Как это будет работать: Когда проект запускается, мы открываем последовательную связь с PL C. Тогда во время выполнения программы мы будем использовать только Talk2PL C () для связи с PL C, мы будем вызывать этот метод несколько раз. Когда данные из PL C будут получены, они будут обработаны в ProcessData (). Когда вся работа будет завершена, мы закроем связь с PL C, вызовем Close ().
!!It's import methods are separated¡¡
Вопросы:
Будет ли это работать хорошо, как я, даже если «открыть» и «закрыть» разделены?
В Talk2PL C () я смогу читать данные, отправленные обратно из PL C даже если ответ не мгновенный? Нужна ли какая-то задержка на случай, если мне нужно подождать? Мой обработчик событий com_Datareceive () сможет прочитать его? Думаю, что «ReadTimeout» и «WriteTimeout» должны помочь.
- После того, как я вызову Open () и затем вызову Talk2PL C () в первый раз, в следующий раз я позвоню Talk2PL C () смогу ли я отправлять и получать данные с PL C?
a
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.IO.Ports;
namespace Project
{
class Serial
{
// Serial port settings.
SerialPort com = new SerialPort("COM1", 9600, Parity.None, 8, StopBits.One);
List<byte> PlcBuffer = new List<byte>();
// Open serial communication with PLC.
public void Open()
{
com.Open();
}
/* Query PLC and get answer.
* @cmd: command to be send.
*/
public void Talk2PLC(byte[] cmd)
{
PlcBuffer.Clear();//Clear previous data before storing new one.
// Set the read/write timeouts
com.ReadTimeout = 1000;
com.WriteTimeout = 1000;
//Write. Send data to PLC
com.Write(cmd, 0, cmd.Length);
//Read. Wait for an answer from PLC.
com.DataReceived += new SerialDataReceivedEventHandler(com_DataReceived);
}
// Gets all data send by the PLC.
public void com_DataReceived(object sender, SerialDataReceivedEventArgs e)
{
// Buffer and process binary data
while (com.BytesToRead > 0)
PlcBuffer.Add((byte)com.ReadByte());
ProcessData(PlcBuffer); //Send data to be processed
}//End com_DataReceived()
// This will process data from PLC
public void ProcessData(List<byte> buffer)
{
//Process data
}
// Close serial communication with PLC.
public void Close()
{
com.Close();
}
}
}
Спасибо всем, кто прочитал все и попытался помочь :)