1 / 1 / 0
Регистрация: 30.01.2015
Сообщений: 32
1

Опрос нескольких датчиков по ModBus RTU из программы на Python (PyModbus)

08.09.2023, 14:50. Показов 899. Ответов 27
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Опрашиваю датчики температуры и влажности через USB-RS485 конвертер. Если датчик один, всё прекрасно работает без sleep-ов. Но если надо два датчика опрашивать, без sleep-ов возникает ошибка:
Код
[SENS_0] 41.8%; 26.4°C [SENS_1] 41.8%; 26.3°C
Traceback (most recent call last):
  File "/home/zenbooster/work/sht20/./sens.py", line 23, in <module>
    sens.read()
  File "/home/zenbooster/work/sht20/dev.py", line 19, in read
    self.t = res.registers[0] / 10
AttributeError: 'ModbusIOException' object has no attribute 'registers'
Почему так происходит, и есть ли более изящное решение чем использование задержек? Или хотя бы способ, как эти задержки рассчитать?

dev.py:

Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
class csSensBase:
  def __init__(self, cli, id):
    self.cli = cli
    self.id = id
 
  def get_t(self):
    return self.t
 
  def get_h(self):
    return self.h
 
  def get_th(self):
    return (self.t, self.h)
 
class csSens_XY_MD01(csSensBase):
  def read(self):
    cli = self.cli
    res = cli.read_input_registers(1, 2, slave=self.id)
    self.t = res.registers[0] / 10
    self.h = res.registers[1] / 10
    return res
 
class csSens_CWT_THxxS(csSensBase):
  def read(self):
    cli = self.cli
    res = cli.read_input_registers(0, 2, slave=self.id)
    self.h = res.registers[0] / 10
    self.t = res.registers[1] / 10
    return res
sens.py:
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
#!/usr/bin/env python3
from pymodbus.client import ModbusSerialClient
import sys
from time import sleep
from dev import *
 
cli = ModbusSerialClient(port='/dev/ttyUSB0', baudrate=9600)
 
sens_list = [csSens_XY_MD01(cli, 2), csSens_CWT_THxxS(cli, 3)]
 
while(1):
  try:
    i = 0
    for sens in sens_list:
      sens.read()
      t, h = sens.get_th()
      print(f'[SENS_{i}] {h}%; {t}\u00B0C ', end='')
      sys.stdout.flush()
      i += 1
      sleep(0.15)
 
    print('')
 
  except KeyboardInterrupt:
    break
 
print('') # after ^C
 
print('end')
cli.close()
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
08.09.2023, 14:50
Ответы с готовыми решениями:

Последовательный опрос устройств по Modbus RTU
Здравствуйте, пишу сюда впервые и очень надеюсь на вашу помощь. Задача в последовательном опросе...

Нет связи между модулем ввода (modbus rtu slave) и программой modbus poll на ноутбуке
Добрый день форумчанам. Сконфигурирован модуль modbus rtu slave в Ovation system. Опыт работы с...

Преобразование modbus rtu в modbus tcp
Суть проблемы: есть устройство, оно работает по протоколу modbus rtu, но нужно подключиться к нему...

Modbus RTU. Запись в modbus регистр
Доброго всем времени суток. qt5.15 Из приложения должен формироваться запрос — &quot;01 06 00 00 00...

27
Заблокирован
09.09.2023, 10:01 2
Модбас рту? К компу подсоединяется лишь преобразователем модбас-USB.
Я уже намучился с этой дрянью, хуже модбаса сложно придумать извращение. ОС не в состоянии гарантированные задержки обеспечивать, вот и получается, что какие-то устройства работают, какие-то - нет.
Рекомендую сделать преобразователь из убогого модбаса во вменяемый протокол, так в комп и заводить. И датчики можно сразу на CAN брать, чтобы не было проблем.
0
95 / 93 / 10
Регистрация: 30.10.2014
Сообщений: 279
10.09.2023, 14:57 3
Похоже на проблему слейва, не все корректно определяют начало и конец посылок мастера и других слейвов на проводах.
В настройках ваших слейвов есть что то похожее на "задержка передачи"?
----------
Как вариант, установите на компе связку виртуальных портов, на один порт свой скрипт, на второй программный модбас слейв. Мониторы, симуляторы и эмуляторы Modbus
проверите корректность работы своей проги.
0.15 сек. это очень дофига.
------------
Писал как то терминалку для ModBus RTU без всяких библиотек на VB.NET, никаких проблем не помню.
0
1 / 1 / 0
Регистрация: 30.01.2015
Сообщений: 32
11.09.2023, 12:34  [ТС] 4
Цитата Сообщение от Eddy_Em Посмотреть сообщение
Модбас рту? К компу подсоединяется лишь преобразователем модбас-USB.
Я уже намучился с этой дрянью, хуже модбаса сложно придумать извращение. ОС не в состоянии гарантированные задержки обеспечивать, вот и получается, что какие-то устройства работают, какие-то - нет.
Рекомендую сделать преобразователь из убогого модбаса во вменяемый протокол, так в комп и заводить. И датчики можно сразу на CAN брать, чтобы не было проблем.
Да, Модбас рту. Слышал, есть ещё модбас-TCP. С CAN не получится, т.к. в проекте есть ещё частотник, который умеет только RS-485. Может на esp32 ещё попробую сделать, если ничего другое не поможет...

