2 / 2 / 1
Регистрация: 10.01.2018
Сообщений: 26

Обмен данными по ModbusTCP

07.09.2018, 12:26. Показов 1500. Ответов 11

Студворк — интернет-сервис помощи студентам
Добрый день, Единомышленики! Последняя надежда на этот замечательный форум, уже порядка 3х недель бьёмся с проблемой чтения и записи аналоговых значений по ModbusTCP. Дискеты читаются исправно, запись дискретов не реализована.
Объясню всё подробно:
Есть 2 контроллера, они общаются по ModbusTCP. Один из них является контроллером верхнего уровня, другой ЛСАу. Необходимо с контроллера верхнего уровня читать и записывать аналоги (уставки) в контроллер ЛСАУ. Они находятся в разных сетях, маршруты автоматические сформировались на windows server. ping от одного до другого и обратно проходит.
Запись и чтение происходит по следующей схеме:
1. Запись: В скаде задаю значение уставки U (float) - преобразую в относительные единицы (AnOut = anpar.U / 1000 * Unom) - перевожу в INT( так как ЛСАУ принимает целочисленные значения 2 бита) - отправляю
2. Чтение: принимаю значение в о.е. INT - перевожу во float - перевожу из о.е. в нормальные значения (anpar.U = AnIn * 1000 \ Unom)
В результате считываю и записыва 0 по всем параметрам.
Был проведён эксперимент:
Вместо контроллера ЛСАУ подключили ноут с айпишником контроллера и запустили Modbus Slave. И по данной схеме всё работает. Прикладываю фото: верх - фото из СКАДы управляющей контроллером верхнего уровня, низ фото Modbus Slave. ( не обращаете внимания на Уст Ie, там была ошибка в коде.)
Ещё интересный момент:
Режимы работы устройства ЛСАУ я переключаю также аналоговым сигналом: 0, 1 или 2. И это работает исправно, режимы переключаются в контроллере ЛСАУ (это я отслеживаю по лампочкам на двери шкафа управления.

В связи с чем есть предположение что ошибки где то в преобразованиях. Не могу понять в чём проблема. Пожалуйста помогите.
Прошу прощения за много текста, хотелось дать исчерпывающую информацию что бы картина была как можно конкретней. Готов ответить на дополнительные вопросы, с данного момента буду онлайн постоянно.
Заранее всем спасибо за участие!
Миниатюры
Обмен данными по ModbusTCP  
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
07.09.2018, 12:26
Ответы с готовыми решениями:

Простой обмен данными
Отправляю серверу строку, а функция recv() возвращает мне -1 :( Почему? client.cpp #include <iostream> #include...

MODBUS-TCP обмен данными
Моё простенькое чудо-приложение должно принимать/посылать данные от/на внешнее устройство. Внешнее устройство - ПЛК Овен, который...

Обмен данными через интернет
Искал ответ но так и не нашел... Прошу прощения если плохо искал Проблема такая... Хочу организовать обмен текстовыми формами через...

11
Модератор
 Аватар для vxg
3404 / 2175 / 353
Регистрация: 13.01.2012
Сообщений: 8,437
07.09.2018, 18:23
Rriderr, 1) а преобразование в целое случайно не так должно быть: float / Range * 1000? 2) правильный ли порядок байт в целом выбран?
0
2 / 2 / 1
Регистрация: 10.01.2018
Сообщений: 26
07.09.2018, 18:40  [ТС]
vxg, 1) тут Формула преобразования не указана, только преобразование в о.е., преобразование в целое идёт дальше в драйверах. Но судя по таблице из
Slave (приложенное фото нижняя часть) преобразование в целое число происходит верно.
2) Да, если я правильно понял. Ручкой подписано на нижней части фото номера, они соответствуют номерам в протоколе обмена ModbusTCP. От 0 байта до 15ого = 16.
И мне кажется что если была бы напутана номерация, я бы записал хоть что то Хоть куда то, а тут вообще нет реакции по всем параметрам.
0
Модератор
 Аватар для vxg
3404 / 2175 / 353
Регистрация: 13.01.2012
Сообщений: 8,437
07.09.2018, 19:34
Rriderr, просто логично предположить что если число с плавающей запятой передают (пишут) как целое то его в начале нормируют к диапазону измерений (делят на Unom) а потом умножают на точность дискретизации (1000) а извлекают (читают) обратным преобразованием - а у вас написано наоборот. про последовательность байт - я имел ввиду порядок следования младшего и старшего байта в одном целом значении если оно конечно имеет размер больше одного байта (WORD или DWORD) что напрашивается из предполагаемой точности дискретизации (1000 больше 255) - этот порядок может быть прямым или обратным
0
2 / 2 / 1
Регистрация: 10.01.2018
Сообщений: 26
08.09.2018, 04:28  [ТС]
vxg, вот это действительно хорошее предположение. Я думал об этом, но у меня получилась какая то ерунда при расчёте и решил что правильно будет наоборот. Завтра попробую записать так как сказали Вы, спасибо.
А по поводу старшего/младшего, я не смог разобраться какое направление необходимо для контроллера ЛСАУ и пробовал переворачивать, но результата никакого не дало.
0
2 / 2 / 1
Регистрация: 10.01.2018
Сообщений: 26
10.09.2018, 19:14  [ТС]
vxg, только сегодня удалось добраться до стенда. Пробовал записывать преобразование по Вашей формуле, значения так же пишутся и читаются только в Modbus Slave - скада их записывает и читает, а с контроллером ЛСАУ не получается.
Проверил через modbus slave также порядок байт, функцией Слейва BINARY. И увидел что мой способ переворота байт не работает.
Возник вопрос, а может ли это быть причиной? Ведь мне кажется я бы записал что то и прочил даже с неправильным порядком... Или я ошибаюсь?
0
Модератор
 Аватар для vxg
