c#2010编写通过 Kepserver v4读写AB 、西门子PLC数据汇总到ORACLE

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;

//需要引入该dll
using OPCAutomation;
using System.Net.NetworkInformation;

namespace DCSCollect
{
    public partial class FrmMain : Form
    {
        DataBase wl = new DataBase();
        DataBase dcs = new DataBase("server=dcs;uid=wlgz;pwd=wlgz");
        OPCServer MyServer;
        OPCGroups MyGroups;
        OPCGroup MyGroup;
        OPCGroup MyGroupxr;
         int numplc = 1;
         int numwl = 1;
        
        List<string> ItemPlcName = new List<string>();
        List<string> ItemPlcAddress = new List<string>();
        string[] ItemPlcValue=new string[105] ;

        List<string> ItemWlName = new List<string>();
        string[] ItemWlValue = new string[10];


        string[] klw = { "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0" };
       
       
        public FrmMain()
        {
            InitializeComponent();
        }

        private void btntest_Click(object sender, EventArgs e)
        {
            GetWlinfo();
            SaveDb();
            SavePlc();
        }

        private void FrmMain_Load(object sender, EventArgs e)
        {
            Ping p1 = new Ping();
            MyServer = new OPCServer();
            MyServer.Connect("KEPware.KEPServerEx.V4", "192.168.1.29");
            //server.Connect(remoteServerName, remoteServerIP);//连接本地服务器:服务器名+主机名或IP

            //if (MyServer.ServerState == (int)OPCServerState.OPCRunning)
            //{
            //    Console.WriteLine("已连接到:{0}", MyServer.ServerName);
            //}
            //else
            //{
            //    //这里你可以根据返回的状态来自定义显示信息,请查看自动化接口API文档
            //    Console.WriteLine("状态:{0}", MyServer.ServerState.ToString());
            //}
            MyServer.ServerShutDown += ServerShutDown;//服务器断开事件

            MyGroups = MyServer.OPCGroups;
           

            //以下设置组属性

            MyServer.OPCGroups.DefaultGroupIsActive = true;//激活组。
            MyServer.OPCGroups.DefaultGroupDeadband = 0;// 死区值,设为0时,服务器端该组内任何数据变化都通知组。
            MyServer.OPCGroups.DefaultGroupUpdateRate = 200;//默认组群的刷新频率为200ms

            MyGroup = MyServer.OPCGroups.Add("测试");//添加组
            MyGroup.UpdateRate = 1000;//刷新频率为1秒。
            MyGroup.IsSubscribed = true;//使用订阅功能,即可以异步,默认false

            MyGroupxr = MyServer.OPCGroups.Add("写入");//添加组
            MyGroupxr.UpdateRate = 1000;//刷新频率为1秒。
            MyGroupxr.IsSubscribed = true;//使用订阅功能,即可以异步,默认false

            for (int i = 0; i < 10; i++)
            {
                ItemWlValue[i] = "0";
            }

           

            if (p1.Send("172.24.24.7").Status == IPStatus.Success)
            {
                lbldcs.Text = "DCS服务器联通";
                DataTable dt = dcs.GetDT("select name,address from dcsitemplc  order by id ");

               
                numplc = dt.Rows.Count;

                for (int i = 0; i < dt.Rows.Count; i++)
                {
                    ItemPlcValue[i] = "0";
                
                    OPCItem myItem = MyGroup.OPCItems.AddItem(ItemPlcAddress[i], i);
                }

                DataTable dtwl = dcs.GetDT("select name from dcsitemwl  order by id ");
              
                numwl = dtwl.Rows.Count;

                for (int i = 0; i < dtwl.Rows.Count; i++)
                {
                    ItemWlValue[i] = "0";
                    ItemWlName.Add(dtwl.Rows[i][0].ToString());
                }
               

                MyGroup.DataChange += new DIOPCGroupEvent_DataChangeEventHandler(GroupDataChange);
            }
            else
            {
                lbldcs.Text = "DCS服务器不通";
                dcs.ExeSql("insert into ERRORINFO(name,INFO) values('FrmMain_Load','DCS服务器不通')");
            }
        }
        private  void ServerShutDown(string Reason)//服务器先行断开
        {
            Console.WriteLine("服务器已经先行断开!");
        }
        private  void GroupDataChange(int TransactionID, int NumItems, ref Array ClientHandles, ref Array ItemValues, ref Array Qualities, ref Array TimeStamps)
        {

            //此处注意i是从1开始,因为getvalue没有0.下面输出分别为数据的ClientHandles(就是上文AddItem方法的第二个参数。),
            //Itemvalue就是值,Qualities为质量,timestamps为时间。
            try
            {


                for (int i = 1; i < NumItems + 1; i++)
                {
                 
                    lblerror.Text = ClientHandles.GetValue(i) + "        " + ItemValues.GetValue(i).ToString();
                  
                        ItemPlcValue[Convert.ToInt16(ClientHandles.GetValue(i))] = ItemValues.GetValue(i).ToString();
                }
            }
            catch (Exception ex)
            {
                label1.Text = " group   " + ex.Message;
               
                //throw ex;
            }
        }
    

