Подключил через конвертер АС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# получить битовую маску?




Ответить с цитированием
