RFID Reader auslesen mit Zeit und Transponder

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
wimmera
User
Beiträge: 4
Registriert: Freitag 3. November 2017, 12:24

Hallo zusammen,

Ich bin komplett neu in diesen Forum und auch was Python angeht ein richtiger Anfänger und hoffe auch Eure Unterstützung?
Wir sind ein Hobby Verein und veranstalten ein Laufevent.
Um die Laufzeiten zu Messen habe ich einen RFID Reader bei Ebay günstig ersteigert. Ich habe auch die Software dazu erhalten wo auch einige Python und Java Bsp. enthalten sind. Leider gibt es da kein Kontrollkästchen welches ich anklicke, wo mir die Daten ausgeleitet werden.
Ich kann die Bsp. direkt in den Reader importieren und an den Reader senden.
Leider fehlt mir bei der Ausgabe die Reader Zeit und die Ausgabe wird mir nur in einen neuen Web Tab angezeigt.
Ich hätte diese gerne als CSV Datei auf meinen Desktop.
Ich entschuldige mich schon mal im voraus, ich weis das in diesen Code mehr enthalten ist als ich benötige aber ich hoffe mir sagt jemand was ich wo hineinschreiben muss, dass dies funktioniert.
Dafür bedanke ich mich schon mal im Voraus
Lg
Alex

Code: Alles auswählen

#!/usr/bin/python -u
import socket
import time, sys, readline, re, getopt, os
import select
import traceback
import commands
import re
import saturn
import string
import binascii
import threading
import serial

#print a short help message
def usage():
    sys.stderr.write("""USAGE: %s [options]
    A demonstration of reader dio and event handling.
    Version: %s
   
    options:
    --host=<addr> Set the IP address of the C2 processor (defaults to localhost)
    --din_ll_low  Set digital input active logic level to low (default is high)
    --dout_ll_low Set digital output active logic level to low (default is high)
    --noserial    disable output to the serial port (default is enabled)
    --port=<PORT> serial port, a number (default is 0)
    --baud=<BAUD> serial port baudrate (default 1200)
    --rtscts      enable RTS/CTS flow control (default disabled)
    --xonxoff     enable software flow control (default disabled)
    --debug       enable debug information (default is debug disabled)
    --repr        in debug mode, enable escape nonprintable chars (defult is disabled)
    --scantime=<sec> When in timer mode, scan time in seconds (default 1 sec) 
    --outtime=<sec>  Digital output "on" time (default 1 sec) 
    --static      disable timed mode 
                  digital input 1 high  on turns reader on
                  digital input 1 low off turns reader off
                  (default is timed mode)                    
    --eot_mode=<mode>  0=cr terminator (default) 
                       1=lf terminator           
                       2=crlf terminator           
                       3=ETX terminator           
    --fancy       enable sending of blank and flash LED control characters (default disabled)                    
    --version     display version number
    --help        display usage information
    
    Note: For this app to fuction, the reader must be configured with the serial 
    console program disabled.  This can be accomplished with the C2 command
    "com.serial.console(program=none)". 


""" % (sys.argv[0], VERSION ))

VERSION="1.0"
HOST = 192.168.1.107
COMMAND_PORT =50007 
EVENT_PORT   =50008 
SERIAL_PORT=COM1
BAUDRATE=9600
rtscts=0
xonxoff=0
debug = False
repr_mode = False
bcc_mode = False
tag_found = False
serial_out = True 
timed_mode = True 
scantime=float(1)
plain=True
outtime=1
din_ll = "1"
dout_on = "1"
dout_off = "0"
dout_time = float(1)
eot_mode=0
demo_out=''
CR='\x0D'
LF='\x0A'
CRLF='\x0D\x0A'
ESC='\x1B'
BL_ON='B1'    # blank on
BL_OFF='B0'   # blank off
FL_ON='F1'    # flash on
FL_OFF='F0'   # flash off
EOT=CR