        private void GetWlinfo()
        {
            for (int i = 0; i < 10; i++)
            {
                ItemWlValue[i] = "0";
            }
  
            Ping p1 = new Ping();
            if (p1.Send("172.24.24.1").Status == IPStatus.Success)
            {
                lblwl.Text = "物流服务器联通";
                DataTable dtzj = wl.GetDT("select biaoji, a6,a26,a14,a17 from banpiplc where   biaoji='BANPI' or biaoji='FANGPI'");
                //铸机状态 重量、状态,分别对应ItemValue的100-104项
                ItemWlValue[0] = dtzj.Rows[0][1].ToString();
                ItemWlValue[1] = dtzj.Rows[0][2].ToString();

                ItemWlValue[2] = dtzj.Rows[1][3].ToString();
                ItemWlValue[3] = dtzj.Rows[1][4].ToString();

                if (ItemWlValue[1] == "空闲")
                    ItemWlValue[1] = "0";
                else
                    ItemWlValue[1] = "1";

                if (ItemWlValue[3] == "结束")
                    ItemWlValue[3] = "0";
                else
                    ItemWlValue[3] = "1";

                ItemWlValue[4] = wl.GetString("select DIANLUCHUIYANGLIANG from 现场数据查询 where id=1");
                //获取转炉信息
                DataTable dtzl = wl.GetDT("Select 炉号,废钢量,自产铁水,  钢水量,出渣量,加废钢时刻 From "
                   + "( select * from 转炉_统计  Order By 1 Desc )Where Rownum=1");
                if (dtzl != null && dtzl.Rows.Count > 0)
                {
                   
                    for (int i = 0; i < 5; i++)
                    {
                        ItemWlValue[i + 5] = dtzl.Rows[0][i + 1].ToString();
                    }                

                   
                }
            }
            else
            {
                lblwl.Text = "物流服务器不通";
                dcs.ExeSql("insert into ERRORINFO(name,INFO) values('GetWlinfo','物流服务器不通')");
            }
               
           
        }
        private void SaveDb()
        {
            try
            {
                int totalnum = numwl + numplc;
                string[] sqlreal = new string[totalnum + 1];
                string sql="";

                Ping p1 = new Ping();

                if (p1.Send("172.24.24.7").Status == IPStatus.Success)
                {
                    lbldcs.Text = "DCS服务器联通";
                    //string sql = "insert into dcsvalue(";
                    //string sqlbk

                    sqlreal[totalnum] = "update dcscurent set ";

                    for (int i = 0; i < numplc; i++)
                    {
                        if (ItemPlcValue[i].Trim() == "")
                            ItemPlcValue[i] = "0";

                        sql = sql + ItemPlcName[i] + ",";
                        sqlreal[i] = "update dcsitem set value='" + ItemPlcValue[i] + "',cj_time=sysdate  where name='" + ItemPlcName[i] + "'";
                        sqlreal[totalnum] = sqlreal[totalnum] + ItemPlcName[i] + "='" + ItemPlcValue[i] + "',";
                    }

                    for (int i = 0; i < numwl; i++)
                    {
                        if (ItemWlValue[i].Trim() == "")
                            ItemWlValue[i] = "0";

                        sql = sql + ItemWlName[i] + ",";
                        sqlreal[i + numplc] = "update dcsitem set value='" + ItemWlValue[i] + "',cj_time=sysdate  where name='" + ItemWlName[i] + "'";
                        sqlreal[totalnum] = sqlreal[totalnum] + ItemWlName[i] + "='" + ItemWlValue[i] + "',";
                    }

                    sql = sql.Remove(sql.Length - 1, 1) + ") values(";
                    for (int i = 0; i < numplc; i++)
                    {
                        sql = sql + "'" + ItemPlcValue[i] + "',";
                    }
                    for (int i = 0; i < numwl; i++)
                    {
                        sql = sql + "'" + ItemWlValue[i] + "',";
                    }
                    sql = sql.Remove(sql.Length - 1, 1) + ")";


                    sqlreal[totalnum] = sqlreal[totalnum] + "insert_time=sysdate where id=1";

                    //dcs.ExeSql("insert into dcsvalue(" + sql);
                    dcs.ExeSql("insert into dcsvalue"+DateTime.Now.ToString("yyyyMM") + "(" + sql);
                    dcs.ExeArr(sqlreal);


                    string rq = DateTime.Now.ToString("yyyy-MM-dd HH");
                    string[] xm = { "YLZ_1#_DLXT_DLCCCEMS_KLW", "YLZ_1#_DLXT_HTLCCCEMS_KLW",
                              "YLZ_1#_ZLXT_ZLJLCCCEMS_KLW", "YLZ_1#_ZLXT_ECCCEMS_KLW", 
                              "YLZ_1#_JRL_GXJELCEMS_KLW", "YLZ_1#_JRL_GXJELCEMS_Nox",
                              "YLZ_1#_JRL_GXJELCEMS_SO2", "YLZ_1#_DLXT_DLSCCCEMS_KLW", 
                              "YLZ_1#_ZLXT_ZLSCCCEMS_KLW", "YLZ_1#_DLXT_LGQSCCCCEMS_KLW" ,
                              "YLZ_1#_ZLXT_ZLFGL", "YLZ_1#_ZLXT_ZLTSL", "YLZ_1#_ZLXT_ZLCGL",
                              "YLZ_1#_ZLXT_ZLczl","YLZ_1#_ZLXT_ZLJLTIME"
                          };

                    sql = "Select round(Avg(YLZ_1#_DLXT_DLCCCEMS_KLW),3),round(Avg(YLZ_1#_DLXT_HTLCCCEMS_KLW),3),"
                        + "round(Avg(YLZ_1#_ZLXT_ZLJLCCCEMS_KLW),3),round(Avg(YLZ_1#_ZLXT_ECCCEMS_KLW),3),"
                        + "round(Avg(YLZ_1#_JRL_GXJELCEMS_KLW),3),round(Avg(YLZ_1#_JRL_GXJELCEMS_Nox),3),"
                        + "round(Avg(YLZ_1#_JRL_GXJELCEMS_SO2),3),round(Avg(YLZ_1#_DLXT_DLSCCCEMS_KLW),3), "
                         + "round(Avg(YLZ_1#_ZLXT_ZLSCCCEMS_KLW),3),round(Avg(YLZ_1#_DLXT_LGQSCCCCEMS_KLW),3) "
                        + "from dcsvalue" + DateTime.Now.ToString("yyyyMM") + "  Where to_char(insert_time,'yyyy-MM-dd hh24')='" + rq + "'";

                    DataTable dtklw = dcs.GetDT(sql);

                    for (int i = 0; i < dtklw.Columns.Count; i++)
                    {
                        if (dtklw.Rows[0][i].ToString().Trim() != "")
                            klw[i] = dtklw.Rows[0][i].ToString().Trim();
                    }

                    //DataTable dtzl = dcs.GetDT("select YLZ_1#_ZLXT_ZLFGL,YLZ_1#_ZLXT_ZLTSL,YLZ_1#_ZLXT_ZLCGL,YLZ_1#_ZLXT_ZLczl"
                    //              + " from dcszlxplc where YLZ_1#_ZLXT_ZLJLTIME='1' ");
                    //if (dtzl != null && dtzl.Rows.Count > 0)
                    //{
                    for (int i = 0; i < 4; i++)
                    {
                        if (ItemWlValue[i + 5].Trim() != "")
                            klw[i + 10] = ItemWlValue[i + 5];
                    }
                    klw[14] = "1";
                  
                    if (dcs.HasRecord("select * from dcsklw Where to_char(insert_time,'yyyy-MM-dd hh24')='" + rq + "'"))
                    {
                        sql = "update dcsklw set ";
                        for (int i = 0; i < xm.Length; i++)
                        {
                            sql = sql + xm[i] + "=" + klw[i] + ",";
                        }
                        sql = sql.Remove(sql.Length - 1) + "  Where to_char(insert_time,'yyyy-MM-dd hh24')='" + rq + "'";

                    }
                    else
                    {
                        sql = "insert into dcsklw(insert_time) values(to_date('" + rq + "','yyyy-MM-dd hh24'))";
                    }

                    dcs.ExeSql(sql);

                }
                else
                {
                    lbldcs.Text = "DCS服务器不通";
                    dcs.ExeSql("insert into ERRORINFO(name,INFO) values('SaveDb','DCS服务器不通')");
                }
            }
            catch (Exception ex)
            {
                lblerror.Text = "savedb     " + ex.Message;
                dcs.ExeSql("insert into ERRORINFO(name,INFO) values('SaveDb','"+ ex.Message+"')");
                //continue;
                //throw;
            }

        }
        private void SavePlc()
        {
            try
            {         
           
                 Ping p1 = new Ping();

                 if (p1.Send("192.168.11.5").Status == IPStatus.Success)
                 {
                     lblplc.Text = "高线plc联通";
                     string[] writeaddress = { "SMZ.GAOXIAN.KLWXR_YLZ_1#_DLXT_DLCCCEMS", "SMZ.GAOXIAN.KLWXR_YLZ_1#_DLXT_HTLCCCEMS",
                                     "SMZ.GAOXIAN.KLWXR_YLZ_1#_ZLXT_ZLJLCCCEMS", "SMZ.GAOXIAN.KLWXR_YLZ_1#_ZLXT_ECCCEMS", 
                                     "SMZ.GAOXIAN.KLWXR_YLZ_1#_JRL_GXJELCEMS", "SMZ.GAOXIAN.KLWXR_YLZ_1#_JRL_GXJELCEMS_Nox",
                                     "SMZ.GAOXIAN.KLWXR_YLZ_1#_JRL_GXJELCEMS_SO2","SMZ.GAOXIAN.KLWXR_YLZ_1#_DLXT_DLSCCCEMS",
                                    "SMZ.GAOXIAN.KLWXR_YLZ_1#_ZLXT_ZLSCCCEMS","SMZ.GAOXIAN.KLWXR_YLZ_1#_DLXT_LGQSCCCCEMS",
                                     "SMZ.GAOXIAN.KLWXR_YLZ_1#_ZLXT_ZLFGL","SMZ.GAOXIAN.KLWXR_YLZ_1#_ZLXT_ZLTSL",
                                    "SMZ.GAOXIAN.KLWXR_YLZ_1#_ZLXT_ZLCGL","SMZ.GAOXIAN.KLWXR_YLZ_1#_ZLXT_ZLczl",
                                    "SMZ.GAOXIAN.KLWXR_YLZ_1#_ZLXT_ZLJTIME"
                                    };

                     OPCItem opcklw;
                     for (int i = 0; i < writeaddress.Length; i++)
                     {
                         //MyGroup.OPCItems.AddItem(writeaddress[i], 100 + i).Write(klw[i]);

                         opcklw = MyGroupxr.OPCItems.AddItem(writeaddress[i], i);
                         opcklw.Write(klw[i]);
                     }
                     //OPCItem opcklw=MyGroup.OPCItems.AddItem("KLWXR_YLZ_1#_DLXT_DLCCCEMS",99);
                     //opcklw.Write();
                 }
                 else
                 {
                     lblplc.Text = "高线plc不通";
                     dcs.ExeSql("insert into ERRORINFO(name,INFO) values('SavePlc','高线plc不通')");
                 }
            }
            catch (Exception ex)
            {
                lblerror.Text = "saveplc     " + ex.Message;
                dcs.ExeSql("insert into ERRORINFO(name,INFO) values('SavePlc','" + ex.Message + "')");
                //throw;
            }
        }

