Взаимодействие с ЛИР 919 Д30 по протоколу Modbus TCP/IP

Модератор: Денис Кашин

Ответить
Beginner
Сообщения: 13
Зарегистрирован: 10 апр 2024, 16:30

Взаимодействие с ЛИР 919 Д30 по протоколу Modbus TCP/IP

Сообщение Beginner »

Здравствуйте!
Я новичок по работе с modbus TCP/IP, работал только с modbus RTU на другом устройстве.
Сейчас пишу приложение под ЛИР 919 и нужно взаимодействие с ним по протоколу modbus TCP/IP.
Подскажите пожалуйста, ЛИР 919 как-то нужно настроить на работу с modbus TCP/IP?
Если нужно, то как?

Я пересмотрел все документацию, нашел про RS-485 и про USB их взаимодействие через библиотеку UPL_LIB, но по ethernet modbus TCP/IP, нечего.

Выставлял настройки в приложении ULP Demo на вкладке ethernet: IP, port, протокол TCP. Порт ставил 502, как я понял, это специальный порт для работы modbus TCP/IP.

Я пытался подключится через библиотеку NModbus4 на c#, подключение не получилось. Так же пытался подключится через приложения по работе TCP/IP.
Владимир Чухляев
СКБИС
СКБИС
Сообщения: 50
Зарегистрирован: 19 июл 2022, 09:35

Re: Взаимодействие с ЛИР 919 Д30 по протоколу Modbus TCP/IP

Сообщение Владимир Чухляев »

Здравствуйте
Подскажите пожалуйста, ЛИР 919 как-то нужно настроить на работу с modbus TCP/IP?
Да
Если нужно, то как?
Открыть соответствующую вкладку в программе ULP Demo и заполнить необходимые параметры.
Я пересмотрел все документацию, нашел про RS-485 и про USB их взаимодействие через библиотеку UPL_LIB, но по ethernet modbus TCP/IP, нечего.
Примера работы через Ethernet, к сожалению, нет. Эти примеры для взаимодействие по протоколу ulp, а Вам необходим Modbus.
Посмотрите описание модулей.
Выставлял настройки в приложении ULP Demo на вкладке ethernet: IP, port, протокол TCP. Порт ставил 502, как я понял, это специальный порт для работы modbus TCP/IP.
Необходимо также выбрать протокол, не забыть кнопку "Изменить на". Задать Modbus адрес как в ULP Demo, так и в клиентском приложении.
Я пытался подключится через библиотеку NModbus4 на c#, подключение не получилось. Так же пытался подключится через приложения по работе TCP/IP.
1. Есть ли пинг?
2. Попробуйте подключиться через ULP Demo выбрав тип соединения Ethernet (на медленных компьютерах бывает необходимо увеличить интервал опроса)
3. Если выполняются первые два пункта, то можно воспользоваться любой утилитой для чтения регистров по Modbus TCP/IP (например modbus poll).
Beginner
Сообщения: 13
Зарегистрирован: 10 апр 2024, 16:30

Re: Взаимодействие с ЛИР 919 Д30 по протоколу Modbus TCP/IP

Сообщение Beginner »

Добрый день! Настроил все параметры сети у ПК и программы ULP Demo, для работы по протоколу modbus TCP/IP.
IP адреса пингуются. Прикрепил файлы настройки подключения, пинга адресов и параметры в программе modbus poll.

Я в программе modbus poll задаю:
1. Salve ID: 247
2. Function: 04 Read Input Registers(3x)
3. Address mode: Hex
4. Address: 1
5. Quantity: 4
6. Scan Rate: 1000 ms

Я хотел прочитать "Регистры ввода (input registers)", по адресу "0x01" ("Координата датчика").
Подключение есть, только ответ 0 и не меняется.
Параметр Quantity менял 1-30.

Помогите пожалуйста, как правильно читать координаты датчика и выставлять нули (параметр >0<)?