try:
    opts, args = getopt.getopt(sys.argv[1:], "", ["baud=", "sport=", "rtscts", "xonxoff",  "debug", "host=", "repr" ,"noserial", "din_ll_low", "dout_ll_low", "static", "scantime=", "outtime=", "eot_mode=", "fancy", "version"])
except getopt.GetoptError:
    usage()
    sys.exit(2)

for o, a in opts:
    if o == "--host":
        HOST = a 
    if o == "--debug":
        debug = True
    if o == "--repr":
        repr_mode = True
    if o == "--rtscts":
        rtscts=1 
    if o == "--xonxoff":
        xonxoff=1 
    if o == "--baud":
        BAUDRATE = int(a)
    if o == "--sport":
        SERIAL_PORT = int(a)
    if o == "--noserial":
        serial_out = False 
    if o == "--static":
        timed_mode = False 
    if o == "--din_ll_low":
        din_ll = "0" 
    if o == "--fancy":
        plain = False 
    if o == "--eot_mode":
        try:
          eot_mode=int(a)
          if (eot_mode) > 3 or (eot_mode < 0):
            raise ValueError
        except ValueError:
            print "\nERROR: eot_mode must be an number between 0 and 3, not %r" % a
            usage()
            sys.exit(2)
          
    if o == "--outtime":
        try:
            outtime= float(a)
        except ValueError:
            print "\nERROR: douttime must be an number, not %r" % a
            usage()
            sys.exit(2)
    if o == "--scantime":
        try:
            scantime = float(a)
        except ValueError:
            print "\nERROR: scantime must be a number, not %r" % a
            usage()
            sys.exit(2)

    if o == "--dout_ll_low":
        dout_on = "0" 
        dout_off = "1" 

    if o == "--version":    
        print "Program %s - Version: %s" % (sys.argv[0], VERSION)
        sys.exit(0)

#
# process tag info and turn on/off digital io's 
#
def process_info():
    global tag_found
    global demo_out
    
    if plain == False:
      send_serial(ESC+BL_ON) # turn blank on
      send_serial(ESC+BL_OFF) # turn blank off 
      send_serial(ESC+FL_ON) # turn flash on
      
    if tag_found == False:
        # send no tag found
        send_serial("No tag found")
        # turn on digital output 2
        cmd.sendcommand('dio.out.2='+dout_on)
        time.sleep(outtime)
        cmd.sendcommand('dio.out.2='+dout_off)
    else:
        # send the tag id
        send_serial(demo_out)
        # turn on digital output 1 
        cmd.sendcommand('dio.out.1='+dout_on)
        time.sleep(outtime)
        cmd.sendcommand('dio.out.1='+dout_off)
        tag_found = False
        print "sent output %s" % repr(demo_out)
    if plain == False:
      send_serial(ESC+FL_OFF) # turn flash off 
    # clear demo_out for the next run    
    demo_out=''


#
# function to respond to timer pops  
#
def polled_timer():
    global timer_running
    global tag_found
    global demo_out

    #
    # get the current operating mode
    #
    try:
      rc = cmd.sendcommand('setup.operating_mode')
      if rc[0] == "ok":
          if rc[1] == "autonomous":
              # timer popped and we're in autonomous mode.
              # switch to standby
              print "timer popped, switching to standby"
              rc = cmd.sendcommand('setup.operating_mode=standby')
              if rc[0] != "ok":
                  print "setup error: %s " % rc[0]
              else :
                  print "reader is in standby mode"

              # process the info and turn on/off io's
              process_info()    
                  
          else:
              print "hmmmm... someon else popped us out of auton mode"
              if tag_found == False:
                pass
              else:  
                tag_found = False
                
          
      else:
          print "mode error: " % rc
      # turn off the timer running indicator
      print "turn timer running off"
      timer_running = 0
    except:    
      # turn off the timer running indicator
      timer_running = 0
      tag_found = False
      traceback.print_exc(sys.stdout)


