数据采集 订阅
数据采集(DAQ),是指从传感器和其它待测设备等模拟和数字被测单元中自动采集非电量或者电量信号,送到上位机中进行分析,处理。数据采集系统是结合基于计算机或者其他专用测试平台的测量软硬件产品来实现灵活的、用户自定义的测量系统。 展开全文
数据采集(DAQ),是指从传感器和其它待测设备等模拟和数字被测单元中自动采集非电量或者电量信号,送到上位机中进行分析,处理。数据采集系统是结合基于计算机或者其他专用测试平台的测量软硬件产品来实现灵活的、用户自定义的测量系统。
信息
别    称
数据获取
英    译
Data acquisition
简    称
DAQ
数据范围
电力系统
释    义
利用一种装置,从系统外部采集数据并输入到系统内部的一个接口
中文名
数据采集
采集方式
传感器和计算机
数据采集简介
数据采集,又称数据获取,是利用一种装置,从系统外部采集数据并输入到系统内部的一个接口。数据采集技术广泛应用在各个领域。比如摄像头,麦克风,都是数据采集工具。被采集数据是已被转换为电讯号的各种物理量,如温度、水位、风速、压力等,可以是模拟量,也可以是数字量。采集一般是采样方式,即隔一定时间(称采样周期)对同一点数据重复采集。采集的数据大多是瞬时值,也可是某段时间内的一个特征值。准确的数据测量是数据采集的基础。数据量测方法有接触式和非接触式,检测元件多种多样。不论哪种方法和元件,均以不影响被测对象状态和测量环境为前提,以保证数据的正确性。数据采集含义很广,包括对面状连续物理量的采集。在计算机辅助制图、测图、设计中,对图形或图像数字化过程也可称为数据采集,此时被采集的是几何量(或包括物理量,如灰度)数据。在互联网行业快速发展的今天,数据采集已经被广泛应用于互联网及分布式领域,数据采集领域已经发生了重要的变化。首先,分布式控制应用场合中的智能数据采集系统在国内外已经取得了长足的发展。其次,总线兼容型数据采集插件的数量不断增大,与个人计算机兼容的数据采集系统的数量也在增加。国内外各种数据采集机先后问世,将数据采集带入了一个全新的时代。
收起全文
精华内容
参与话题
问答
  • 数据采集

    千次阅读 2019-01-26 20:43:09
    我们知道,做数据分析,数据是第一位,所以首先我们应该拥有自己的数据,如果我们自身没有足够的数据,那就需要做大量的数据采集,现在用python做数据采集也就是我们常说到的爬虫是最广泛的,基本上可以会经历三个...

    我们知道,做数据分析,数据是第一位,所以首先我们应该拥有自己的数据,如果我们自身没有足够的数据,那就需要做大量的数据采集,现在用python做数据采集也就是我们常说到的爬虫是最广泛的,基本上可以会经历三个过程:
    1. 使用request库爬取网页内容,这个时候网页已经拉到我们本地了。
    2. 使用XPath解析内容。XPath是XML+Path的缩写,也就是XML路径语言。它是一种用来确定XML文档中某部分位置的语言,在开发中经常用来当作小型查询语言。XPath可以通过元素和属性进行位置索引。
    3. 使用Pandas保存数据。Pandas是让数据分析工作变得更加简单的高级数据结构,我们可以用Pandas保存爬取的数据。最后通过Pandas再写入到XLS或者MySQL等数据库中。

    具体的使用python做爬虫的实现可以自行上网搜一下,网上有大量资料关于这方面的介绍。
    或者可以看下我的github上面的几个例子:
    https://github.com/xiaoyuan199/Baike_Scrapy

    另外我们也可以不编程就抓取到网页信息,这里介绍三款爬虫工具:
    火车采集器
    八爪鱼
    集搜客
    一些比较简单的任务都可以通过这种软件进行抓取,因为不需要编程,所以入门比较简单,可以作为一种辅助工具。

    展开全文
  • 上篇文章讲述了Fanuc数据采集的必备库的说明以及调用方式,此片文章开始真正的实战操作 首先看下上图,所有的公开函数都会有一个FlibHndl参数,次参数的含义为大家解释: 开发者开发客户端程序和Fanuc系统连接,...

    上篇文章讲述了Fanuc数据采集的必备库的说明以及调用方式,此片文章开始真正的实战操作

    首先看下上图,所有的公开函数都会有一个 FlibHndl参数,次参数的含义为大家解释:

    开发者开发客户端程序和Fanuc系统连接,客户端为TCP Client,Fanuc数控系统为TCP Server,那么我们将这里的FlibHndl参数定义为Socket实列,只不过Fanuc厂家为了我们开发方便,用数字代替了Socket,我们拿着FlibHndl去和函数做调用的时候,内部函数会根据和FlibHndl绑定的Socket进行和数控系统通讯实际Socket是由fwlibe1.dll来进行统一管理。

    那么既然我们用到一个句柄,我们就为句柄定义为一个静态变量,同时为了对fwlib32函数的扩展,我们写一个类继承f2lib32,如下图:

    那么上图我们写了一个FanucOpe类,该类继承focas类库,这样我们又可以在FanucOpe添加我们想要的功能,同时可以通过FanucOpe类调用Focas类里面的所有方法、变量、枚举等,又不去改写原有的类库。

    那么以上类库建立完成,下面开始做连接操作

    fanuc连接函数为如下函数,

      public static extern short cnc_allclibhndl3( [In,MarshalAs(UnmanagedType.AsAny)] Object ip,
            ushort port,int timeout, out ushort FlibHndl);

    ip代表数控系统的通讯IP,Port代表数控系统的通讯端口,timerout代表着连接超时,单位为秒,如设置为10S,则代表10秒钟没连接成功代表通信失败,类似socket中的阻塞模式下的waitone功能,

    同时函数返回short类型的结果,以及out出来ushort类型的通讯句柄,以后每次和函数连接时候都拿着句柄和系统进行通讯。

     

    开始调用此函数,如下

    ret代表函数执行结果,与函数枚举进行匹配,FanucOpe.Handle代表函数返回值,

    博主现在没有和数控系统进行连接,返回-16,代表socket通信错误,如果成功返回值是0。同时Handle的值>0

    如果连接成功我们尝试读取一个加工总数测试一下

    ,如下图,cnc_rdparam是读取fanuc系统参数的公共函数,6712代表我们要读取的点在fanuc数控系统里面的参数位置,此方法返回一个IODBPSD_1,我们不用去管他是什么,我们就先去定义一个此类型的参数,让他从cnc_rdparam中回调出来,我们直接拿其结果即可。

    以上就是fanuc函数的连接操作和读取操作方法,如有需要,可以在评论区留邮箱,我会将fanuc所有的函数库代表的是读取什么数据解释出来,如读取主轴倍率,就是pmc_rdpmcrng函数。调用方式是

     

    以下demo解决了fanuc各种 坑:如负载内存泄漏、报警版本问题、程序新老版本指定目录问题、大文件传输丢包问题等

    谢谢支持,有需要的留邮箱,有测试demo。同时博主有多线程并发数据采集架构可供参考

    下一篇文章开始写西门子数控系统(无需opc)、新代数控系统、广数数控系统、三菱数控系统以及兄弟数控系统等。

    西门子采集如下图:支持828D,840dsl,808,802dsl,840d,810d

     

    加qq 验证入群

    展开全文
  • 发那科数据采集 (法兰克数据采集

    千次阅读 热门讨论 2019-01-07 17:41:58
    因为项目需要用到发那科机器的一些数据,在里面踩了无数的坑,终于写好了一个可以满足目前项目需求的程序。 回想起来真是心酸都不足以形容。。 先上一个采集端的界面,界面是很丑陋,但是胜在简单。: 机器的配置...

    因为项目需要用到发那科机器的一些数据,在里面踩了无数的坑,终于写好了一个可以满足目前项目需求的程序。
    回想起来真是心酸都不足以形容。。

    先上一个采集端的界面,界面是很丑陋,但是胜在简单。:
    在这里插入图片描述

    机器的配置信息我都是写进数据库的,每次开启程序之前都要先查询一次数据库,然后再连接CNC机器一次,以获取相应的机器连接情况。这个也只是方便用户查看而已,没什么实际的作用,因为在这里获取的句柄在采集程序里面是用不了的。
    原则上,我是没有用到全局变量,因为使用全局变量有很多问题需要考虑,什么全局加锁啦,什么的。反正我是不懂。

    先上一个界面的代码:
    先说一下数据库架构。
    1:第一张表用来保存所有数据,方便以后统计停机时间什么的。
    2:第二张表,只做更新数据,用来查询机器的当前运行状态。
    所以我在程序了分了两个方法。

    
    /***************************************************************
    *               date:2018-11-30
    *               By:Bevan
     * *            sappmis@163.com
     * *  说明:IP,机号添加面板。主要实现多线程开启采集功能。
     * *
     * ***************************************************************/
    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Linq;
    using System.Text;
    using System.Windows.Forms;
    using System.Data.SqlClient;
    using System.Threading;
    
    namespace SmachCNC
    {
        public partial class Form1 : Form
        {
            public int sleepTime;
            private List<Thread> threadPool = new List<Thread>(); //创建第一个线程池,用来写数据库
            private List<Thread> threadPool2 = new List<Thread>();  //创建第二个线程池,用来更新实时数据
    
            public Form1()
            {
                InitializeComponent();
            }
    
            private void Form1_Load(object sender, EventArgs e)
            {
                ip_show(DGVip);
                ChangLabStatue();
                txtip1.Enabled = false;
                txtmachno1.Enabled = false;
                txtmodel.Enabled = false;
                txtname.Enabled = false;
                version.Enabled = false;
            }
    
    
            /// <summary>
            /// 将采集方法实例化,以方便多线程调用。我采用的是委托方法,使用多线程开启采集程序,所以需要先将采集方法实例化,以方便给线程传递参数。
            /// </summary>
            public class IndataCnc
            {
                private int sleeptime;
                private string IP;
                private string machno;
                public IndataCnc(string ip, string machno, int sleep)  //这个方法是LinkCnc();采集方法中需要的参数。这里一定要处理好,如果看不懂这个代码,建议多看看多线程方面的文章。或者搜索“”c#多线程调用有参数方法“”。
                {
                    this.machno = machno;
                    this.IP = ip;
                    this.sleeptime = sleep;
                }
                public void funRun()
                {
                    LinkCnc Lcnc = new LinkCnc();
                    Lcnc.readCncToData(IP, machno, sleeptime);
                }
            }
    
            /// <summary>
            /// 使用实例化类给方法传参数。另一个方法。
            /// </summary>
            public class UpdataCnc
            {
                private string IP;
                private string machno;
    
                public UpdataCnc(string ip, string machno)
                {
                    this.machno = machno;
                    this.IP = ip;
                }
                public void funRun()
                {
                    ReadCnc cnc = new ReadCnc();
                    cnc.readCncUpData(IP, machno);
                }
            }
    
            /// <summary>
            /// 改变程序运行状态提示
            /// </summary>
            public void ChangLabStatue()
            {
                if (button2.Text == "启动程序")
                {
                    labShowInfo1.Text = "程序已停止";
                    labShowInfo1.ForeColor = Color.Red;
                }
                else
                {
                    labShowInfo1.Text = "程序正在运行....";
                    labShowInfo1.ForeColor = Color.Green;
                }
            }
    
            /// <summary>
            /// 将数据库中的机器信息带出面板。
            /// </summary>
            public void ip_show(DataGridView dgvw)
            {
                try
                {
                    this.Invoke(new EventHandler(delegate
                    {
                        string sql = "select * from machinfo order by machno";
                        DataSet ds = new DbHelp().QueryDataset(sql);
                        dsNum = ds.Tables[0].Rows.Count;
                        if (ds.Tables[0].Rows.Count > 0)
                        {
                            for (int i = 0; i < ds.Tables[0].Rows.Count; i++)
                            {
                                dgvw.Rows.Add();
                                dgvw.Rows[i].Cells[0].Value = ds.Tables[0].Rows[i]["machno"];
                                dgvw.Rows[i].Cells[1].Value = ds.Tables[0].Rows[i]["ip"];
                                dgvw.Rows[i].Cells[2].Value = ds.Tables[0].Rows[i]["port"];
                            }
                        }
                    }
                    ));
                }
                catch (Exception ex)
                {
                    MessageBox.Show(ex.Message);
                }
            }
    
            /// <summary>
            /// 判断机器是否连接成功
            /// </summary>
            /// <param name="num"></param>
            /// <returns></returns>
            public string getState(ushort num)
            {
                if (num > 0)
                {
                    return "连接成功";
                }
                else return "机器离线";
            }
    
            /// <summary>
            /// 连接机器取回句柄号
            /// </summary>
            public void GetCncHandle()
            {
                DGVip.DataSource = null;
                string sql = "select * from machinfo";
                DataSet ds = new DbHelp().QueryDataset(sql);
                for (int i = 0; i < ds.Tables[0].Rows.Count; i++)
                {
                    string Ip;
                    ushort port;
                    string statue;
                    ushort fwlibHandle = 0;
                    Ip = ds.Tables[0].Rows[i]["ip"].ToString();
                    port = Convert.ToUInt16(ds.Tables[0].Rows[i]["port"].ToString());
                    short ret = Focas1.cnc_allclibhndl3((object)Ip, port, 5, out fwlibHandle);
                    statue = getState(fwlibHandle);
                    DGVip.Rows[i].Cells[0].Value = ds.Tables[0].Rows[i]["machno"];
                    DGVip.Rows[i].Cells[1].Value = ds.Tables[0].Rows[i]["ip"];
                    DGVip.Rows[i].Cells[2].Value = ds.Tables[0].Rows[i]["port"];
                    DGVip.Rows[i].Cells[3].Value = statue;
                    DGVip.Rows[i].Cells[4].Value = fwlibHandle;
                }
            }
    
    
    
            /// <summary>
            /// 开启线程,循环将IP读出并传递给DLL
            /// </summary>
            public void startThreadPool()
            {
                if (txtsleeptime.Text != "")
                {
                    sleepTime = Convert.ToInt32(txtsleeptime.Text.Trim());
                }
                else sleepTime = 30;  //这个数值我用的是30秒采集一次。
                try
                {
                    for (int i = 0; i < DGVip.Rows.Count; i++)
                    {
                        string machno = Convert.ToString(DGVip.Rows[i].Cells[0].Value.ToString());
                        string ip = Convert.ToString(DGVip.Rows[i].Cells[1].Value.ToString());
                        IndataCnc Icnc = new IndataCnc(ip, machno, sleepTime);
                        Thread thread = new Thread(new ThreadStart(Icnc.funRun));
                        this.threadPool.Add(thread);
                    }
                    foreach (Thread thread1 in this.threadPool)
                    {
                        thread1.Start();
                    }
                }
                catch (Exception ex) { MessageBox.Show(ex.Message); }
            }
    
            /// <summary>
            /// 开启第二线程池实时更新数据
            /// </summary>
            public void startThreadPool2()
            {
                for (int i = 0; i < DGVip.Rows.Count; i++)
                {
                    string machno = Convert.ToString(DGVip.Rows[i].Cells[0].Value.ToString());
                    ushort Handle = Convert.ToUInt16(DGVip.Rows[i].Cells[4].Value.ToString());
                    string ip = Convert.ToString(DGVip.Rows[i].Cells[1].Value.ToString());
                    UpdataCnc cnc = new SmachCNC.Form1.UpdataCnc(ip, machno);
                    Thread thread = new Thread(new ThreadStart(cnc.funRun));
                    threadPool2.Add(thread);
                }
                foreach (Thread thread1 in this.threadPool2)
                {
                    thread1.Start();
                }
            }
    
            /// <summary>
            /// 停止按钮,并销毁线程
            /// </summary>
            /// <param name="sender"></param>
            /// <param name="e"></param>
            private void button2_Click(object sender, EventArgs e)
            {
                if (button2.Text == "停止程序")
                {
                    stopThread();
                    button2.Text = "启动程序";
                    ChangLabStatue();
                    return;
                }
                if (button2.Text == "启动程序")
                {
                    GetCncHandle();
                    startThreadPool();
                    startThreadPool2();
                    button2.Text = "停止程序";
                    ChangLabStatue();
                }
            }
    
            /// <summary>
            /// 停止线程,并释放机器连接.
            /// </summary>
            public void stopThread()
            {
                foreach (Thread thread2 in this.threadPool2)
                {
                    thread2.Abort();
                }
                foreach (Thread thread in this.threadPool)
                {
                    thread.Abort();
                }
                cancelCncContion();
                this.threadPool2.Clear();
                this.threadPool.Clear();
            }
    
            /// <summary>
            /// 释放句柄,在停止程序的时候先释放所有句柄,因为这个句柄超过1024就连接不上了。
            /// </summary>
            private void cancelCncContion()
            {
                for (int i = 0; i < DGVip.Rows.Count; i++)
                {
                    ushort handle = Convert.ToUInt16(DGVip.Rows[i].Cells[4].Value);
                    int ret = Fanuc.cnc_freelibhndl(handle);
                }
            }
    
    //以下代码都是些垃圾代码,用不用都无所谓。
            private void button1_Click(object sender, EventArgs e)
            {
                try
                {
                    string machId = txtmachno.Text.Trim();
                    string Ip = txtip.Text.Trim();
                    ushort port = Convert.ToUInt16(txtport.Text.Trim());
                    string btntxt = button2.Text;
                    machInfo(machId, Ip, port, btntxt);
                }
                catch
                {
                    MessageBox.Show("机号或者IP已经存在.");
                }
            }
            /// <summary>
            /// 判断Ip是否存在
            /// </summary>
            /// <param name="ip"></param>
            /// <returns></returns>
            public bool IsExistIp(string ip)
            {
                if (DGVip.Rows.Count - 1 > 0)
                {
                    for (int i = 0; i < DGVip.Rows.Count; i++)
                    {
                        if (DGVip.Rows[i].Cells[1].Value.ToString() == ip)
                        {
                            return false;
                        }
                    }
                }
                return true;
            }
            /// <summary>
            /// 判断机号是否已经存在表中
            /// </summary>
            /// <param name="MachId"></param>
            /// <returns></returns>
            public bool IsMachId(string MachId)
            {
                if (DGVip.Rows.Count - 1 > 0)
                {
                    for (int i = 0; i < DGVip.Rows.Count; i++)
                    {
                        if (DGVip.Rows[i].Cells[1].Value.ToString() == MachId)
                        {
                            return false;
                        }
                        //else return false;
                    }
                }
                return true;
            }
            /// <summary>
            /// 添加或者修改IP地址的方法体
            /// </summary>
            /// <param name="machId"></param>
            /// <param name="Ip"></param>
            /// <param name="port"></param>
            /// <param name="btnText"></param>
            public void machInfo(string machId, string Ip, ushort port, string btnText)
            {
                string inssql = "insert into machinfo (machno,ip,port)values('" + machId + "','" + Ip + "','" + port + "')";
                string upsql = "update machinfo set ip='" + Ip + "' where machno='" + machId + "'";
                if (button1.Text == "添加") //添加机器的配置
                {
                    if (machId.Length > 0 || Ip.Length > 0 || port != 0)//判断文本框是否为空
                    {
                        int y = new DbHelp().OperSql(inssql);
                        if (y > 0)
                        {
                            MessageBox.Show("添加成功.");
                            int x = this.DGVip.Rows.Add();
                            DGVip.Rows[x].Cells[0].Value = machId;
                            DGVip.Rows[x].Cells[1].Value = Ip;
                            DGVip.Rows[x].Cells[2].Value = port;
                        }
                    }
                }
                else if (button1.Text == "修改")//修改机器的IP地址
                {
                    int y = new DbHelp().OperSql(upsql);
                    if (y > 0)
                    {
                        MessageBox.Show("信息修改成功.");
                    }
                    DGVip.Rows.Clear();
                    ip_show(DGVip);
                }
            }
    
            /// <summary>
            ///双击显示窗口中的IP将该IP拉取到文本框,以待修改。
            /// </summary>
            /// <param name="sender"></param>
            /// <param name="e"></param>
    
            private void DGVip_CellDoubleClick(object sender, DataGridViewCellEventArgs e)
            {
                int index = DGVip.CurrentCell.RowIndex;
                txtmachno.Text = DGVip.Rows[index].Cells[0].Value.ToString();
                txtip.Text = DGVip.Rows[index].Cells[1].Value.ToString();
                txtport.Text = DGVip.Rows[index].Cells[2].Value.ToString();
                txtmachno.Enabled = false;
                button1.Text = "修改";
                        }
    
            private void button4_Click(object sender, EventArgs e)
            {
                button1.Text = "添加";
                txtip.Text = "";
                txtmachno.Text = "";
                txtport.Text = "";
                txtmachno.Enabled = true;
            }
    
            private void Form1_FormClosing(object sender, FormClosingEventArgs e)
            {
                stopThread();
            }
    
            private void txtsleeptime_MouseHover(object sender, EventArgs e)
            {
                ToolTip tp = new ToolTip();
                tp.SetToolTip(txtsleeptime, "这里输入的数值为CNC机床采集的间隔时间。\n如果为空,默认3秒采集一次。");
            }
    
            private void Form1_MinimumSizeChanged(object sender, EventArgs e)
            {
            }
            private void button3_Click_3(object sender, EventArgs e)
            {
            }
        }
    }
    
    
    

    以上就是界面需要用的代码,注释都写明了函数方法使用的功能。
    下面就上采集方法的代码。
    方法只要用的是使用库函数连接机器,然后返回一个句柄号,然后就循环用句柄号去连接机器。不能使用IP一直连接机器的,因为有1024次的限制。

    /**********************************
    *               date:2018-11-30
    *               By bevan 
    *               sappmis@163.com
    *               
    *主要实现以下功能:将调用出传递过来的IP,机号,端口号等参数连接CNC,读取坐标,负载,运行状态信息,并写入数据库。
    *
    */
    
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Windows.Forms;
    using System.Threading;
    namespace SmachCNC
    {
        class LinkCnc
        {
    
            public ushort Handlew(string cncip)    //使用调用出传递多来的IP参数连接机器,返回一个句柄号给调用方法。
            {
                ushort fwlibHandle = 0;
                short ret = Focas1.cnc_allclibhndl3(cncip, 8193, 8, out fwlibHandle);
                return fwlibHandle;  //如果连接机器超时或者不成功都会返回一个数值。
            }
    
            /// <summary>
            /// 开启采集方法,将需要的数据写入数据库
            /// </summary>
            public void readCncToData(string ip, string cncno, int sleeptime)
            {
                string Ip = ip;
                string machineNo = cncno;
                ushort Handle = Handlew(Ip);  //调用方法传入IP,如果成功返回一个句柄号,不成功则返回其他代码。
                int sleepTime = sleeptime * 1000;   //线程采集时间间隔
                if (Handle==0)    //判断句柄状态。
                {
                    string sqlen = "INSERT INTO [dbo].[MachState]([MachNo],[Times])values("+machineNo+",getdate())";
                    int x = new DbHelp().OperSql(sqlen );
                    Thread.Sleep(sleepTime);
                    readCncToData(Ip, machineNo, sleeptime);  //如果连接机器不成功则继续调用自身去重新连接机器。因为程序是不间断工作的,如果没有这个方法这个机器将一直采集不到数据。需要将采集程序重新启动才可以。
                    return;
                }
                while (true)  //死循环,用来采集数据。
                {
                    Thread.Sleep(sleepTime); //采集数据的时间间隔
                    List<Swap> swap = new List<Swap>(); //这个是一个泛型,用来保存数据集合
                    swap.AddRange(get_Abs(Handle));
                    swap.AddRange(get_MachCoX(Handle));
                    swap.AddRange(get_Relatively(Handle));
                    swap.AddRange(get_Status(Handle));
                    swap.AddRange(get_Load(Handle));
                    swap.AddRange(get_program(Handle));
                    swap.AddRange(get_feed(Handle));
                    swap.AddRange(get_spinfo(Handle));
                    swap.AddRange(get_spact(Handle));
                    double spact;
                    string Mainpro;
                    double absX;//绝对座标
                    double absY;
                    double absZ;
                    double absA;
                    double relativelyU; //相对座标
                    double relativelyW;
                    double relativelyV;
                    double machCoX; //机械座标
                    double machCoY;
                    double machCoZ;
                    double alarm;
                    double aut;
                    double dummy;
                    double edit;
                    double emerg;
                    double motion;
                    double mstb;
                    double run;
                    double tmmode;
                    double sp1;
                    double sp2;
                    double sp3;
                    double sv1;
                    double sv2;
                    double sv3;
                    double feed;
                    int mState;//状态
                    int WorkModel;//工作模式1,2,3,4、自动、手动、调试、停机
                    absX = Convert.ToDouble(swap[0].Value);
                    absY = Convert.ToDouble(swap[1].Value);
                    absZ = Convert.ToDouble(swap[2].Value);
                    absA = Convert.ToDouble(swap[3].Value);
                    machCoX = Convert.ToDouble(swap[4].Value);  //机械座标
                    machCoY = Convert.ToDouble(swap[5].Value);
                    machCoZ = Convert.ToDouble(swap[6].Value);
                    relativelyU = Convert.ToDouble(swap[7].Value); //相对座标
                    relativelyV = Convert.ToDouble(swap[8].Value);
                    relativelyW = Convert.ToDouble(swap[9].Value);
                    alarm = Convert.ToInt32(swap[10].Value);
                    aut = Convert.ToInt32(swap[11].Value);
                    dummy = Convert.ToInt32(swap[12].Value);
                    edit = Convert.ToInt32(swap[13].Value);
                    emerg = Convert.ToInt32(swap[14].Value);
                    motion = Convert.ToInt32(swap[15].Value);
                    mstb = Convert.ToInt32(swap[16].Value);
                    run = Convert.ToInt32(swap[17].Value);
                    tmmode = Convert.ToInt32(swap[18].Value);
                    WorkModel = Convert.ToInt32(swap[19].Value);
                    mState = Convert.ToInt32(swap[20].Value);
                    sv1 = Convert.ToInt32(swap[21].Value);
                    sv2 = Convert.ToInt32(swap[22].Value);
                    sv3 = Convert.ToInt32(swap[23].Value);
                    // sp1 = Convert.ToInt32(swap[24].Value);
                    //sp2 = Convert.ToInt32(swap[25].Value);
                    //sp3 = Convert.ToInt32(swap[26].Value);
                    Mainpro = Convert.ToString(swap[27].Value);
                    feed = Convert.ToDouble(swap[28].Value);
                    sp1 = Convert.ToDouble(swap[29].Value);
                    sp2 = Convert.ToDouble(swap[30].Value);
                    sp3 = Convert.ToDouble(swap[31].Value);
                    spact = Convert.ToInt32(swap[32].Value);
                    if (aut == 0 && run == 0 && edit == 0 && mstb == 0 && alarm == 0)  //再次判断机器是否在线,如果这几个状态都为0的话,机器估计是不在线了,然后重新调用自身连接机器。
                    {
                       
                        string sqlen1 = "INSERT INTO [dbo].[MachState]([MachNo],[times])values(" + machineNo + ",getdate())";
                        int x1 = new DbHelp().OperSql(sqlen1);
                        readCncToData(Ip, machineNo, sleeptime);
                        return;  //中断当前函数,返回函数入口。
                    }
                    string sql = "INSERT INTO [dbo].[MachState]([MachNo],[mState],[WorkModel],[absX],[absY],[absZ],[relativelyU],[relativelyW],[relativelyV],[MachCoX],[MachCoY],[MachCoZ],[Times],[aut],[run],[edit],[mstb],[alarm],[sp1],[sp2],[sp3],[sv3],[sv2],[sv1],[dummy],[emerg],[motion],[tmmode],[Feed],[mainpro],[AbsA],[spact])VALUES('" + machineNo + "','" + mState + "','" + WorkModel + "'," + absX + "," + absY + "," + absZ + "," + relativelyU + "," + relativelyW + "," + relativelyV + "," + machCoX + "," + machCoY + "," + machCoZ + ",getdate(),'" + aut + "','" + run + "','" + edit + "','" + mstb + "','" + alarm + "'," + sp1 + "," + sp2 + "," + sp3 + "," + sv3 + "," + sv2 + "," + sv1 + ",'" + dummy + "','" + emerg + "','" + motion + "','" + tmmode + "'," + feed + ",'" + Mainpro + "'," + absA + "," + spact + ")";
                    int x = new DbHelp().OperSql(sql);
                }
            }
    
    
    
    
            /// <summary>
            /// 读取绝对
            /// </summary>
            /// <param name="mun"></param>
            /// <returns></returns>
            public List<Swap> get_Abs(ushort mun)//座标相关,绝对座标
            {
                List<Swap> swap = new List<Swap>();
                swap.Clear();
                Focas1.ODBST oDBST = new Focas1.ODBST();
                Focas1.ODBAXIS oDBAXI = new Focas1.ODBAXIS();
                for (int i = 0; i < 4; i++)
                {
                    Focas1.cnc_absolute2(mun, (short)(i + 1), 8, oDBAXI);
                    swap.Add(new Swap("abs" + i, (oDBAXI.data[0] / 1000).ToString()));
                }
    
                return swap;
            }
    
            /// <summary>
            /// 获取相对坐标
            /// </summary>
            /// <param name="mun"></param>
            /// <returns></returns>
            public List<Swap> get_Relatively(ushort mun)
            {
                List<Swap> swap = new List<Swap>();
                swap.Clear();
                Focas1.ODBST oDBST = new Focas1.ODBST();
                Focas1.ODBAXIS oDBAXI = new Focas1.ODBAXIS();
    
                double[] num = new double[100];
                for (int i = 0; i < 3; i++)
                {
                    Focas1.cnc_relative2(mun, (short)(i + 1), 8, oDBAXI);
                    double num1 = (double)oDBAXI.data[0] / 1000;
                    swap.Add(new Swap("Relatively" + i, num1.ToString()));
                }
                return swap;
            }
    
            /// <summary>
            /// 读取机械坐标
            /// </summary>
            /// <param name="mun"></param>
            /// <returns></returns>
            public List<Swap> get_MachCoX(ushort mun)
            {
                List<Swap> swap = new List<Swap>();
                swap.Clear();
                Focas1.ODBST oDBST = new Focas1.ODBST();
                Focas1.ODBAXIS oDBAXI = new Focas1.ODBAXIS();
                for (short i = 0; i < 3; i = (short)(i + 1))
                {
                    Focas1.cnc_machine(mun, (short)(i + 1), 8, oDBAXI);
    
                    double num1 = (double)oDBAXI.data[0] / 10000;
                    swap.Add(new Swap("MachCo" + i, num1.ToString()));
                }
                return swap;
            }
    
    
    
            /// <summary>
            /// 读取机器状态信息
            /// </summary>
            /// <param name="mun"></param>
            /// <returns></returns>
            public List<Swap> get_Status(ushort mun)
            {
                List<Swap> swap = new List<Swap>();
                swap.Clear();
                Focas1.ODBST statu = new Focas1.ODBST();
                Focas1.cnc_statinfo(mun, statu);
    
                int edit1 = Convert.ToInt32(statu.edit.ToString());
                int run1 = Convert.ToInt32(statu.run.ToString());
                int aut1 = Convert.ToInt32(statu.aut.ToString());
                int WorkModel;
                int mState;
                if (run1 == 0 && aut1 == 0)
                {
                    WorkModel = 0; //关机
                    mState = 0;
    
                }
                else if (run1 == 3 && aut1 == 1)
                {
                    WorkModel = 1; //正常运行
                    mState = 1;
                }
    
                else if (aut1 == 3 && run1 == 0)
                {
                    WorkModel = 2; //调机
                    mState = 1;
                }
                else if (aut1 == 4)
                {
                    WorkModel = 3; //手轮
                    mState = 1;
                }
                else
                {
                    WorkModel = 4; //闲置
                    mState = 1;
                }
                swap.Add(new Swap("alarm", statu.alarm.ToString()));
                swap.Add(new Swap("aut", statu.aut.ToString()));
                swap.Add(new Swap("dummy", statu.dummy.ToString()));
                swap.Add(new Swap("edit", statu.edit.ToString()));
                swap.Add(new Swap("emerg", statu.emergency.ToString()));
                swap.Add(new Swap("motion", statu.motion.ToString()));
                swap.Add(new Swap("mstb", statu.mstb.ToString()));
                swap.Add(new Swap("run", statu.run.ToString()));
                swap.Add(new Swap("tmmode", statu.tmmode.ToString()));
                swap.Add(new Swap("workmodel", WorkModel.ToString()));
                swap.Add(new Swap("state", mState.ToString()));
                return swap;
            }
    
    
    
    
            /// <summary>
            /// 读取机器主轴负载信息,这个信息我都不知道是不是准确的,我估计很大几率是不准确的
            /// </summary>
            /// <param name="mun"></param>
            /// <returns></returns>
            public List<Swap> get_Load(ushort mun)
            {
                Fanuc.ODBSVLOAD sv = new Focas1.ODBSVLOAD();
                Fanuc.ODBSPLOAD sp = new Focas1.ODBSPLOAD();
                List<Swap> swap = new List<Swap>();
                swap.Clear();
                short q1 = 6;
                Focas1.cnc_rdsvmeter(mun, ref q1, sv);
                short q2 = 0;
                Focas1.cnc_rdspmeter(mun, q2, ref q1, sp);
                swap.Add(new Swap("sv1", sv.svload1.data.ToString()));
                swap.Add(new Swap("sv2", sv.svload2.data.ToString()));
                swap.Add(new Swap("sv3", sv.svload3.data.ToString()));
                swap.Add(new Swap("sp1", sp.spload1.spload.data.ToString()));
                swap.Add(new Swap("sp2", sp.spload2.spload.data.ToString()));
                swap.Add(new Swap("sp3", sp.spload3.spload.data.ToString()));
                return swap;
            }
    
            /// <summary>
            /// 
            /// 读取机器进给量
            /// </summary>
            /// <param name="mun"></param>
            /// <returns></returns>
            public List<Swap> get_feed(ushort mun)
            {
                Fanuc.ODBSVLOAD sv = new Focas1.ODBSVLOAD();
                Focas1.IODBPMC0 pmc = new Focas1.IODBPMC0();
                List<Swap> swap = new List<Swap>();
                swap.Clear();
                Focas1.pmc_rdpmcrng(mun, 0, 0, 12, 13, 10, pmc);
                swap.Add(new Swap("feed", (this.Transform((int)pmc.cdata[0]).ToString())));
                swap.Add(new Swap("RemaFeed", (this.Transform((int)pmc.cdata[1]).ToString())));
                return swap;
            }
    
            /// <summary>
            /// 转换倍速
            /// </summary>
            /// <param name="s"></param>
            /// <returns></returns>
            public int Transform(int s)
            {
                if (s == 0)
                {
                    return 0;
                }
                string str = "";
                int num = 0;
                while (s > 0)
                {
                    str = string.Concat(str, s % 2);
                    s /= 2;
                    num++;
                }
                string str1 = "";
                for (int i = num - 1; i >= 0; i--)
                {
                    char chr = str[i];
                    str1 = string.Concat(str1, chr.ToString());
                }
                str1 = str1.Replace('1', '2');
                str1 = str1.Replace('0', '1');
                str1 = str1.Replace('2', '0');
                int num1 = 0;
                int num2 = int.Parse(str1);
                int num3 = 0;
                while (num2 != 0)
                {
                    int num4 = num2 % 10;
                    num2 /= 10;
                    num1 = num1 + num4 * (int)Math.Pow(2, (double)num3);
                    num3++;
                }
                return num1;
            }
    
            /// <summary>
            /// 获取主轴速度
            /// </summary>
            /// <param name="mun"></param>
            /// <returns></returns>
            public List<Swap> get_spinfo(ushort mun)
            {
                List<Swap> swap = new List<Swap>();
                swap.Clear();
                Focas1.ODBSPN odbspn = new Focas1.ODBSPN();
                for (int i = 0; i < 3; i++)
                {
                    Focas1.cnc_rdspload(mun, -1, odbspn);
                    swap.Add(new Swap("spq" + i, odbspn.data[i].ToString()));
                }
                return swap;
            }
    
            /// <summary>
            /// 获取实际主轴速度
            /// </summary>
            /// <param name="mun"></param>
            /// <returns></returns>
            public List<Swap> get_spact(ushort mun)
            {
                List<Swap> swap = new List<Swap>();
                swap.Clear();
                Focas1.ODBACT2 act2 = new Focas1.ODBACT2();
                Focas1.cnc_acts2(mun, -1, act2);
                swap.Add(new Swap("spact", act2.data[0].ToString()));
                return swap;
            }
    
    
            /// <summary>
            /// 读取刀具信息
            /// </summary>
            /// <param name="mun"></param>
            /// <returns></returns>
            public List<Swap> get_toolInfo(ushort mun)
            {
                List<Swap> swap = new List<Swap>();
                swap.Clear();
                Focas1.IODBTD iodb = new Focas1.IODBTD();
                for (int i = 0; i < 2; i++)
                {
    
                    Focas1.cnc_rd1tlifedata(mun, 0, 0, iodb);
                    swap.Add(new Swap("tool_grno" + i, iodb.datano.ToString()));//组编号
                    swap.Add(new Swap("tool_no" + i, iodb.tool_num.ToString()));//刀具编号
                    swap.Add(new Swap("tool_inf" + i, iodb.tool_inf.ToString()));//xinxi 
                    swap.Add(new Swap("tool_H" + i, iodb.h_code.ToString()));//长度补偿
                    swap.Add(new Swap("tool_D" + i, iodb.d_code.ToString()));//半径补偿
    
                }
                return swap;
            }
    
            /// <summary>
            /// 当前主程序号
            /// </summary>
            /// <param name="mun"></param>
            /// <returns></returns>
            public List<Swap> get_program(ushort mun)
            {
                List<Swap> swap = new List<Swap>();
                Focas1.ODBEXEPRG EXEPRG = new Focas1.ODBEXEPRG();
                Focas1.PRGDIR3 pRGDIR3 = new Focas1.PRGDIR3();
                Focas1.cnc_exeprgname(mun, EXEPRG);
                short num = 2;
                int oNum = EXEPRG.o_num;
                short num1 = 1;
                Focas1.cnc_rdprogdir3(mun, num, ref oNum, ref num1, pRGDIR3);
                swap.Add(new Swap("workpart", pRGDIR3.dir1.comment.ToString()));
                return swap;
            }
        }
    }
    
    

    另一个更新数据的方法我就不贴了,跟这个大同小异,只是将insert 改成update方法而已。
    总的说来这些代码看着不多,但是坑超多,反正用遍地是坑来形容都不过分。
    还有西门子机器的采集,等过段时间再贴了。最近项目很赶。。。也是超多坑。。。

    展开全文
  • APP数据采集 / 网站页面数据采集 / 小程序数据抓取定制软件采集数据服务 【服务介绍】 对国内外APP、网站、小程序数据进行采集,并可以按照您的要求把采集好的数据整理成需要的格式(txt/excel/sql/pdf), 从事...

    APP数据采集 / 网站页面数据采集 / 小程序数据抓取定制软件采集数据服务

    【服务介绍】
          对国内外APP、网站、小程序数据进行采集,并可以按照您的要求把采集好的数据整理成需要的格式(txt/excel/sql/pdf),

    从事数据采集多年,各种难度的网站/APP/小程序都有采集过。

    【服务承诺】
    服务让您满意,我们真诚、尽力完成您的要求!

    联系方式:微信: calljia  

    展开全文
  • 小红书用户笔记数据采集分析报告

    万次阅读 2019-06-13 22:19:37
    原文链接... Xiao Hongshu as a netizen's "grass base", there are wedding planning companies from across the country, new people will choose to understand on the platform to collect ...
  • 《BackTrader从数据采集到实盘交易》是本系列的第一个中级课程。本网站的课程宗旨是缩短个人或小型投资者与大型机构投资者之间的的差距。 课程内容从python环境的安装开始使用,到股票数据采集,BackTrader开源...
  • prometheus数据采集

    千次阅读 2020-03-03 15:57:45
    prometheus数据采集 Exporter将监控数据采集的端点通过HTTP服务的形式暴露给Prometheus Server,Prometheus Server通过访问该Exporter提供的Endpoint端点,即可获取到需要采集的监控数据。 Prometheus通过HTTP...
  • 数据采集

    千次阅读 多人点赞 2018-04-03 14:52:12
    二、大数据采集设备 1.科研数据 (1)大型强子对撞机 (2)射电望远镜 (3)电子显微镜 2.网络数据 我们可以利用数据中心采集网络中的数据。 三、大数据采集方法 1.科研数据 2.网络数据 爬虫(慎用) 3....
  • LabView数据采集

    千次阅读 2019-08-12 15:15:52
    LabView数据采集 文章目录1. LabView 基础 1. LabView 基础 求极差、组距与数组、分点、频率分布表、频率分布直方图 数据质量分析的任务是检测原始数据 ... ...
  • 抖音数据采集接口

    千次阅读 2020-06-11 16:09:54
    提供封装好的抖音数据接口,通过手机自动化实时采集,接口稳定。 接口使用详情请参考接口文档。 已支持接口列表如下: 抖音用户详情信息 抖音用户发布的视频列表 抖音用户喜欢(点赞)的视频列表 抖音用户粉丝...
  • 大数据开启了一个大规模生产、分享和应用数据的时代,它给技术和商业带来了巨大的变化。麦肯锡研究表明,在医疗、零售和制造业领域,大数据每年可以提高劳动生产率0.5-1个百分点。大数据在核心领域的渗透速度...
  • 总的来说目前互联网常用的数据采集分为APP采集和web端采集对于APP采集最常用的方式就是通过集成SDK,进行埋点采集对于这种方式,目前分为有无埋点采集,可视化埋点采集,手工埋点采集大类分别针对于:日志的全量收集...
  • Hass数据采集

    2019-07-23 16:03:52
    哈斯机床数据采集分享 本着网络资源共享的理想,本人将开始工业机床数据采集的方法分享,为广大已投身工业采集或即将投入工业采集的同仁理一些思路。 哈斯机床数据采集是一个相对简单的采集类机床,没有专用的开发包...
  • 科加斯数据采集平台使用教程 当前版本 测试版 新建采集 功能 新建一个爬虫来进行数据采集 使用 打开“新建采集”菜单,进入爬虫配置界面: 基本配置: 项 是否必填 说明 示例 爬虫名字 是 任意字符,不可...
  • 电商图书数据采集-ISBN数据采集

    千次阅读 2018-04-12 14:49:08
    ISBN是International Standard Book Number(国际标准书号)的一个英文缩写,是国际上通用的出版物标识编码。图书采集与一般商品信息需求不同,他们的...因为这个是页面显示出来的东西,一般电商数据采集软件都能爬...
  • 数据采集:如何自动化采集数据?

    万次阅读 2019-01-27 20:33:54
    上一节中我们讲了如何对用户画像建模,而建模之前我们都要进行数据采集数据采集是数据挖掘的基础,没有数据,挖掘也没有意义。很多时候,我们拥有多少数据源,多少数据量,以及数据质量如何,将决定我们挖掘产出的...
  • 前一段时间一直在做用研华数据采集卡的PCI-1710来进行数据采集然后将数据采集的信号通过LabView显示在工控机中,在进行实验的过程中发现了许多问题,这些问题好像在网上看到了其他的人也有疑惑的,这里说一点经验,...
  • 基于AD7606八通道高速数据采集模块

    千次阅读 2020-06-04 16:27:10
      01前言 AD7606八通道AD采集模块 是一款16比特AD转换器。它最大可以提供200kps的采样速率。通过 带有128KB缓存的AD7606模拟采集板 可以在占用C51CPU执行时间30%的情况...AD7606数据采集板使用ASCII码传递BINARY.
  • M400数据采集管理软件,采集的数据怎么获取? 我想写个C#winform程序去获取采集的数据,做个预警功能。 求大神们指点 ![![图片说明](https://img-ask.csdn.net/upload/201706/29/1498708597_950463.png)图片说明]...
  • 关于从0到1搭建大数据平台,之前的一篇博文《如何从0到1搭建大数据平台》已经给大家介绍过了,接下来我们会分步讲解搭建大数据平台的具体注意事项。一、“大”数据海量的数据当你需要搭建大数据平...
  • 哔哩哔哩用户数据采集及数据分析

    千次阅读 2019-10-03 13:48:59
    就简单的采集几万个练一下手,代码大家看着改吧 你好! 这是你第一次使用 Markdown编辑器 所展示的欢迎页。如果你想学习如何使用Markdown编辑器, 可以仔细阅读这篇文章,了解一下Markdown的基本语法知识。 新的...
  • 内容与下方一样 全量备份: 一般是mysql表的数据做每日快照然后全量导入hive中 增量备份: 获取每天更新的数据和hive中原有的数据进行合并 差异备份:暂时没有遇到,后期遇到就加入说明...
  • Python网络数据采集

    千次阅读 2019-05-27 18:55:05
    书中不仅介绍了网络数据采集的基本原理,还深入探讨了更高级的主题,比如分析原始数据、用网络爬虫测试网站等。此外,书中还提供了详细的代码示例,以帮助你更好地理解书中的内容。 通过阅读本书,你将能够: 解析...
  • 基于kettle实现数据采集

    千次阅读 2020-08-18 17:36:04
    基于kettle实现数据采集1.kettle简介2.kettle实现不同数据库的数据采集3.kettle实现接口的数据采集 1.kettle简介 Kettle 是一款国外开源的 ETL 工具,纯 Java 编写,绿色无需安装,数据抽取高效稳定(数据迁移工具)。...
  • 小程序用户行为数据采集器讲解

    千次阅读 2019-10-31 23:31:41
    这些数据很大一部分来源于采集公司自家的应用客户端。当前小程序兴起,给公司带来了大量的用户,我们也很有必要收集用户行为数据。作者开发的采集器已在网易产品里大量使用,希望通过本场分享帮助到大家。 本场 ...
  • 小红书数据采集接口

    千次阅读 2020-06-12 11:57:13
    提供封装好的小红书数据采集接口,通过手机自动化实时采集,接口稳定。 接口使用详情请参考接口文档。 已支持接口列表如下: 小红书关键字搜索 小红书用户信息详情 小红书用户笔记列表 小红书单个笔记详细数据...
  • Fanuc机床数据采集

    2019-07-17 11:18:53
    机床数据采集无外乎通过各个机床供应商提供的接口 之前数据采集一般部署都是wins平台,使用对应供应商提供.dll接口,可以进行对应数据采集。 最近老板突发奇想想在linux环境下对机床进行采集。我们干活的没办法只能...
  • 用户行为分析之数据采集

    千次阅读 2020-09-22 07:00:00
    用户行为简介用户行为分析主要关心的指标可以概括如下:哪个用户在什么时候做了什么操作在哪里做了什么操作,为什么要做这些操作,通过什么方式,用了多长时间等问题,总结出来就是WHO,WHEN,...

空空如也

1 2 3 4 5 ... 20
收藏数 58,176
精华内容 23,270
关键字:

数据采集