Python - второе нажатие кнопки возвращает неправильные значения, но всегда одно и то же значение - PullRequest
0 голосов
/ 02 мая 2020

Я новичок в программировании на Python; тем не менее, у меня более десяти лет опыта программирования ПЛК для больших систем управления.

Работая дома во время этого дерьма COVID, у меня нет доступа ко всем моим обычным настольным тестовым устройствам. Мне нужно было создать симулятор широтно-импульсной модуляции с моим Raspberry Pi 3B, чтобы я мог протестировать и воссоздать функциональность импульсного расходомера на моем PL C, чтобы проверить функциональность моего PL C.

Рабочий процесс:

  1. Точка ввода GPIO (12)
  2. Частота ввода (10 Гц)
  3. Рабочий цикл ввода (50%)
  4. Нажмите «Start Simulation»
  5. Нажмите «Stop Simulation»
  6. Повторно введите точку GPIO, частоту, рабочий цикл
  7. Нажмите «Start Simulation»
  8. Нажмите «Остановить симуляцию»

Шаги 1-6 работают без нареканий; однако, когда я пытаюсь выполнить шаг 7, параметры GPIO Point, Frequency и Duty Cycle снова не передаются в функцию. Вместо этого, ШИМ запускается и значения повсюду. Шаг 8 работает.

Это мой код:

import RPi.GPIO as GPIO
from guizero import App, Text, TextBox, PushButton
from time import sleep

def Start():

        global PWM
        global IOPoint
        global Freq
        global DutyCycle

        IOPoint     =   int(IO_IN.value)        #Pass I/O Point Value
        Freq        =   int(FREQ_IN.value)      #Pass Frequency Value
        DutyCycle   =   int(DC_IN.value)        #Pass Duty Cycle Value

        GPIO.setwarnings(False)             #Disable GPIO Warnings
        GPIO.setmode(GPIO.BOARD)        #Set Pin Numbering System
        GPIO.setup(IOPoint,GPIO.OUT)            #Set GPIO Settings

        PWM = GPIO.PWM(IOPoint, Freq)           #Create PWM Instance With Frequency (Hz)
        PWM.start(DutyCycle)                    #Start PWM of Required Duty Cycle

def Stop():

        IO_IN.value = ""                        #Clears IO_IN Value
        FREQ_IN.value = ""                      #Clears FREQ_IN Value
        DC_IN.value = ""                        #Clears DC_IN Value

        PWM.stop()
        GPIO.cleanup()

#Call GUI Window            
APP = App(layout="grid", title="Pulse With Modulation Utility", height=180, width=380)

#IO Point Input
LABEL_0 = Text(APP, text="I/O Point", grid=[0,0], size=16, font="Ariel", color="Black", align="left")
IO_IN = TextBox(APP, grid=[1,0])

#Frequency Input
LABEL_1 = Text(APP, text="Enter Frequency (Hz)", grid=[0,1], size=16, font="Ariel", color="Black", align="left")
FREQ_IN = TextBox(APP, grid=[1,1])

#Duty Cycle Input
LABEL_2 = Text(APP, text="Enter Duty Cycle", grid=[0,2], size=16, font="Ariel", color="Black", align="left")
DC_IN = TextBox(APP, grid=[1,2])

#Run Start
START = PushButton(APP, command=Start, text="Start Simulation", grid=[1,3], align="top")

#Run Stop
STOP = PushButton(APP, command=Stop, text="Stop Simulation", grid=[1,4], align="top")

#Display Application
APP.display()

Вот снимок экрана работающей программы. Любая помощь будет принята с благодарностью, поэтому я могу убедиться, что мой код PL C работает должным образом, прежде чем внедрить его в новую систему управления.

Заранее спасибо за помощь.

...