Добавлено через 12 минут
Цитата Сообщение от Олег_ Посмотреть сообщение
Похоже на проблему слейва, не все корректно определяют начало и конец посылок мастера и других слейвов на проводах.
В настройках ваших слейвов есть что то похожее на "задержка передачи"?
----------
Как вариант, установите на компе связку виртуальных портов, на один порт свой скрипт, на второй программный модбас слейв. Мониторы, симуляторы и эмуляторы Modbus
проверите корректность работы своей проги.
0.15 сек. это очень дофига.
------------
Писал как то терминалку для ModBus RTU без всяких библиотек на VB.NET, никаких проблем не помню.
Слейвы - китайские датчики, измеряют одновременно влажность и температуру: XY-MD01 и CWT-TH04S. Из настроек, только slave id, baud rate и коррекции влажности и температуры. baud rate везде одинаковый: 9600. Программный модбас слейв надо будет попробовать... Возможно, надо просто попробовать другую библиотеку использовать...
0
Модератор
Эксперт по электронике
8340 / 4234 / 1605
Регистрация: 01.02.2015
Сообщений: 13,185
Записей в блоге: 5
11.09.2023, 18:21 5
ZenBooster, просто из любопытства - почему программа на Python?
Это для проверки работоспособности?
Или программа для чего-то подобного Raspberry Pi?

Не по теме:

Ведь, если использовать программируемые реле (ПР) или ПЛК, то ограничиваешься указанием порта, его настроек, адреса устройства на шине и регистра, а сам обмен выполняется "операционной системой" этого ПР/ПЛК. Это я к тому, что хотя и довелось изучить протокол ModBus, но, если бы не случай, до сих пор ограничивался бы конфигурированием вместо программирования обмена.
Вы - именно программируете.

0
Заблокирован
11.09.2023, 18:28 6
Цитата Сообщение от ФедосеевПавел Посмотреть сообщение
ограничивался бы конфигурированием вместо программирования обмена.
Это как?
В компьютер воткнута железка, с нее надо считывать данные. Как здесь обойтись без программирования? Вот, взять даже элементарный текстовый протокол: нужно читать, парсить и писать. Да, можно в простейшем случае баш-скриптами обойтись, но все равно это - программирование.
0
Модератор
Эксперт по электронике
8340 / 4234 / 1605
Регистрация: 01.02.2015
Сообщений: 13,185
Записей в блоге: 5
11.09.2023, 18:42 7
Цитата Сообщение от ФедосеевПавел Посмотреть сообщение
Ведь, если использовать программируемые реле (ПР) или ПЛК, то ограничиваешься указанием порта, его настроек, адреса устройства на шине и регистра, а сам обмен выполняется "операционной системой" этого ПР/ПЛК.
Потому, что обмен по распространённым протоколам "вшит" в ПР/ПЛК и достаточно сконфигурировать обмен.
пример конфигурирования обмена и программирования управления включением ПЧВ от Овен ПР200

Опрос нескольких датчиков по ModBus RTU из программы на Python (PyModbus)

Опрос нескольких датчиков по ModBus RTU из программы на Python (PyModbus)


Вижу у топикстартера упоминание датчиков и ПЧВ - значит или создание какой очень универсальной системы на Raspberry Pi или проверка работоспособности оборудования с компьютера на наиболее знакомом языке - тут реально безразлично, на каком.