Какой адрес для чтения координат датчика использовать (есть несколько адресов 0x01-0x04, 0x08-0x0B и 0x11-0x14)?
Вложения
Setting2.PNG
Setting2.PNG (40 КБ) 3017 просмотров
Setting1.PNG
Setting1.PNG (68.33 КБ) 3017 просмотров
Modbus tcp ip1.PNG
Modbus tcp ip1.PNG (65.43 КБ) 3017 просмотров
Владимир Чухляев
СКБИС
СКБИС
Сообщения: 50
Зарегистрирован: 19 июл 2022, 09:35

Re: Взаимодействие с ЛИР 919 Д30 по протоколу Modbus TCP/IP

Сообщение Владимир Чухляев »

Здравствуйте

Вы читаете 0, т.к. не читаете регистр статуса. Регистр статуса позиции необходимо читать вместе с позицией. Именно чтение регистра статуса обновляет значение в регистрах позиции. Т.е. для вашего запроса необходимо изменить Address на 0 и Quantity на 5.
читать координаты датчика и выставлять нули
Поскольку Вам требуется обнуление, то следует обратить внимание на группы регистров хранения:
0х1010-0х1014 - G52 (оперативная СО, смещение хранится в ОЗУ, число перезаписей не лимитировано);
0х2010-0х2014 - G53 (абсолютная СО, смещение храниться в ПЗУ, число перезаписей ~1000, есть ограничение на выставление 0);
0х3010-0х3014 - G54 (абсолютная СО, смещение храниться в ПЗУ, число перезаписей ~100000).
Beginner
Сообщения: 13
Зарегистрирован: 10 апр 2024, 16:30

Re: Взаимодействие с ЛИР 919 Д30 по протоколу Modbus TCP/IP

Сообщение Beginner »

Владимир Чухляев писал(а): 15 апр 2024, 15:14 Т.е. для вашего запроса необходимо изменить Address на 0 и Quantity на 5.
Я задал Address 0 и Quantity 5. Значения все по нулям. Может каких то настроек не хватает?
Вложения
ReadParam.PNG
ReadParam.PNG (31.65 КБ) 3009 просмотров
Владимир Чухляев
СКБИС
СКБИС
Сообщения: 50
Зарегистрирован: 19 июл 2022, 09:35

Re: Взаимодействие с ЛИР 919 Д30 по протоколу Modbus TCP/IP

Сообщение Владимир Чухляев »

Здравствуйте
Значения все по нулям
Если у Вас инкрементный преобразователь - его стоит повращать.
Что во время запросов по Modbus показывает ULP Demo на вкладке преобразователь в индикаторе позиции?
Beginner
Сообщения: 13
Зарегистрирован: 10 апр 2024, 16:30

Re: Взаимодействие с ЛИР 919 Д30 по протоколу Modbus TCP/IP

Сообщение Beginner »

Добрый день, Владимир!
Владимир, спасибо большое за помощь!

Данные читаю! Вопрос насчет формата полученных данных.
В программе UPL Demo при таких настройка
Соединение: usb
Вкладка "Преобразователь".
-Состояние: включен
Раздел: преобразователь
-Текущий тип датчика:SSI
К примеру, на датчике стоит число 16637756, а по modus TCP, читается значение:
0=256
1=57148
2=253

Как преобразовать полученное значение?

При отключении питания, в программе UPL Demo нужно заново настраивать на подключение через modbus TCP/IP.
Есть ли какая-то возможность сохранять заданные настройки в устройстве?

Оставляю код на c#, вдруг кому-то пригодиться. Используется пакет (библиотека) NModbus4.

Код: Выделить всё

using Modbus.Device;
using System;
using System.Net.Sockets;