#
# handle a reader mode change based on changes of the digital inputs 
# 
def mode_change(state):

    global timer_running
    global din_ll
   
    if timed_mode:
      # if the timer is still running from previous events,
      # ignore this event
      if timer_running == 1:
          print "timer already running..."
          return
    
    try:
      # parse the respone
      if state == din_ll:
         # the io pin is high, go to autonomous mode
         print "dio.in.%s:  %s - " % (dio_pin, state),
         rc = cmd.sendcommand('setup.operating_mode=autonomous') 
         if rc[0] != "ok":
             print "setup error: %s " % rc[0]
         if timed_mode:
           # start the timer
           if debug:
             print "starting timer"
           timeout=scantime
           t = threading.Timer(timeout, polled_timer)
           t.start()
           timer_running = 1
      else:
         # go to standby mode
         print "dio.in.%s:  %s - " % (dio_pin, state),
         rc = cmd.sendcommand('setup.operating_mode=standby')
         if rc[0] != "ok":
             print "setup error: %s " % rc[0]
             
         if timed_mode == False:
             # not in timed mode, process info and turn on/off dio
             process_info()
         
    except: 
      traceback.print_exc(sys.stdout)
    #
    # display the current operating mode
    #
    rc = cmd.sendcommand('setup.operating_mode')
    if rc[0] == "ok":
        print "mode change reader is in %s mode" % rc[1]
    else:
      print "mode error: " % rc

#
# parse an event, looking for a field name.  if found, return
# the value of the field, up to the field size
#
def parse_event(event, field_name, field_size):
      rdata = "NULL"
      # try to find the field name in the event  
      field_index=event.find(field_name)
      if field_index != -1:
        # field the found, skip over the field name
        field_index += len(field_name)
        # extract the value of the field
        rdata=event[field_index:field_index+field_size]
        if debug:
          print "parse_event %s" % rdata
          
      return rdata

#
# send a response out the serial port
def send_serial(response):
  try:
    if response == "":
      return
    else:
      response = STX + response 
      if bcc_mode:
        # calculate block check (xor of data)
        bcc = 0
        for i in response:
           bcc ^= ord(i)
           
        response = response + EOT + str("%02x" % bcc)
        if debug:
            print "bcc of response %02x" % bcc 
      else:     
        response += EOT 
        if debug:
            if repr_mode:
              print "sending response %s" % repr(response)
            else:
              print "sending response %s" % response 
      
      if serial_out:
        if debug:
          print "writing to serial port...."
        for char in response:
          sport.write(char)
        
      response = ""
  except:   
    traceback.print_exc(file=sys.stdout)

#
# callback to handle digital io events
#
def dio_event(event):

  try:  
    if event == "event.dio.in.1 value=0":
      mode_change("0")
    elif event == "event.dio.in.1 value=1":
      mode_change("1")
    else:  
      print "dio event: %s" % event
  except:   
    traceback.print_exc(file=sys.stdout)
    
#
# callback to handle tag arrive events
#
def tag_event(event):
  global tag_found
  global timer_running
  global timed_mode
  global demo_out 

  try:   
    # process tag event 
    tag_id=parse_event(event,'tag_id=0x',24)
    if debug:
      print "got tag event %s" % tag_id
      print "tag_found %d" % tag_found
    if tag_id != 'NULL':
      if ((timer_running)  or (timed_mode == False)):
        if (tag_found != True):
          tag_found=True
          # turn the hex tag data into ascii  
          demo_out = binascii.unhexlify(tag_id)
  except:   
    traceback.print_exc(file=sys.stdout)

#
# callback for unknown events
#
def unknown_event(event):
    print "unknown event: %s" % event
    send_serial( event)
#
# main callback for all events
#
def event_receiver(event):    
    if debug:
      print "event receiver: %s" % event
      
    # parse the first nine chars of the event.
    # use these chars to index into the event_handlers list.
    # this will invoke the proper event callback routine, passing in
    # the entire event string
    event_handlers.get(event[:9], unknown_event)(event)

#
# list of events and their callbacks
#
event_handlers = {
    'event.dio': dio_event,
    'event.tag': tag_event,
}    