Мне любопытно, почему - Python.
Если это проверка оборудования - да и махнуть рукой.
Если создание программы, тогда нужно разбираться в языке, библиотеке.
0
Заблокирован
11.09.2023, 19:11 8
Цитата Сообщение от ФедосеевПавел Посмотреть сообщение
достаточно сконфигурировать обмен
Но все равно к этой штуке нужно подключить компьютер. И написать ПО…
А ПЛК - извращение. Дичь какая-то в духе "лабвью". Зачем уродоваться, если можно на микроконтроллере железку сделать? Правда, если сделать будет намного дороже, чем готовую использовать, придется уродоваться… Обычно у ПЛК очень специфичный "язык", а готового софта в подавляющем большинстве случаев нет (по крайней мере, я встречал несколько ПЛК, везде под линукс был полный ноль, а у некоторых еще и отсутствовала документация на протокол - чтобы самому недостающий софт написать).

Цитата Сообщение от ФедосеевПавел Посмотреть сообщение
библиотеке
Вот там как раз и может находиться проблема, если "библиотекописатель" отнесся к делу спустя рукава и не очень-то аккуратно соблюдая требования к протоколу. В любом случае, библиотека написана на С или С++, ее исходники есть — можно самому посмотреть, да переделать.

Но в очередной раз напомню: ни одна ОС общего назначения не обеспечивает жестких временных интервалов. Да еще и работа с последовательным портом буферизуется на уровне ядра: даже если не использовать буферизацию stdio, можно на это нарваться. Какое уж там соблюдение дурацких требований к интервалам в посылке? Ну и самое печальное - попытаться из компьютера slave сделать или пассивно слушать линию (замучился, когда нужно было вводить данные из метеостанции в сервер, но было условие, что "мастер" - экранчик, отображающий данные, должен работать).

Самый надежный способ - вообще не использовать устройства, которые "общаются" на древнючем убогом модбасе. Да пусть будет тупой текстовый протокол поверх 232 или 485 - всяко лучше и надежней. Если хочется проверки CRC - есть CAN (заодно он, в отличие от 232 или 485, позволяет мультимастер).
Для работы с короткими линиями есть I2C (до трех метров на 100кГц у меня работают датчики) и SPI. Правда, SPI требует еще Cable Select на каждое устройство, что неудобно. А адрес I2C не у всех можно в широком диапазоне задать (те же TSYS01 пришлось в пары объединять, либо нужно было бы еще один провод на каждый вести в качестве Cable Select).

Не знаю, чего людям не нравится простой текстовый протокол вида "геттер\n" и "сеттер=параметр\n". У меня все железки по 232, 485 и USB именно так работают. А для CAN я парочку своих протоколов придумал, чтобы гарантированно в 8 байт вмещаться (но мне и не нужно больше uint32_t/int32_t). Если уж прямо все очень сложно, можно CANopen использовать.

Многие STM32 имеют "почти аппаратную" возможность реализации modbus RTU - если мне таки купят частотники не с CAN (увы, SEW eurodrive уже того, а китайцы с какого-то перепуга только модбас делают), то сделаю переходник modbus-USB на STM32 (или даже, что лучше, modbus-CAN, чтобы интегрироваться в существующую сеть).

Добавлено через 3 минуты
P.S. Почему-то многие думают, что реализация гальваноразвязанного CAN - дорогое удовольствие. Однако, переходничок CAN-USB с гальваноразвязкой CAN по нынешним ценам в 500 рублей уложится по себестоимости.
0
Модератор
Эксперт по электронике
8340 / 4234 / 1605
Регистрация: 01.02.2015
Сообщений: 13,185
Записей в блоге: 5
11.09.2023, 20:22 9
Это какой-то холивар. Избегаю этого. И сейчас спорить не буду.

