Страница 1 из 2 12 ПоследняяПоследняя
Показано с 1 по 10 из 18

Тема: Чтение битовой маски в коде c#

Комбинированный просмотр

Предыдущее сообщение Предыдущее сообщение   Следующее сообщение Следующее сообщение
  1. #1
    Пользователь Аватар для k119_55524
    Регистрация
    24.04.2024
    Адрес
    Темиртау
    Сообщений
    7

    По умолчанию Чтение битовой маски в коде c#

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

  2. #2

    По умолчанию

    Я могу быть не прав, но почему Coils-то?
    Новые модули HW 2.0 эту команду НЕ поддерживают. Только регистры.
    Пишите код так, как будто сопровождать его будет склонный к насилию психопат, который знает, где вы живёте. © Steve McConnell
    Мой рабочий блог со статьями про щиты и автоматику ОВЕН - Cs-Cs.Net | Почта: Info@Cs-Cs.Net

  3. #3
    Пользователь Аватар для k119_55524
    Регистрация
    24.04.2024
    Адрес
    Темиртау
    Сообщений
    7

    По умолчанию

    Уточняю.
    Конфигуратор позволяет получить маску:
    Screenshot_1.png

    В коде можно её получить?
    Другим путём?
    Судя по поведению конфигуратора маска и регистры имеют "не зависимые" значения.

  4. #4

    По умолчанию

    Цитата Сообщение от k119_55524 Посмотреть сообщение
    Уточняю.
    Конфигуратор позволяет получить маску:
    Screenshot_1.png

    В коде можно её получить?
    Другим путём?
    Судя по поведению конфигуратора маска и регистры имеют "не зависимые" значения.
    Что значит независимые? 32 битная переменная (два регистра по 16 бит) и есть "маска"

    Цитата Сообщение от k119_55524 Посмотреть сообщение
    Пользуюсь всем этим пол дня. Никогда ничем подобным не занимался. Или по другому - впервые.

    Чтобы прочитать состояние регистров использую:
    data = modbusMaster.ReadHoldingRegisters(addrDevice_MU110 _32, startAddress, countReg);
    и оно работает.

    Для чтения маски использую ReadCoils и оно не работает. Вы указали что 2 версия приборов её не поддерживает. Спасибо за помощь.

    Повторю в очередной раз вопрос как мне получить маску с помощью кода?
    Просьба помочь конкретным советом)
    Ну так data - это и есть маска в виде массива байт (два прочитанных 16 битных регистра)

  5. #5
    Пользователь Аватар для k119_55524
    Регистрация
    24.04.2024
    Адрес
    Темиртау
    Сообщений
    7

    По умолчанию

    Цитата Сообщение от 1exan Посмотреть сообщение
    Что значит независимые? 32 битная переменная (два регистра по 16 бит) и есть "маска"



    Ну так data - это и есть маска в виде массива байт (два прочитанных 16 битных регистра)
    1. Если в конфигураторе отправить 1000(максимум) в коэффициент заполнения шим, то вход(ожидаемо) включится. Но при чтении из устройства бит маски регистра в 1 не переключается(скрин прилагаю). Подобную ситуацию можно назвать - не связаны, хотя по сути оба эти параметра управляют включением/отключением одного и тогоже физического выхода но разными путями. Тоесть я могу пользоваться управлением через параметры шим(вариант ReadHoldingRegisters). Понятно, что битовая маска более логична в использовании для простого управления выходами(шим какбы для другого)(вариант ReadCoils, но он как выше писали не поддерживается).
    Конфигуратор позволяет читать маску. Значит такая возможность есть, надеюсь она не секретная.
    Screenshot_10.png

    2. В моём случае(и других, рабочих, вариантов в интерфейсе библиотеки доступа к rs485 я не нашёл) ReadHoldingRegisters возвращает массив ushort размерностью 32(по количеству выходов на приборе). Это 16 х 32 = ..., тоесть больше чем 2 слова. И в массиве явно хранятся не битовые состояния маски а коэффициенты заполнения шим. Конечно, в итоге, можно интерпретировать этот массив в битовую маску но сдаётся мне что это не правильно. Правильно - прочитать битовую маску как есть. Я не знаю как это сделать. И в этом я прошу помощи.
    Последний раз редактировалось k119_55524; 25.04.2024 в 07:23.

  6. #6

    По умолчанию

    Цитата Сообщение от k119_55524 Посмотреть сообщение
    1. Если в конфигураторе отправить 1000(максимум) в коэффициент заполнения шим, то вход(ожидаемо) включится. Но при чтении из устройства бит маски регистра в 1 не переключается(скрин прилагаю). Подобную ситуацию можно назвать - не связаны, хотя по сути оба эти параметра управляют включением/отключением одного и тогоже физического выхода но разными путями. Тоесть я могу пользоваться управлением через параметры шим(вариант ReadHoldingRegisters). Понятно, что битовая маска более логична в использовании для простого управления выходами(шим какбы для другого)(вариант ReadCoils, но он как выше писали не поддерживается).
    Конфигуратор позволяет читать маску. Значит такая возможность есть, надеюсь она не секретная.
    Screenshot_10.png

    2. В моём случае(и других, рабочих, вариантов в интерфейсе библиотеки доступа к rs485 я не нашёл) ReadHoldingRegisters возвращает массив ushort размерностью 32(по количеству выходов на приборе). Это 16 х 32 = ..., тоесть больше чем 2 слова. И в массиве явно хранятся не битовые состояния маски а коэффициенты заполнения шим. Конечно, в итоге, можно интерпретировать этот массив в битовую маску но сдаётся мне что это не правильно. Правильно - прочитать битовую маску как есть. Я не знаю как это сделать. И в этом я прошу помощи.
    1. Насчет регистров параметров ШИМ - да, наверное они не связаны с регистром маски выходов.
    2. В запросе data = modbusMaster.ReadHoldingRegisters(addrDevice_MU110 _32, startAddress, countReg); вы что вообще указываете? Нужно указать startAddress = 50 (если я не ошибаюсь, это адрес 1-го регистра маски выходов) и countReg = 2 (два 16-битных регистра). Тогда вы получите data размером 4 со значением маски (тут не уверен, возможно будет размер 2 - надо смотреть библиотеку)
    Последний раз редактировалось 1exan; 25.04.2024 в 08:14.

  7. #7

    По умолчанию

    Так маска этим модулем всегда же отдаётся в виде двух 16-битных регистров. А у тебя Coils упоминаются, которые им не поддерживаются.
    Пишите код так, как будто сопровождать его будет склонный к насилию психопат, который знает, где вы живёте. © Steve McConnell
    Мой рабочий блог со статьями про щиты и автоматику ОВЕН - Cs-Cs.Net | Почта: Info@Cs-Cs.Net

  8. #8
    Пользователь Аватар для k119_55524
    Регистрация
    24.04.2024
    Адрес
    Темиртау
    Сообщений
    7

    По умолчанию

    Так маска этим модулем всегда же отдаётся в виде двух 16-битных регистров.
    - как получить эти 2 слова в коде(пример, ссылка)?

  9. #9

    По умолчанию

    Я не умею на C#. Ну так через Modbus и получить. Командой чтения двух регистров (слов).
    Чтобы ответ был более точным - скажи хоть то, насколько ты уверенно знаешь:
    * Продукцию ОВЕН
    * Протокол Modbus и его команды
    Пишите код так, как будто сопровождать его будет склонный к насилию психопат, который знает, где вы живёте. © Steve McConnell
    Мой рабочий блог со статьями про щиты и автоматику ОВЕН - Cs-Cs.Net | Почта: Info@Cs-Cs.Net

  10. #10
    Пользователь Аватар для k119_55524
    Регистрация
    24.04.2024
    Адрес
    Темиртау
    Сообщений
    7

    По умолчанию

    Пользуюсь всем этим пол дня. Никогда ничем подобным не занимался. Или по другому - впервые.

    Чтобы прочитать состояние регистров использую:
    data = modbusMaster.ReadHoldingRegisters(addrDevice_MU110 _32, startAddress, countReg);
    и оно работает.

    Для чтения маски использую ReadCoils и оно не работает. Вы указали что 2 версия приборов её не поддерживает. Спасибо за помощь.

    Повторю в очередной раз вопрос как мне получить маску с помощью кода?
    Просьба помочь конкретным советом)
    Последний раз редактировалось k119_55524; 25.04.2024 в 06:20.

Страница 1 из 2 12 ПоследняяПоследняя

Похожие темы

  1. Ответов: 15
    Последнее сообщение: 26.03.2023, 16:06
  2. Добавление выходных переменных в коде ST
    от Илья563 в разделе Программируемые реле
    Ответов: 10
    Последнее сообщение: 10.06.2022, 16:25
  3. Разбор битовой маски в ПР-200
    от Р.Александр в разделе Программируемые реле
    Ответов: 9
    Последнее сообщение: 31.12.2021, 13:20
  4. Чтение битовой маски TRM-1032
    от SergeyGushchin в разделе Эксплуатация
    Ответов: 2
    Последнее сообщение: 15.12.2021, 08:44
  5. Распаковка битовой маски в Мастер скада
    от Александр N в разделе Master SCADA 3
    Ответов: 10
    Последнее сообщение: 02.09.2021, 08:04

Метки этой темы

Ваши права

  • Вы не можете создавать новые темы
  • Вы не можете отвечать в темах
  • Вы не можете прикреплять вложения
  • Вы не можете редактировать свои сообщения
  •