大家都在使用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#脚本设置高输出?
答案 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文档以查看输出如何映射到寄存器。当他们打开/关闭输出时,他们可能会映射到线圈,在这种情况下,您应该使用写多线圈功能。