先说下为了采集CNC兄弟设备的数据可谓是一波三折。

因为首次接触brother设备(CNC)是直接在设备上设置IP、用户名、密码,然后直连PC,用Ftp可以查看和下载CNC brother设备里的数据库文件(NC文件)。其实我们最关心的是CNC的“工件计数”,经确认CNC可以实时的将计数写入WKCNTR.NC文件,现在理论上已经没有问题了,可是后面还有很多坑。

我们刚开始是用dotnet来做的,写好demo程序连接brother测试,可是怎么都无法下载,一直提示“基础连接关闭,协议冲突”之类的异常,查资料发现下载后文件保存的是在中文目录下,立马移动文件保存位置保证都在英文目录下,还真的好了!这下太好了。

后来我们就按照这个demo开始编写正式代码,结果怎么都无法下载,试了好多台设备都不行,真的莫名其妙、一头雾水。并且提示的异常都是“基础连接关闭,协议冲突”,这次可不是中文目录的问题了。于是就在google上查资料,各种方法都试了,结果还是不行,不能一头撞死南墙,最后放弃了。

灵光一闪,为什么不用python试试呢,于是随手写了个demo程序,也就有了上一篇随笔《远程监控显示brother数控机床数据》,结果真的好了很轻松就搞定了,并且所有的16台CNC brother设备都可以正常采集数据,按照30秒频率将采集到的数据写入数据库(mariadb),别慌到这里才是欢喜了一半。

真正运行起来稳定性可没那么好,刚开始16台都好好的,没过1天就有一台出现问题,现象是可以ping通,可以连接到设备,也可以登录,还可以列出设备上所有的文件,但就是无法下载,结果就是超时。后来经过不断调查发现,如果我同时开两个连接都访问这个文件,那么有一个失败超时,另一个居然可以下载读取,太奇妙了,没找到好的办法之前就用这个下下策吧。结果第三天又有一台出现问题,可以ping通,就不让连接了,就好像brother设备上没有开启ftp服务一样。本来好好的,就出现这种莫名其妙的问题,到这里简直郁闷到极点。

总之对这种方案不满意,也考虑到还有4台brother CNC设备没有ftp服务可以利用,于是找设备科找brother的操作手册参考书,看是否有其他方法。结果在第五章关于通信,还真的找到了,Tcp通讯协议在眼前一亮,再细看具体的指令协议,只能看懂指令必须以%开始,以%结束,里面的就不懂了。只好再拨打供应商电话,说明情况请求两个%之间的内容怎么写,供应商回复:%CLOD    WKCNTR     + 换行 + 00%

赶紧将指令贴在网络调试助手里,随便连接一台brother,结果真的返回数据了,目标工件计数就在返回的数据里面,接下来的就是解析返回字符串了,这都不是问题。结果不仅16台新的brother设备可以采集到数据,4台老的也可以,并且效率要比ftp要高很多。

下面就把最重要的部分代码贴出来:

         private int GetCncDada(string ip)
{
TcpClient client = new TcpClient();
int cnc = -;
try
{
client.Connect(new IPEndPoint(IPAddress.Parse(ip), ));
if (client.Connected)
{
var networkStream = client.GetStream();
var buffer = Encoding.UTF8.GetBytes("%CLOD    WKCNTR    \r\n00%");
networkStream.Write(buffer, , buffer.Length);
networkStream.ReadTimeout = ;
var readBuffer = new byte[];
var len = networkStream.Read(readBuffer, , readBuffer.Length);
var result = Encoding.UTF8.GetString(readBuffer, , len);
//_logger.Debug(result);
networkStream.Close(); var lines = result.Split(new[] { Environment.NewLine }, StringSplitOptions.None);
foreach (var line in lines)
{
if (line.StartsWith("A01"))
{
var fields = line.Split(',');
_logger.Debug("工件计数 = " + fields[].Trim());
cnc = Convert.ToInt32(fields[].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个字段就是目标[工件计数]
return int(fields[2].strip())
except Exception as e:
print(ip, e)
return -1
finally:
client.close() def save_db(name='J44', qty=-1):
try:
conn = pymysql.Connect(user='root', password='', database='dademes', charset='utf8')
cus = conn.cursor()
if qty == -1:
cus.execute('update kbequipment set running=%s where name=%s', ('关机', 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保存数据异常,%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数据读取完毕...30秒后再次读取...')
time.sleep(30)

Tcp方式采集CNC兄弟设备数据的更多相关文章

  1. 【AT91SAM3S】ADC中断方式采集数据

    板子依旧是英倍特的EK-SAM3S.ADC部分的原理图如下: PB1是一个复用引脚,在这里被用作AD功能,对应芯片上的AD5.即,使用片内ADC的5通道测VR1上2号引脚的电压. 实验采用了SysTi ...

  2. 计算机组成原理——I/O接口以及I/O设备数据传送控制方式

    接口可以看作是两个部件之间交接的部分.硬件与硬件之间有接口,硬件与软件之间有接口,软件与软件之间也有接口. 这里我们所说的I/O接口,一边连接着主机,一边连接着外设. I/O接口的功能 I/O接口的基 ...

  3. 用vlc搭建简单流媒体服务器(UDP和TCP方式)

    .UDP(legacy)传统模式 .RTP方式 .RTSP方式 RTSP方式是通过RTP进行流媒体数据的传输的,VLC的实现也是基于UDP的.这种方式网上的参考资料比较多,我就不截图了,直接叙述命令行 ...

  4. FFmpeg获取DirectShow设备数据(摄像头,录屏)

    这两天研究了FFmpeg获取DirectShow设备数据的方法,在此简单记录一下以作备忘.本文所述的方法主要是对应Windows平台的. 1.       列设备 ffmpeg -list_devic ...

  5. 【转】FFmpeg获取DirectShow设备数据(摄像头,录屏)

    这两天研究了FFmpeg获取DirectShow设备数据的方法,在此简单记录一下以作备忘.本文所述的方法主要是对应Windows平台的. 1.       列设备 ffmpeg -list_devic ...

  6. [转帖]IP /TCP协议及握手过程和数据包格式中级详解

    IP /TCP协议及握手过程和数据包格式中级详解 https://www.toutiao.com/a6665292902458982926/ 写的挺好的 其实 一直没闹明白 网络好 广播地址 还有 网 ...

  7. ffmpeg强制使用TCP方式推流到EasyDarwin开源流媒体服务器进行直播

    我们的EasyDarwin目前部署在阿里云的服务器上面,运行的效果是非常好的,而且无论是以TCP方式.还是UDP的方式推送,都可以非常好地进行直播转发: 但并不是所有的用户服务器都是阿里云的形式,有很 ...

  8. TCP/IP UDP 协议首部及数据进入协议栈封装的过程

    数据的封装 UDP 封装 TCP 封装 IP 封装 检验和算法 当应用程序用TCP传送数据时,数据被传送入协议栈中,然后逐一通过每一层直到被当作一串比特流送入网络 注: UDP数据TCP数据基本一致. ...

  9. 设备数据通过Azure Functions 推送到 Power BI 数据大屏进行展示(2.Azure Functions实战)

    本案例适用于开发者入门理解Azure Functions/ IoT Hub / Service Bus / Power BI等几款产品. 主要实战的内容为: 将设备遥测数据上传到物联网中心, 将遥测数 ...

随机推荐

  1. Fragment的生命周期(三)

    自定义lifecycleoffragment布局文件 在main_activity布局中引用自定义的fragment布局 到logcat中查看程勋运行的结果 代码如下: 自定义的fragment布局: ...

  2. hdu 2074

    ps:WA了好多次...因为首先是n=1的情况,其次是中心花色和外花色,中心花色也有可能是最外层花色....很无语. 然后就是格式问题咯. 代码 #include "stdio.h" ...

  3. Enable rsh on MAC OS with command line

    1. Enable rsh on macos. 1). os version (10.0) Enabling the "Allow remote login" option tur ...

  4. mysql数据库引擎 MyISAM和 InnoDB区别

    1. 存储结构 MyISAM:每个MyISAM在磁盘上存储成三个文件.第一个文件的名字以表的名字开始,扩展名指出文件类型..frm文件存储表定义.数据文件的扩展名为.MYD (MYData).索引文件 ...

  5. Magento显示多货币,Magento 多货币设置

    System - Configuration - Currency Setup 在右边Currency Options里的Allowed currencies勾选, 然后 System - Manag ...

  6. 创建 Transact-SQL 作业步骤

    创建 Transact-SQL 作业步骤 在对象资源管理器中,连接到 SQL Server 数据库引擎实例,再展开该实例. 展开"SQL Server 代理",创建一个新作业或右键 ...

  7. 转载:Android横屏竖屏切换的问题

    一.禁止横竖屏转换 Android横竖屏切换在手机开发中比较常见,很多软件在开发过程中为了避免横竖屏切换时引发不必要的麻烦,通常禁止掉横竖屏的切换, 通过在AndroidManifest.xml中设置 ...

  8. maven打包不执行测试用例

    在执行maven打包时不需要执行测试用例,使用如下2种方式实现:-DskipTests=true : 不执行测试用例,但编译测试用例类生成相应的class文件至target/test-classes下 ...

  9. 基于redis排行榜的实战总结

    前言: 之前写过排行榜的设计和实现, 不同需求其背后的架构和设计模型也不一样. 平台差异, 有的立足于游戏平台, 为多个应用提供服务, 有的仅限于单个游戏.排名范围差异, 有的面向全局排名, 有的只做 ...

  10. EF里一对一、一对多、多对多关系的配置

    EF关系规则 参考文章:http://www.cnblogs.com/feigao/p/4617442.html Entity Framework 实体间的关系,一对一,一对多,多对多,根据方向性来说 ...