1.读取AOI供应商扫描每片PCB后在数据库中保存的条码,供应商数据格式是按每月新建一个数据库表储存PCB的条码信息。
2.把月度的数据库表按车间需求读出,并进行格式整理,并规定储存目录方便MES收料系统收录。
3.重点是如何从一大堆数据中获取同一片治具(含8pcs或12pcsPCB)里面的的同一批板的全部条码归档到同一个文件。
#运行结果
#简单的示例AOI数据结构
import pymssql
import xml.dom.minidom
import time
conn = pymssql.connect(host="localhost",user= "sa",password= "123456789", database="1111")
cursor = conn.cursor() # 获取光标
#查询数据
cursor.execute('SELECT * FROM PCBtest')
PP = []
index = 0
for row in cursor:
PCBID = row[0]
liaohao = row[1]
tiaoma = row[3]
#print(' PCBID:' + str(PCBID) + ' liaohao:' + str(liaohao) + ' tiaoma:' + str(tiaoma))
#print('PCBID:' + str(PCBID))
PCBID = str(PCBID)
P = str(PCBID[11:13])+str(PCBID[14:16])+str(PCBID[17:19])
z = index,P,liaohao,tiaoma
PP.append(z)
index += 1
#print(PP)
cnt = []
#print(len(PP))
#for i in range(len(PP)-1): #历遍PP
#a = len(PP)-i-1 # j 循环每次-1
#print('i-------------',PP[i][1])
##print(PP[-a:])
#for j in PP[-a:]:
#print('j[1]',j[1])
#A = ((int(PP[i][1])-int(j[1]))**2)**0.5
##print('A',A)
#if A <= 2:
#print('这数据需要打包')
#zz = PP[i][0],PP[i][1],PP[i][2],PP[i][3]
#cnt.append(zz)
def catchXML():
for a in range (len(PP)): #抓取XML条码
#print(PP[a][1])
zzz = PP[a][1],PP[a][3] #[1]是日期,[3]是对应的条码
cnt.append(zzz)
return cnt
cnt1 = []
cnt2 = []
def ArraySort(list): #阈值为 if 后面的 2
for q in range(len(list)):
z = list[q][0]
zz = list[q][1]
cnt1.append(z)
cnt2.append(zz)
#print(cnt1)
#print(cnt2)
#镜像
list0 = cnt1.copy()
list1 = cnt2.copy()
l = len(list0)
result = [] #新建result存放list0的切片
result1 = [] #新建result1存放list1的切片
if l==1:
result.append(list0[:])#如果只有一个元素,那就直接添加
result1.append(list1[:])
else:
i=0
j=0
while(i<len(list0)-1):
#[1, 2, 3, 4, 50, 51, 52, 53, 100, 101, 102, 103]
#len = 12
# i < 11
if ((abs(int(list0[i + 1]) - int(list0[i])) <= 2) and i+1 !=len(list0)-1):
i += 1
#如果遍历的过程中发现下标i的值还没有到达倒数第二个下标那就继续前进
elif((abs(int(list0[i + 1])-int(list0[i])) <= 2) and i+1==len(list0)):
#print(list0[j:i + 1])
result.append(list0[j:i + 1])
result1.append(list1[j:i + 1])
#如果发现下标i到达了倒数第二个下标了,为了避免程序执行
#循环条件终止而下标自动失效,不去记忆了,因为循环结束 了,可是之前的下标
#没有完成切片操作。
else:
#print(list0[j:i+1])
result.append(list0[j:i+1])
result1.append(list1[j:i+1])
j = i+1
i += 1
#用j记下切片初始下标,用i来记录切片终止下标
#然后i和j自动加1,在满足条件的情况下继续前进
if (abs(int(list0[-1]) - int(list0[-2])) <= 2):
result[-1].append(list0[-1])
result1[-1].append(list1[-1])
else:
result.append(list0[-1:])
result1.append(list1[-1:])
#这个if-else语句是处理最后的一个元素,到底是独立成为一个切片还是并入到最后的切片中,根据条件判断即可
A = result #B借用A的线程,不能return,否则A return会干扰B结果生成
#print('\n\nThe sorted list0 is as follows:\n',A)
B = result1
#print('\n\nThe sorted list1 is as follows:\n',B)
return B
cnt = catchXML()
#print('CNT打印',cnt)
B = ArraySort(cnt) #result 列表输出的是 日期的序列, result1 列表输出的是条形码
print('B',B)
indexX = 100
for e in B: #写入XML文件
ee = str(e)
print(ee)
#result2txt = str(PCBID) # data是前面运行出的数据,先将其转为字符串才能写入
#with open('wenben1.txt','a') as file_handle: # .txt可以不自己新建,代码会自动新建
#file_handle.write(result2txt) # 写入
#file_handle.write('\n') # 有时放在循环里面需要自动转行,不然会覆盖上一条数据
#在内存中创建一个空的文档
doc = xml.dom.minidom.Document()
#创建一个根节点Managers对象
root = doc.createElement('Managers')
#设置根节点的属性
root.setAttribute('PCB', 'InnoluxSMT')
#将根节点添加到文档对象中
doc.appendChild(root)
nodeManager = doc.createElement('Manager')
#给叶子节点name设置一个文本节点,用于显示文本内容
nodeAge = doc.createElement("PCBliaohao")
nodeAge.appendChild(doc.createTextNode(ee))
nodeManager.appendChild(nodeAge)
root.appendChild(nodeManager)
#开始写xml文档
#fp = open('C:\\Users\\Jiahui01.Mai\\Desktop\\Manager.xml', 'w')
indexX += 1
fp = open("%d PCB.xml" % indexX, "w")
doc.writexml(fp, indent='\t', addindent='\t', newl='\n', encoding="utf-8")
fp.flush() #打开一个录入再关闭,才能正常保存
conn.close()
time.sleep(5)
quit() #睡觉5秒后退出