- Обязательно представиться на русском языке кириллицей (заполнить поле "Имя").
- Фиктивные имена мы не приветствуем. Ивановых и Пупкиных здесь уже достаточно.
- Не надо писать свой вопрос в первую попавшуюся тему - всегда лучше создать новую тему.
- За поиск, предложение и обсуждение пиратского ПО и средств взлома - бан без предупреждения. Непонятно? - Читать здесь.
- Рекламу и частные объявления "куплю/продам/есть халтура" мы не размещаем ни на каких условиях.
- Перед тем как что-то написать - читать здесь, а затем здесь и здесь.
- Не надо писать в ЛС администраторам свои технические вопросы. Администраторы форума отлично знают как работает форум, а не все-все контроллеры, о которых тут пишут.
M340 + Симаг 12 Modbus
Модераторы: Глоб.модераторы, Специалисты SE
-
- здесь недавно
- Сообщения: 18
- Зарегистрирован: 06 май 2015, 08:43
- Имя: Ivan Pavluchenko
M340 + Симаг 12 Modbus
Здравствуйте, уважаемые коллеги!
У меня возникли трудности по получению данных по ModbusTCP от 2-х вторичников расходомеров Симаг 12 на Modicon M340 (процессор BMXP342020). В gest пишет 16#0007 Problem in sending to the destination или Addressing error.
Самое интересное, что было проверено по OPC (insat) все данные получаются, только интересно что надо либо получать float, либо считывать сразу по два байта если читать в int, например Input registers 0 и 1, 2 и 3 и т.д. Так же было перекинуто на SerialPort контроллера и проверено, данные получались, но правда не на все запросы прилетали ответы от симагов.
Пояснения:
192.168.1.4 - это Moxa Mgate MB3180, на неё по RS485 подключаются Симаг 12.
Настройки:
Port1 RTU Slave
Serial Baundrate 19200, parity none, Stop bit 1, Interface RS485 2-wire
Modbus routing по умолчанию 001-254
Initial delay 0ms
Response timeout 1000ms
Ethernet_1 - сетка на контроллере, IP 192.168.1.2, маска 255.255.255.0, шлюз 192.168.1.1.
Прикладываю фото значений Gest, а так же руководство по Симаг 12.
Текст программы:
IF NOT FLOW_01_GEST[0].0 and timer1=0 then
FLOW_01_GEST[2]:=10;
(*Чтение данных_расходомер 1*)
READ_VAR (ADR := ADDM('Ethernet_1{192.168.1.4}33')(*11 - адрес устройства modbus rtu*),
OBJ := '%IW'(*параметр адреса modbus (Input registers)*),
NUM := 0(*Начальный адрес чтения*),
NB := 6(*Длина адреса*),
GEST := FLOW_01_GEST(*Следящий массив*),
RECP => FLOW_01_DATA(*Массив данных, минимум 2 значения*));
timer1:=1;
ELSE IF FLOW_01_GEST[0].0 and timer1=0 then timer1:=1; END_IF;
END_IF;
IF NOT FLOW_02_GEST[0].0 and timer1=1 then
FLOW_02_GEST[2]:=10;
(*Чтение данных_расходомер 2*)
READ_VAR (ADR := ADDM('Ethernet_1{192.168.1.4}34')(*11 - адрес устройства modbus rtu*),
OBJ := '%IW'(*параметр адреса modbus (Input registers)*),
NUM := 0(*Начальный адрес чтения*),
NB := 6(*Длина адреса*),
GEST := FLOW_02_GEST(*Следящий массив*),
RECP => FLOW_02_DATA(*Массив данных, минимум 2 значения*));
timer1:=0; (*Конец опроса, обнуляем timer*)
ELSE IF FLOW_02_GEST[0].0 and timer1=1 then timer1:=0; END_IF;
END_IF;
Отправлено спустя 41 минуту 45 секунд:
Самое интересное что иногда даже данные проскакивают... значения записываются в Data
У меня возникли трудности по получению данных по ModbusTCP от 2-х вторичников расходомеров Симаг 12 на Modicon M340 (процессор BMXP342020). В gest пишет 16#0007 Problem in sending to the destination или Addressing error.
Самое интересное, что было проверено по OPC (insat) все данные получаются, только интересно что надо либо получать float, либо считывать сразу по два байта если читать в int, например Input registers 0 и 1, 2 и 3 и т.д. Так же было перекинуто на SerialPort контроллера и проверено, данные получались, но правда не на все запросы прилетали ответы от симагов.
Пояснения:
192.168.1.4 - это Moxa Mgate MB3180, на неё по RS485 подключаются Симаг 12.
Настройки:
Port1 RTU Slave
Serial Baundrate 19200, parity none, Stop bit 1, Interface RS485 2-wire
Modbus routing по умолчанию 001-254
Initial delay 0ms
Response timeout 1000ms
Ethernet_1 - сетка на контроллере, IP 192.168.1.2, маска 255.255.255.0, шлюз 192.168.1.1.
Прикладываю фото значений Gest, а так же руководство по Симаг 12.
Текст программы:
IF NOT FLOW_01_GEST[0].0 and timer1=0 then
FLOW_01_GEST[2]:=10;
(*Чтение данных_расходомер 1*)
READ_VAR (ADR := ADDM('Ethernet_1{192.168.1.4}33')(*11 - адрес устройства modbus rtu*),
OBJ := '%IW'(*параметр адреса modbus (Input registers)*),
NUM := 0(*Начальный адрес чтения*),
NB := 6(*Длина адреса*),
GEST := FLOW_01_GEST(*Следящий массив*),
RECP => FLOW_01_DATA(*Массив данных, минимум 2 значения*));
timer1:=1;
ELSE IF FLOW_01_GEST[0].0 and timer1=0 then timer1:=1; END_IF;
END_IF;
IF NOT FLOW_02_GEST[0].0 and timer1=1 then
FLOW_02_GEST[2]:=10;
(*Чтение данных_расходомер 2*)
READ_VAR (ADR := ADDM('Ethernet_1{192.168.1.4}34')(*11 - адрес устройства modbus rtu*),
OBJ := '%IW'(*параметр адреса modbus (Input registers)*),
NUM := 0(*Начальный адрес чтения*),
NB := 6(*Длина адреса*),
GEST := FLOW_02_GEST(*Следящий массив*),
RECP => FLOW_02_DATA(*Массив данных, минимум 2 значения*));
timer1:=0; (*Конец опроса, обнуляем timer*)
ELSE IF FLOW_02_GEST[0].0 and timer1=1 then timer1:=0; END_IF;
END_IF;
Отправлено спустя 41 минуту 45 секунд:
Самое интересное что иногда даже данные проскакивают... значения записываются в Data
У вас нет необходимых прав для просмотра вложений в этом сообщении.
-
- эксперт
- Сообщения: 1146
- Зарегистрирован: 25 июл 2008, 10:06
- Имя: Леонид
- Страна: РФ
- Благодарил (а): 49 раз
- Поблагодарили: 134 раза
M340 + Симаг 12 Modbus
Таймаут пробовали больше сделать? 20 вместо 10 например?
Хард - это то, что можно швырнуть об стенку, а софт - это то, что можно лишь обматерить.
-
- здесь недавно
- Сообщения: 18
- Зарегистрирован: 06 май 2015, 08:43
- Имя: Ivan Pavluchenko
-
- специалист
- Сообщения: 642
- Зарегистрирован: 02 дек 2015, 06:57
- Имя: Огородников Сергей
- Страна: РФ
- Благодарил (а): 136 раз
- Поблагодарили: 111 раз
M340 + Симаг 12 Modbus
Добрый день!
Для чего вам это делать опрос так часто?
Сделайте опрос, например, раз в секунду - может прибор не способен реагировать с такой скоростью?
Для проверки можно оставить чтение одного расходомера по команде
И можно вынести из проверки наружу строку
FLOW_01_GEST[2]:=50; (*5 секунд*)
Это же не изменяемый параметр за время выполнения IF
Для чего вам это делать опрос так часто?
Сделайте опрос, например, раз в секунду - может прибор не способен реагировать с такой скоростью?
Для проверки можно оставить чтение одного расходомера по команде
И можно вынести из проверки наружу строку
FLOW_01_GEST[2]:=50; (*5 секунд*)
Это же не изменяемый параметр за время выполнения IF
СВ
-
- здесь недавно
- Сообщения: 18
- Зарегистрирован: 06 май 2015, 08:43
- Имя: Ivan Pavluchenko
M340 + Симаг 12 Modbus
Пробовал менять таймаут, запросы реже делать - ничего не изменилось.
В скаду пришлось заводить напрямую через опрос Моха...
Может кто что ещё подскажет?
В скаду пришлось заводить напрямую через опрос Моха...
Может кто что ещё подскажет?
-
- не первый раз у нас
- Сообщения: 324
- Зарегистрирован: 31 окт 2017, 16:45
- Имя: Дмитрий
- Страна: Россия
- город/регион: Калининград
- Благодарил (а): 9 раз
- Поблагодарили: 84 раза
M340 + Симаг 12 Modbus
1. провести опрос любой программой Модбас мастер связку преобразователь МодбасТСР/RTU -расходомер. Посмотреть, на какие команды и количества запрошенных байт отвечает и не отвечает.
2. Если расходомер отдает либо текущие измерения либо интегральные суммы по отдельности, значит разбить запросы в вашей программе в контроллере на отдельные запросы ТИТ и ТИИ.
3. Записать логи успешного опроса из программы мастера, добиться чтобы ваша программа делала такие же запросы
4. отрегулировать тайм-ауты-это важно. Помните, что расходомер опрашивает преобразователь по модбас рту, у него есть тайм-аут ожидания ответа от расходомера (например 1000мс). После отправки запроса от преобразователя на расходомер, преобразователь ожидает ответа от расходомера в течении 1с, после получения ответа обрабатывает его и отвечает по модбас тср контроллеру. Все это время он не будет реагировать на любые запросы по модбас тср. Поэтому при тайм-ауте в 1000мс в преобразователе делать модбас-тср опрос чаще чем 1000 мс нельзя. При этом тайм-аут в контроллере ожидания ответа от преобразователя должен быть чуть больше 1 сек, т.е. больше тайм-аута в преобразователе.
5. после того как получите успешный обмен, проверьте работу программы при обрыве между преобразователем и расходомером , между контроллером и преобразователем на автоматическое возобновление опроса расходомера при восстановлении связи.
2. Если расходомер отдает либо текущие измерения либо интегральные суммы по отдельности, значит разбить запросы в вашей программе в контроллере на отдельные запросы ТИТ и ТИИ.
3. Записать логи успешного опроса из программы мастера, добиться чтобы ваша программа делала такие же запросы
4. отрегулировать тайм-ауты-это важно. Помните, что расходомер опрашивает преобразователь по модбас рту, у него есть тайм-аут ожидания ответа от расходомера (например 1000мс). После отправки запроса от преобразователя на расходомер, преобразователь ожидает ответа от расходомера в течении 1с, после получения ответа обрабатывает его и отвечает по модбас тср контроллеру. Все это время он не будет реагировать на любые запросы по модбас тср. Поэтому при тайм-ауте в 1000мс в преобразователе делать модбас-тср опрос чаще чем 1000 мс нельзя. При этом тайм-аут в контроллере ожидания ответа от преобразователя должен быть чуть больше 1 сек, т.е. больше тайм-аута в преобразователе.
5. после того как получите успешный обмен, проверьте работу программы при обрыве между преобразователем и расходомером , между контроллером и преобразователем на автоматическое возобновление опроса расходомера при восстановлении связи.
-
- здесь недавно
- Сообщения: 3
- Зарегистрирован: 07 июл 2021, 13:17
- Имя: Дмитрий
- город/регион: Воронеж
- Благодарил (а): 1 раз
M340 + Симаг 12 Modbus
Sokolov_Dmitry,
У меня не расходомер, но не суть важно. Опрашиваю шлюз CAN/Modbus RTU...
1. Именно этим способом выловил всех "блох" и добился чтобы ПЛК (М580) слал то, на что шлюз отвечает корректно. Выяснил "слушая" порт сторонним ПО.
Теперь по шине ходят правильные данные, при чем ПЛК шлет правильный запрос и шлюз ему отвечает, а контроллер их не получает (возникает ошибка [16#07 Problem in sending to the destination ].
При этом (использую READ_VAR) не отображается параметр Lenght (количество отправленных байт).
У меня не расходомер, но не суть важно. Опрашиваю шлюз CAN/Modbus RTU...
1. Именно этим способом выловил всех "блох" и добился чтобы ПЛК (М580) слал то, на что шлюз отвечает корректно. Выяснил "слушая" порт сторонним ПО.
Теперь по шине ходят правильные данные, при чем ПЛК шлет правильный запрос и шлюз ему отвечает, а контроллер их не получает (возникает ошибка [16#07 Problem in sending to the destination ].
При этом (использую READ_VAR) не отображается параметр Lenght (количество отправленных байт).
-
- не первый раз у нас
- Сообщения: 324
- Зарегистрирован: 31 окт 2017, 16:45
- Имя: Дмитрий
- Страна: Россия
- город/регион: Калининград
- Благодарил (а): 9 раз
- Поблагодарили: 84 раза
M340 + Симаг 12 Modbus
контроллер опрашивает преобразователь по CAN-шине?
как то не похоже на опрос по модбас тср
-
- здесь недавно
- Сообщения: 3
- Зарегистрирован: 07 июл 2021, 13:17
- Имя: Дмитрий
- город/регион: Воронеж
- Благодарил (а): 1 раз
M340 + Симаг 12 Modbus
Нет. Контроллер опрашивает шлюз по Modbus.
Конечно не TCP, но ведь Modbus... :)
Конечно не TCP, но ведь Modbus... :)
-
- не первый раз у нас
- Сообщения: 324
- Зарегистрирован: 31 окт 2017, 16:45
- Имя: Дмитрий
- Страна: Россия
- город/регион: Калининград
- Благодарил (а): 9 раз
- Поблагодарили: 84 раза
M340 + Симаг 12 Modbus
используя программу http://ardsoft.ru/mEmulator.html можно тренироваться в настройке работы программы для опроса по модбас без наличия конкретного модбас слэйва.
Используйте рекомендации SE для READ_VAR: "Выполнение вызова команды READ_VAR мы рекомендуем производить не чаще чем раз в 50 мсек" и "Часто встречающаяся ошибка опрос в каждом цикле контроллера и за счёт этого переполнение внутреннего буфера". Для ТСР еще "Прежде чем выполнять команду READ_VAR необходимо проверить готовность устройство к взаимообмену и после этого осуществлять связь".
Сделав первый модбас запрос нужно контроллировать получение ответа, затем выдерживать тайм-аут Т1 (период опроса устройства), затем следующий запрос. В случае неответа выдерживать тайм-аут Т2 ожидания ответа от слейва, следующий запрос,формировать переменную "Нет ответа по модбас от устройства" (для верхнего уровня и для работы с переменными из устройства) после N подряд неответов и прекращать запросы данного устройства на тайм-аут Т3 (чтобы не загружать порт rs485 запросами без ответа с тайм-аутами Т2 и не тормозить обмен с другими устройствами по порту).
А для ТСР прежде чем посылать запросы по модбас контроллировать наличие ТСР-соединения по порту между ПЛК и устройством. И тоже формировать переменную "Нет ТСР соединения с устройством" для верхнего уровня.
Сначала сделайте рабочую схему опроса по модбас (любого простенького на пару переменных) используя программу эмулятор, чтобы она стабильно работала при ответах, неответах, пропадании связи и восстановлении связи. Затем эту схему используйте в рабочем проекте.