namespace ConsoleApp1
{
    internal class Program
    {
        static void Main(string[] args)
        {
            // Создание клиента Modbus TCP
            string ip = "192.168.1.250";
            int port = 90;
 	    TcpClient client = new TcpClient(ip, port);
            ModbusIpMaster master = ModbusIpMaster.CreateIp(client);
		
	    //Modbus адрес	
            byte slave = 247;
            
            ushort startAddress = 0x00;
            ushort numInputs = 5;
            
            ushort[] inputs = master.ReadInputRegisters(slave, startAddress, numInputs);
            
            for (int i = 0; i < numInputs; i++)
            {
                Console.WriteLine("Input {0}={1}", startAddress + i, inputs[i]);
            }
            Console.ReadLine();                      
        }
    }
}     
Владимир Чухляев
СКБИС
СКБИС
Сообщения: 50
Зарегистрирован: 19 июл 2022, 09:35

Re: Взаимодействие с ЛИР 919 Д30 по протоколу Modbus TCP/IP

Сообщение Владимир Чухляев »

на датчике стоит число 16637756
0xFD DF3C
1=57148
2=253
1-0xDF3C
2-0x00FD

В регистрах данные позиции располагаются начиная с младших байт. Если разрядность преобразователя не использует все биты позиции, то можно читать не все Modbus регистры (например, для 32 битного преобразователя можно читать 2 Modbus регистра позиции + статус).
0=256
Статус позиции 0000 0001 0000 0000b. Расшифровывается согласно описанию (стр.18)
Поскольку у Вас в статусе 8ой бит в "1", скорее всего, не верно заданы настройки преобразователя.
Есть ли какая-то возможность сохранять заданные настройки в устройстве?
Вкладка "Системный" -> "Сохранить" в области "Устройство"
Beginner
Сообщения: 13
Зарегистрирован: 10 апр 2024, 16:30

Re: Взаимодействие с ЛИР 919 Д30 по протоколу Modbus TCP/IP

Сообщение Beginner »

Подскажите пожалуйста, что нужно настроить в "Преобразователе", для правильного чтения по modbus TCP/IP?
Все настройки, которые есть сейчас в "Преобразователе", были установлены по умолчанию.
Вложения
Setting.PNG
Setting.PNG (45.99 КБ) 2908 просмотров
Владимир Чухляев
СКБИС
СКБИС
Сообщения: 50
Зарегистрирован: 19 июл 2022, 09:35

Re: Взаимодействие с ЛИР 919 Д30 по протоколу Modbus TCP/IP

Сообщение Владимир Чухляев »

что нужно настроить в "Преобразователе"
Если предположить, что модуль интерфейса работает в паре с преобразователем ЛИР-ДА190К-Ф4-22-3-В(DB9), то:
-изменить значение поля "Количество бит данных" на 22
Beginner
Сообщения: 13
Зарегистрирован: 10 апр 2024, 16:30

Re: Взаимодействие с ЛИР 919 Д30 по протоколу Modbus TCP/IP

Сообщение Beginner »

-изменить значение поля "Количество бит данных" на 22
Изменения "Количества бит данных" на 22, не дало положительных результатов.
Если предположить, что модуль интерфейса работает в паре с преобразователем ЛИР-ДА190К-Ф4-22-3-В(DB9)
Да, преобразователь верный.

Настройки применил и обновил.
Получается такой же непонятный набор данных прочитанный по modbus TCP.
Программа UPL Demo: 2166945 => Modbus TSP: 1=17030, 2=132.
Вложения
Setting_.PNG
Setting_.PNG (45.82 КБ) 2889 просмотров
Владимир Чухляев
СКБИС
СКБИС
Сообщения: 50
Зарегистрирован: 19 июл 2022, 09:35

Re: Взаимодействие с ЛИР 919 Д30 по протоколу Modbus TCP/IP

Сообщение Владимир Чухляев »

Получается такой же непонятный набор данных прочитанный по modbus TCP.
Надо разделять задачи:
-настройка работы по Modbus TCP (это сделано);
-настройка преобразователя (с этим проблемы).

При установленных 22 битах как изменяется позиция при медленном вращении? По одной дискрете или .... ?
Beginner
Сообщения: 13
Зарегистрирован: 10 апр 2024, 16:30

