PDA

Просмотр полной версии : МВ110-224.8А modbus



danilk
05.06.2017, 21:16
сломал голову, как прочитать регистры по модбасу: конфигуратор работает, Modbus Poll работает. А простейший скрипт пайтона бьет ошибку пустого ответа.



import serial
ser = serial.Serial(None, 9600, timeout=1)
ser.port='COM5'
print ser
ser.open()
ser.write(':100300010001D68B\r\n')
print repr(ser.read(1000)) # Read 1000 bytes, or wait for timeout
ser.close()




Serial<id=0x209e070, open=False>(port='COM5', baudrate=9600, bytesize=8, parity='N', stopbits=1, timeout=1, xonxoff=False, rtscts=False, dsrdtr=False)
''

я подозреваю ошибку конфигурирования порта. Чтение через CP210x
Подскажите куда копать?

Евгений Кислов
05.06.2017, 21:31
Вы пытаетесь опрашивать по Modbus ASCII, но контрольную сумму считаете как для Modbus RTU.
В Modbus ASCII контрольная сумма - это двухбайтовый LRC:
http://www.modbustools.com/modbus.html#lrc

danilk
05.06.2017, 21:57
Взял рту запрос с BaseBlock ComTest
Скорость конфигуратором поменял на 115200


import serial
ser = serial.Serial(None, 115200, timeout=1, rtscts=True)
ser.port='COM5'
print ser, ser.dtr, ser.rts
#ser.write(':100300010001D68B\r\n')
ser.open()
ser.read()
ser.write('\x10\x03\x00\x00\x00\x06\xC6\x89')
print repr(ser.read(1000)) # Read 1000 bytes, or wait for timeout
ser.close()




C:\Python27\python.exe C:/Users/Danil/PycharmProjects/modbus/serialtest.py
Serial<id=0x2ace0b0, open=False>(port='COM5', baudrate=115200, bytesize=8, parity='N', stopbits=1, timeout=1, xonxoff=False, rtscts=True, dsrdtr=False) True True
''

Process finished with exit code 0

IVM
06.06.2017, 08:58
А что это за программа такая ?

capzap
06.06.2017, 09:07
Взял рту запрос с BaseBlock ComTest
Скорость конфигуратором поменял на 115200


import serial
ser = serial.Serial(None, 115200, timeout=1, rtscts=True)
ser.port='COM5'
print ser, ser.dtr, ser.rts
#ser.write(':100300010001D68B\r\n')
ser.open()
ser.read()
ser.write('\x10\x03\x00\x00\x00\x06\xC6\x89')
print repr(ser.read(1000)) # Read 1000 bytes, or wait for timeout
ser.close()




C:\Python27\python.exe C:/Users/Danil/PycharmProjects/modbus/serialtest.py
Serial<id=0x2ace0b0, open=False>(port='COM5', baudrate=115200, bytesize=8, parity='N', stopbits=1, timeout=1, xonxoff=False, rtscts=True, dsrdtr=False) True True
''

Process finished with exit code 0


timeout равный единице это нормально?

danilk
06.06.2017, 09:53
Тайм-аут не менее, чем на модуле, это нормально. Методом тыка пришёл к тому, что чип не умеет автоматически переключать rts, буду экспериментировать с 485 режимом библиотеки serial

danilk
06.06.2017, 09:58
А что это за программа такая ? какая именно?

