Использование NModbus для чтения и записи значений на ведомом устройствеC#

Место общения программистов C#
Anonymous
Использование NModbus для чтения и записи значений на ведомом устройстве

Сообщение Anonymous »

Попытка чтения/записи значений на установленное ведомое устройство с помощью Nmodbus в C#. Цель состоит в том, чтобы отправить несколько команд в некоторые регистры хранения и прочитать значения из некоторых входных регистров. Регистры временного хранения — 40001–4004, а входные регистры — с 30001 по 30015, хотя для того, что нужно измерять и контролировать, нужна всего пара. Там есть код, в котором говорится о релейной плате, но он полностью функционален и на данный момент не требует никакого внимания. Я буду брать эти значения и сообщать о них в текстовый файл, но меня больше волнует, чтобы Modbus работал, прежде чем двигаться дальше. Информация о COM-порте и последовательном порте верна.
Использование команды IMODBUSSERIALMASTER, создание последовательного порта и подключение к устройству.
using System.Diagnostics;
using NModbus;
using System.IO.Ports;
using NModbus.Device;
using NModbus.Device.MessageHandlers;
using System.Runtime.CompilerServices;
using NModbus.IO;

internal class Program
{
public static RelayBoard Relayboard { get; private set; }

public interface IModbusSerialMaster : IModbusMaster, IDisposable;
public static IModbusSerialMaster master { get; private set; }

private static void Main(string[] args)
{
try
{
Relayboard = new RelayBoard("FT9I67UJ");
Console.WriteLine("Successfully Connected to Relay Board");
}
catch (Exception)
{
Console.WriteLine("Failed connection to relay board");
}
Relayboard.setRelay(RelayBoard.Banks.D, 7, true);
Relayboard.setRelay(RelayBoard.Banks.D, 6, true);

byte slaveAddress = 1;
const string portName = "COM13";
SerialPort serialPort = new SerialPort(portName, 38400, Parity.None, 8, StopBits.One);
serialPort.Open();

//Set RPM Value
try
{

master.WriteSingleRegister(slaveAddress, 40001, 3600);
Console.WriteLine("Successfully Wrote RPM Value to register.");
}
catch (Exception)
{
Console.WriteLine("Error While setting RPM Value");
}
//Start "Motor"
try
{
master.WriteSingleRegister(slaveAddress, 40002, 1);
Console.WriteLine("Successfully Wrote Start Value to register.");
}
catch (Exception)
{
Console.WriteLine("Error While setting start Value");
}
//Load Parameter
try
{
master.WriteSingleRegister(slaveAddress, 40003, 0);
Console.WriteLine("Successfully Wrote Parameter Value to register.");
}
catch (Exception)
{
Console.WriteLine("Error While setting Parameter Value");
}
try
{
master.WriteSingleRegister(slaveAddress, 40005, 1);
Console.WriteLine("Successfully cleared faults.");
master.WriteSingleRegister(slaveAddress, 40005, 0);
}
catch
{
Console.WriteLine("Error clearing motor faults.");
}
try
{
master.WriteSingleRegister(slaveAddress, 40006, 1);
Console.WriteLine("Successfully established heartbeat.");
}
catch
{
Console.WriteLine("Error establishing heartbeat.");
}

//tests go here.

Stopwatch TestSpan = new Stopwatch();
TestSpan.Start();
Thread.Sleep(5000);
while (TestSpan.ElapsedMilliseconds < 60000)
{
//+24VDC Voltage
Relayboard.setRelay(RelayBoard.Banks.C, 0, true);
Relayboard.setRelay(RelayBoard.Banks.C, 1, true);
Thread.Sleep(1000);
//read mrasurement from dmm
Relayboard.setRelay(RelayBoard.Banks.C, 0, false);
Relayboard.setRelay(RelayBoard.Banks.C, 1, false);
//Current 1 Measurement
Relayboard.setRelay(RelayBoard.Banks.C, 2, true);
Relayboard.setRelay(RelayBoard.Banks.C, 3, true);
Thread.Sleep(1000);
//read mrasurement from dmm
Relayboard.setRelay(RelayBoard.Banks.C, 2, false);
Relayboard.setRelay(RelayBoard.Banks.C, 3, false);
//Current 2 Measurment
Relayboard.setRelay(RelayBoard.Banks.C, 4, true);
Relayboard.setRelay(RelayBoard.Banks.C, 5, true);
Thread.Sleep(1000);
//read mrasurement from dmm
Relayboard.setRelay(RelayBoard.Banks.C, 4, false);
Relayboard.setRelay(RelayBoard.Banks.C, 5, false);
//Phase Measurement
Relayboard.setRelay(RelayBoard.Banks.C, 6, true);
Relayboard.setRelay(RelayBoard.Banks.C, 7, true);
Thread.Sleep(1000);
//read mrasurement from dmm
Relayboard.setRelay(RelayBoard.Banks.C, 6, false);
Relayboard.setRelay(RelayBoard.Banks.C, 7, false);

Thread.Sleep(1000);
//MODBUS Measurements
//MODBUS Measurements

//AB Voltage
master.ReadInputs(slaveAddress, 30001, 1);

//BC Voltage
master.ReadInputs(slaveAddress, 30002, 1);

//CA Voltage
master.ReadInputs(slaveAddress, 30003, 1);

//Motor Current
master.ReadInputs(slaveAddress, 30006, 1);

//DC Bus Current
master.ReadInputs(slaveAddress, 30007, 1);

//DC Bus Voltage
master.ReadInputs(slaveAddress, 30008, 1);

//Temperature Reading
master.ReadInputs(slaveAddress, 30012, 1);

}
Relayboard.setRelay(RelayBoard.Banks.D, 7, false);
Relayboard.setRelay(RelayBoard.Banks.D, 6, false);
TestSpan.Stop();

TimeSpan ts = TestSpan.Elapsed;
// Format and display the TimeSpan value.
string elapsedTime = string.Format("{0:00}:{1:00}:{2:00}.{3:00}", ts.Hours, ts.Minutes, ts.Seconds, ts.Milliseconds / 10);
}

}


Подробнее здесь: https://stackoverflow.com/questions/784 ... ave-device

Вернуться в «C#»