如何使用NModbus和C#与PLC来打开和关闭输出

时间:2014-07-27 18:10:43

标签: 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

现在,当我运行此脚本时,我的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#脚本设置高输出?

1 个答案:

答案 0 :(得分:2)

如果将字节转换为十六进制表示,则更容易理解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的值

00 0F 是写入寄存器2002的值

95 98 是此帧的计算CRC

对于RX数据,我们有:

01 10 07 D0 00 03 80 85

写多路寄存器功能的响应只是具有相同从机地址,功能代码,起始地址和来自请求的寄存器数的响应,以及响应帧的计算CRC( 80 85 < /强>)。

您可以从http://www.modbus.org/specs.php获取Modbus规范。您可以在Modbus应用协议规范中找到所有请求和响应帧的格式。

您需要检查PLC文档以查看输出如何映射到寄存器。当他们打开/关闭输出时,他们可能会映射到线圈,在这种情况下,您应该使用写多线圈功能。