Собственно, мы гостим в теме с вопросом: "как опросить датчики из программы на Python?"
Я - не знаю. Но у топикстартера интересуюсь деталями - почему программа на Python?
0
Заблокирован
11.09.2023, 20:52 10
Цитата Сообщение от ФедосеевПавел Посмотреть сообщение
почему программа на Python?
Подозреваю, что он не знает языка С. Хотя лично мне это непонятно: С значительно проще питона. Да и применить питон не везде получится (ну и, как я уже говорил, без "библиотек" на С или С++ питон вообще ничего не может, кроме самых элементарных хэллоуворлдов).
0
95 / 93 / 10
Регистрация: 30.10.2014
Сообщений: 279
12.09.2023, 10:07 11
Цитата Сообщение от Eddy_Em Посмотреть сообщение
А ПЛК - извращение. Дичь какая-то в духе "лабвью". ..............Но в очередной раз напомню: ни одна ОС общего назначения не обеспечивает жестких временных интервалов. Да еще и........
Сами себе противоречите, возможно не знаете что в классических ПЛК как у Сименса, Омрона, Мицубиши, Дельты и.т.д. линуксом и подобным даже не пахнет.
Цитата Сообщение от Eddy_Em Посмотреть сообщение
....на древнючем убогом модбасе....
Самый популярный протокол в промке, и даже стандартизирован. https://modbus.org/ Для частотников и для недорогих модулей ввода вывода вообще обязательным стал. Случайно не Вы на вике статью про модбас написали и охраняете её от правок?
CAN тоже устаревший интерфейс, на смену CANopen и DeviceNet уже давно EtherNet/IP пришёл.

Встроеный CAN есть у частотников Дельты, для Яскавы, Хитачи и многих других это опция, т.е. дополнительную плату заказать нужно.

Если вы любитель CAN, могу этот ПЛК порекомендовать.
https://aliexpress.ru/item/100... 7884883011
CAN у него есть, но нет поддержки CANopen. И не поверите, на нём есть модбас через кан.
0
Заблокирован
12.09.2023, 10:50 12
Цитата Сообщение от Олег_ Посмотреть сообщение
линуксом и подобным даже не пахнет.
При чем здесь ПЛК, если ТС хочет к компьютеру железку подключить?
Цитата Сообщение от Олег_ Посмотреть сообщение
Самый популярный протокол в промке, и даже стандартизирован.
Напомнить про миллионы мух? Напоминаю. Эзернетом CAN не заменить, т.к. придется слишком удорожать систему (вместо 50-рублевого МК брать уже полноценный проц, что выйдет тысячи в 2-3 рублей).

И да, не надо мне ПЛК рекомендовать. Я это УГ не использую. Вообще смысла нет, когда можно на МК нормальную железяку сделать.

Добавлено через 2 минуты
Цитата Сообщение от Олег_ Посмотреть сообщение
могу этот ПЛК порекомендовать
Кстати, в описани обеих моделей вообще отсутствует CAN.
0
95 / 93 / 10
Регистрация: 30.10.2014
Сообщений: 279
12.09.2023, 11:02 13
Цитата Сообщение от Eddy_Em Посмотреть сообщение
При чем здесь ПЛК, если ТС хочет к компьютеру железку подключить?
наверно из-за этого:
Цитата Сообщение от Eddy_Em Посмотреть сообщение
А ПЛК - извращение.
Про мух прикольно, т.е. вы не муха (вы выше этого), а все остальные тупые?
Цитата Сообщение от Eddy_Em Посмотреть сообщение
не надо мне ПЛК рекомендовать. Я это УГ не использую
Миллионы "мух" используют это, и естественно ошибаются?
Цитата Сообщение от Eddy_Em Посмотреть сообщение
Кстати, в описани обеих моделей вообще отсутствует CAN.
Вас в гугле забанили?
Default COM
Type-C, RS-232,RS-485*2,Ethernet,CAN
Protocol
Mitsubishi programming port Modbus RTU, Modbus TCP, Modbus UDP, freeport protocol,CAN, Ethernet/IP,Mitsubishi BD board
0
1 / 1 / 0
Регистрация: 30.01.2015
Сообщений: 32
12.09.2023, 15:06  [ТС] 14
Цитата Сообщение от ФедосеевПавел Посмотреть сообщение
ZenBooster, просто из любопытства - почему программа на Python?
Это для проверки работоспособности?
Или программа для чего-то подобного Raspberry Pi?
Python - потому, что быстрее всего было написать скрипт именно на питоне. Скорости работы тут особые не нужны, по этому, подумал, что с/с++ будет излишним. Собираюсь контроллировать влажность в кладовке ГСК с помощью датчиков, частотника и улитки. Комп - raspberry pi с ubuntu 22.04 lts. Удобно, что можно зайти на него по ssh, подправить скрипт, проконтроллировать работу...

Но я написал тестовую программу на С++ с использованием библиотеки libmodbus и там ошибка воспроизводится:

Makefile:
Bash
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
TARGET = sens
.PHONY: clean all
 
