PDA

Просмотр полной версии : MB110 Linux ModBus как начать?



multimorf
19.05.2015, 12:57
Здравствуйте. Я уже неделю изучаю ваши форумы, но найти что-либо полезное так и не смог, кроме того, что прибор протокол общения определяет автоматически. Возможно стоит как-то упорядочить его, создать отдельно инструкции для линуксоидов.
У меня 3 прибора: МВ110-8АС, МУ110-6У, МУ110-8Р. Я пытаюсь связаться с МВ110-8АС через ком порт консольно и ничего не выходит. Воткнут сразу в com1 материнской платы. Первичная задача - общаться консольно из под linux (использую gtcterm). Далее пойдёт код на Python. Библиотеки не предлагать — хочу сам знать как оно работает. Сейчас я нахожусь на уровне уважаемого SRC потому и пишу в эту тему. Я НЕ МОГУ прорваться к прибору НАПРЯМУЮ - получилось только из под Windows с утилиты Конфигуратор и с утилиты bb_commtest для modbus (позволяет отсылать только команды записи и чтения регистров в формате modbus RTU). USB переходинк - использую для Windows (и под Linux тоже пробовал его с дровами - не помогло).

Настройки порта:
для Linux название /dev/ttyS0 для Windows com1
скорость 9600 8/1
Паритет none контроль потока none

С bb_commtest у меня выходят следующие диалоги:
100300000001874B
1003020002C586

1003000C014748
10030200C845D1

10030058010698
10830290F4

1003008800010761
1003020006C445
причём эти диологи получаются при настройке 9600 8/2 при 8/1 программа работает исключительно с паритетом и выдаёт билиберду.
первые три регистра читал наугад, в четвёртом, я так понимаю, он мне ответил "аппаратный сброс" - причина включения устройства.
Эти же строки я пробую вводить gtcterm и в режиме шестнадцатеричного ввода и в режиме ASCII, и 8/1 и 8/2 без паритета
CRC генерировал тут http://vk.com/away.php?utf=1&to=http%3A%2F%2Fwww.lammertbies.nl%2Fcomm%2Finfo%2 Fcrc-calculation.html
В основное окно программы макросом пишу:
С полиномом для ASCII modbus
:1003008800013E2A\0D - этот вариант на всякий случай
:1003008800012A3E\0D - этот правильный по моему мнению
С полиномом для обычного ASCII crc-16
:1003008800014E3C\0D
:1003008800013C4E\0D
В окно для шестнадцатеричного ввода пишу:
С полиномом для RTU modbus
10 03 00 88 00 01 07 61 0D - совпадает с тем, что пишет утилита bb_commtest
10 03 00 88 00 01 61 07 0D
С полиномом для обычного RTU crc-16
10 03 00 88 00 01 07 7A 0D
10 03 00 88 00 01 7A 07 0D

На всё ОВЕН упрямо молчит. Пробовал писать писать из Гиппер Терминала (в ASCII режиме соответственно) те же строки, ещё из терминала Terminal 1_9_b (тоже ASCII) - ОВЕН молчит.
PS хочу указать, что я новичок и в com портах и в modbud и в приборах ОВЕН. Документацию всю перебирал и по ОВНУ и по modbus. может что и пропустил.
Самые простые вопросы, которые возникли:
1. Правильно ли указываю начало/конец строки?
2. Правильно ли всё с CRC?
3. нужны ли разделители в режиме ASCII между байтами
4. Управление потоком нужно или нет? Вероятнее всего, мне кажется, я не правильно настраиваю COM порт, может интервалы какие-нибудь..
5. Начальник сваливает всё на версию COM интерфейса ПО. Дескать, она у gtcterm и Hyper Terminal одинаковая и не подходит к ОВЕН. Может ли быть такое?
Что я делаю не так? Опишите пожалуйста весь процесс работы из под линукс в терминале, кто этим занимался. Спасибо

multimorf
19.05.2015, 15:26
Только что попробовал вот так вот:
root@hardbox:~/server/1.3.11/mxu11x0# python
Python 2.7.6 (default, Mar 22 2014, 22:59:38)
[GCC 4.8.2] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import serial
>>> ser = serial.Serial('/dev/ttyS0', 9600, timeout=1)
>>> ser.write("\x7E\x10\x03\x00\x88\x00\x01\x07\x61")
9
>>> ser.write("\x7E\x10\x03\x00\x88\x00\x01\x07\x61\x7E")
10
>>> ser.write("\x7E\x10\x03\x00\x88\x00\x01\x07\x61\x7E")
10
>>> ser.write("\x7E\x10\x03\x00\x88\x00\x01\x07\x61\x7E\x0D")
11

