Подключил через конвертер АС4(usb<->rs485) МУ110-32Р к компьютеру.
Изображение WhatsApp 2024-04-24 в 20.53.01_a8709bc1.jpg
Использую код в с# для управления дискретными выходами:
Код:
using System;
using Modbus.Device;
using System.IO.Ports;
using System.Threading;
using System.Diagnostics;
namespace Experience
{
internal class Program
{
static void Main(string[] args)
{
string[] portNames = SerialPort.GetPortNames();
if (portNames.Length > 0)
{
SerialPort port = new SerialPort(portNames[0], 9600, Parity.None, 8, StopBits.One);
// Установка параметров порта
port.Handshake = Handshake.None;
port.ReadTimeout = 500; // Таймаут чтения (ms)
port.WriteTimeout = 500; // Таймаут записи (ms)
const byte addrDevice_MU110_32 = 1;
const ushort countReg = 32;
const ushort valReg = 1000;
ushort[] data = new ushort[countReg];
try
{
port.Open();
ModbusSerialMaster modbusMaster = ModbusSerialMaster.CreateRtu(port);
for (ushort i = 0; i < countReg; i += 2)
{
data[i] = valReg;
data[i + 1] = 0;
}
modbusMaster.WriteMultipleRegisters(addrDevice_MU1 10_32, 0, data);
ushort startAddress = 0;
Stopwatch stopwatch = new Stopwatch();
while (true)
{
Thread.Sleep(1000);
stopwatch.Restart();
stopwatch.Start();
data = modbusMaster.ReadHoldingRegisters(addrDevice_MU110 _32, startAddress, countReg);
stopwatch.Stop();
Console.WriteLine("<<<<< Время получения данных: " + stopwatch.Elapsed.TotalSeconds + "(sec).");
for (ushort i = 0; i < data.Length; i++)
{
data[i] = (ushort)(valReg - data[i]);
}
bool[] values = modbusMaster.ReadCoils(addrDevice_MU110_32, 0, countReg);
stopwatch.Restart();
stopwatch.Start();
modbusMaster.WriteMultipleRegisters(addrDevice_MU1 10_32, 0, data);
stopwatch.Stop();
Console.WriteLine(">>>>> Время отправки данных: " + stopwatch.Elapsed.TotalSeconds + "(sec).\n");
}
}
catch (Exception ex)
{
Console.WriteLine(">>>>> Error: " + ex.Message);
Console.ReadKey();
}
finally
{
if (port.IsOpen)
port.Close();
}
}
}
}
}
По сути программа бесконечно, с задержкой переключает выхода из включенного в выключенное, при этом чётные выхода в своем состоянии противоположны нечётным(смысл только в тестировании управления выходами).
Используемые пакеты NUGET:
Screenshot_10.png
Всё работает, проблем нет, за исключением:
попытка прочитать/записать битовую маску выходов приводит к exeptions по превышению времени ожидания запроса.
Screenshot_2.png
Команда запроса(в примере кода присутствует):
Код:
bool[] values = modbusMaster.ReadCoils(addrDevice_MU110_32, 0, countReg);
Варианты проблемы:
1. Код NeGet пакетов нормально не поддерживает команду чтения маски.
2. Я не правильно чтото делаю в коде.
Что я понимаю под битовой маской:
Screenshot_1.png
Вопрос: как мне, при моей схеме, в коде c# получить битовую маску?