Во-первых, это, вероятно, будет долго, так что терпите меня и извините заранее, если мое описание может быть неправильно сформулировано, я не знал, как это объяснить.
Я новичок здесь иновичок в программировании (за исключением курса средней школы в Паскале и курса колледжа в 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, вернитесь обратно в состояние ожидания.
Если вам нужно увидеть больше кода или что-то еще, пожалуйста, дайте мне знать.Я знаю, что это было долго, и я, вероятно, все делаю задом наперед ....
Заранее спасибо,
Кевин