日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 >

Tcp方式采集CNC兄弟设备数据

發(fā)布時間:2025/3/19 26 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Tcp方式采集CNC兄弟设备数据 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

轉(zhuǎn)載地址:http://www.cnblogs.com/jonney-wang/p/6238768.html

Tcp方式采集CNC兄弟設備數(shù)據(jù)

先說下為了采集CNC兄弟設備的數(shù)據(jù)可謂是一波三折。

因為首次接觸brother設備(CNC)是直接在設備上設置IP、用戶名、密碼,然后直連PC,用Ftp可以查看和下載CNC brother設備里的數(shù)據(jù)庫文件(NC文件)。其實我們最關(guān)心的是CNC的“工件計數(shù)”,經(jīng)確認CNC可以實時的將計數(shù)寫入WKCNTR.NC文件,現(xiàn)在理論上已經(jīng)沒有問題了,可是后面還有很多坑。

我們剛開始是用dotnet來做的,寫好demo程序連接brother測試,可是怎么都無法下載,一直提示“基礎連接關(guān)閉,協(xié)議沖突”之類的異常,查資料發(fā)現(xiàn)下載后文件保存的是在中文目錄下,立馬移動文件保存位置保證都在英文目錄下,還真的好了!這下太好了。

后來我們就按照這個demo開始編寫正式代碼,結(jié)果怎么都無法下載,試了好多臺設備都不行,真的莫名其妙、一頭霧水。并且提示的異常都是“基礎連接關(guān)閉,協(xié)議沖突”,這次可不是中文目錄的問題了。于是就在google上查資料,各種方法都試了,結(jié)果還是不行,不能一頭撞死南墻,最后放棄了。

靈光一閃,為什么不用python試試呢,于是隨手寫了個demo程序,也就有了上一篇隨筆《遠程監(jiān)控顯示brother數(shù)控機床數(shù)據(jù)》,結(jié)果真的好了很輕松就搞定了,并且所有的16臺CNC brother設備都可以正常采集數(shù)據(jù),按照30秒頻率將采集到的數(shù)據(jù)寫入數(shù)據(jù)庫(mariadb),別慌到這里才是歡喜了一半。

真正運行起來穩(wěn)定性可沒那么好,剛開始16臺都好好的,沒過1天就有一臺出現(xiàn)問題,現(xiàn)象是可以ping通,可以連接到設備,也可以登錄,還可以列出設備上所有的文件,但就是無法下載,結(jié)果就是超時。后來經(jīng)過不斷調(diào)查發(fā)現(xiàn),如果我同時開兩個連接都訪問這個文件,那么有一個失敗超時,另一個居然可以下載讀取,太奇妙了,沒找到好的辦法之前就用這個下下策吧。結(jié)果第三天又有一臺出現(xiàn)問題,可以ping通,就不讓連接了,就好像brother設備上沒有開啟ftp服務一樣。本來好好的,就出現(xiàn)這種莫名其妙的問題,到這里簡直郁悶到極點。

總之對這種方案不滿意,也考慮到還有4臺brother CNC設備沒有ftp服務可以利用,于是找設備科找brother的操作手冊參考書,看是否有其他方法。結(jié)果在第五章關(guān)于通信,還真的找到了,Tcp通訊協(xié)議在眼前一亮,再細看具體的指令協(xié)議,只能看懂指令必須以%開始,以%結(jié)束,里面的就不懂了。只好再撥打供應商電話,說明情況請求兩個%之間的內(nèi)容怎么寫,供應商回復:%CLOD ? ?WKCNTR ? ? + 換行 + 00%

趕緊將指令貼在網(wǎng)絡調(diào)試助手里,隨便連接一臺brother,結(jié)果真的返回數(shù)據(jù)了,目標工件計數(shù)就在返回的數(shù)據(jù)里面,接下來的就是解析返回字符串了,這都不是問題。結(jié)果不僅16臺新的brother設備可以采集到數(shù)據(jù),4臺老的也可以,并且效率要比ftp要高很多。

下面就把最重要的部分代碼貼出來:

private int GetCncDada(string ip){TcpClient client = new TcpClient();int cnc = -1;try{client.Connect(new IPEndPoint(IPAddress.Parse(ip), 10000));if (client.Connected){var networkStream = client.GetStream();var buffer = Encoding.UTF8.GetBytes("%CLOD WKCNTR \r\n00%");networkStream.Write(buffer, 0, buffer.Length);networkStream.ReadTimeout = 3000;var readBuffer = new byte[1024];var len = networkStream.Read(readBuffer, 0, readBuffer.Length);var result = Encoding.UTF8.GetString(readBuffer, 0, len);//_logger.Debug(result);networkStream.Close(3000);var lines = result.Split(new[] { Environment.NewLine }, StringSplitOptions.None);foreach (var line in lines){if (line.StartsWith("A01")){var fields = line.Split(',');_logger.Debug("工件計數(shù) = " + fields[2].Trim());cnc = Convert.ToInt32(fields[2].Trim());break;}}}return cnc;}catch (Exception err){_logger.Error(err);return cnc;}finally{if (client.Connected){client.Close();}}}

?以下是python版的代碼:

# coding: utf8 import socket import pymysql import os import time cnc_config = [('J01', "192.168.1.40"), ('J02', "192.168.1.41"), ('J03', "192.168.1.42"), ('J04', "192.168.1.43"),('J22', "192.168.1.44"), ('J21', "192.168.1.45"), ('J20', "192.168.1.46"), ('J19', "192.168.1.47"),('J18', "192.168.1.48"), ('J17', "192.168.1.49"), ('J16', "192.168.1.50"), ('J15', "192.168.1.51"),('J14', "192.168.1.52"), ('J13', "192.168.1.53"), ('J12', "192.168.1.54"), ('J11', "192.168.1.55"),('J37', "192.168.1.56"), ('J36', "192.168.1.57"), ('J35', "192.168.1.58"), ('J34', "192.168.1.59")]def get_from_brother(ip='127.0.0.1', port=10000):client = socket.socket(socket.AF_INET, socket.SOCK_STREAM)client.settimeout(3)try:client.connect((ip, port))instruct = '%CLOD WKCNTR ' + os.linesep + '00%'client.send(instruct.encode())lines = client.recv(1024).decode().split(os.linesep)lines = [line for line in lines if line.startswith('A01')] # 選出以A01開頭的行fields = lines[0].split(',') # 拆分出字段,第3個字段就是目標[工件計數(shù)]return int(fields[2].strip())except Exception as e:print(ip, e)return -1finally:client.close()def save_db(name='J44', qty=-1):try:conn = pymysql.Connect(user='root', password='1234', database='dademes', charset='utf8')cus = conn.cursor()if qty == -1:cus.execute('update kbequipment set running=%s where name=%s', ('關(guān)機', name))else:cus.execute('update kbequipment set running=%s, status=%s where name=%s', ('正常', qty, name))conn.commit()cus.close()conn.close()except Exception as e:print('機臺號=%s保存數(shù)據(jù)異常,%s' % (name, e))if __name__ == '__main__':while True:try:for cnc_name, ip in cnc_config:print('正在讀取機臺號=%s,ip=%s' % (cnc_name, ip))qty = get_from_brother(ip=ip)save_db(qty=qty, name=cnc_name)except Exception as e:print('__main__', e)finally:print('CNC數(shù)據(jù)讀取完畢...30秒后再次讀取...')time.sleep(30)

總結(jié)

以上是生活随笔為你收集整理的Tcp方式采集CNC兄弟设备数据的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。