Уведомления

Группа в Telegram: @pythonsu

#1 Апрель 5, 2021 00:50:39

staxbel
Зарегистрирован: 2021-03-13
Сообщения: 48
Репутация: +  0  -
Профиль   Отправить e-mail  

Запись в БД с условием

Контроля четности нету, работает по интерфейсу RS-232C, переделан на RS-485, т.к. длина трассы большая. Суть в том, что даже если он запишет не верное значение, то особо проблемы нет, через 30 сек идет повторный опрос. Этот мусор бывает очень редко. Просто в данный момент при значении например b' 118\x98' - получается ошибка записи в БД и программа вылетает.

Офлайн

#2 Апрель 5, 2021 10:37:13

PEHDOM
Зарегистрирован: 2016-11-28
Сообщения: 2196
Репутация: +  294  -
Профиль   Отправить e-mail  

Запись в БД с условием

staxbel
Тут родилась другая идея, может ее проще реализовать? При получении данных, сравниваем с предыдущим значением, если значения совпадают - записываем в БД если нет - отправляем запрос еще раз.
Э-э, а какой смысл тогда вообще чтото писать? эти же цифры чтото означают, если там нету мусора, статус работы или данные измерения. И наверное нужно понимать если “чтото пошло не так”.
staxbel
Если ставлю utf-8, получаю ошибку
вы таки видать не там ставите. Не должно оно вам такого говорить если вы просто строку декодируете, максимум вы можете получить DecodeError если там совсем мусор-мусор. попробуйте без кодировки указать, просто decode(). и вобще покажите весь код что вы там наисправляли.
Если это таки “из за помех, наводок и прочего” и у вас нету возможности повлиять на “данные от прибора”, добавив контроль четности или коректирующие коды, то проверить можно только подобными костылями которые я вначале приводил или примерно как Rodegast советовал.
 def check_data(data):
    correct_set = [32, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57 ]
    for x in data:
        if x not in correct_set:
            return False
    else:
        return True
print(check_data(b' 118\x98'))
print(check_data(b' 1180'))
print(check_data(b' 1q80'))
print(check_data(b' 118<'))
print(check_data(b' 1234'))
>>>
False
True
False
False
True
>>> 



==============================
Помещайте код в теги:
[code python][/code]
Бериегите свое и чужое время.

Отредактировано PEHDOM (Апрель 5, 2021 11:33:38)

Офлайн

#3 Апрель 5, 2021 11:26:32

Rodegast
От: Пятигорск
Зарегистрирован: 2007-12-28
Сообщения: 2756
Репутация: +  184  -
Профиль   Отправить e-mail  

Запись в БД с условием

> Контроля четности нету

Что за железка?

> получается ошибка записи в БД и программа вылетает

Ну так обработай её через try/except



С дураками и сектантами не спорю, истину не ищу.
Ели кому-то правда не нравится, то заранее извиняюсь.

Офлайн

#4 Апрель 5, 2021 13:07:26

xam1816
Зарегистрирован: 2020-05-11
Сообщения: 1370
Репутация: +  121  -
Профиль   Отправить e-mail  

Запись в БД с условием

вот так будет работать?

 def check_data(data): # проверяем данные
	if data.isdigit():
		if 0 <= int(data) <= 100000:
			return True
		else:
			return False
         else:return False
def hold_session():
	with db.getConnection() as connection: # подключились к базе данных
		with serial.Serial('COM3', timeout=1) as ser: # подключились к порту
			last_value = None # последние записанные данные данные
			if last_value is None:
				pass # здесь достаем последние записаные значения из бд
			while True: # запустили поток
				cmd = bytearray([0x3])
				ser.write(cmd) # отправили байты оборудованию (скорее всего весы в силосе)
				reply = ser.read(22) # прочитали ответ 22 байта
				out = reply[11:16] # из них выбрали с 11 по 16 байты
				data = out.decode()#раскодировали данные
				if check_data(data) and last_value != data:#если валидны и не равны последним 
					try:
						cursor = connection.cursor()
						sql = "Update silos3 set weight = %s, date = %s where id = %s " # вот сюда нужно записать вес
						newHireDate = datetime.today()
						cursor.execute(sql, (data, newHireDate, 1 ) )#вот здесь id всегда будет 1 непонятно
						connection.commit()
						print ("Данные изменены",data, newHireDate)
						last_value = data
					except Exception as e:
						print(e, f" данные >>> {data} <<< не записались в бд")
				else:
					print('шлак какой-то пришел')