3404 / 2175 / 353
Регистрация: 13.01.2012
Сообщений: 8,437
11.09.2018, 06:20
Rriderr, на железе ячейки имеют тип WORD?
0
2 / 2 / 1
Регистрация: 10.01.2018
Сообщений: 26
11.09.2018, 08:32  [ТС]
vxg, имеете ввиду в контроллере?
0
Модератор
 Аватар для vxg
3404 / 2175 / 353
Регистрация: 13.01.2012
Сообщений: 8,437
11.09.2018, 18:22
Rriderr, да, в железе или описании ячеек модбас
0
2 / 2 / 1
Регистрация: 10.01.2018
Сообщений: 26
12.09.2018, 08:33  [ТС]
vxg, Сейчас проверил, в описании ячеек стоит WORD.
0
Модератор
 Аватар для vxg
3404 / 2175 / 353
Регистрация: 13.01.2012
Сообщений: 8,437
12.09.2018, 18:23
Rriderr, пробовали слать без математики прямо в них всегда 00 00 или всегда FF FF или 00 FF или FF 00?
0
2 / 2 / 1
Регистрация: 10.01.2018
Сообщений: 26
13.09.2018, 22:28  [ТС]
vxg, выяснили в чём проблема. Хочу поделиться, может кому будет полезно. Оказалось проблема была в чтении. И проблема в том, что в ЛСАУ стояло ограничение по количеству одновременно считываемых регистров - 28. Попытки считать разом большее количество регистров приводило к ошибке. А контроллер верхнего уровня читал стандартом 32.
Спасибо за участие и комментарии.
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
13.09.2018, 22:28
Помогаю со студенческими работами здесь

Обмен данными между приложениями
Здравствуйте Нужна помощь Нужна программа которая будет брать некие данные из одной программы и копировать их в другую программу и...

Обмен данными без открытых портов
Может звучит глупо, но можно ли организовать обмен данными, при том, что все порты закрыты? Ну или как тогда программно открыть порты?...

Обмен данными между Linux и Windows
Здравствуйте, у меня есть малинка, и пк на windows, мне нужно с помощью сокетов передавать данные между Linux и Windows, возможно ли это,...

Обмен данными по сети между двумя приложениями
Всем доброго времени суток! суть вопроса: есть 2 приложения на разных компах. Одно приложение рассчитывает параметры движения объекта,...

Обмен данными php через socket и с++ сервера
В общем задача такова. Есть сервер написанный на С++ и к сожалению утрачены связи с его программистом. Из описания удалось вытащить вот...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
12
Ответ Создать тему
Опции темы

Новые блоги и статьи
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
Фото: Daniel Greenwood
kumehtar 13.11.2025
Расскажи мне о Мире, бродяга
kumehtar 12.11.2025
— Расскажи мне о Мире, бродяга, Ты же видел моря и метели. Как сменялись короны и стяги, Как эпохи стрелою летели. - Этот мир — это крылья и горы, Снег и пламя, любовь и тревоги, И бескрайние. . .
PowerShell Snippets
iNNOKENTIY21 11.11.2025
Модуль PowerShell 5. 1+ : Snippets. psm1 У меня модуль расположен в пользовательской папке модулей, по умолчанию: \Documents\WindowsPowerShell\Modules\Snippets\ А в самом низу файла-профиля. . .
PowerShell и онлайн сервисы. Валюта (floatrates.com руб.)
iNNOKENTIY21 11.11.2025
PowerShell функция floatrates-rub Примеры вызова: # Указанная валюта 'EUR' floatrates-rub -Code 'EUR' # Список имеющихся кодов валют floatrates-rub -Available function floatrates-rub {
PowerShell и онлайн сервисы. Погода (RP5.ru)
iNNOKENTIY21 11.11.2025
PowerShell функция Get-WeatherRP5rss для получения погоды с сервиса RP5 Примеры вызова Get-WeatherRP5rss с указанием id 5484 — Москва (восток, Измайлово) и переносом строки:. . .
PowerShell и онлайн сервисы. Погода (wttr)
iNNOKENTIY21 11.11.2025
PowerShell Функция для получения погоды с сервиса wttr Примеры вызова: Погода в городе Омск с прогнозом на день, можно изменить прогноз на более дней, для этого надо поменять запрос:. . .
PowerShell и онлайн сервисы. Валюта (ЦБР)
iNNOKENTIY21 11.11.2025
# Получение курса валют function cbr (] $Valutes = @('USD', 'EUR', 'CNY')) { $url = 'https:/ / www. cbr-xml-daily. ru/ daily_json. js' $data = Invoke-RestMethod -Uri $url $esc = 27 . . .
И решил я переделать этот ноут в машину для распределенных вычислений
Programma_Boinc 09.11.2025
И решил я переделать этот ноут в машину для распределенных вычислений Всем привет. А вот мой компьютер, переделанный из ноутбука. Был у меня ноут асус 2011 года. Со временем корпус превратился. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru