Уведомления

Группа в Telegram: @pythonsu

#1 Авг. 15, 2016 18:45:21

PooH
От:
Зарегистрирован: 2006-12-05
Сообщения: 1948
Репутация: +  72  -
Профиль   Отправить e-mail  

Чтение modbus RTU запроса python 1.5

vic57
sys.maxint? не пойму что за питон такой, стандартные функции не выполняются
Там похоже платка 16-ти битная. Плавающую запятую железка не умеет, а эмуляцию писать не захотели - типа кому надо, да и медленно, наверняка. Попробуйте с long вместо int. По мануалу бинарные функции с ним умеет. Ну или побайтово.



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

Офлайн

#2 Авг. 15, 2016 19:13:34

vic57
Зарегистрирован: 2015-07-07
Сообщения: 893
Репутация: +  126  -
Профиль   Отправить e-mail  

Чтение modbus RTU запроса python 1.5

PooH, судя по ошибке “str(num).zfill(n)”, интерпретатор упрощен сильно, нужно и писать как можно проще: одна строка - одно действие.

PooH
Попробуйте с long вместо int
УМВР pytnon-2.7 поэтому и не пойму



Офлайн

#3 Авг. 15, 2016 21:13:39

vic57
Зарегистрирован: 2015-07-07
Сообщения: 893
Репутация: +  126  -
Профиль   Отправить e-mail  

Чтение modbus RTU запроса python 1.5

скачал я этот Telit Python на посмотреть, все стало ясно.
Не поддерживает: True, False, >>=, +=, не знаю что еще
переписал, в PythonWin все заработало

Отредактировано vic57 (Авг. 18, 2016 11:56:01)

Офлайн

#4 Авг. 15, 2016 21:33:39

Svet
Зарегистрирован: 2016-08-09
Сообщения: 18
Репутация: +  0  -
Профиль   Отправить e-mail  

Чтение modbus RTU запроса python 1.5

vic57
скачал я этот Telit Python на посмотреть, все стало ясно.Не поддерживает: True, False, >>=, +=, не знаю что еще переписал, в PythonWin все заработало
Спасибо!
Код заработал!
Получаю на
Но вот на второй части кода ошибка:
 while 1:
		s =  raw_input('hex? :')
		if s == 'q':
			break
		print hex2float(s)
 EOF when reading a line
А для чего это? Ведь функция hex2float() все отлично выполнила!?

Получаю из 41eee135 = 29.85996434
Супер! Спасибо за помощь!

Офлайн

#5 Авг. 15, 2016 22:01:34

Svet
Зарегистрирован: 2016-08-09
Сообщения: 18
Репутация: +  0  -
Профиль   Отправить e-mail  

Чтение modbus RTU запроса python 1.5

Еще раз спасибо за большой труд в решении данной проблемы!

Вопрос еще один: Я в serial port monitor вижу обмен данными в hex.
А вот модуль по умолчанию принимает данные в string.
10 03 04 E1 35 41 EE 6D 1C = …б5Aоm.
Если не сложно, подскажите как вытащить из полученного ответа 41EEE135.

Офлайн

#6 Авг. 15, 2016 22:41:10

vic57
Зарегистрирован: 2015-07-07
Сообщения: 893
Репутация: +  126  -
Профиль   Отправить e-mail  

Чтение modbus RTU запроса python 1.5

Svet, это я для проверки делал - вводишь hex, получаешь float. для импорта в другую программу это не надо. или у тебя ошибка табуляции где-то, PythonWin ИМХО кривоватый
терминал открой в PyWin

>>> s = '10 03 04 e1 35 41 ee 6d 1c=...Aom'
>>> s= s.split('=')[0]
>>> s
'10 03 04 e1 35 41 ee 6d 1c'
>>> l = s.split()
>>> l
['10', '03', '04', 'e1', '35', '41', 'ee', '6d', '1c']
>>> out = l[5] +l[6] + l[3] +l[4]
>>> out
'41eee135'
RTFM

Отредактировано vic57 (Авг. 16, 2016 00:46:39)

Офлайн

#7 Авг. 16, 2016 10:16:04

Svet
Зарегистрирован: 2016-08-09
Сообщения: 18
Репутация: +  0  -
Профиль   Отправить e-mail  

Чтение modbus RTU запроса python 1.5

Делаю вот так:

 def hex2 (data):
	b = ''
	for i in data:
		b = b + chr(i)
	return b
SER.receive(10) #мусор
SEND = hex2([0x10, 0x03, 0x02, 0xAA, 0x00, 0x02, 0xE6, 0xD2]) # 10 03 02 AA 00 02 E6 D2
SER.send(str(SEND))
MOD.sleep(10)
SRcv2 = SER.receive(20)
l = SRcv2.split()
out = l[5] +l[6] + l[3] +l[4]
print 'READ: '+str(hex2float(out))
Вижу через serial port monitor что прибор на запрос ответил, но модуль кидает ошибку: list index out of range

Офлайн

#8 Авг. 16, 2016 12:53:36

vic57
Зарегистрирован: 2015-07-07
Сообщения: 893
Репутация: +  126  -
Профиль   Отправить e-mail  

Чтение modbus RTU запроса python 1.5

для отладки print вставляй где сомневаешься

 SRcv2 = SER.receive(20)
print '?', SRcv2, len(SRcv2), type(SRv2), str(SRv2)
как то так

Отредактировано vic57 (Авг. 16, 2016 15:31:42)

Офлайн

#9 Дек. 27, 2016 10:13:39

Svet
Зарегистрирован: 2016-08-09
Сообщения: 18
Репутация: +  0  -
Профиль   Отправить e-mail  

Чтение modbus RTU запроса python 1.5

Подниму еще небольшой вопрос.
С modbus RTU как-то не срослось…
А вот с modbus ASCII получается отправлять и принимать данные, а так же их обрабатывать.
Только вот с float не получается привести к правильному виду.

Вот примеры:
A3 9D C0 5B = 3.43
84 50 41 B4 = 22.56

И еще вопрос про целые числа, я получаю 00 0F = это 15. Тут все гуд. А вот когда получаю FF E2 = это должно быть -30. Но я int('FFE2',16) получаю 65506. Как получать отрицательные целые данные?

Отредактировано Svet (Дек. 27, 2016 10:14:00)

Офлайн

#10 Дек. 28, 2016 19:47:47

vic57
Зарегистрирован: 2015-07-07
Сообщения: 893
Репутация: +  126  -
Профиль   Отправить e-mail  

Чтение modbus RTU запроса python 1.5

не то
15 = 0x31 0x35
https://sites.google.com/site/fieldbusbook/seti/modbus-rtu-ascii-rus
http://www.simplymodbus.ca/ASCII.htm
причем модбас м.б. модифицирован, надо спецификацию смотреть

Отредактировано vic57 (Дек. 28, 2016 21:13:47)

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version