hold_session()

Отредактировано xam1816 (Апрель 5, 2021 13:47:28)

Офлайн

#5 Апрель 5, 2021 14:29:53

PEHDOM
Зарегистрирован: 2016-11-28
Сообщения: 2196
Репутация: +  294  -
Профиль   Отправить e-mail  

Запись в БД с условием

xam1816
вот так будет работать?
поскольку у там может быть любой мусор то data = out.decode() может вызвать DecodeError, я бы его еще в тру-ексепт decode() заключил.
вот в этой проверке if 0 <= int(data) <= 100000 я вообще не вижу смысла, изначально берется срез с 11 по 16, тоесть 5 символов, а минусу или другим символам не даст пролезсть isdigit()
+ там пробел проскакивал в данных,
b' 1180'
если это валидные данные то isdigit() выдаст False. В таком случае пробелы перед проверкой нужно обрезать.




==============================
Помещайте код в теги:
[code python][/code]
Бериегите свое и чужое время.

Отредактировано PEHDOM (Апрель 5, 2021 14:36:21)

Офлайн

#6 Апрель 5, 2021 15:38:53

xam1816
Зарегистрирован: 2020-05-11
Сообщения: 1370
Репутация: +  121  -
Профиль   Отправить e-mail  

Запись в БД с условием

PEHDOM
вот в этой проверке if 0 <= int(data) <= 100000 я вообще не вижу смысла
Это как пример,если данные будут числовое значение но выходящее из диапазона,т.е если это вес, но он не может быть по существу,его отсеять.А так вообще нужно почитать если это весы,как там устроено это общение, потому что мне кажется в сообщении от оборудования есть проверка на корректность данных в каких нибудь байтах

Офлайн

#7 Апрель 5, 2021 17:02:22

Rodegast
От: Пятигорск
Зарегистрирован: 2007-12-28
Сообщения: 2756
Репутация: +  184  -
Профиль   Отправить e-mail  

Запись в БД с условием

> потому что мне кажется в сообщении от оборудования есть проверка на корректность данных в каких нибудь байтах

Я о чём тебе и говорю. Там должна быть контрольная сумма (CRC). Ты должен вычислить её у полученного сообщения и сравнить с тем что к тебе с ним пришло. Если они одинаковые то всё норм, иначе данные не верны.



С дураками и сектантами не спорю, истину не ищу.
Ели кому-то правда не нравится, то заранее извиняюсь.

Офлайн

#8 Апрель 5, 2021 20:53:26

staxbel
Зарегистрирован: 2021-03-13
Сообщения: 48
Репутация: +  0  -
Профиль   Отправить e-mail  

Запись в БД с условием

Это весы CAS2001A, в документации про корректность данных ни слова.
Сейчас вообще вот такой мусор вылез

b' \xb2980'

Офлайн

#9 Апрель 5, 2021 21:41:50

xam1816
Зарегистрирован: 2020-05-11
Сообщения: 1370
Репутация: +  121  -
Профиль   Отправить e-mail  

Запись в БД с условием

пришлите все 22 байта и скажите какой вес был на весах, у вас данные с 10 по 17 байты должны быть

Отредактировано xam1816 (Апрель 5, 2021 21:49:36)

Офлайн

#10 Апрель 5, 2021 21:59:47

staxbel
Зарегистрирован: 2021-03-13
Сообщения: 48
Репутация: +  0  -
Профиль   Отправить e-mail  

Запись в БД с условием

b'ST,NT,\x03\xc0,   1565  kg\r\n'
b'ST,NT,\x03\xc0, 1565 kg\x0f\n'
b'ST,NT,\x03\xc0, 1565 k\x7f\r\n'
b'ST,NT,\x03\xc0, 1565 {g\r\n'
b'ST,NT,\x03\xc0, 156\xb5 og\r\n'

на весах 1565

Офлайн

Board footer

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

Powered by DjangoBB

Lo-Fi Version