#
# start of main execution
#
try:
        if eot_mode == 0:
          # cr terminator
          STX=''
          EOT=CR
        elif eot_mode == 1:
          # lf terminator
          STX=''
          EOT=LF
        elif eot_mode == 2:
          # crlf terminator
          STX=''
          EOT=CRLF
        elif eot_mode == 3:
          # etx terminator
          STX='\02'
          ETX='\03'
          EOT=ETX
          
        dio_pin="1"
        timer_running = 0

        # open the command channel
        cmd = saturn.Command(HOST,COMMAND_PORT)
        # open the event channel
        evt = saturn.Event(HOST,EVENT_PORT)
        # obtain the event channel id
        evtid = evt.getid()
        
        if debug:
          print "Event channel id = %s" % evtid

        #
        # register for tag arrive events
        #
        cmd.sendcommand('reader.events.register(id='+evtid+',name=event.tag.arrive)')
        #
        # register for dio events
        #
        cmd.sendcommand('reader.events.register(id='+evtid+',name=event.dio.in.'+dio_pin+')')

        if serial_out:
          # open the serial port
          try:
            sport = serial.Serial(SERIAL_PORT, BAUDRATE, rtscts=rtscts, xonxoff=xonxoff)
          except:
            sys.stderr.write("Could not open port\n")
            sys.exit(1) 

        # print out the startup parameters
        print "Program %s - Version: %s" % (sys.argv[0], VERSION)
        print "Startup parameters:"
        print "\tHOST = %s " % HOST
        print "\tdebug =", 
        if debug: print "enabled" 
        else: print "disabled"
        print "\trepr =", 
        if repr_mode: print "enabled" 
        else: print "disabled"
        print "\trtscts =", 
        if rtscts: print "enabled" 
        else: print "disabled"
        print "\txonxoff =", 
        if xonxoff: print "enabled" 
        else: print "disabled"
        print "\tbaud = %d" % BAUDRATE 
        print "\tsport = %d" % SERIAL_PORT 
        print "\tserial output =",
        if serial_out: print "enabled" 
        else: print "disabled"
        print "\tstatic =",
        if timed_mode: print "disabled" 
        else: print "enabled"
        print "\tdin_ll active high = %s" % din_ll 
        print "\tdout_ll active high = %s" % dout_on 
        print "\tfancy =",
        if plain: print "disabled" 
        else: print "enabled"
        print "\teot_mode = %d" % eot_mode 
        print "\touttime = %.1f" % outtime 
        print "\tscantime = %.1f" % scantime 
        print "\tversion = %s" % VERSION
        print "\n"

        # set callback for events.  go into polling loop and wait for events
        evt.receive(event_receiver)

except:
    traceback.print_exc(file=sys.stdout)

cmd.close()
evt.close()
        
        
Sirius3
User
Beiträge: 17745
Registriert: Sonntag 21. Oktober 2012, 17:20

@wimmera: leider ist das Programm überhaupt nicht zu gebrauchen. Chaotische Einrückungen, Unmengen an globalen Variablen, veraltete Bibliotheken, ... Bevor man da neue Funktionalität einbauen könnte, müßte man alles wegschmeißen und neu schreiben.
wimmera
User
Beiträge: 4
Registriert: Freitag 3. November 2017, 12:24

Hallo Sirius und Danke für Deine Antwort,
Ich habe das schon befürcht :wink:
Ich habe etwas (so hoffe ich hald) etwas übersichtlichere?
Wenn das nicht hilft, was hätte ich für eine Alternative?
Ich würde dies sogar als Auftrag geben wenn es nicht zu teuer ist?

Danke für Deine Rückmeldung

Lg
Alex

Code: Alles auswählen

#!/usr/bin/python -u
#
# sample reader python script.
#
# purpose: turn on a digital output pin upon a successful tag read
#
# inputs: optional, pin - digital output pin number (1-4). Default is digital out 1
#         optional, time, in miliseconds, to keep the digital output high. Default
#         is 1000 milliseconds (1 sec).
#         optional, logic level for digital out "on", 0 or 1. Default is 1 for
#         "on"
#         
##
# This routine will turn on a dio output if a tag is successfully read.  The
# dio output pin number can be specified on the command line.  If not
# specified, a dio output 1 is used.
# The output pin will remain high for n milliseconds, where n is either the default
# of 1000 milliseconds, or the value supplied on the command line.  Minimum
# value for n is 10 milliseconds.  

