Мониторинг переменной для изменения в Python - PullRequest
4 голосов
/ 08 марта 2012

Во-первых, это, вероятно, будет долго, так что терпите меня и извините заранее, если мое описание может быть неправильно сформулировано, я не знал, как это объяснить.

Я новичок здесь иновичок в программировании (за исключением курса средней школы в Паскале и курса колледжа в C ++, которые были много лун назад). В настоящее время я учу себя Python и пытаюсь написать небольшой проект для решения проблемы, с которой я сталкиваюсь на работе.Удивительно, но я до сих пор неплохо справляюсь со своим проектом, и в значительной степени он работает, но я пытаюсь сделать его немного лучше.В основном я беру чтение из последовательного порта, убираю возврат каретки из указанного чтения, затем пытаюсь сопоставить свой последовательный вывод с записью в таблице базы данных SQL и в зависимости от результатов выполнить необходимые действия.У меня все это работает достаточно хорошо, но я столкнулся с проблемой, которую не знаю, как решить.

Я использую «ctypes» для взаимодействия с файлом DLL, предоставленным производителем оборудования.Данное оборудование представляет собой карту цифрового ввода-вывода, которая имеет 8 цифровых входов и 8 релейных выходов.DLL позволяет мне читать состояние входов и выходов, а также я могу управлять выходами (включать и выключать реле).В основном это делается так:

mydll = cdll.LoadLibrary("acces32.dll")
input_status = mydll.InPortB(0xDC7C+1)

Где DC7C - это базовый адрес карты в HEX, а +1 - это то, как возвращается состояние входа.Состояние входа возвращается в виде десятичного числа от 0 до 255, которое при преобразовании в двоичное представляет состояние 8 входов, т.е.:

0 0 0 0 0 0 0 0 - decimal=0 - all inputs off
0 0 0 0 0 0 0 1 - decimal=1 - input 1 on
1 0 0 0 0 0 0 1 - decimal=129 - input 8 and 1 on
etc, etc, etc

МОЕ оборудование в настоящее время использует первые два входа в данный момент,так что мои возможные результаты - 0, 1, 2 или 3. Но было бы неплохо учесть все возможности, но я не обвожу голову, чтобы легко определить, какие входы включены или выключены.То, что я пытаюсь сделать, это контролировать состояние входного, чтобы увидеть, выключен он или включен (0 или 1).Вот мой текущий фрагмент кода:

def input():
    mydll = cdll.LoadLibrary("acces32.dll")
    input_status = mydll.InPortB(0xDC7C+1)

    while input_status != 1 or 3:
        arming = mydll.InPortB(0xDC7C+1)
        print "System is idle" #input 1 off
        #added the sleep as without it was using alot of CPU time
        time.sleep(0.5)
    print "Waiting for user input..." # then call bar_code function
    #calls another function which reads data from a serial connected bar code reader
    bar_code_reader()

Хотя это более или менее работает, очевидно, что оно не является идеальным и не учитывает, что происходит, если состояние входа 1 изменяется после того, как функция "bar_code_reader"запустить.Итак, более или менее, что является правильным способом для постоянного контроля этих входов, так что даже если я нахожусь в режиме bar_code_reader и затем вход 1 переключается в выключенное состояние, программа вернется к «Состояние в режиме ожидания».

Во-вторых, я не учитываю все возможные значения «input_status», где ввод 1, в настоящее время я просто учитываю использование двух входов, поэтому я знаю, что значение будет 0, 1, 2 или 3.но если мне случится использовать другие входные данные в будущем, я должен учитывать это сейчас, я полагаю.Существует ли простой способ учета всех возможных значений при включенном входе 1?Я уверен, что для этого есть какая-то простая математика, которую я забыл.Я думал о преобразовании десятичного вывода в двоичный и проверке таким образом, но не был уверен, что это лучший способ сделать это.Я выяснил, как преобразовать в двоичный файл, но это все, что я сделал с этим.

В основном, чтобы подвести итог:

Если вход 1 равен 0, то система остается бездействующей, в то время как ввод1 - 1, затем приступить к сбору пользовательского ввода (в виде штрих-кода), но если ввод 1 вернется к 0, вернитесь обратно в состояние ожидания.

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

Заранее спасибо,

Кевин

Ответы [ 3 ]

2 голосов
/ 09 марта 2012

Похоже, у вас есть две проблемы - как узнать, включен ли input 1, и прервать bar_code_reader, если input 1 выключится.

Первая задача проста: input_status & 1 оценивается какTrue если этот первый бит включен, False в противном случае.

Второй вариант немного сложнее.

При нормальных обстоятельствах bit 0 все еще будет включен в значение bar_code_reader() успешновозвращает?

  • Если да, просто проверьте бит после попытки считывания штрих-кода, и если он все еще включен, у вас есть хорошие данные.

  • Если нет, то вам придется поставить чек в bar_code_reader сам (возможно, более одного раза), а затем bar_code_reader вернуть хорошее значение, когда bit 0 остался на все время, и None в противном случае.(Вы можете использовать любой часовой, кроме None, он просто самый распространенный.)

О, и поэтому вам не нужно запоминать, какое битовое поле равно какому числу:

BIT0 = 2 ** 0
BIT1 = 2 ** 1
BIT2 = 2 ** 2
BIT3 = 2 ** 3
BIT4 = 2 ** 4
BIT5 = 2 ** 5
BIT6 = 2 ** 6
BIT7 = 2 ** 7
2 голосов
/ 09 марта 2012

Чтобы проверить, включен ли вход 1, вы можете input_status & 0x1, если input_status является целым числом.

1 голос
/ 09 марта 2012

Учитывая, что у вас есть только 8 возможных битов, я бы посоветовал сделать простейшие операции с битовыми and и or операциями с масками, которые вы форматируете в коде как двоичные целые числа (например, 0b00000001).Вы также можете установить ряд значений, если хотите, например:

inputs = []
for i in range(0, 8):
    input[i] = 2**i

, затем использовать inputs[i] в побитовых операциях вместо явного значения.

Что касается другой проблемы,вам придется справиться с разрывом метода сканирования внутри метода сканирования, как указали другие.Вы бы поместили весь беспорядок в цикл while True, а затем в текст цикла if inputs[0] & input_status: bar_code_reader().

...