def main(): ''' Create our window and comm driver ''' global root global comm global ProductionCount # create a comm driver comm = PLC() comm.IPAddress = ipAddress # create a tkinter window root = Tk() root.config(background='black') root.title = 'Production Count' root.geometry('800x600') # bind the "q" key to quit root.bind('q', lambda event:root.destroy()) # create a labe to display our variable ProductionCount = Label(root, text='n', fg='white', bg='black', font='Helvetica 350 bold') ProductionCount.place(anchor=CENTER, relx=0.5, rely=0.5) # call our updater and show our window root.after(1000, UpdateValue) root.mainloop() comm.Close()
def main(): ''' Create our window and comm driver ''' global root global comm global ProductionCount # create a comm driver comm = PLC() comm.IPAddress = ipAddress # create a tkinter window root = Tk() root.config(background='black') root.title = 'Production Count' root.geometry('800x600') # bind the "q" key to quit root.bind('q', lambda event: root.destroy()) # create a labe to display our variable ProductionCount = Label(root, text='n', fg='white', bg='black', font='Helvetica 350 bold') ProductionCount.place(anchor=CENTER, relx=0.5, rely=0.5) # call our updater and show our window root.after(1000, UpdateValue) root.mainloop() comm.Close()
def door_active(door): # Check verify_trailers table for active route routes = "SELECT route FROM wcs.verify_trailers WHERE door_id=" + str(door) cursor.execute(routes) result = cursor.fetchall() routes = [] if len(result) > 0: for r in result: routes.append(r[0]) #print(routes) doorActive = False for route in routes: #print("") #print(route) pre_verify = "SELECT pre_verify FROM wcs.verify_trailers WHERE route=" + str( route) cursor.execute(pre_verify) result = cursor.fetchone() pre_verify = result[0] #print(pre_verify) status = "SELECT status FROM wcs.verify_trailers WHERE route=" + str( route) cursor.execute(status) result = cursor.fetchone() status = result[0] #print(status) if pre_verify == 1 and status != "Shipped": doorActive = True break else: doorActive = False else: doorActive = False #print(doorActive) if doorActive == True: with PLC() as comm: comm.IPAddress = plcIP comm.Write("wxsDoor" + str(door) + "Control", 1) elif doorActive != True: with PLC() as comm: comm.IPAddress = plcIP comm.Write("wxsDoor" + str(door) + "Control", 0) ret = comm.Read("wxsDoor" + str(door) + "Control", datatype=INT) #print(ret.Value) comm.Close() if doorActive == True: return "Door " + str(door) + " is Active" elif doorActive != True: return "Door " + str(door) + " is Inactive"
def WriteSEQCount(): comm = PLC() comm.IPAddress = '169.254.215.82' seqcount = entry1.get() seqcount = int(seqcount) comm.Write('SEQCount', seqcount) time.sleep(.22) comm.Close() return
def comm_check(): global comm ip = selectedIPAddress.get() port = int(selectedProcessorSlot.get()) if (comm.IPAddress != ip or comm.ProcessorSlot != port): comm.Close() comm = None comm = PLC() comm.IPAddress = ip comm.ProcessorSlot = port
def get_all_tags(ipAddress, slot): tags = [] comm = PLC(ipAddress, slot) ret = comm.GetTagList() comm.Close() if ret.Value is None: return jsonify(ret.Status) for tag in ret.Value: tags.append({"tagName": tag.TagName, "dataType": tag.DataType}) return jsonify({'tags': tags})
def get_production(tag_prefix): with PLC() as comm: comm.IPAddress = '192.168.1.2' comm.ProcessorSlot = 2 hourly = [] totals = [] for shift in range(3): shift_counts = [] for hour in range(8): tag_name = tag_prefix + 'Shift_' + \ str(shift+1) + '_Hour_' + str(hour+1) + '_Total' # print(tag_name) ret = comm.Read(tag_name) # print(ret.TagName, ret.Value, ret.Status) if ret.Status == 'Success': shift_counts.append(ret.Value) else: shift_counts.append('Error') hourly.append(shift_counts) tag_name = tag_prefix + 'Shift_' + str(shift + 1) + '_Total' ret = comm.Read(tag_name) # print(ret.TagName, ret.Value, ret.Status) if ret.Status == 'Success': totals.append(ret.Value) else: totals.append('Error') return (hourly, totals)
def get_devices(ipAddress, slot): devices = [] comm = PLC(ipAddress, slot) ret = comm.Discover() comm.Close() if ret.Value == []: return jsonify('No Devices Discovered') for device in ret.Value: devices.append({ "productName": device.ProductName, "revision": device.Revision }) return jsonify({'devices': devices})
def Scan(host): plc_ip = host with PLC() as comm: comm.IPAddress = plc_ip prop = comm.GetModuleProperties(0) if prop.Value.ProductName: PLC_id_file.write("AB" + " | " + plc_ip + " | " + prop.Value.Vendor + " " + prop.Value.ProductName + '\n') print prop.Value.ProductName, prop.Value.Revision
def closepop(self): global clx global ismicro global firstrun firstrun = True if ipset: clx = PLC(ip, 2) if ismicro: App.get_running_app( ).root.ids.iplabel.text = 'Connected ' + ip + ' Micro800' else: App.get_running_app( ).root.ids.iplabel.text = 'Connected ' + ip + ' Logix' clx.Micro800 = ismicro print(ismicro) Clock.schedule_interval(update, 0.25) else: print('Nop')
def comm_check(): global comm global updateRunning global connected global connectionInProgress try: connectionInProgress = True ip = selectedIPAddress.get() port = int(selectedProcessorSlot.get()) if (not connected or comm.IPAddress != ip or comm.ProcessorSlot != port or changePLC.get() == 1): if not comm is None: comm.Close() comm = None comm = PLC() comm.IPAddress = ip if checkVarMicro800.get() == 0: comm.ProcessorSlot = port comm.Micro800 = False else: comm.Micro800 = True plcTime = comm.GetPLCTime() lbConnectionMessage.delete(0, 'end') lbErrorMessage.delete(0, 'end') if plcTime.Value is None: if btnStop['state'] == 'disabled': btnStart['state'] = 'disabled' btnStart['bg'] = 'lightgrey' lbConnectionMessage.insert(1, ' Not Connected') lbErrorMessage.insert(1, ' ' + plcTime.Status) connected = False root.after(5000, start_connection) else: lbConnectionMessage.insert(1, ' Connected') if not updateRunning: updateRunning = True connected = True connectionInProgress = False if btnStop['state'] == 'disabled': btnStart['state'] = 'normal' btnStart['bg'] = 'lightgreen' else: start_update() changePLC.set(0) except Exception as e: if app_closing: pass else: print(str(e))
def get_tag_list(ip, slot=0): from pylogix import PLC with PLC() as comm: comm.IPAddress = ip comm.ProcessorSlot = slot tags = comm.GetTagList() for t in tags.Value: print(t.TagName, t.DataType)
def run(self): self.running = True with PLC() as plc: plc.IPAddress = global_parameters['PLC_IP'] current_time = self.time_Q.get() counter = 0 while True: if self.stopped: return if current_time < time.time() and current_time > 0: if counter == 0: s = time.time() print("Sending instructions to PLC...") counter += 1 if not self.instruction_Q.empty(): instruction = self.instruction_Q.get() to_send = np.around(instruction, 2) ### PLC write instruction ### print(instruction) # plc.Write("<tag0>", value=instruction[0]) # plc.Write("<tag1>", value=instruction[1]) # plc.Write("<tag2>", value=instruction[2]) # plc.Write("<tag3>", value=instruction[3]) # plc.Write("<tag4>", value=instruction[4]) # plc.Write("<tag5>", value=instruction[5]) # plc.Write("<tag6>", value=instruction[6]) # plc.Write("<tag7>", value=instruction[7]) ############################# current_time = self.time_Q.get() else: print("ERROR: Instruction size mismatch.") elif current_time == 0 and counter != 0: # Send a stop order to stop all motion # plc.Write("<tag0>", value=instruction[0]) # plc.Write("<tag1>", value=instruction[1]) # plc.Write("<tag2>", value=instruction[2]) # plc.Write("<tag3>", value=instruction[3]) # plc.Write("<tag4>", value=instruction[4]) # plc.Write("<tag5>", value=instruction[5]) # plc.Write("<tag6>", value=instruction[6]) # plc.Write("<tag7>", value=instruction[7]) counter = 0 print("Instruction completed. \nExecution time:", round(time.time() - s, 2), "s\n") current_time = self.time_Q.get( ) # get is a locking function so it stays here until the next instruction comes in self.instruction_Q.get() # Clears out the 0 instruction
def audit_rack(plc): ''' Query each slot for a module ''' with PLC() as c: c.IPAddress = plc.IPAddress f.write('%s - %s\n' % (plc.IPAddress, plc.ProductName)) for i in range(17): x = c.GetModuleProperties(i) f.write('\tSlot %d:%s rev:%s\n' % (i, x.ProductName, x.Revision)) f.write('')
def timeTestforReadWrite(): ''' testing the time to read and write to the PLC ''' from pylogix import PLC import time DiamondElements = PLC('192.168.1.10') #AB PLC IP Address count = 0 targetCycleCount = 1000 startTime = time.time() """ read the bool, write its opposite value, read it again. """ while True: returnedValue = DiamondElements.Read('IO_NEEDED_HERE') print('Currently read value of ' + returnedValue.TagName + ': ' + str(returnedValue.Value)) if returnedValue.Value == True: boolToWrite = 0 else: boolToWrite = 1 DiamondElements.Write('IO_NEEDED_HERE', boolToWrite) newReturnedValue = DiamondElements.Read('IO_NEEDED_HERE') print('New value after writing: ' + str(newReturnedValue.Value)) if count >= targetCycleCount: break count += 1 EndTime = time.time() totalTime = EndTime - startTime print(f"{totalTime:.4f} seconds with {targetCycleCount} read/write cycles")
def poll_ribbon_switch(door): with PLC() as comm: comm.IPAddress = plcIP ret = comm.Read("wxsDoor" + str(door) + "RibbonSwitch", datatype=BOOL) switch = ret.Value if switch == True: delete = modal.delete(door) if delete == "Done": comm.Write("wxsDoor" + str(door) + "RibbonSwitch", False)
def loop(taglist, ip, slot=0, minimum_cycle=.5): with PLC() as comm: comm.IPAddress = ip comm.ProcessorSlot = slot for entry in taglist: # get current timestamp now = time.time() frequency = entry['frequency'] # make sure we are not polling too fast if frequency < minimum_cycle: frequency = minimum_cycle # handle first pass through if entry['nextread'] == 0: entry['nextread'] = now if entry['nextread'] > now: continue # too soon move on entry['lastread'] = now if entry['type'] == 'counter': with PLC() as comm: comm.IPAddress = ip comm.ProcessorSlot = slot read_counter(entry, comm) if entry['type'] == 'value': with PLC() as comm: comm.IPAddress = ip comm.ProcessorSlot = slot read_value(entry, comm) # set the next read timestamp entry['nextread'] += frequency
def get_rabbit_bypass(prefix): """ Gets a red rabbit's bypass status. Return 0, 1 and datetime, or -1)""" with PLC() as comm: comm.IPAddress = '192.168.1.2' comm.ProcessorSlot = 2 res = comm.Read(prefix + '.Bypassed') if res.Status == 'Success': if res.Value: return res.Value, get_date_time(prefix + '.Date_Time') else: return res.Value, None else: return -1, None
def PauseSEQ(): comm = PLC() comm.IPAddress = '169.254.215.82' comm.Write('SEQPause', True) time.sleep(.25) comm.Write('SEQPause', False) comm.Close() return
def Emergency(): comm = PLC() comm.IPAddress = '169.254.215.82' comm.Write('EmergencyPB', False) time.sleep(.250) comm.Write('EmergencyPB', True) comm.Close() return
def MasterOn(): comm = PLC() comm.IPAddress = '169.254.215.82' comm.Write('MasterStart', True) time.sleep(.25) comm.Write('MasterStart', False) comm.Close() return
def StartSEQ(): comm = PLC() comm.IPAddress = '169.254.215.82' comm.Write('StartSeq', True) time.sleep(.3) comm.Write('StartSeq', False) comm.Close() return
def SeqResume(): comm = PLC() comm.IPAddress = '169.254.215.82' comm.Write('SEQResume', False) time.sleep(.3) comm.Write('SEQResume', True) comm.Close() return
def get_date_time(tag_prefix): """ Returns a datetime object from a collection of tags """ with PLC() as comm: comm.IPAddress = '192.168.1.2' comm.ProcessorSlot = 3 tag_list = [ tag_prefix + '.Year', tag_prefix + '.Month', tag_prefix + '.Day', tag_prefix + '.Hour', tag_prefix + '.Min', tag_prefix + '.Sec' ] x = list(map(test_response, comm.Read(tag_list))) if -1 not in x: return datetime(*x)
def discoverDevices(): try: lbDevices.delete(0, 'end') commDD = PLC() devices = commDD.Discover() if str(devices) == 'None [] Success': lbDevices.insert(1, 'No Devices Discovered') else: i = 0 for device in devices.Value: lbDevices.insert(i * 12 + 1, 'IP Address: ' + device.IPAddress) lbDevices.insert(i * 12 + 2, 'Product Name: ' + device.ProductName) lbDevices.insert(i * 12 + 3, 'Product Code: ' + str(device.ProductCode)) lbDevices.insert(i * 12 + 4, 'Vendor: ' + device.Vendor) lbDevices.insert(i * 12 + 5, 'Vendor ID: ' + str(device.VendorID)) lbDevices.insert(i * 12 + 6, 'Device Type: ' + str(device.DeviceType)) lbDevices.insert(i * 12 + 7, 'Device ID: ' + str(device.DeviceID)) lbDevices.insert(i * 12 + 8, 'Revision: ' + device.Revision) lbDevices.insert(i * 12 + 9, 'Serial: ' + str(int(device.SerialNumber, 0))) lbDevices.insert(i * 12 + 10, 'State: ' + str(device.State)) lbDevices.insert(i * 12 + 11, 'Status: ' + str(device.Status)) lbDevices.insert(i * 12 + 12, '----------------------------------') i += 1 for device in devices.Value: if device.DeviceID == 14: lbDevices.insert(i * 12 + 1, 'Modules at ' + device.IPAddress) ''' Query each slot for a module ''' with PLC() as c: c.IPAddress = device.IPAddress for j in range(17): x = c.GetModuleProperties(j) lbDevices.insert(i * 12 + 2 + j, 'Slot ' + str(j) + ' ' + x.Value.ProductName + ' rev: ' + x.Value.Revision) c.Close() c = None i += 1 commDD.Close() commDD = None except Exception as e: if not commDD is None: commDD.Close() commDD = None if app_closing: pass else: print(str(e))
def rockwells(): with PLC() as comm: # 设备扫描 deviceip = [] devicename = [] devices = comm.Discover() for device in devices.Value: deviceip.append(device.IPAddress) devicename.append(device.ProductName + ' ' + device.IPAddress) global rockwell_device_list rockwell_device_list = dict(zip(devicename, deviceip)) # 创建设备字典 写入全局变量 scanresult = "扫描到" + str(len(rockwell_device_list)) + "台设备" print(scanresult) flash(scanresult, "scanresult") #扫描完成flash提示 return redirect("rockwellscan")
def __init__(self): super(CondorSkill, self).__init__(name="CondorSkill") self.myKeywords = [] # self.client = '' # mqtt.Client() # Initialize settings values self.client = mqtt.Client(self.id_generator()) #self.MQTT_Enabled = False #self.settings["MQTT_Enabled"] = False #self.broker_address = "192.168.0.43" #self.settings["broker_address"] = "" #self.broker_address #self.broker_port = 1883 #self.settings["broker_port"] = "" # self.broker_port #self.settings["plc_address"] = "" # '142.156.204.41' #self.plcOutTagName = "StartRobot" #self.settings["plc_out_tag_name"] = "" # self.plcOutTagName #self.plcInTagName = "RobotStarted" #self.settings["plc_in_tag_name"] = "" # self.plcInTagName #self.cardRequestFreq = 2 #self.settings["card_request_interval"] = 2 self.comm = PLC() self._is_setup = False self.io_pins = [] self.notifier_bool = True
def ReadSEQCount(): comm = PLC() comm.IPAddress = '169.254.215.82' valueseqcount = comm.Read('SEQCount') lbl6 = Label(window, text="Sequence Count", bg="white", fg="Black", bd=2, relief="solid", width=15, height=2) lbl6.place(x=540, y=180) lbl7 = Label(window, text=valueseqcount, bg="Black", fg="lime", bd=3, relief="raised", width=15, height=5) lbl7.place(x=540, y=220) window.after(550, ReadSEQCount) return
def ReadOutWord(): comm = PLC() comm.IPAddress = '169.254.215.82' value = comm.Read('OutWord') lbl3 = Label(window, text="OutWord|Value", bg="white", fg="Black", bd=2, relief="solid", width=15, height=2) lbl3.place(x=410, y=20) lbl4 = Label(window, text=value, bg="Black", fg="lime", bd=3, relief="raised", width=15, height=5) lbl4.place(x=410, y=60) window.after(550, ReadOutWord) return
def readString(tag): with PLC() as comm: comm.IPAddress = '10.4.42.135' comm.ProcessorSlot = 3 length = comm.Read('{}.LEN'.format(tag)) if not (length.Status == 'Success'): return length if not length.Value: return None ret = comm.Read(tag + '.DATA', length.Value) if ret.Status == 'Success': return ''.join(chr(i) for i in ret.Value) else: return ret
def read_pylogix_counter(counter_entry): with PLC() as comm: comm.IPAddress = counter_entry['processor_ip'] comm.ProcessorSlot = counter_entry['processor_slot'] tag = counter_entry['tag'] part_count = comm.Read(tag) if part_count.Status != 'Success': logger.error(f'Failed to read: {part_count} : {tag}') return -1 logger.debug( f'Read pylogix counter:{part_count}, tag:{counter_entry["tag"]}') return part_count.Value
''' the following import is only necessary because eip.py is not in this directory ''' import sys sys.path.append('..') ''' Read an array of values I have a tag called "LargeArray", which is DINT[10000] We can read as many of them as we'd like, which makes reading arrays the most efficient way to read data. Read will handle multi-packet replies. We're going to pass Read() the tag and the number to read. ''' from pylogix import PLC with PLC() as comm: comm = PLC() comm.IPAddress = '192.168.1.9' values = comm.Read('LargeArray[0]', 500) print(values)