        private void timer1_Tick(object sender, EventArgs e)
        {
            //try
            //{


                //NetConn();

                timer1.Enabled = false;
                GetWlinfo();
                SaveDb();
                SavePlc();

                lblcj.Text = DateTime.Now.ToShortTimeString();
                timer1.Enabled = true;
            //}
            //catch (Exception ex)
            //{
            //    //lblcj.Text = "采集不正常";
            //    lblerror.Text = "timer 采集不正常     " + ex.Message;
            //    throw;
            //}
        }

    }
}
 

  • 16
    点赞
  • 29
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
KEPServer是一个用于工业自动化领域的通信服务器软件,它通过各种协议与不同类型的控制设备进行通信。在这个问题中,我们讨论KEPServer如何使用RSLink协议来读取ABPLCAB型号的可编程逻辑控制器)。 首先,KEPServer需要安装RSLink软件,并进行配置以建立与ABPLC的通信。RSLink是Rockwell Automation(罗克韦尔自动化)开发的专门用于与ABPLC通信的软件。在KEPServer中,我们需要配置RSLink插件,以便正确读取ABPLC数据。 在KEPServer中添加RSLink插件后,我们需要进行以下配置: 1. 在KEPServer的配置界面中,选择RSLink插件,并指定与ABPLC通信所使用的通讯端口或网络地址。 2. 配置RSLink插件的参数,例如选择正确的通信协议、设备类型和数据传输速率等。 3. 指定ABPLC的地址和数据结构,以便KEPServer能够正确读取和解析ABPLC数据。 一旦RSLink插件配置完成,KEPServer就可以与ABPLC建立通信。其工作方式如下: 1. KEPServer发送请求给RSLink插件,请求读取ABPLC的指定地址或数据区域。 2. RSLink插件通过RSLink协议与ABPLC进行通信,并读取所需的数据。 3. RSLink插件将读取到的数据传递给KEPServerKEPServer数据解析并提供给其他相应的应用程序或设备。 通过以上步骤,KEPServer成功通过RSLink读取ABPLC数据。它使得用户可以方便地集成和管理ABPLC数据,并与其他设备或系统进行数据交换和控制。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值