SerialDataReceivedEventHandler с С# и ПЛК (не запускающее событие)

Я получил свой ПЛК для связи с моим приложением С#, использующим nModBus, но сейчас я постоянно читаю все входы ПЛК, пробегая цикл for.

Я хочу создать свой код так, что только когда часть данных будет получена через последовательный порт, тогда он запустит цикл for для чтения через каждый вход и определит, какой вход в частности является высоким.

Вот что у меня есть. Я установил точки останова, и мой код никогда не входит в метод DataReceivedHandler. Я вручную включаю высоковольтные входы ПЛК (используя перемычку). Любые предложения или комментарии?

пространство имен WindowsFormsApplication2 {static class Program {

public static void Main() { SerialPort mySerialPort = new SerialPort("COM1"); mySerialPort.BaudRate = 38400; mySerialPort.Parity = Parity.Odd; mySerialPort.StopBits = StopBits.One; mySerialPort.DataBits = 8; mySerialPort.Handshake = Handshake.None; mySerialPort.ReadBufferSize = 4096; mySerialPort.DataReceived += new SerialDataReceivedEventHandler(DataReceivedHandler); IModbusSerialMaster master = ModbusSerialMaster.CreateRtu(mySerialPort); Console.WriteLine("Press any key to continue..."); Console.WriteLine(); Console.ReadKey(); mySerialPort.Close(); } public static void DataReceivedHandler(object sender,SerialDataReceivedEventArgs e) { SerialPort sp = (SerialPort)sender; string indata = sp.ReadExisting(); Console.WriteLine("Data Received:"); Console.Write(indata); }
1 ответ

Пусть ваш компьютер будет мастером, но опросите это событие. Когда это ИСТИНА, ТОГДА сделайте "массовое" комм, затем попросите ваш компьютер/мастер сбросить "событие".

Я бы сделал это "событие" отдельным "событием связи" с фактическим пользовательским интерфейсом. Сделайте это "CommEvent", установите ПЛК (когда произойдет реальное событие), и ПК/мастер очистит его, как только он закончит массовое сообщение.

Read CommEvent
if CommEvent is TRUE Do BulkReads Clear CommEvent

licensed under cc by-sa 3.0 with attribution.