Найти - Пользователи
Полная версия: Чтение modbus RTU запроса python 1.5
Начало » Mobile Python » Чтение modbus RTU запроса python 1.5
1 2 3 4
PooH
vic57
sys.maxint? не пойму что за питон такой, стандартные функции не выполняются
Там похоже платка 16-ти битная. Плавающую запятую железка не умеет, а эмуляцию писать не захотели - типа кому надо, да и медленно, наверняка. Попробуйте с long вместо int. По мануалу бинарные функции с ним умеет. Ну или побайтово.
vic57
PooH, судя по ошибке “str(num).zfill(n)”, интерпретатор упрощен сильно, нужно и писать как можно проще: одна строка - одно действие.
PooH
Попробуйте с long вместо int
УМВР pytnon-2.7 поэтому и не пойму



vic57
скачал я этот Telit Python на посмотреть, все стало ясно.
Не поддерживает: True, False, >>=, +=, не знаю что еще
переписал, в PythonWin все заработало
Svet
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
Супер! Спасибо за помощь!

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

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

Svet
Делаю вот так:
 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
vic57
для отладки print вставляй где сомневаешься
 SRcv2 = SER.receive(20)
print '?', SRcv2, len(SRcv2), type(SRv2), str(SRv2)
как то так
Svet
Подниму еще небольшой вопрос.
С 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. Как получать отрицательные целые данные?
vic57
не то
15 = 0x31 0x35
https://sites.google.com/site/fieldbusbook/seti/modbus-rtu-ascii-rus
http://www.simplymodbus.ca/ASCII.htm
причем модбас м.б. модифицирован, надо спецификацию смотреть
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB