Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/266.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使用带PLC的NModbus和C#打开和关闭输出_C#_Serial Port_Modbus - Fatal编程技术网

如何使用带PLC的NModbus和C#打开和关闭输出

如何使用带PLC的NModbus和C#打开和关闭输出,c#,serial-port,modbus,C#,Serial Port,Modbus,大家好,我正在使用NModbus库,以前在VS2012和VS2010上运行过,但尝试在VS2008上运行过,它似乎运行得更好 这是我在dos提示符下运行代码时的输出 Modbus.IO.ModbusSerialTransport Write - TX: 1,16,7,208,0,3,6,0,1,0,5,0,15,149,152 Modbus.IO.ModbusRTUTransport ReadResponse - RX: 1,16,7,208,0,3,128,133 现在,当我运行此脚

大家好,我正在使用NModbus库,以前在VS2012和VS2010上运行过,但尝试在VS2008上运行过,它似乎运行得更好

这是我在dos提示符下运行代码时的输出

Modbus.IO.ModbusSerialTransport Write -     TX: 1,16,7,208,0,3,6,0,1,0,5,0,15,149,152
Modbus.IO.ModbusRTUTransport ReadResponse - RX: 1,16,7,208,0,3,128,133
现在,当我运行此脚本时,我的PLC单元上的RX和TX确实会闪烁,但我没有看到PLC上的输出变高。下面是库中的相关代码段

{
        using (SerialPort port = new SerialPort("COM1"))
        {
            // configure serial port
            port.BaudRate = 38400;
            port.DataBits = 8;
            port.Parity = Parity.Odd;
            port.StopBits = StopBits.One;
            port.Open();

            // create modbus master
            IModbusSerialMaster master = ModbusSerialMaster.CreateRtu(port);

            byte slaveId = 1;
            ushort startAddress = 2000;
            //ushort[] registers = new ushort[] { 1, 2, 3 };
            ushort[] registers = new ushort[] { 01, 05, 15 };
            // write three registers
            master.WriteMultipleRegisters(slaveId, startAddress, registers);
        }
    }

有人能帮我理解TX和RX吗?也许还能帮我指明方向,让我找到如何从C#script中设置高输出的方法?

如果将字节转换为十六进制表示,那么理解TX和RX数据就更容易了

对于TX数据,我们有:

01 10 07 D0 00 03 06 00 01 00 05 00 0F 95 98

01是Modbus从机地址

10是写入多个寄存器功能的Modbus功能代码

07 D0是起始地址(2000)

00 03是写入的寄存器数(3)

06是包含寄存器数据的字节数(每个寄存器包含2个字节,当您写入3个寄存器时,我们将传输6个字节)

00 01是写入寄存器2000的值

00 05是写入寄存器2001的值

000f是写入寄存器2002的值

95 98是此帧的计算CRC

对于RX数据,我们有:

01 10 07 D0 00 03 80 85

写入多个寄存器功能的响应只是一个具有相同从机地址、功能代码、起始地址和来自请求的寄存器数量的响应,加上响应帧的计算CRC(80 85

您可以从中获取Modbus规范。您可以在Modbus应用协议规范中找到所有请求和响应帧的格式


您需要检查PLC文档,查看输出如何映射到寄存器。由于它们是开/关输出,它们可能映射到线圈,在这种情况下,您应该使用写入多线圈功能。

在命令写入总线之前,您正在处理串行端口。这需要时间。你需要重组你的计划。在启动时打开串口,在程序退出前不要关闭。罗纳尔多,你是个英雄,我非常感谢你概述了以上内容。我确实遇到了一些modbus教程,并使用C#nmodbus库成功地编写了我的plc。真是一种享受:)