SRC_CPP = main.cpp
OBJ_CPP = $(SRC_CPP:%.cpp=%.o)
OBJ     = $(OBJ_CPP)
 
all: $(TARGET)
 
$(TARGET): $(OBJ)
        $(CXX) $(CFLAGS) $(OBJ) -o $@ $(LDFLAGS)
 
.cpp.o:
        $(CXX) $(CFLAGS) -c $< -o $@
 
clean:
        rm -f $(OBJ) $(TARGET)
 
CFLAGS = -I/usr/include/modbus -o3
LDFLAGS = -lmodbus
main.cpp
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
#include <iostream>
#include <modbus.h>
 
using namespace std;
 
int main(void)
{
  int rc = 0;
  uint16_t regs[2];
  modbus_t *ctx = modbus_new_rtu("/dev/ttyUSB0", 9600, 'N', 8, 1);
 
  do
  {
    rc = modbus_connect(ctx);
    if (rc == -1)
    {
      cerr << "Connection failed: " << modbus_strerror(errno) << endl;
      break;
    }
 
    while(1)
    {
      modbus_set_slave(ctx, 2);
      rc = modbus_read_input_registers(ctx, 1, 2, regs);
      if (rc == -1)
      {
        cerr << modbus_strerror(errno) << endl;
        break;
      }
 
      cout << "[SENS_0] T: " << regs[0] / 10 << "\u00B0C; H: " << regs[1] / 10 << "% ";
      flush(cout);
 
      usleep(150000);
 
      modbus_set_slave(ctx, 3);
      rc = modbus_read_input_registers(ctx, 0, 2, regs);
      if (rc == -1)
      {
        cerr << modbus_strerror(errno) << endl;
        break;
      }
 
      cout << "[SENS_1] T: " << regs[1] / 10 << "\u00B0C; H: " << regs[0] / 10 << "%" << endl;
 
      usleep(150000);
 
    }
 
    modbus_close(ctx);
 
  } while(0);
 
  modbus_free(ctx);
 
  return rc;
}
Без usleep - ов выдаёт:
Код
zenbooster@zenpc:~/work/sht20/sens$ ./sens
[SENS_0] T: 25°C; H: 48% Connection timed out
zenbooster@zenpc:~/work/sht20/sens$ ./sens
[SENS_0] T: 25°C; H: 48% [SENS_1] T: 26°C; H: 45%
Connection timed out
zenbooster@zenpc:~/work/sht20/sens$
Цитата Сообщение от ФедосеевПавел Посмотреть сообщение

Не по теме:

Ведь, если использовать программируемые реле (ПР) или ПЛК, то ограничиваешься указанием порта, его настроек, адреса устройства на шине и регистра, а сам обмен выполняется "операционной системой" этого ПР/ПЛК. Это я к тому, что хотя и довелось изучить протокол ModBus, но, если бы не случай, до сих пор ограничивался бы конфигурированием вместо программирования обмена.
Вы - именно программируете.

У меня modbus rtu устройства подключены к компьютеру. Программа опрашивает датчик (датчики) и на основе собранных данных управляет частотным преобразователем. Тут нет других вариантов, кроме как общаться с устройствами из программы.
ПР/ПЛК - это штука, которая может заменить компьютер в этой схеме? Просто не имел опыта работать с ними. Пока что с компьютера хотелось бы чтоб работало...

Добавлено через 40 минут
Сделал деление regs[] на 10.0, добавил modbus_set_debug(1):

Код
zenbooster@zenpc:~/work/sht20/sens$ ./sens
Opening /dev/ttyUSB0 at 9600 bauds (N, 8, 1)
[02][04][00][01][00][02][20][38]
Waiting for a confirmation...
<02><04><04><00><FE><01><E4><A8><AF>
[SENS_0] T: 25.4°C; H: 48.4% [03][04][00][00][00][02][70][29]
Waiting for a confirmation...
<03><04><04><01><C3><01><06><A8><16>
[SENS_1] T: 26.2°C; H: 45.1%
[02][04][00][01][00][02][20][38]
Waiting for a confirmation...
ERROR Connection timed out: select
Connection timed out
zenbooster@zenpc:~/work/sht20/sens$
0
Заблокирован
12.09.2023, 16:08 15
ZenBooster, пора уже попробовать "в лоб" - вообще без использования сторонних библиотек. Тем более, уж для чего, а для модбаса они не нужны однозначно.
Вот такую штуку я написал, чтобы прослушивать модбас в пассивном режиме и собирать данные, отсылаемые мастеру метеостанцией.
0
121 / 63 / 15
Регистрация: 26.11.2022
Сообщений: 346
12.09.2023, 16:22 16
для поростых действий с устройством - типа проверки и установки конфигурации можно и через шелл скрит всё сделать.
пример - я так когда то давно проверял настройки для овеновского ПЧВ
Кликните здесь для просмотра всего текста
Bash
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
#!/bin/sh
#@set -x
PORTDEBUG="$(cat modbus_port_name)"
#echo $PORTDEBUG
PORTPATH='/dev/serial/by-id/'$PORTDEBUG
#echo $PORTPATH
 