capzap
19.05.2015, 15:55
не пробовали конфигуратором подключится к прибору, может тоже ему не отвечает?

multimorf
19.05.2015, 17:57
Конфигуратор работает отлично! Настройки пишутся, данные каналов читаются

multimorf
20.05.2015, 10:35
Снимок попытки использования ModPoll.
18253

capzap
20.05.2015, 10:43
не мешало бы выложить тогда уж вывод команды dmesg и хотя бы сказать какой у Вас конвертер

multimorf
20.05.2015, 11:13
Забыл указать, что на Linux я тоже всего месяц сижу. Пожалуйста укажите какие параметры использовать для dmesg. О каком преобразователе вы спрашиваете?

Yegor
20.05.2015, 11:17
Воткнут сразу в com1 материнской платы.
О каком преобразователе вы спрашиваете?На бытовых компах нет 485-го интерфейса. Как вы модуль в ком-порт напрямую подключить умудрились?

multimorf
20.05.2015, 11:29
Как вы модуль в ком-порт напрямую подключить умудрились?
Штырьки на плате и переходник на стандартный разъём...
Если интерфейс действительно не поддерживается, то через Uport в USB на Linux я тоже пробовал.

Yegor
20.05.2015, 12:19
Штырьки на плате и переходник на стандартный разъём.Что именно за плата? У неё есть RS-485?
через Uport в USB на Linux я тоже пробовалИ соответственно вместо /dev/ttyS0 другой порт указывали?

multimorf
20.05.2015, 13:04
Наверно что-то я делаю не так. Проэмулировал modbus master+slave.

В одном окне:

root@hardbox:~/server/terminals/DiagSlave/linux# ./diagslave -a 16 -b 9600 -d 8 -s 1 -p none -m rtu /dev/ttyS0diagslave 2.12 - FieldTalk(tm) Modbus(R) Diagnostic Slave Simulator
Copyright (c) 2002-2012 proconX Pty Ltd
Visit http://www.modbusdriver.com for Modbus libraries and tools.

Protocol configuration: Modbus RTU
Slave configuration: address = 16, master activity t/o = 3.00
Serial port configuration: /dev/ttyS0, 9600, 8, 1, none

Server started up successfully.
Listening to network (Ctrl-C to stop)
............................

В другом окне:

root@hardbox:~/server/terminals/modpoll.3.4/linux# ./modpoll -m rtu -a 16 -r 1 -c 10 -t 3 -b 9600 -d 8 -p none /dev/ttyS0
modpoll 3.4 - FieldTalk(tm) Modbus(R) Master Simulator
Copyright (c) 2002-2013 proconX Pty Ltd
Visit http://www.modbusdriver.com for Modbus libraries and tools.

Protocol configuration: Modbus RTU
Slave configuration...: address = 16, start reference = 1, count = 10
Communication.........: /dev/ttyS0, 9600, 8, 1, none, t/o 1.00 s, poll rate 1000 ms
Data type.............: 16-bit register, input register table

-- Polling slave... (Ctrl-C to stop)
Reply time-out!
-- Polling slave... (Ctrl-C to stop)
Reply time-out!
-- Polling slave... (Ctrl-C to stop)
Reply time-out!

multimorf
20.05.2015, 13:12
И соответственно вместо /dev/ttyS0 другой порт указывали?
Указывал ttyUSB0. название отображается по ls -l /dev/tty*

Что именно за плата? У неё есть RS-485?

Handle 0x0006, DMI type 2, 20 bytes
Base Board Information
Manufacturer: Intel Corporation
Product Name: D510MO
Version: AAE76523-403
Serial Number: BTMO036004AV
Asset Tag: Base Board Asset Tag
Features:
Board is a hosting board
Board is replaceable
Location In Chassis: Base Board Chassis Location
Chassis Handle: 0x0007
Type: Unknown
Contained Object Handles: 0
Про 485 ничего не нашёл в документации

Yegor
20.05.2015, 13:21
Проэмулировал modbus master+slave.Не пойму. Вы это пытаетесь loopback сделать как в IP-сетях что ли? Если так, то во-первых, встроенного loopback'а на последовательных интерфейсах я не встречал. А во-вторых, ну не на один физический порт же! Для подобных экспериментов надо связанные виртуальные порты делать (под виндой com0com, например), и у них разные имена в системе будут. Странно, что во втором окне программа не закрылась с ошибкой занятого порта.
Manufacturer: Intel Corporation
Product Name: D510MOК этой плате нельзя напрямую подключить модули Овен. Нужен либо преобразователь 232-485 (типа Овен АС3М), чтобы работать через /dev/ttyS0, либо какой-нибудь USB-485, но внутренний адрес порта уже другой будет. К сожалению, здесь мои познания Линукса заканчиваются.

