Код: Выделить всё
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();
}
}
}
}
}
Я пробовал устанавливать и использовать разные адреса подчиненных устройств, пробовал 9600 бод, считывал с разных стартовых адресов. регистры (с использованием шестнадцатеричных и десятичных чисел) и разные четности, но ни один из них не увенчался успехом. Кроме того, я использовал анализатор осциллографа/логики для просмотра сигналов, отправляемых и получаемых моим ПК, и убедился, что мой запрос от ПК был правильным, но после нескольких попыток ответа от WAGO не последовало. Мне сказали, что мне не понадобятся согласующие резисторы или даже заземляющий провод после того, как несколько других инженеров из моей компании попытались мне помочь. Я новичок в работе с MODBUS, поэтому не удивлюсь, если упущу что-то тривиальное, вызывающее это, но я исчерпал все возможные способы решения, которое мог придумать.
Может ли кто-нибудь помочь мне диагностировать эту проблему и предложить потенциальное решение? На данный момент у меня почти нет вариантов, что попробовать дальше, и я не могу найти на этом веб-сайте ничего, что помогло бы мне решить эту проблему. Любая помощь или совет будут очень признательны.
Подробнее здесь: https://stackoverflow.com/questions/792 ... easurement