########################################################################
printf "  *******   Группа  0. Управление и отображение  \n"
 
PORT=40
printf "$PORT Режим работы при включении питания Uint8  "
./modpoll -m rtu -d8 -b9600 -p none -a1  -t4 -r $PORT -c1 -1 $PORTPATH | grep $PORT"]:"
 
PORT=100
printf "$PORT Активный набор Uint8  "
./modpoll -m rtu -d8 -b9600 -p none -a1  -t4 -r $PORT -c1 -1 $PORTPATH | grep $PORT"]:"
 
PORT=110
printf "$PORT Изменяемый набор Uint8  "
./modpoll -m rtu -d8 -b9600 -p none -a1  -t4 -r $PORT -c1 -1 $PORTPATH | grep $PORT"]:"
 
PORT=310
printf "$PORT Минимальное значение показаний Int32  "
./modpoll -m rtu -d8 -b9600 -p none -a1  -t4:int -r $PORT -c1 -1 $PORTPATH | grep $PORT"]:"
 
PORT=320
printf "$PORT Максимальное значение показаний Int32  "
./modpoll -m rtu -d8 -b9600 -p none -a1  -t4:int -r $PORT -c1 -i -1 $PORTPATH | grep $PORT"]:"
 
PORT=400
printf "$PORT Кнопка РУЧН Uint8  "
./modpoll -m rtu -d8 -b9600 -p none -a1  -t4 -r $PORT -c1 -1 $PORTPATH | grep $PORT"]:"
 
PORT=410
printf "$PORT Кнопка СБРОС/СТОП  Uint8  "
./modpoll -m rtu -d8 -b9600 -p none -a1  -t4 -r $PORT -c1 -1 $PORTPATH | grep $PORT"]:"
 
PORT=420
printf "$PORT Кнопка АВТО  Uint8  "
./modpoll -m rtu -d8 -b9600 -p none -a1  -t4 -r $PORT -c1 -1 $PORTPATH | grep $PORT"]:"
########################################################################
printf "  *******   Группа 1. Нагрузка/ электродвигатель. \n"
 
PORT=1010
printf "$PORT Принцип управления электродвигателем Uint8  "
./modpoll -m rtu -d8 -b9600 -p none -a1  -t4 -r $PORT -c1 -1 $PORTPATH | grep $PORT"]:"
 
PORT=1200
printf "$PORT Мощность двигателя Uint32  "
./modpoll -m rtu -d8 -b9600 -p none -a1  -t4 -r $PORT -c1 -1 $PORTPATH | grep $PORT"]:"
 
 
PORT=1220
printf "$PORT Напряжение двигателя (В) Uint16  "
./modpoll -m rtu -d8 -b9600 -p none -a1  -t4 -r $PORT -c1 -1 $PORTPATH | grep $PORT"]:"
 
 
PORT=1230
printf "$PORT Частота двигателя (Гц) Uint16  "
./modpoll -m rtu -d8 -b9600 -p none -a1  -t4 -r $PORT -c1 -1 $PORTPATH | grep $PORT"]:"
 
 
PORT=1710
printf "$PORT Задержка запуска (секунды) Uint16  "
./modpoll -m rtu -d8 -b9600 -p none -a1  -t4 -r $PORT -c1 -1 $PORTPATH | grep $PORT"]:"
 
PORT=1720
printf "$PORT Функция запуска Uint16  "
./modpoll -m rtu -d8 -b9600 -p none -a1  -t4 -r $PORT -c1 -1 $PORTPATH | grep $PORT"]:"
 
