带有C#和PLC的SerialDataReceivedEventHandler(不触发事件)

时间:2014-07-31 20:09:28

标签: c# serial-port plc modbus

我已经让我的PLC使用nModBus与我的C#应用​​程序进行通信,但是现在我通过运行for循环不断地读取所有PLC输入。

我想设计我的代码,这样只有当通过串口接收到一条数据时,它才会触发for循环来读取每个输入并确定哪个输入特别高。

这就是我所拥有的。我设置了断点,我的代码甚至都没有输入DataReceivedHandler方法。我手动打开PLC输入高电平(使用跳线)。有什么建议或意见吗?

命名空间WindowsFormsApplication2 {     静态类程序     {

    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 个答案:

答案 0 :(得分:0)

让您的PC成为主人,但轮询事件。如果为TRUE,则执行“批量”通信,然后让PC /主机重置“事件”。

我会让这个“事件”成为与实际用户界面分开的“通信事件”。使它成为“CommEvent”,让PLC设置它(当实际事件发生时),并且PC / Master在完成批量通信后清除它。

Read CommEvent
if CommEvent is TRUE
  Do BulkReads
  Clear CommEvent