# examples: 
#    signal_read.py         # turns on digital output 1 for 1000 milliseconds on tag reads
#    signal_read.py 2       # turns on digital output 2 for 1000 milliseconds on tag reads
#    signal_read.py 1 5000  # turns on digital output 1 for 5000 milliseconds on tag reads
#    signal_read.py 1 500   # turns on digital output 1 for 500 milliseconds on tag reads
#    signal_read.py 1 800 0 # turns on digital output 1, logic level 0, for 800 milliseconds on tag reads
# 

import saturn
import re
import commands
import time 
import sys
from sys import argv

#
# callback for dio events
#
def tag_arrive(data):

    try:
      # parse the respone
      print "tag arrive  %s " % (data)
    except: 
      print "setup error" 
    rc = cmd.sendcommand('dio.out.'+dio_pin+'='+dio_hi)
    if rc[0] != "ok":
        print "setup error for dio.out: %s " % rc[0]
    print "sleep for : %f " % on_time 
    time.sleep(on_time)
    print "done sleep for : %f " % on_time 
    rc = cmd.sendcommand('dio.out.'+dio_pin+'='+dio_lo)
    if rc[0] != "ok":
        print "setup error for dio.out: %s " % rc[0]
   
#
# default for dio out pin number 
#
try:
   dio_pin = argv[1]
except:
   dio_pin = "1"
#
# default for on time for dio out pulse 
#
try:
   on_time_ms = float(argv[2])
   on_time = float(on_time_ms/1000)
except:
   on_time = 1
#
# default for output logic level
#
try:
   if int(argv[3]) not in range(0,2):
       dio_hi = "1"
   else:
       dio_hi = str(argv[3])
except:
   dio_hi = "1"

if dio_hi == "1":
  dio_lo = "0"
else:
  dio_lo = "1"

#
# setup the command and event session
#
cmd = saturn.Command('localhost',50007)
evt = saturn.Event('localhost',50008)

evtid = evt.getid()
print "Event Id = ",evtid
print "on time = %f" % on_time

#
# make sure the dio output pin is off 
#
rc = cmd.sendcommand('dio.out.'+dio_pin+'='+dio_lo)
if rc[0] != "ok":
    print "setup error for dio.out: %s " % rc[0]

#
# register for tag arrive events
#
cmd.sendcommand('reader.events.register(id='+evtid+',name=event.tag.arrive)')
evt.receive(tag_arrive)

cmd.close()
evt.close()
__deets__
User
Beiträge: 14533
Registriert: Mittwoch 14. Oktober 2015, 14:29

Ein solches Zeitmesssystem ist nicht trivial. Da reden wir von Tagen Arbeit, und das unter der Vorraussetzung, das es ueberhaupt technisch geeignet ist.

Probleme die ich sehe:

- Computer-Uhren sind unzuverlaessig. Woher kommen der gueltige Zeitstempel? DCF77 faellt einem ein, muss aber angebunden werden. Oder NTP. Ist Netzwerk verfuegbar an der Strecke? Oder gibt es gar eine offizielle Uhr? Wie kommt man an die ran?
- kann das System mit mehreren Laeufern die zur gleichen Zeit am Messpunkt eintreffen umgehen?
- ist die Erfassung des RFID-Tags wiederholgenau, oder kann sich der Messort (und damit Zeitpunkt) abhaengig von der Laeuferposition veraendern?
- wie ist sichergestellt, dass der Laeufer ueberhaupt erfasst wird, oder kann es passieren das sie vorbeirennt, ohne auszuloesen?
- wie werden RFID-Tags zu Laeufern zugeordnet? Wenn es schon ein System zur Verwaltung der Laeufer gibt, wie kann das an/eingebunden werden?

Und ich nehme mal an das alles soll schnell fertig werden...

