使用MODBUS RTU读取WAGO电力测量模块保持寄存器故障求助
问题:C# NModbus4 无法与WAGO三相电力测量模块通信
我正尝试开发GUI程序与WAGO三相电力测量模块(型号2857-570/024-005)通信,受公司限制无法使用PLC及CODESYS,故用C#结合NModbus4包编写程序,但读取保持寄存器时无法获得WAGO响应。
自研C#代码
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using System.IO.Ports; using Modbus.Data; using Modbus.Device; using Modbus.Utility; using Modbus.Message; using Modbus.IO; //using Modbus.Serial; namespace MODBUS_RTU_Tester { internal class Program { static void Main(string[] args) { //Specify the COM port assigned to the RS-485 Adapter string comPort = "COM4"; //Replace with your desired COM port int baudRate = 19200; // Standard MODBUS baud rate Parity parity = Parity.Even; //Ensure it matches your devices configuration int dataBits = 8; //Standard for MODBUS StopBits stopBits = StopBits.One; Console.WriteLine("MODBUS RTU Tester"); using (SerialPort port = new SerialPort(comPort)) { port.BaudRate = baudRate; port.Parity = parity; port.DataBits = dataBits; port.StopBits = stopBits; port.ReadTimeout = 5000; //Timeout adjustments port.WriteTimeout = 5000; //port.Open(); //Open the port for communication try { Console.WriteLine("Opening serial port..."); port.Open(); Console.WriteLine("Serial port opened successfully"); IModbusSerialMaster modbusMaster = ModbusSerialMaster.CreateRtu(port); byte slaveAddress = 7; //WAGO module address ushort startAddress = 0; //Register Address ushort numberOfRegisters = 1; //Number of Registers Console.WriteLine("Reading holding registers"); ushort[] registers; try { //Read holding registers registers = modbusMaster.ReadHoldingRegisters(slaveAddress, startAddress, numberOfRegisters); Console.WriteLine("Register Values:"); for (int i = 0; i < registers.Length; i++) { Console.WriteLine($"Register {startAddress + i}: {registers[i]}"); } } catch (Exception ex) { Console.WriteLine($"Error reading registers: {ex.Message}"); return; } //Write to a single register ushort registerToWrite = 0x0054; ushort valueToWrite = 440; try { modbusMaster.WriteSingleRegister(slaveAddress, registerToWrite, valueToWrite); Console.WriteLine($"Wrote value {valueToWrite} to register {registerToWrite}"); } catch (Exception ex) { Console.WriteLine($"Error writing registers: {ex.Message}"); } } catch (Exception ex) { Console.WriteLine($"Error: {ex.Message}"); } finally { Console.WriteLine("Closing serial port..."); if (port.IsOpen) port.Close(); Console.WriteLine("Serial port closed."); Console.WriteLine("Press any key to exit..."); Console.ReadKey(); } } } } }
环境与排查情况
- 硬件配置:使用MOXA UPort 1130 USB转串口适配器,配置为RS-485二线制,参数为19200波特率、偶校验、8数据位、1停止位,WAGO模块配置完全一致,连接符合手册要求。
- 排查过程:最初用示波器确认PC发出的请求帧正确,但WAGO无响应;后续排查发现MOXA适配器故障,更换线缆后,用PowerShell的FieldTalk Modbus驱动可正常与模块通信,但自研的C#代码依然无法读取寄存器,请求协助排查问题。
内容的提问来源于stack exchange,提问作者aidanbarefoot2
相关产品推荐
相关产品推荐