PORT=1730
printf "$PORT Подхват работающего  "
./modpoll -m rtu -d8 -b9600 -p none -a1  -t4 -r $PORT -c1 -1 $PORTPATH | grep $PORT"]:"
./modpoll -m rtu -d8 -b9600 -p none -a1  -t4 -r $PORT -c1 -1 $PORTPATH 0
./modpoll -m rtu -d8 -b9600 -p none -a1  -t4 -r $PORT -c1 -1 $PORTPATH | grep $PORT"]:"
########################################################################
printf "  *******   Группа 2. Торможение двигателя постоянным током \n"
 
PORT=2000
printf "$PORT Удержание постоянным током .  Uint8  "
./modpoll -m rtu -d8 -b9600 -p none -a1  -t4 -r $PORT -c1 -1 $PORTPATH | grep $PORT"]:"
 
PORT=2010
printf "$PORT Ток торможения постоянным током .  Uint8  "
./modpoll -m rtu -d8 -b9600 -p none -a1  -t4 -r $PORT -c1 -1 $PORTPATH | grep $PORT"]:"
 
PORT=2020
printf "$PORT Время торможения постоянным током (секунды).  Uint16  "
./modpoll -m rtu -d8 -b9600 -p none -a1  -t4 -r $PORT -c1 -1 $PORTPATH | grep $PORT"]:"
 
PORT=2040
printf "$PORT Скорость включения торможения постоянным током (Гц) Uint16  "
./modpoll -m rtu -d8 -b9600 -p none -a1  -t4 -r $PORT -c1 -1 $PORTPATH | grep $PORT"]:"
 
########################################################################
printf "  *******   Группа 3. Источники сигналов, единицы измерения, пределы и диапазоны \n"
 
PORT=3000
printf "$PORT Диапазон задания.  Uint8  "
./modpoll -m rtu -d8 -b9600 -p none -a1  -t4 -r $PORT -c1 -1 $PORTPATH | grep $PORT"]:"
 
PORT=3020
printf "$PORT Минимальное задание.  Uint32  "
./modpoll -m rtu -d8 -b9600 -p none -a1  -t4:int -r $PORT -c1 -1 $PORTPATH | grep $PORT"]:"
 
PORT=3030
printf "$PORT Максимальное задание  Int32  "
./modpoll -m rtu -d8 -b9600 -p none -a1  -t4:int -r $PORT -c1 -i -1 $PORTPATH | grep $PORT"]:"
 
PORT=3100
printf "$PORT Предустановленное задание  Int16  "
./modpoll -m rtu -d8 -b9600 -p none -a1  -t4 -r $PORT -c1 -1 $PORTPATH | grep $PORT"]:"
 
PORT=3110
printf "$PORT Фиксированная скорость  (Гц)   UInt16  "
./modpoll -m rtu -d8 -b9600 -p none -a1  -t4 -r $PORT -c1 -1 $PORTPATH | grep $PORT"]:"
 
PORT=3400
printf "$PORT Изменение скорости, тип 1   Uint8  "
./modpoll -m rtu -d8 -b9600 -p none -a1  -t4 -r $PORT -c1 -1 $PORTPATH | grep $PORT"]:"
 
PORT=3410
printf "$PORT Время разгона 1 (секунды) .  Uint32  "
./modpoll -m rtu -d8 -b9600 -p none -a1  -t4:int -r $PORT -c1 -i -1 $PORTPATH | grep $PORT"]:"
 
PORT=3420
printf "$PORT Время замедления 1 (секунды) .  Uint32  "
./modpoll -m rtu -d8 -b9600 -p none -a1  -t4:int -r $PORT -c1 -i -1 $PORTPATH | grep $PORT"]:"
########################################################################
printf "  *******   Группа 4. Пределы и предупреждения \n"
 
PORT=4100
printf "$PORT Направление вращения двигателя.   Uint8  "
./modpoll -m rtu -d8 -b9600 -p none -a1  -t4 -r $PORT -c1 -1 $PORTPATH | grep $PORT"]:"
 
PORT=4120
printf "$PORT Нижний предел скорости вращения двигателя (Гц)   Uint16  "
./modpoll -m rtu -d8 -b9600 -p none -a1  -t4 -r $PORT -c1 -1 $PORTPATH | grep $PORT"]:"
 
PORT=4140
printf "$PORT Верхний предел скорости вращения двигателя (Гц) Uint16  "
./modpoll -m rtu -d8 -b9600 -p none -a1  -t4 -r $PORT -c1 -1 $PORTPATH | grep $PORT"]:"
########################################################################
printf "  *******   Группа 5. Цифровой ввод/выход.  \n"
 