Ich wuerde mich auf die Suche nach Alternativen begeben. Solche Anlagen kann man sicher auch mieten.
wimmera
User
Beiträge: 4
Registriert: Freitag 3. November 2017, 12:24

Ein solches Zeitmesssystem ist nicht trivial. Da reden wir von Tagen Arbeit, und das unter der Vorraussetzung, das es ueberhaupt technisch geeignet ist.
Geeignet ist es, ich habe einen Feig Reader, also ein zweitgerät der mir von der Originalsoftware durch klicken eines Kontrollkästchen alle benötigten Daten ausgibt und ist auch schon Wettkampf erbrobt. Leserate 100%
Bei dem Reader um den es geht ist ein Sirit Infinity 510 (eigendlch das bessere Gerät) hat leider nicht diese tolle Software und ist für eine Programmierleihen sicher nicht das richtige Gerät. Meine Situation ist aber, dass ich Ihn habe und sehr günstig ersteigert habe. Technisch ist das Gerät einwandfrei.

Probleme die ich sehe:
- Computer-Uhren sind unzuverlaessig. Woher kommen der gueltige Zeitstempel? DCF77 faellt einem ein, muss aber angebunden werden. Oder NTP. Ist Netzwerk verfuegbar an der Strecke? Oder gibt es gar eine offizielle Uhr? Wie kommt man an die ran?
Der Reader Besitzt eine eigene Baterie und die Uhrzeit kann im Reader eingestellt werden. Grundsätzlich gibt er die Zeit mit aus.
Der Reder ist über eine Serielle Schnittstelle RS mit dem PC232 oder mit dem Ethernet verbunden.
- kann das System mit mehreren Laeufern die zur gleichen Zeit am Messpunkt eintreffen umgehen?
Ja das funktioniert
- ist die Erfassung des RFID-Tags wiederholgenau, oder kann sich der Messort (und damit Zeitpunkt) abhaengig von der Laeuferposition veraendern?
Natürlich gibt es verschiedene Antennen Arten. Das kann mann nur über eine Bodenmatten Antenne gewährleisten. Die hat eine lineare polarisation.
Ich habe normalle Antennen 4 Stück, welche wie ein Gate aufgebaut sind. Bei mir ist Polarization Circular. Also eine Wolke.
Da könnte Theoretisch der zweite der erste sein. Das ist aber für unser Rennen Sekundär, da wir nicht den Berlin Marathon messen :lol:
Unser Teilnehmerfeld besteht maximal aus 200 Startern und es wird via Einlaufliste mitdokumentiert.
- wie ist sichergestellt, dass der Laeufer ueberhaupt erfasst wird, oder kann es passieren das sie vorbeirennt, ohne auszuloesen?
Natürlich kann das pasieren, Generell hat man mit einen Transponder eine 98% Trefferquote. In der Regel werden zwei verwendet wodurch man eine 99% trefferquote gewährleistet wird. Diese wird über ein Backup Einlaufliste bzw. zweit Reader korrigiert.
- wie werden RFID-Tags zu Laeufern zugeordnet? Wenn es schon ein System zur Verwaltung der Laeufer gibt, wie kann das an/eingebunden werden?
Die Transponder habe ich Codiert also nicht wie üblich 1X15464684irgendwas sondern 0001,0002,0003,0004........ wie die Startnummer.
Ich verwende Access und VBA als auswertesoftware. Dabei funktioniert die CSV als Schnitstelle in dem ich die CSV als Tabelle in meine DB Verknüpfe aktualisiere und auswerte.
Und ich nehme mal an das alles soll schnell fertig werden...
Ja bitte :lol:
Nein! ich habe bis Februar Zeit, dann ist das nächste Event.
Ein 12 Stunden Tourenskirennen und den zweiten Reader benötige ich für die Bergstation um die Aufstiegszeiten zu messen.
Ich wuerde mich auf die Suche nach Alternativen begeben. Solche Anlagen kann man sicher auch mieten.
Das ist mir schon klar, aber mieten ist bei 4 - 5 Events im Jahr ist für einen non Profit Verein zu teuer, da das Geld für einen Guten Zweck und für unsere Kinder / Jugendförderung verwendet wird.