multimorf
20.05.2015, 13:33
не мешало бы выложить тогда уж вывод команды dmesg

Вот лог, правда кроме UPorta 1130 я там ничего не разобрал

multimorf
20.05.2015, 13:49
К этой плате нельзя напрямую подключить модули Спасибо. Что-то прояснилось: теперь буду пытаться только через свой переходник USB-Serial UPort 1130. Тогда вопрос: как из Windows мне поговорить с ModBus по 485? Я заметил, что в програмке, которая у меня работает, bb_comtest есть переключатель 232/485 больше нигде такого нету, в т.ч. и в программах под Linux (или я не нашёл). Может подскажете терминал под 485 для windows, что б можно было проверить ?? (или Linux).

ASo
20.05.2015, 13:51
По windows создастся логический COM порт. Посмотрите номер в диспетчере устройств.
Терминал - любой. Хотя бы putty.

Yegor
20.05.2015, 14:01
Приложения ОС не должен беспокоить вид порта — 232 или 485. Соответственно, он не должен там упоминаться. Посмотрите руководство к этой bb_comtest.

multimorf
21.05.2015, 15:53
Приложения ОС не должен беспокоить вид порта — 232 или 485.
Да действительно: выбор протокола осуществляется на уровне драйвера. Нашёл настройки как Linux так и в Windows. По Windows он уже был настроен как надо. Подозреваю, что под Linux тоже, ибо не помогло:
18287

Цитата из мануала к Uport 1130:

parameter value interface

port 0 RS-232
1 RS-485 2W
2 RS-422
3 RS-485 4W

For example:
To set the port's informations:
# setserial /dev/ttyUSB0 port 1

To get the port's informations:
# setserial -G /dev/ttyUSB0

Ответ Uport 1130
root@hardbox:~/server/terminals/modpoll.3.4/linux# setserial -G /dev/ttyUSB0
/dev/ttyUSB0 uart 16550A port 0x0001 irq 0 baud_base 9600 spd_normal low_latency
root@hardbox:~/server/terminals/modpoll.3.4/linux#

multimorf
22.05.2015, 09:22
Привожу скрин программы, которой модули отвечают по ModBus у меня. BaseBlock ModBus Communication Tester
Не вижу никаких специфических настроек, кроме rs-485... Помогите кто-нибудь!
18305

Yegor
22.05.2015, 11:12
На скриншоте в посте #18 у вас уже идёт ответ от устройства. Только запрос на него неправильный поступает, и возвращается исключение.

multimorf
25.05.2015, 12:17
Это победа:
18337
Всем спасибо. Разобрался!
Дело оказалось в стартовых битах пакета. По документации протокола сообщение должно начинаться с периода "молчания" 3,5 символа. Дело в том что "молчанием" тут является не отсутствие каких-либо данных вообще, а трансляцией в порт нулей, т.е. низкого уровня сигнала (логического нуля), который я проэмулировал в режиме ModBus RTU нулевым байтом в начале сообщения. Видимо все используемы мной терминалы не в состоянии были сделать это автоматически. Вот что получается:
10 03 00 88 00 01 07 61 нет ответа
00 10 03 00 88 00 01 07 61 10 03 02 00 06 С4 45 вот он ответ
что, собственно, (не смотря на мусор) видно на скриншоте

ASo
25.05.2015, 12:31
Молчание - это молчание.
Длинный ноль - это сигнал break. К протоколу МОДБАС он не имеет никакого отношения.

multimorf
26.05.2015, 14:29
Молчание - это молчание.
Длинный ноль - это сигнал break. К протоколу МОДБАС он не имеет никакого отношения.
И как это сработало в моём случае?

Получил теперь и так:

>>> import serial
>>> ser = serial.Serial('/dev/ttyUSB1',57600, timeout=1)
>>> ser.Settings = "115200,N,8,1"
>>> ser.read
<bound method Serial.read of Serial<id=0xb6dfc9ac, open=True>(port='/dev/ttyUSB1', baudrate=57600, bytesize=8, parity='N', stopbits=1, timeout=1, xonxoff=False, rtscts=False, dsrdtr=False)>
>>> ser.write("\x10\x03\x01\x00\x00\x08\x5D\xAA")
8
>>> ser.read(30)
'\x10\x03\x10\x00\x01\x00\n\x00\n\x00\n\x00\n\x00\ t\x00\t\x00\t\xfd\x11'