[PYTHON] Testautomatisierung beginnend mit L-Chika (3) Einbau eines Oszilloskops

1. Zuallererst

Dies ist die dritte Testautomatisierungsserie, die mit L Chika beginnt.

In Anbetracht der jüngsten Energiesparsituation wird die Beleuchtungsmethode der zu testenden LED von [Statische Beleuchtung](https://www.google.co.jp/search?hl=ja&as_q=Static Lighting) auf [Dynamische Beleuchtung](https: / geändert) /www.google.co.jp/search?hl=ja&as_q=dynamic beleuchtung) wird geändert. Daher werden wir den Prüfstand so modifizieren, dass die Go / No-Go-Beurteilung automatisch durchgeführt werden kann, indem die Beleuchtungsspannung und die Beleuchtungsfrequenz der LED mit einem Oszilloskop gemessen werden.

IMG_0603s.jpg

Die Artikel finden Sie hier.

  1. Testautomatisierung beginnend mit L Chika
  2. Testautomatisierung beginnend mit L Chika (2) Verbesserung der Wartbarkeit von Testskripten

2. Reparatur des Testziels

Wechsel von statischer Beleuchtung zu dynamischer Beleuchtung mit 1000 Hz und einem Tastverhältnis von 50%. Ton (), [noTone ()](https://www.arduino.cc/reference/ En / language / functions / advanced-io / notone /) steuert die Beleuchtung / das Löschen.

ArduinoLedLight.ino(Teil wechseln)


void Led::on(void)
{
    //digitalWrite(m_led_pin, HIGH);
    tone(m_led_pin, 1000);
}

void Led::off(void)
{
    //digitalWrite(m_led_pin, LOW);
    noTone(m_led_pin);
}

3. Reparatur des Testläufers

|Befehl|Streit|Funktion |-----------+----------------+---- |open_dso |Keiner|-Importiere PyVISA und öffne das Oszilloskop |dso |VISA-Befehl|・ Senden und Empfangen von Befehlen zum und vom Oszilloskop
・ In den empfangenen Daten enthalten","Ist"-"Ersetzen mit |eval_dbl_eq|Erwarteter Wert(Doppeltyp[^1])|・変数valがErwarteter Wertの値(Doppeltyp)Gleich |eval_dbl_gt|Standardwert(Doppeltyp)|・変数valがStandardwert(Doppeltyp)Bewerten, wenn größer als |eval_dbl_lt|Standardwert(Doppeltyp)|・変数valがStandardwert(Doppeltyp)Bewerten, wenn kleiner

-Bitte installieren Sie PyVISA [^ 2].

test-runner.py


#!/usr/bin/python3

#
# This software includes the work that is distributed in the Apache License 2.0
#

from time import sleep
import serial
import codecs
import csv
import sys
import visa

UNINITIALIZED = 0xdeadbeef

def serial_write(h, string):
    if h == UNINITIALIZED:
        print("UART Not Initialized.")
        return False
    else:
        string = string + '\n'
        string = str.encode(string)
        h.write(string)
        return True


def open_dso():
    rm = visa.ResourceManager()
    resources = rm.list_resources()
    #print(resources)
    for resource in resources:
        #print(resource)
        try:
            dso = rm.open_resource(resource)
        except:
            print(resource, "Not Found.")
        else:
            print(resource, "Detected.")
            return dso

    #Throw an error to caller if none succeed.
    return dso


def main():
    is_passed = True
    val = str(UNINITIALIZED)
    dso = UNINITIALIZED
    uart = UNINITIALIZED
    arg = [""]

    with codecs.open('script.csv', 'r', 'utf-8') as file:
        script = csv.reader(file, delimiter=',', lineterminator='\r\n', quotechar='"')

        with codecs.open('result.csv', 'w', 'utf-8') as file:
            result = csv.writer(file, delimiter=',', lineterminator='\r\n', quotechar='"')

            for cmd in script:
                print(cmd)

                if "#" in cmd[0]:
                    pass

                elif cmd[0]=="sleep":
                    sleep(float(cmd[1]))
                    cmd.append("OK")

                elif cmd[0]=="open_dso":
                    try:
                        dso = open_dso()
                    except:
                        cmd.append("NG")
                        is_passed = False
                    else:
                        cmd.append("OK")

                elif cmd[0]=="dso":
                    try:
                        if "?" in cmd[1]:
                            val = dso.query(cmd[1]).rstrip().replace(",", "-")
                            cmd.append(val)
                        else:
                            dso.write(cmd[1])
                            cmd.append("OK")
                    except:
                        cmd.append("NG")
                        is_passed = False

                elif cmd[0]=="open_uart":
                    try:
                        uart = serial.Serial(cmd[1], 115200, timeout=1.0, dsrdtr=1)
                        cmd.append("OK")
                    except:
                        cmd.append("NG")
                        is_passed = False

                elif cmd[0]=="send":
                    ret = serial_write(uart, cmd[1])
                    if ret == True:
                        cmd.append("OK")
                    else:
                        cmd.append("NG")
                        is_passed = False

                elif cmd[0]=="rcvd":
                    try:
                        val = uart.readline().strip().decode('utf-8')
                        cmd.append(val)
                        cmd.append("OK")
                    except:
                        cmd.append("NG")
                        is_passed = False

                elif cmd[0]=="eval_str_eq":
                    if str(val) == str(cmd[1]):
                        cmd.append("OK")
                    else:
                        cmd.append("NG")
                        is_passed = False

                elif cmd[0]=="eval_int_eq":
                    if int(val) == int(cmd[1]):
                        cmd.append("OK")
                    else:
                        cmd.append("NG")
                        is_passed = False

                elif cmd[0]=="eval_int_gt":
                    if int(val) > int(cmd[1]):
                        cmd.append("OK")
                    else:
                        cmd.append("NG")
                        is_passed = False

                elif cmd[0]=="eval_int_lt":
                    if int(val) < int(cmd[1]):
                        cmd.append("OK")
                    else:
                        cmd.append("NG")
                        is_passed = False

                elif cmd[0]=="eval_dbl_eq":
                    if float(val) == float(cmd[1]):
                        cmd.append("OK")
                    else:
                        cmd.append("NG")
                        is_passed = False

                elif cmd[0]=="eval_dbl_gt":
                    if float(val) > float(cmd[1]):
                        cmd.append("OK")
                    else:
                        cmd.append("NG")
                        is_passed = False

                elif cmd[0]=="eval_dbl_lt":
                    if float(val) < float(cmd[1]):
                        cmd.append("OK")
                    else:
                        cmd.append("NG")
                        is_passed = False

                else:
                    cmd.append("#")

                print(cmd)
                result.writerow(cmd)

                if is_passed == False:
                    print("FAIL")
                    sys.exit(1)

    if is_passed == True:
        print("PASS")
        sys.exit(0)


main()

4. Testen Sie das Skript und den Skriptgenerator

4.1 (Einzelfunktion) Testskript

Fügen Sie das folgende Testskript zum Ordner "script-parts" hinzu.

setup_dso.csv


#
# Setup DSO
open_dso,
dso,*IDN?
eval_str_eq,RIGOL TECHNOLOGIES-DS1104Z-XXXXXXXXXXXXXX-00.04.04.SP3

dso_write_timescale_200us.csv


#
# Timebase Scale 200us
dso,:TIMebase:SCALe 0.0002

dso_query_vmax_gt1700-lt1900.csv


#
# 1.80V +/- 0.10V
dso,:MEASure:VMAX? CHANnel1
eval_dbl_gt,1.70
eval_dbl_lt,1.90

dso_query_freq_gt995-lt1005.csv


#
# 1000Hz +/- 5Hz
dso,:MEASure:FREQuency? CHANnel1
eval_dbl_gt,995
eval_dbl_lt,1005

4.2 Skriptgenerator

Die folgenden zwei Punkte wurden repariert.

script-generator.bat


REM script generator for LED Light Test Bench

set script_parts_dir=script-parts
set script_file_name=script.csv

REM-Prüfstandsaufbau
copy /b %script_parts_dir%\setup.csv %script_file_name%

Einrichtung des digitalen REM-Oszilloskops
copy /b %script_file_name% + %script_parts_dir%\setup_dso.csv
copy /b %script_file_name% + %script_parts_dir%\dso_write_timescale_200us.csv

Die REM-LED leuchtet nicht(Die LED-Spannung beträgt weniger als 200 mV)
copy /b %script_file_name% + %script_parts_dir%\eval_int_lt0200.csv

Schalten Sie das REM-Relais ein und
copy /b %script_file_name% + %script_parts_dir%\operation_relay_on.csv
REM 1.LED-Beleuchtungsspannung größer als 1700 mV und kleiner als 1900 mV
copy /b %script_file_name% + %script_parts_dir%\dso_query_vmax_gt1700-lt1900.csv
REM 2.Die LED-Beleuchtungsfrequenz ist größer als 995 Hz und kleiner als 1005 Hz
copy /b %script_file_name% + %script_parts_dir%\dso_query_freq_gt995-lt1005.csv

Das REM-Relais ist ausgeschaltet und die LED-Spannung beträgt weniger als 200 mV.
copy /b %script_file_name% + %script_parts_dir%\operation_relay_off.csv
copy /b %script_file_name% + %script_parts_dir%\eval_int_lt0200.csv

5. Ergebnis der Testausführung

result.csv


# setup
# wait for if restart Arduino Uno
sleep,2,OK
#
# Open UART
open_uart,COM3,OK
#
# model and version check
send,i,OK
rcvd,Arduino Test Bench Ver.100,OK
eval_str_eq,Arduino Test Bench Ver.100,OK
#
# relay assigned Pin number check
send,p,OK
rcvd,12,OK
eval_int_eq,12,OK
#
# Setup DSO
open_dso,,OK
dso,*IDN?,RIGOL TECHNOLOGIES-DS1104Z-XXXXXXXXXXXXXX-00.04.04.SP3
eval_str_eq,RIGOL TECHNOLOGIES-DS1104Z-XXXXXXXXXXXXXX-00.04.04.SP3,OK
#
# Timebase Scale 200us
dso,:TIMebase:SCALe 0.0002,OK
#
# eval_int_lt0200
send,v,OK
rcvd,0,OK
eval_int_lt,200,OK
#
# relay ON
send,n,OK
sleep,1,OK
#
# 1.80V +/- 0.10V
dso,:MEASure:VMAX? CHANnel1,1.840000e+00
eval_dbl_gt,1.70,OK
eval_dbl_lt,1.90,OK
#
# 1000Hz +/- 5Hz
dso,:MEASure:FREQuency? CHANnel1,9.999999e+02
eval_dbl_gt,995,OK
eval_dbl_lt,1005,OK
#
# relay OFF
send,f,OK
sleep,1,OK
#
# eval_int_lt0200
send,v,OK
rcvd,0,OK
eval_int_lt,200,OK

6. Fazit

Die Go / No-Go-Beurteilung basierend auf dem Messergebnis des Oszilloskops könnte durch Python \ (^ o ^) / automatisiert werden

[^ 1]: Python float ist eine Gleitkommazahl mit doppelter Genauigkeit, aber im Allgemeinen ist float eine einfache Genauigkeit und double eine doppelte Genauigkeit, daher wird es hier als doppelter Typ geschrieben. [^ 2]: Die offizielle Website enthält Installationsanweisungen mit dem Befehl pip. Die Prozedur, die ich in der Miniconda-Umgebung mit dem Befehl conda installiert habe, lautet [hier](https://qiita.com/pbjpkas/items/bd483d4773468e26414c#22-python%E5%AE%9F%E8%A1%8C%E7% 92% B0% E5% A2% 83).

Recommended Posts

Testautomatisierung beginnend mit L-Chika (3) Einbau eines Oszilloskops
Testautomatisierung beginnend mit L-Chika (5) Embedded Web Camera und OCR
Erstellen Sie mit AirtestIDE eine Umgebung für die Testautomatisierung (Tipps)
Primzahlbeurteilung mit Python
Mit Codetest stärken ⑦
Mit Codetest stärken ⑨
Mit Codetest stärken ⑤
Primzahlbeurteilung mit Python
Python ab Windows 7
GRPC beginnend mit Python
Mit Codetest stärken ②
Python-Tag-Kooperationstest
Mit Codetest stärken ①
Testautomatisierung für die Arbeit
Mit Codetest stärken ⑧
Mit Codetest stärken ⑨
Der wahre Wert der Terraform-Automatisierung ab Oracle Cloud