Страница 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

    По умолчанию

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

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

    По умолчанию

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

  6. #6

    По умолчанию

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

  7. #7
    Пользователь
    Регистрация
    27.11.2011
    Адрес
    Краснодар
    Сообщений
    10,684

    По умолчанию

    Автор, вы должны читать регистры так, как того требует документация прибора.

    Битовая маска это всего лишь абстракция. Это только значит, что в определенном регистре значение, представляет собой эту самую битовую маску, но это не означает, что надо пытаться прочитать каждый бит какими-то другими средствами протокола.

    Код:
    // Возвращает бит n значения val.
    public double GetBit(double val, int n)
    {
        ulong ulVal = (ulong)val;
        return (ulVal >> n) & 1ul;
    }
    допилите по необходимости
    Последний раз редактировалось melky; 24.04.2024 в 23:27.

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

    По умолчанию

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

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

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

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

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

    По умолчанию

    Спасибо что уделили время. С абстракциями и манипуляциями битами у меня проблем нет, тут мне всё ясно.

    У меня не получается прочитать регистры, а точнее я не знаю как это сделать(в итоге у меня нет исходных данных для работы с битами). Это то что меня интересует и о чем я прошу помощи.
    У Вас есть возможность подсказать?
    Последний раз редактировалось k119_55524; 25.04.2024 в 06:19.

  10. #10

    По умолчанию

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

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

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

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

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

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

Страница 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

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

Ваши права

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