Ich habe jetzt noch was und vieleicht hilft ja das weiter?
läuft über PowerShell und funktioniert solala.
Ich bin mir nicht mal sicher was das für eine Sprache ist, PHP oder?

Ich hoffe das ich alle Fragen beantworten konnte und hoffe auf Unterstützung

Thx
Lg
Alex

Code: Alles auswählen

##############################################
# DEFINES                                    #
##############################################

$COMPortname = "COM1"
$Speed = 9600
$IntervalTime = 500 # in milliseconds
$showFields = @("tag_id", "tid", "user_data", "user_data_offset", "type", "time", "antenna", "repeat")
$outfile = "$env:USERPROFILE\Desktop\tags.csv"
$outfileDelimiter = ","
##############################################

$port = new-Object System.IO.Ports.SerialPort $COMPortname,$Speed

"Open port"
$port.Open()
if(!$?) {
    "Could not open port. Is another application using it?"
    return 
}
"configure antenna to send all fields"
$port.WriteLine( "setup.operating_mode=active`r" )
start-sleep -m 500
$port.WriteLine( "tag.reporting.taglist_fields=$($showFields -join " ")`r" )
start-sleep -m 500
$port.WriteLine( "tag.db.purge()`r" )
start-sleep -m 500
$port.WriteLine( "tag.db.max_count=10000`r" )
start-sleep -m 500
$port.ReadExisting()


"This script runs until you close it"
    new-item $outfile -force -Value ""
while($true) {
    $port.WriteLine( "tag.db.get()`r" )
     
    start-sleep -m $IntervalTime
    $text = $port.ReadExisting()
    
    $start = $false
    $($showFields -join $outfileDelimiter) > $outfile
    "$(get-date -format s): Writing to file "
    $entries = @()
    foreach($line in $text.split("`n")) {

        if($line.trim() -eq "ok") {
            $start = $true
            continue
        }

        if(!$start) { continue }
        if($line.Trim() -eq ">>>" -or $line.trim() -eq "") { continue}

        $entries += new-object psobject -Property $($line.trim().replace(",", "`n").replace("(", "").replace(")", "") | ConvertFrom-StringData )
    }

    $entries | Export-Csv -Delimiter $outfileDelimiter -NoTypeInformation -Path $outfile
    
}

$port.ReadExisting()
$port.Close()
__deets__
User
Beiträge: 14533
Registriert: Mittwoch 14. Oktober 2015, 14:29

Ok, das Gerät klingt ja gut. Aber der hat auch ein 260 Seiten starkes Manual zur Programmierung. Das wird trotzdem teuer :K
wimmera
User
Beiträge: 4
Registriert: Freitag 3. November 2017, 12:24

Hi und Danke für Deine Antwort,

Naiv wie ich bin habe ich an einen Zweizeiler gedacht.
So quasi ein give me all…. und das ganze als CSV.
Ich brauch ja nicht mehr als die Readerzeit und die TransponderNr.
Ich glaube nicht, dass man dann das ganze Manual Zereisen muss?
__deets__
User
Beiträge: 14533
Registriert: Mittwoch 14. Oktober 2015, 14:29

Man muss schon verstehen, was die Kiste macht. Und von dir die ausreichend präzise Spezifiktaion zu erhalten kostet ja auch Zeit, da ist noch sehr sehr viel unklar. Testläufe & Fehlerbehebung etc... Und mit dem ganzen hin und her sind das zwei, drei Tage in Summe bis das steht. Da mag ich mich irren, aber ohne da jetzt richtig einzusteigen klingt das danach.

Vielleicht findest du ein Meetup bei dir in der Nähe, oder eine Python Usergroup oder so, und kannst das Ding da mal vorführen, existierend Software und Wünsche inklusive. Vielleicht kann dann da einer was spontaner zu sagen wie schwierig da wirklich ist - wie gesagt, aus der Ferne wirkt das erstmal wie ein ordentliches Brett.
Antworten