PORT=5100
printf "$PORT Клемма 18, цифровой вход.   Uint8  "
./modpoll -m rtu -d8 -b9600 -p none -a1  -t4 -r $PORT -c1 -1 $PORTPATH | grep $PORT"]:"
 
PORT=5110
printf "$PORT Клемма 19, цифровой вход.  Uint8  "
./modpoll -m rtu -d8 -b9600 -p none -a1  -t4 -r $PORT -c1 -1 $PORTPATH | grep $PORT"]:"
 
#echo "writing"
#PORT=1730
#VALUE=1
#./modpoll -m rtu -d8 -b9600 -p none -a1  -t4 -r $PORT -c1 -1 $PORTPATH  $VALUE


или еще
Кликните здесь для просмотра всего текста
Bash
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#!/bin/bash
#set -x
OWENPORT="$(cat owen_port)"
#echo $OWENPORT
PORTPATH='/dev/serial/by-id/'$OWENPORT
#echo $PORTPATH
 
 
function read_owen_temperature ()
{
    POLLRESULT=$(./modpoll -1 -b 9600 -d 8 -s 1 -p none -c 1 -t 3:float -r 4 -m ascii -a 16 $PORTPATH | grep "]:" | awk ' { print $2 }')
    echo $POLLRESULT
}
 
while true; do 
    DATE=`date +%H-%M-%S`
    # read temperature float
    OWEN_TEMP=$(read_owen_temperature)
    echo $DATE"   temperature=  "$OWEN_TEMP
    echo $DATE" ,  "$OWEN_TEMP >> a.csv
    sleep 2
done
1
Заблокирован
12.09.2023, 16:30 17
Aledveu, а содержимое скрипта modpoll?
0
121 / 63 / 15
Регистрация: 26.11.2022
Сообщений: 346
12.09.2023, 17:16 18
Eddy_Em, Это улилита https://www.modbusdriver.com/modpoll.html
но можно любую другую аналогичную по функционалу
благо их полно типа такой https://github.com/favalex/modbus-cli и прочие
https://manpages.ubuntu.com/ma... oll.1.html
1
Заблокирован
12.09.2023, 17:18 19

Не по теме:

Aledveu, а зачем, если самому на С написать быстрей и проще?
Разве что, удобно, когда есть под рукой универсальная утилита, которую можно из баш-скриптов запускать.
Вот только та самая написана на питоне, а я змеюке не доверяю (особенно в таких низкоуровневых делах, да и вообще непонятно, зачем было писать на змеюке код, который на 99% все равно состоит из сишного кода используемых модулей).


Я вот ТСу советую таки сначала попробовать "в лоб" решить без всяких левых "библиотек". На гольном С. С дебажным дампом всего, что происходит.
0
Модератор
Эксперт по электронике
8340 / 4234 / 1605
Регистрация: 01.02.2015
Сообщений: 13,185
Записей в блоге: 5
12.09.2023, 19:53 20
Цитата Сообщение от ZenBooster Посмотреть сообщение
написал тестовую программу на С++ с использованием библиотеки libmodbus и там ошибка воспроизводится
Может быть таймаут, который определён в библиотеке маловат для скорости 9600.
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
12.09.2023, 19:53
Помогаю со студенческими работами здесь

Modbus RTU
Здравствуйте, пытаюсь решить задачу. Нужно послать значение какой-либо переменной с...

modbus rtu
Добрый день Не могу разобраться с работой modbus rtu что значит запрос 024600e260? 02 - номер...

Запрос MODBUS RTU
Добрый день! Никак не получается получить ответ от МВА8. По протоколу ascii проблем не...

Работа с Modbus RTU
Есть некий модуль ввода/вывода, со своим адресом, дискретный и аналоговый сигнал поддерживает....

ModBus RTU и Arduino
Здравствуйте ! Я из Ардуино МЕГА 2560 передаю данные в панель СП270 по МодВас РТУ функцией: ...

Modbus RTU на STM32F10x
Доброго времени суток. Столкнулся с задачей реализации Modbus на STM32f100C4T6B. До этого момента...

Modbus rtu wincc
Добрый день. Есть wincc advanced v13. Необходимо проверить наличие/отсутствие связи по канала...


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2023, CyberForum.ru