Найти - Пользователи
Полная версия: Запись в БД с условием
Начало » Python для новичков » Запись в БД с условием
1 2 3 4 5 6 7
staxbel
Контроля четности нету, работает по интерфейсу RS-232C, переделан на RS-485, т.к. длина трассы большая. Суть в том, что даже если он запишет не верное значение, то особо проблемы нет, через 30 сек идет повторный опрос. Этот мусор бывает очень редко. Просто в данный момент при значении например b' 118\x98' - получается ошибка записи в БД и программа вылетает.
PEHDOM
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
>>> 
Rodegast
> Контроля четности нету

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

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

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


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

Я о чём тебе и говорю. Там должна быть контрольная сумма (CRC). Ты должен вычислить её у полученного сообщения и сравнить с тем что к тебе с ним пришло. Если они одинаковые то всё норм, иначе данные не верны.
staxbel
Это весы CAS2001A, в документации про корректность данных ни слова.
Сейчас вообще вот такой мусор вылез
b' \xb2980'
xam1816
пришлите все 22 байта и скажите какой вес был на весах, у вас данные с 10 по 17 байты должны быть
staxbel
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
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