Re: Взаимодействие с ЛИР 919 Д30 по протоколу Modbus TCP/IP

Сообщение Beginner »

Надо разделять задачи:
-настройка работы по Modbus TCP (это сделано);
-настройка преобразователя (с этим проблемы).
Согласен.
При установленных 22 битах как изменяется позиция при медленном вращении? По одной дискрете или .... ?
Я составил таблицу. Будет ли ее достаточно?
Вложения
Data.PNG
Data.PNG (23.63 КБ) 2862 просмотра
Владимир Чухляев
СКБИС
СКБИС
Сообщения: 50
Зарегистрирован: 19 июл 2022, 09:35

Re: Взаимодействие с ЛИР 919 Д30 по протоколу Modbus TCP/IP

Сообщение Владимир Чухляев »

Здравствуйте

Я просмотрел что в вашем преобразователе присутствует бит аларм. Установите следующие настройки:
Снимок.PNG
Снимок.PNG (9.45 КБ) 2769 просмотров
Улучшило ли это ситуацию? Если нет, Вы территориально где находитесь? Если в Санкт-Петербурге, то было бы быстрее к нам подъехать.
Beginner
Сообщения: 13
Зарегистрирован: 10 апр 2024, 16:30

Re: Взаимодействие с ЛИР 919 Д30 по протоколу Modbus TCP/IP

Сообщение Beginner »

Добрый день, Владимир!
Улучшило ли это ситуацию?
Нет.
Вы территориально где находитесь?
Территориально в Москве.

При работе с "Количеством бит данных" 16, читаю правильно и хватает одного регистра и преобразование не нужно. Но мне нужно минимум 22 бита данных. В таком количестве данных уже участвует 2 регистра.

Я разобрался, напишу, вдруг кто-то будет искать информацию. Когда число в 1 разряде становиться рано 65536, то число переходит в следующий регистр, во второй. Получается 1 регистр 0, а второй регистр 1. Например, число 3 301 787. Чтение modbus TCP/IP, получаем 1 регистр 24 987 2 регистр 50. Полученное число 50 это количество циклов для числа 65 536. Далее берем его и умножаем 50 * 65536 =3 276 800 к нему прибавляем 2 регистр 3 276 800 + 24 987 = 3 301 787.
Вот и весь расчет.

Работает для настроек:
"Количества бит данных" - 22
"Позиция первого бита данных" - 1
"Количество бит статуса" - 1
"Инверсия битов статуса" - 1
"Начальный интервал" - 0
Настройки в скриншотах.

После настройки всех параметрам, сохраняем в программе. Необходимость UPL Demo, отпадает.
Используется пакет (библиотека) NModbus4.
Код для работы

Код: Выделить всё

using Modbus.Device;
using System;
using System.Net.Sockets;

namespace ConsoleApp1
{
    internal class Program
    {
        static void Main(string[] args)
        {
            // Создание клиента Modbus TCP
            string ip = "192.168.1.250";
            int port = 90;
 	    TcpClient client = new TcpClient(ip, port);
            ModbusIpMaster master = ModbusIpMaster.CreateIp(client);
		
	    //Modbus адрес	
            byte slave = 247;
            
            ushort startAddress = 0x00;
            ushort numInputs = 5;
            
            ushort[] inputs = master.ReadInputRegisters(slave, startAddress, numInputs);
            
            for (int i = 0; i < numInputs; i++)
            {
                Console.WriteLine("Input {0}={1}", startAddress + i, inputs[i]);
            }
            Console.ReadLine();                      
        }
    }
}     
Вложения
Сохранение настроек
Сохранение настроек
Setting__2.PNG (42.15 КБ) 2613 просмотров
Настройки для чтения modbus TCP/IP.
Настройки для чтения modbus TCP/IP.
Setting__1.PNG (38.56 КБ) 2619 просмотров
Настройки для подключения modbus TCP/IP.
Настройки для подключения modbus TCP/IP.
Setting__.PNG (40.92 КБ) 2619 просмотров
Ответить