capzap
06.06.2017, 10:29
здесь (http://pyserial.readthedocs.io/en/latest/pyserial_api.html) вот написано про rs485_mode, который явно имеется физически а в программе нет настроек. И стоит при всех непонятных ситуациях использовать flush()

danilk
06.06.2017, 10:33
К сожалению flush не работал. Пробовал

capzap
06.06.2017, 10:38
а готовые библиотеки работают? https://stackoverflow.com/questions/17081442/python-modbus-library

danilk
06.06.2017, 11:47
Minimalmodbus пока не разбирался с 485. Верхний скрипт переключил в 485 и он начал отвечать. Вечером попробую овен пайтон библиотеку с изменённым классом порта под 485

Grampus
06.06.2017, 15:10
Помогите разобраться не работает программа.
Один порт RS 485 чтение 1 переменная запись одна переменная
ПЛК73


(*Организуем счетчик, что бы передавать эти данные по сети*)
t:=t+1;
IF (t MOD 1000)=0 THEN
A := A + 1;
IF A > 9999 THEN
A := 0;
END_IF

(*Устанавливаем настройки COM-порта*)
IF port_opened=0 THEN
Settings.Port:=com_num; (*номер COM-порта*)
Settings.dwBaudRate:=115200; (*скорость*)
Settings.byParity:=0;
Settings.dwTimeout:=45;
Settings.byStopBits:=0;
Settings.dwBufferSize:=0;
Settings.dwScan:=0;
END_IF

(*Открываем COM-порт*)
COM_SERVICE1(Enable:=(port_opened=0) , Settings:=Settings , Task:=OPEN_TSK );
(*Если COM-порт открыт, то переходим к приему и передачи данных *)
IF COM_SERVICE1.ready THEN
port_opened:=2;
END_IF

CASE process OF
0:
read_real(
Enable:=enable,
Mode:= MB_RTU,
DevAddr:=16 ,
FirstAddr:=261,
Quantity:=1,
ComHandle:=Settings.Port,
TimeOut:=TimeOut,
Buffer:=Buffer , (* буфер данных *)
Complete=>cmpl , (* скопировать признак завершения операции *)
Exception=>err, (* скопировать регистр ошибок *)
ByteCnt=>DataSize);
IF cmpl THEN
IF err <>0 THEN

ptr_D:=ADR(d);
ptr_D^:=buffer[1];
ptr_D:=ptr_D+1;
ptr_D^:=buffer[0];
ptr_D:=ptr_D+1;
ptr_D^:=buffer[3];
ptr_D:=ptr_D+1;
ptr_D^:=buffer[2];

END_IF
END_IF
process:=1;(*переходим к выполнению следующего блока*)

1:
write_real(
Enable:= enable, (* разрешение работы блока *)
Mode:=MB_RTU , (*режим передачи*)
DevAddr:=15 , (*адрес*)
FirstAddr:= 261, (*номер регистра*)
Quantity:= 1, (*количество записываемых регистров*)
ComHandle:=Settings.Port ,(*номер сом-порта*)
TimeOut:=TimeOut , (*таймаут T#50ms*)
Buffer:=Buffer , (* буфер данных *)
Complete=>cmpl , (* скопировать признак завершения операции *)
Exception=>err , (* скопировать регистр ошибок *)
RegCnt=> DataSize); (*кол-во считанных байтов *)
(*если установлен признак завершения операции, то *)
IF cmpl THEN

ptr_D:=ADR(d);
ptr_D^:=buffer[1];
ptr_D:=ptr_D+1;
ptr_D^:=buffer[0];
ptr_D:=ptr_D+1;
ptr_D^:=buffer[3];
ptr_D:=ptr_D+1;
ptr_D^:=buffer[2];
process:=0;
END_IF
END_CASE


IF enable = FALSE THEN
enable := TRUE;
END_IF
(*IF err <> 0 THEN
enable := FALSE;
END_IF*)
END_IF

capzap
06.06.2017, 15:15
Помогите разобраться не работает программа.
как Ваша программа связана с данной темой, лишь бы вбросить. И начните с того, что определитесь по какому адресу слейва Вы обращаетесь

danilk
06.06.2017, 21:11
с режимом rs485 все заработало: и модбас, и овен.

danilk
06.06.2017, 21:44
с виндоус все ок
однако raspbian вываливается с ошибкой конфигурирования RS485
ValueError: Failed to set RS485 mode: [Errno 25] Inappropriate ioctl for device

Grampus
07.06.2017, 06:37
как Ваша программа связана с данной темой, лишь бы вбросить. И начните с того, что определитесь по какому адресу слейва Вы обращаетесь

Программа для связи ПЛК73 с модулем ввода МВ110 8АС этим связана.

Grampus
07.06.2017, 06:38
как Ваша программа связана с данной темой, лишь бы вбросить. И начните с того, что определитесь по какому адресу слейва Вы обращаетесь

Для чтения с модуля 16 адрес
Для записи этого числа в орс сервер 15 адрес
Вы про это????

Grampus
07.06.2017, 06:43
с виндоус все ок
однако raspbian вываливается с ошибкой конфигурирования RS485
ValueError: Failed to set RS485 mode: [Errno 25] Inappropriate ioctl for device

Расскажите пожалуйста по подробнее что изменить!
com_num: PORTS:=0; (*0 - RS-485, 1 - RS-232*)
я руководствовался описанием библиотеки. если вы про это!

capzap
07.06.2017, 07:01
Программа для связи ПЛК73 с модулем ввода МВ110 8АС этим связана.

Предположим что это так и есть, следующая наводка, зачем переворачивать четыре байта, если читаете один регистр

Grampus
07.06.2017, 08:36
Предположим что это так и есть, следующая наводка, зачем переворачивать четыре байта, если читаете один регистр

Quantity:=2, это имеете в виду! было 1 нужно 2 да!
я пробывал и так и так ничего не получается(((((((

capzap
07.06.2017, 08:52
Quantity:=2, это имеете в виду! было 1 нужно 2 да!
я пробывал и так и так ничего не получается(((((((

перечитайте еще раз документацию, раз Вы читаете 261 регистр в нем хранится двухбайтное число, чуть ниже в таблице есть и в формате реал значения кaнaлов, кажется начиная с 0х120 регистра. Поэтому определитесь, если хотите по переворачивать, выберите подходящий регистр и измените запрос на чтение двух регистров, если всеже интересует целочисленное то не нужно переворачивать а указатель делать на INT.

третья наводка, что бы что то записать, нужно подготовить вначале данные потом отправить запрос, а копирование одного кейса в другой и замена экземпляра функции и адреса слейва не поможет, правильно изучите пример

Grampus
07.06.2017, 09:25
Предположим что это так и есть, следующая наводка, зачем переворачивать четыре байта, если читаете один регистр

COM_SERVICE1(Enable:=(port_opened=0) , Settings:=Settings , Task:=OPEN_TSK );
IF COM_SERVICE1.ready THEN
port_opened:=2;
END_IF
Вот порт открывается один раз за 10 стартов программы или реже это что может быть! ?

danilk
07.06.2017, 10:48
Подскажите чип USB 485 с гарантированной работой под линукс?

capzap
07.06.2017, 11:08
Подскажите чип USB 485 с гарантированной работой под линукс?

овеновский AC4 меня в линуксе ни когда не подводил, там вроде ftdi стоит, хотя читал что ас-4 модернизацию прошел

capzap
07.06.2017, 11:08
COM_SERVICE1(Enable:=(port_opened=0) , Settings:=Settings , Task:=OPEN_TSK );
IF COM_SERVICE1.ready THEN
port_opened:=2;
END_IF
Вот порт открывается один раз за 10 стартов программы или реже это что может быть! ?
порт надо открывать один раз, в этом коде ни чго нет про переподключение

danilk
07.06.2017, 11:10
Цена великовата. Попробую китайца на ftdi

danilk
07.06.2017, 13:20
оставлю инфу по чипу CP210х, вдруг кому поможет.
1) виндоус: Аппаратная инициализация порта через serial.Serial(...), затем serial.rs485_mode=serial.rs485.RS485Settings()
2) мак os+ debian инициалиция через serial.rs485.RS485(...) + serial.rs485_mode=serial.rs485.RS485Settings(delay _before_rx=0.002)

danilk
09.06.2017, 20:57
поддерживаю тему далее
смотрим в драйвер:
https://github.com/raspberrypi/linux/blob/rpi-4.9.y/drivers/usb/serial/cp210x.c
{ USB_DEVICE(0x1555, 0x0004) }, /* Owen AC4 USB-RS485 Converter */
То бишь AC4 на этом же чипе.

danilk
10.06.2017, 23:47
ошибка сидит в распбиане. установленная убунту работает с этим адаптером

danilk
12.06.2017, 23:12
по мере работы возник вопрос: между измерениями 0.3с по конфигуратору, а по результатам чтения - отметка времени меняется раз в 5 секунд. Это правильно?

capzap
13.06.2017, 06:28
Если бы был 8АС то не правильно, а так в документации об этом пишется

danilk
13.06.2017, 09:31
Если бы был 8АС то не правильно, а так в документации об этом пишется
не более 0.9c на вход для ТСП. То есть установка между измерениями ни на что не влияет? Мне нужно читать 6 входов = 0,9х6=4,8с для модуля для подготовки данных?

danilk
13.06.2017, 09:47
подскажите еще, если сталкивались:
поскольку в аппаратном режиме pyserial так и не взлетает, мне нужно организовать обработку owen exception так, чтобы восстанавливать связь с модулем при ошибке типа "данные не получены". Есть ли примеры кода? По аппаратной инициализации RS485 ну просто тишина по линуксу, даже силиконлабс на форуме 2 подобные темы без ответов по существу

capzap
13.06.2017, 10:03
не более 0.9c на вход для ТСП. То есть установка между измерениями ни на что не влияет? Мне нужно читать 6 входов = 0,9х6=4,8с для модуля для подготовки данных?

лучше так попробовать и предыдущий пункт руководства тоже надо учитывать

capzap
13.06.2017, 10:04
подскажите еще, если сталкивались:
поскольку в аппаратном режиме pyserial так и не взлетает, мне нужно организовать обработку owen exception так, чтобы восстанавливать связь с модулем при ошибке типа "данные не получены". Есть ли примеры кода? По аппаратной инициализации RS485 ну просто тишина по линуксу, даже силиконлабс на форуме 2 подобные темы без ответов по существу

под рутом делаете, ком порты обычно игнорят простых полбзователей, а так не сталкивался, я обмен на Яве делал

danilk
13.06.2017, 10:23
root не причем, все порты для dialout и root одинаковы. если пользователя в dialout не добавить, то он и в софтовой инициализации вываливается с пермишинами. Этот вариант я проработал с начала


лучше так попробовать и предыдущий пункт руководства тоже надо учитывать
ну как я выше сказал, что модуль в принципе игнорит эту настройку на свое усмотрение

danilk
13.06.2017, 17:00
Slab дал ответ по своему чипу и линукс - управление GPIO не поддерживается. ссылка на тестовый драйвер ведет к 3.х и 2.6.х версиям ядер, у меня все 4+

melky
13.06.2017, 17:53
у меня на RPi без проблем работают на чипах ftdi и на CH340, и cp210x и на PL2303 должно быть без особых отличий.
Есть все, правда последние с TTL, лень проверять с преобразователем TTL-485 (и такой есть)...

Чего у вас там не взлетает не понимаю, можете сделать симлинк и обозвать его COM1 и работайте.

Порты в линукс должны быть уже сконфигурированы по умолчанию с какой-то скоростью, битностью и т.д., необходимо просто изменить настройки работы порта. Может тут затык ?
з.ы. не работал в питоне, нет необходимости.

danilk
13.06.2017, 21:23
Чего у вас там не взлетает не понимаю, можете сделать симлинк и обозвать его COM1 и работайте.
мне кажется, что проблема и действия описаны достаточно четко. если не хватает информации, могу привести код пайтона модбас в 10 строк для проверки с вашей стороны
причем тут симлинк если название порта вообще не представляет проблемы и даже не звучало?


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

melky
13.06.2017, 23:42
Использую Scada систему, которая работает под Windows и в Mono на Raspberry, ни разу не было с портами проблем при использовании встроенного Modbus драйвера.

Так что скорее всего вы просто что-то делаете неправильно в программе. Есть исходные коды на С#, в том числе и по работе с портами. Modbus тут все же прокладка, протокол может быть любым и непосредственно к поведению порта и его работе он не относится , хоть на Raspberry хоть на Ubuntu хоть на Windows.

Так что ищите проблемы в своем коде питона.

danilk
14.06.2017, 00:26
import minimalmodbus
import serial
import serial.rs485

instrument = minimalmodbus.Instrument('COM5',slaveaddress=16) # port name, slave address (in decimal)
instrument.mode = 'rtu' # rtu or ascii mode
instrument.serial.baudrate = 115200 # Baud
instrument.serial.rs485_mode = serial.rs485.RS485Settings()

temperature = instrument.read_register(1, functioncode=3, signed=True, numberOfDecimals=1) # Registernumber, number of decimals
print ('t= ', temperature)

что тут искать? этот код сразу работает на винде и не работает в линуксе (с поправкой на имя порта естессно)
вот на форуме разработчика говорят, что CP2102 не конфигурируется в eeprom в 485, но я все равно не понимаю почему под виндой все ок
PS: настройки битов и четности опущены, тк они по дефолту совпадают с установленными в minimalmodbus

capzap
14.06.2017, 07:44
код сразу работает на винде и не работает в линуксе (с поправкой на имя порта естессно)
поправку тоже бы немешало показать, чтоб вопросов не возникало в различии кода и добавте в код instrument.debug = True чтоб искать проблему

danilk
14.06.2017, 08:09
В отладчике нет интересного, я его смотрел. Ошибка ioctl сразу вываливается как я уже писал, чтобы код начал хотя бы слать, приходится класс instrument переопределять в части порта, а это уже как сказка про белого бычка. Биты проверяются совсем просто: print instrument. Slabs тоже ничего внятного про эту железку не пишет. Все эти круги по нескольку раз обошёл.

capzap
14.06.2017, 08:25
переопределять это как, не совсем понимаю, еще раз ему задавать порт или что

danilk
14.06.2017, 08:59
Нет. Это serial.Serial() внутри класса менять на serial.rs485.RS485()

danilk
14.06.2017, 12:14
https://github.com/pyhys/minimalmodbus/blob/master/minimalmodbus.py

было


class Instrument():
def __init__(self, port, slaveaddress, mode=MODE_RTU):
if port not in _SERIALPORTS or not _SERIALPORTS[port]:
self.serial = _SERIALPORTS[port] = serial.Serial(port=port, baudrate=BAUDRATE, parity=PARITY, bytesize=BYTESIZE, stopbits=STOPBITS, timeout=TIMEOUT)
else:
self.serial = _SERIALPORTS[port]
if self.serial.port is None:
self.serial.open()
стало


import serial.rs485
class Instrument():
def __init__(self, port, slaveaddress, mode=MODE_RTU):
if port not in _SERIALPORTS or not _SERIALPORTS[port]:
self.serial = _SERIALPORTS[port] = serial.rs485.RS485(port=port, baudrate=BAUDRATE, parity=PARITY, bytesize=BYTESIZE, stopbits=STOPBITS, timeout=TIMEOUT)
else:
self.serial = _SERIALPORTS[port]
if self.serial.port is None:
self.serial.open()

capzap
14.06.2017, 12:39
а зачем так то, на сайте в примерах показано как это делать и извне

danilk
14.06.2017, 12:59
Я знаю, просто для теста сделал с копией библиотеки

melky
14.06.2017, 17:02
вы работаете с преобразователем usb - rs485 ? зачем лезете менять в библиотеке на 485 ? с ним работают в линукс как с обычным COM портом....

danilk
14.06.2017, 18:01
вы работаете с преобразователем usb - rs485 ? зачем лезете менять в библиотеке на 485 ? с ним работают в линукс как с обычным COM портом....

вот с этого момента у меня и начались изыскания - прозрачно не заработало, пришлось искать причину. Я сначала тоже думал, что писать как в обычный порт. Получил таймаут. Потом методом тыка опустил setRTS в ноль после чтения и получил ответ.

melky
14.06.2017, 21:43
Странно, для всех этих преобразователей в ядре есть драйвера и загружаются при помощи udev когда обнаруживается устройство.

Скажите какой именно у вас преобразователь ? cp2102 ? поищу такой и постараюсь проверить на ПР200 на следующей неделе.
Собственно сами можете проверить скачав socat и настроив TCP сервер для ком порта и опросить что нибудь удаленно.

Вполне возможно в коде питона и нет управления портом, как в других, типа socat, remserial и так далее.

danilk
14.06.2017, 22:13
2102, все верно. Я честно не понимаю, каких конкретно настроек не хватает. В виндовых модбас мастерах для работы адаптера параметр RTS нужно было отметить, чтобы заработало, а овеновский конфигуратор даже ничего не запросил, сам разобрался

capzap
14.06.2017, 22:24
2102, все верно. Я честно не понимаю, каких конкретно настроек не хватает. В виндовых модбас мастерах для работы адаптера параметр RTS нужно было отметить, чтобы заработало, а овеновский конфигуратор даже ничего не запросил, сам разобрался
Он по ascii работает, вот и не просит ни чего. Кстати присоединюсь к вопросу, а почему питон, а не другие языки, визуализацию на нем вроде не построишь

danilk
14.06.2017, 22:32
у меня уже написано графическое приложение приложение в питоне под 17 дюймов тач интерфейс, с логами, графопостроителями, удаленным доступом по VNC к машине
плату делал сам - 6 АЦП по spi через мультиплексор по микрочиповскому аппноуту для Pt100 + 2 аппаратных ШИМ канала+4 линии GPIO на прочие дела
все шикарно работало, пока небольшое ЧП не пожгло выходные каналы. Решил не чинить, а поставить связку овеновских модулей ввода вывода. Откопал старый адаптер 7 летней давности, которым когда-то настраивал ТРМ251 и начал внедрять в код модбас или овен (не вижу для себя пока разницы).

danilk
14.06.2017, 22:34
31676
31677

danilk
14.06.2017, 22:42
Он по ascii работает, вот и не просит ни чего

minimalmodbus тоже это умеет, но это не помогает в достижении результата)

https://github.com/pyhys/minimalmodbus/blob/master/docs/serialcommunication.rst называет адаптер, который работает. Все-таки я склоняюсь, что cp2102 не для линукс или плата аппаратно кривая


minimalmodbus.Instrument<id=0x7697e850, address=16, mode=ascii, close_port_after_each_call=0, precalculate_read_size=True, debug=True, serial=Serial<id=0x76982350, open=True>(port='/dev/ttyUSB0', baudrate=57600, bytesize=8, parity='N', stopbits=1, timeout=0.05, xonxoff=False, rtscts=False, dsrdtr=False)>
0

MinimalModbus debug mode. Writing to instrument (expecting 15 bytes back): ':100300010001EB\r\n' (3A 31 30 30 33 30 30 30 31 30 30 30 31 45 42 0D 0A)
MinimalModbus debug mode. No sleep required before write. Time since previous read: 1497469293988.4 ms, minimum silent period: 0.67 ms.
MinimalModbus debug mode. Response from instrument: '' () (0 bytes), roundtrip time: 50.4 ms. Timeout setting: 50.0 ms.

0
('t= ', 0)

Process finished with exit code 0

danilk
19.06.2017, 22:44
вообщем с ftdi заработало прозрачно, но код нужно сильно разбавлять ловлей Exception для исключения ошибок

danilk
20.06.2017, 00:40
на распбиане толком не пашет. какие-то проблемы с таймингами

melky
20.06.2017, 11:06
это не преобразователи плохие, это проблемы скорее всего библиотек или кода питона.
У меня scada в Mono пашет через любые преобразователи без проблем на Raspbian, а вот в IOT как раз не хватает дров для преобразователей и только как раз CP2102 заработал у товарища...

Попробуйте разобраться с udev, например запретить ему подхватывать устройство, возможно тут причина всех бед. Либо поискать, как при его помощи выставить нужные вам параметры порта, когда udev срабатывает....

danilk
20.06.2017, 14:15
библиотеку питона я смотрел, криминала в ней нет. под убунтой кол-во ошибок в разы меньше, чем под распбианом
с udev что делать?

melky
20.06.2017, 15:19
разбираться, смотреть как и что он делает при загрузке модуля драйвера
Для начала поискать инфу, можно ли при помощи udev изменить настройки порта по умолчанию как делает команда
stty 9600 cs8 -parenb -cstopb -F /dev/ttyS0
Если можно, то прописать нужное и при подключении железки оно подхватится.

Еще как вариант не хватает прав на устройство, это вот точно можно при помощи udev сделать.
https://blablacode.ru/linux/522

Ну а сами настройки запихнуть как-то в скрипт
http://www.opennet.ru/tips/info/757.shtml

danilk
20.06.2017, 19:17
с правами точно ок.

просто через несколько операций устройство не отвечает, отлавливаю исключение и закрыть/окрыть порт.
утром в 8-20 поставил счетчик ошибок на операцию чтения раз в 1с 6 датчиков. Показывает в 19-15 308 раз таких закрыть/открыть
это все может и проканало бы на 1м устройстве на порту, но если их 2 и более, то алгоритм управления и отслеживания дюже усложняется

danilk
20.06.2017, 22:36
потестил модбас с настройкой
minimalmodbus.CLOSE_PORT_AFTER_EACH_CALL = True
на 2000 чтения нет ошибок
с овен протоколом так не получается. возможно стоит немного дописать класс порта открытием/закрытием.
в процессе…
еще интересное наблюдение: pycharm с удаленной отладкой на убунту прекрасно выдавал подсказки по методам, на распбиане ни в какую

melky
20.06.2017, 23:07
потому что raspbian не убунту, может надо какие-то пакеты доставить, чтобы и там подсказки были.

danilk
20.06.2017, 23:16
нет, при настройке удаленного доступа, он сам тянет интерпретатор с пакетами с удаленного хоста. Единственное отличие я нашел - это версия питона разная

danilk
21.06.2017, 07:58
Добавил в овен закрытие порта. За 8 часов и 30000 чтений кол-во ошибок упало до 4

melky
21.06.2017, 09:16
Ну правильно, вы тянете с удаленного хоста (на котором все крутится) а там может не хватать какого-то пакета.
Можно проверить что из пакетов установлено там и там.

danilk
21.06.2017, 10:18
не заметил каких-то отличий. Вообще бубунта мне понравилась больше, чем сильно порезанный распбиан. 100Мб памяти не великая плата за удобство

danilk
22.06.2017, 08:21
minimalmodbus на 150 000 чтений 0 ошибок

melky
22.06.2017, 10:18
перебирая убунту и прочее всегда возвращался к чистому дебиану - меньше глюков, сколько бы раз не пробовал.
Ну и хорошо, что победили... как говорится...

danilk
22.06.2017, 11:11
вчера решил планово на распбиане модули питоновские обновить - 3 часа заняло с доустановкой -dev пакетов, совсем не компилились обновления. Уж как-то сильно нож поработал.
дебиана вроде как не предлагают на малину, хотя особо не вникал

melky
22.06.2017, 11:57
raspbian по сути и есть дебиан для arm процессора, там только есть добавки для работы с 1wire, i2c, gpio ну и настроечные и конфигурационные вещи.
Основа собственно дебиан.

danilk
23.06.2017, 09:28
попутно выяснил, что по модбасу и овену показания могут разниться на 0.1°C
Проверка сделана на резисторах вместо ПТ100 в рамках одной временной метки

danilk
28.06.2017, 20:21
Чтобы не плодить темы.
Едет ко мне МУ110-8К
Если с чтением все понятно, то с параметром r.ОЕ и библиотекой для Python не очень. Не затруднит привести пример? можно на Си

Lyric
20.07.2017, 14:04
Здравствуйте. Есть ПЛК110.60 и модуль 8АС. Связываю их по протоколу ОВЕН, значения измеренные идут, всё хорошо. Вопрос в том, как прочитать параметры SRD по протоколу ОВЕН? Для связи использую только конфигурацию кодесиса, никаких библиотек "овенлиб" не ставил.

Lyric
21.07.2017, 10:42
В РЭ для Модбаса есть адрес регистра. А для протокола ОВЕН есть только hash.

Мне надо по ОВНУ считать статус SRD каждого из каналов. Если адрес модуля 16, то адреса измеренных значений каналов будут для первого 16, для второго 17, и так далее до 8-го канала. Кроме адреса каждого канала в конфигурации у кажого канала есть ещё графа Hash Name, и у измеренных значений каналов написано там read. Каким образом мне считать SRD этого измеренного канала, адрес которого 16? Создаю ещё одну переменную с таким же адресом 16 и в Hash Name пишу ему SRD. В итоге даже измеренное значение перестаёт приходить с модуля. Я так понимаю из-за того, что в конфигурации появляется 2 переменных с одинаковым адресом. А как быть тогда?

Я понимаю что эта тема про Модбас, но другой подходящей темы не нашёл. Потому прошу не тыкать меня в это носом, а помочь. Спасибо.

TOPan
21.07.2017, 19:54
В РЭ для Модбаса есть адрес регистра. А для протокола ОВЕН есть только hash.
Мне надо по ОВНУ считать статус SRD каждого из каналов. Если адрес модуля 16, то адреса измеренных значений каналов будут для первого 16, для второго 17, и так далее до 8-го канала.

Вы какой тип переменной создаёте? Должен быть Unsigned variable (Listen)
В поле addres пишите адрес канала 16 17...23
В поле Hash name пишите SRD

И вроде как если результат измерения некорректный то возвращается ошибка в канале Read тоже (не проверял)

Lyric
24.07.2017, 07:44
Вы какой тип переменной создаёте? Должен быть Unsigned variable (Listen)
В поле addres пишите адрес канала 16 17...23
В поле Hash name пишите SRD

И вроде как если результат измерения некорректный то возвращается ошибка в канале Read тоже (не проверял)

Спасибо, вроде заработало. Не тот тип переменной был указан.

Насчёт дублирования кода ошибки в канале Read - всё равно для этого нужно отдельную однобайтную переменную создавать. И при резком обрыве датчика в ней остаётся не код ошибки, а часть битовой маски последнего измеренного зависшего значения. Может я что-то не так опять делаю, но, думаю, лучше уж использовать в программе результат чтения регистра SRD для этой цели.

melky
24.07.2017, 10:31
Так вы обрежьте лишние биты и проверяйте на 0 - нет ошибок или код ошибки и что там. Можете даже соответствующий FBD применять от Овен для этого или самописный petera выкладывал.

Lyric
02.08.2017, 15:12
уж использовать в программе результат чтения регистра SRD для этой цели.

В примерном проекте с одним модулем работало с 2-мя сигналами хорошо. На 4-х модулях в реальном проекте - не дышит. Вообще никак не реагирует на обрывы, всегда 0 во всех регистрах SRD. И грузит интерфейс так, что измеренные значения с модулей 8АС обновляются с задержкой около 7 секунд. Поставил опрос регистрам SRD 5000 мсек (всё равно ничего не работает, незачем опрашивать), а измеренным - опрос 50 мсек, - стали измеренные нормально обновляться. Мда. Много возможностей дают эти модули, только работать не хотят. Так же не должно быть, чтобы 32 лишних однобайтных значения настолько вешали интерфейс...



Так вы обрежьте лишние биты и проверяйте на 0 - нет ошибок или код ошибки и что там. Можете даже соответствующий FBD применять от Овен для этого или самописный petera выкладывал.

Это блок DECODE_FLOAT имеется в виду?
На блок petera тоже бы хотелось взглянуть, дайте ссылку где посмотреть, если Вам не сложно.

Lyric
02.08.2017, 15:50
Ага. DECODE_FLOAT тоже не работает. Вообще ничего не делает, тупо передаёт переменную со своего входа на свой выход и всё. Никаких кодов нет, и предустановленное значение при обрыве не ставится. Пробовал его в программе с циклом 100мс, и в свободной. Результат один - ничего.

Как так-то? Прочитанная переменная типа REAL по протоколу ОВЕН с модуля 8АС приходит напрямую на DECODE FLOAT. В чём ошибка?