国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

【OPC UA】C# 通過OpcUaHelper建立OPC客戶端訪問KEPServerEx6 OPC服務(wù)器數(shù)據(jù)

這篇具有很好參考價(jià)值的文章主要介紹了【OPC UA】C# 通過OpcUaHelper建立OPC客戶端訪問KEPServerEx6 OPC服務(wù)器數(shù)據(jù)。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。

OpcUaHelper

一個(gè)通用的opc ua客戶端類庫,基于.net 4.6.1創(chuàng)建,基于官方opc ua基金會(huì)跨平臺(tái)庫創(chuàng)建,封裝了節(jié)點(diǎn)讀寫,批量節(jié)點(diǎn)讀寫,引用讀取,特性讀取,歷史數(shù)據(jù)讀取,方法調(diào)用,節(jié)點(diǎn)訂閱,批量訂閱等操作。還提供了一個(gè)節(jié)點(diǎn)瀏覽器工具。

KEPServerEX

第三方的OPC服務(wù)器,各不同廠家多種設(shè)備下位PLC與上位機(jī)之間通訊。KEPServerEX是行業(yè)領(lǐng)先的通信平臺(tái),用于向您的所有應(yīng)用程序提供單一來源的工業(yè)自動(dòng)化數(shù)據(jù)。該平臺(tái)的設(shè)計(jì)使用戶能夠通過一個(gè)直觀的用戶界面來連接、管理、監(jiān)視和控制不同的自動(dòng)化設(shè)備和軟件應(yīng)用程序。KEPServerEX 利用 OPC(自動(dòng)化行業(yè)的互操作性標(biāo)準(zhǔn))和以 IT 為中心的通信協(xié)議(如 SNMP、ODBC 和 Web 服務(wù))為用戶提供單一來源的工業(yè)數(shù)據(jù)。要開始使用,只需下載 KEPServerEX,然后從Kepware 的包含 150 多個(gè)設(shè)備驅(qū)動(dòng)程序、客戶端驅(qū)動(dòng)程序和高級(jí)選項(xiàng)的庫中進(jìn)行選擇,以滿足您獨(dú)特的工業(yè)控制系統(tǒng)需求。

以下基于開源的OpcUaHelper自帶的demo,修改了界面,測(cè)試了部分功能。

【OPC UA】C# 通過OpcUaHelper建立OPC客戶端訪問KEPServerEx6 OPC服務(wù)器數(shù)據(jù)

【OPC UA】C# 通過OpcUaHelper建立OPC客戶端訪問KEPServerEx6 OPC服務(wù)器數(shù)據(jù)主界面

C# 通過OPC UA 訪問KEPServerEx6 演示視頻

部分代碼:

//同步讀取
        private void button1_Click( object sender, EventArgs e )
        {
           
            if (cbo函數(shù)Nodeid.Text=="")
            {
                return;
            }
            DataValue dataValue = m_OpcUaClient.ReadNode( new NodeId(cbo函數(shù)Nodeid.Text ) );
            if (dataValue.WrappedValue.Value != null)
            {
                txtvalue.Text = dataValue.WrappedValue.Value.ToString();
            }
            //test();
        }
//單節(jié)點(diǎn)訂閱
        private void button2_Click( object sender, EventArgs e )
        {
            // sub
            m_OpcUaClient.AddSubscription( "A", textBox4.Text, SubCallback );
        }
        //取消訂閱 關(guān)鍵字A
        private void button3_Click( object sender, EventArgs e )
        {
            // remove sub
            m_OpcUaClient.RemoveSubscription( "A" );
        }
        //訂閱回調(diào)
        private void SubCallback(string key, MonitoredItem monitoredItem, MonitoredItemNotificationEventArgs args )
        {
            if (InvokeRequired)
            {
                Invoke( new Action<string, MonitoredItem, MonitoredItemNotificationEventArgs>( SubCallback ), key, monitoredItem, args );
                return;
            }


            if (key == "A")
            {
                // 如果有多個(gè)的訂閱值都關(guān)聯(lián)了當(dāng)前的方法,可以通過key和monitoredItem來區(qū)分
                MonitoredItemNotification notification = args.NotificationValue as MonitoredItemNotification;
                if (notification != null)
                {
                    textBox3.Text = notification.Value.WrappedValue.Value.ToString( );
                }
            }
            else if(key == "B")
            {
                // 需要區(qū)分出來每個(gè)不同的節(jié)點(diǎn)信息
                MonitoredItemNotification notification = args.NotificationValue as MonitoredItemNotification;
                if (monitoredItem.StartNodeId.ToString( ) == MonitorNodeTags[0])
                {
                    textBox5.Text = notification.Value.WrappedValue.Value.ToString( );
                }
                else if (monitoredItem.StartNodeId.ToString( ) == MonitorNodeTags[1])
                {
                    textBox9.Text = notification.Value.WrappedValue.Value.ToString( );
                }
                else if (monitoredItem.StartNodeId.ToString( ) == MonitorNodeTags[2])
                {
                    textBox10.Text = notification.Value.WrappedValue.Value.ToString( );
                }
            }
        }
// 緩存的批量訂閱的節(jié)點(diǎn)
        private string[] MonitorNodeTags = null;
        //多節(jié)點(diǎn)訂閱
        private void button5_Click( object sender, EventArgs e )
        {
            // 多個(gè)節(jié)點(diǎn)的訂閱
            MonitorNodeTags = new string[]
            {
                textBox6.Text,
                textBox7.Text,
                textBox8.Text,
            };
            m_OpcUaClient.AddSubscription( "B", MonitorNodeTags, SubCallback );
        }
        //取消訂閱    
        private void button4_Click( object sender, EventArgs e )
        {
            // 取消多個(gè)節(jié)點(diǎn)的訂閱
            m_OpcUaClient.RemoveSubscription( "B" );//關(guān)鍵字 B
        }
//異步讀取節(jié)點(diǎn)
        private async void buttonReadNodeAsync_Click(object sender, EventArgs e)
        {
            Opc.Ua.DataValue value = m_OpcUaClient.ReadNode(cboNodeid.Text);//SelectedItem.ToString()
            if (value.Value == null)
            {
                return;
            }
            // 一個(gè)數(shù)據(jù)的類型是不是數(shù)組由 value.WrappedValue.TypeInfo.ValueRank 來決定的
            // -1 說明是一個(gè)數(shù)值
            // 1  說明是一維數(shù)組,如果類型BuiltInType是Int32,那么實(shí)際是int[]
            // 2  說明是二維數(shù)組,如果類型BuiltInType是Int32,那么實(shí)際是int[,]
            if (value.WrappedValue.TypeInfo.BuiltInType == Opc.Ua.BuiltInType.Int32)
            {
                if (value.WrappedValue.TypeInfo.ValueRank == -1)
                {
                    int temp = (int)value.WrappedValue.Value;               // 最終值
                    txtvalue.Text = temp.ToString();
                }
                else if (value.WrappedValue.TypeInfo.ValueRank == 1)
                {
                    int[] temp = (int[])value.WrappedValue.Value;           // 最終值
                    txtvalue.Text = temp.ToString();
                }
                else if (value.WrappedValue.TypeInfo.ValueRank == 2)
                {
                    int[,] temp = (int[,])value.WrappedValue.Value;         // 最終值
                    txtvalue.Text = temp.ToString();
                }
            }
            else if (value.WrappedValue.TypeInfo.BuiltInType == Opc.Ua.BuiltInType.UInt32)
            {
                uint temp = (uint)value.WrappedValue.Value;                 // 數(shù)組的情況參照上面的例子
                txtvalue.Text = temp.ToString();
            }
            else if (value.WrappedValue.TypeInfo.BuiltInType == Opc.Ua.BuiltInType.Float)
            {
                float temp = (float)value.WrappedValue.Value;               // 數(shù)組的情況參照上面的例子
                txtvalue.Text = temp.ToString();
            }
            else if (value.WrappedValue.TypeInfo.BuiltInType == Opc.Ua.BuiltInType.String)
            {
                string temp = (string)value.WrappedValue.Value;             // 數(shù)組的情況參照上面的例子
                txtvalue.Text = temp.ToString();
            }
            else if (value.WrappedValue.TypeInfo.BuiltInType == Opc.Ua.BuiltInType.DateTime)
            {
                DateTime temp = (DateTime)value.WrappedValue.Value;         // 數(shù)組的情況參照上面的例子
                txtvalue.Text = temp.ToString();
            }
            else if (value.WrappedValue.TypeInfo.BuiltInType == Opc.Ua.BuiltInType.Int16)
            {
                short temp = (short)value.WrappedValue.Value;         // 數(shù)組的情況參照上面的例子
                txtvalue.Text = temp.ToString();
            }
            else if (value.WrappedValue.TypeInfo.BuiltInType == Opc.Ua.BuiltInType.Double)
            {
                double temp = (double)value.WrappedValue.Value;         // 數(shù)組的情況參照上面的例子
                txtvalue.Text = temp.ToString();
????????????}
????????}
//瀏覽節(jié)點(diǎn)引用
????????private?void?buttonBrowseNodeReference_Click(object?sender,?EventArgs?e)
        {
            richTextBox1.Clear();
            try
            {
                //ReferenceDescription[] references = m_OpcUaClient.BrowseNodeReference("ns=2;s=Devices.分廠一.車間二.ModbusTcp客戶端");
                ReferenceDescription[] references = m_OpcUaClient.BrowseNodeReference(comboBox1.SelectedItem.ToString());
                richTextBox1.AppendText(string.Format("{0,-30}", "NodeClass")+ string.Format("{0,-30}","BrowseName")+ string.Format("{0,-40}","DisplayName")+ string.Format("{0,-40}","NodeId")+"\r\n");
                foreach (var item in references)
                {
                    Console.Write(string.Format("{0,-30}", item.NodeClass));
                    Console.Write(string.Format("{0,-30}", item.BrowseName));
                    Console.Write(string.Format("{0,-20}", item.DisplayName));
                    Console.WriteLine(string.Format("{0,-20}", item.NodeId.ToString()));
                    /*  string s1 = "中文";
                    string s2 = "語言學(xué)English";
                    Console.WriteLine("{0}{1}", padRightEx(s1, 20), "hello");
                    Console.WriteLine("{0}{1}", padRightEx(s2, 20), "hello");*/
                    //richTextBox1.AppendText(string.Format("{0,-30}", item.NodeClass));
                    //richTextBox1.AppendText(string.Format("{0,-30}", item.BrowseName));
                    //richTextBox1.AppendText(string.Format("{0,-20}", item.DisplayName));
                    //richTextBox1.AppendText(string.Format("{0,-20}", item.NodeId.ToString()) + "\r\n");
                    richTextBox1.AppendText(string.Format("{0}{1}{2}{3}\r\n", padRightEx(item.NodeClass.ToString().Trim(), 30), padRightEx(item.BrowseName.ToString().TrimStart(), 40), padRightEx(item.DisplayName.ToString().TrimStart(), 40), padRightEx(item.NodeId.ToString().TrimStart(), 100)));
                }


                ;
                // 輸出如下
                //  NodeClass                     BrowseName                      DisplayName           NodeId


                //  Variable                      2:溫度                          溫度                  ns=2;s=Devices/分廠一/車間二/ModbusTcp客戶端/溫度
                //  Variable                      2:風(fēng)俗                          風(fēng)俗                  ns=2;s=Devices/分廠一/車間二/ModbusTcp客戶端/風(fēng)俗
                //  Variable                      2:轉(zhuǎn)速                          轉(zhuǎn)速                  ns=2;s=Devices/分廠一/車間二/ModbusTcp客戶端/轉(zhuǎn)速
                //  Variable                      2:機(jī)器人關(guān)節(jié)                    機(jī)器人關(guān)節(jié)            ns=2;s=Devices/分廠一/車間二/ModbusTcp客戶端/機(jī)器人關(guān)節(jié)
                //  Variable                      2:cvsdf                         cvsdf                 ns=2;s=Devices/分廠一/車間二/ModbusTcp客戶端/cvsdf
                //  Variable                      2:條碼                          條碼                  ns=2;s=Devices/分廠一/車間二/ModbusTcp客戶端/條碼
                //  Variable                      2:開關(guān)量                        開關(guān)量                ns=2;s=Devices/分廠一/車間二/ModbusTcp客戶端/開關(guān)量
            }
            catch (Exception ex)
            {
                ClientUtils.HandleException(this.Text, ex);
            }
        }
//啟用設(shè)備屬性-操作模式-模擬  可讀取節(jié)點(diǎn)屬性
        private void buttonReadNoteAttributes_Click(object sender, EventArgs e)
        {
            richTextBox1.Clear();
            try
            {
                //OpcNodeAttribute[] nodeAttributes = m_OpcUaClient.ReadNoteAttributes("ns=2;s=Devices.分廠一.車間二.ModbusTcp客戶端.溫度");
                OpcNodeAttribute[] nodeAttributes = m_OpcUaClient.ReadNoteAttributes(cboNodeid.Text);
                richTextBox1.AppendText(string.Format("{0,-30}", "Name") + string.Format("{0,-40}", "Type") + string.Format("{0,-40}", "StatusCode") + string.Format("{0,-40}", "Value") + "\r\n");
                foreach (var item in nodeAttributes)
                {
                    //Console.Write(string.Format("{0,-30}", item.Name));
                    //Console.Write(string.Format("{0,-20}", item.Type));
                    //Console.Write(string.Format("{0,-20}", item.StatusCode));
                    //Console.WriteLine(string.Format("{0,20}", item.Value));
                    richTextBox1.AppendText(string.Format("{0}{1}{2}{3}\r\n", padRightEx(item.Name.ToString().Trim(), 30), padRightEx(item.Type.ToString().Trim(), 40), padRightEx(item.StatusCode.ToString().Trim(), 40), padRightEx(item.Value.ToString().Trim(), 100)));


                }
//寫入操作
        private void buttonWrite_Click(object sender, EventArgs e)
        {
            try
            {
                // 此處演示寫入一個(gè)short,2個(gè)float類型的數(shù)據(jù)批量寫入操作。啟用設(shè)備模擬后寫入成功。但是很快就被模擬的0覆蓋
                bool success = m_OpcUaClient.WriteNodes(new string[] {
                    "ns=2;s=Devices.分廠一.車間二.ModbusTcp客戶端.溫度",
                    "ns=2;s=Devices.分廠一.車間二.ModbusTcp客戶端.風(fēng)俗",
                    "ns=2;s=Devices.分廠一.車間二.ModbusTcp客戶端.轉(zhuǎn)速"},
                    new object[] {
                        (short)1234,
                        123.456f,
                        123f
                    });
                //bool success = m_OpcUaClient.WriteNode("ns=2;s=Devices.分廠一.車間二.ModbusTcp客戶端.風(fēng)俗", 123.456f);
                if (success)
                {
                    MessageBox.Show("寫入成功!");
                }
                else
                {
                    // 寫入失敗,一個(gè)失敗即為失敗
                    MessageBox.Show("寫入失??!");
                }
            }
            catch (Exception ex)
            {
                ClientUtils.HandleException(this.Text, ex);
            }
        }

參考:?

https://github.com/dathlin/OpcUaHelper

https://opcfoundation.cn/about/opc-technologies/opc-ua/

https://blog.csdn.net/xiaochenXIHUA/article/details/117070003

https://www.cnblogs.com/bgh408/p/10887580.html

https://blog.csdn.net/Vampire_1122/article/details/119025477

https://cloud.tencent.com/developer/article/1899065

https://blog.csdn.net/han_better/article/details/83034023

https://www.douban.com/note/837168906/?_i=61791832R3OOz3

The End文章來源地址http://www.zghlxwxcb.cn/news/detail-410483.html

到了這里,關(guān)于【OPC UA】C# 通過OpcUaHelper建立OPC客戶端訪問KEPServerEx6 OPC服務(wù)器數(shù)據(jù)的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • SpringBoot集成Milo庫實(shí)現(xiàn)OPC UA客戶端:連接、遍歷節(jié)點(diǎn)、讀取、寫入、訂閱與批量訂閱

    SpringBoot集成Milo庫實(shí)現(xiàn)OPC UA客戶端:連接、遍歷節(jié)點(diǎn)、讀取、寫入、訂閱與批量訂閱

    前面我們搭建了一個(gè)本地的 PLC 仿真環(huán)境,并通過 KEPServerEX6 讀取 PLC 上的數(shù)據(jù),最后還使用 UAExpert 作為OPC客戶端完成從 KEPServerEX6 這個(gè)OPC服務(wù)器的數(shù)據(jù)讀取與訂閱功能。在這篇文章中,我們將通過 SpringBoot 集成 Milo 庫實(shí)現(xiàn)一個(gè) OPC UA 客戶端,包括連接、遍歷節(jié)點(diǎn)、讀取、寫入

    2024年02月09日
    瀏覽(29)
  • 【C#項(xiàng)目實(shí)戰(zhàn)】OPC_DA客戶端開發(fā)

    大家好,我是雷工。 之前練習(xí)過一個(gè)OPC客戶端的樣例,并總結(jié)了博文,記錄了C#開發(fā)OPC客戶端的一些知識(shí): C#學(xué)習(xí)記錄——【實(shí)例】C#實(shí)現(xiàn)OPC Client 最近看到一個(gè)不同的思路開發(fā)的OPC DA客戶端,開發(fā)并測(cè)試了下,下面將開發(fā)過程記錄如下。 開發(fā)OPC客戶端程序,其訪問接口方式

    2024年02月03日
    瀏覽(27)
  • OPC通信從入門到精通_2_OPC通信詳解和C#客戶端編程(OPC基礎(chǔ)概念;OPC通信仿真(KepServer作為OPC服務(wù)器;使用Modbus Slave和另外軟件仿真2個(gè)PLC設(shè)備);C#程序)

    OPC通信從入門到精通_2_OPC通信詳解和C#客戶端編程(OPC基礎(chǔ)概念;OPC通信仿真(KepServer作為OPC服務(wù)器;使用Modbus Slave和另外軟件仿真2個(gè)PLC設(shè)備);C#程序)

    OPC誕生緣由:OPC誕生之前,軟件工程師是不了解硬件和協(xié)議的 OPC解決的是軟件和硬件之間的問題,讓軟件工程師無需了解協(xié)議及底層硬件,例如串口協(xié)議等 OPC起到了橋梁的作用:軟件工程師對(duì)接OPC,OPC對(duì)接硬件 OPC是一種通訊方式,落到實(shí)處就是一個(gè)軟件,就需要開發(fā)相應(yīng)的

    2024年02月05日
    瀏覽(103)
  • C# 中,使用OpcUaHelper讀寫OPC服務(wù)器

    C# 中,使用OpcUaHelper讀寫OPC服務(wù)器

    nuget包 幫助類: Winform: KepServer 設(shè)置: 結(jié)果:

    2024年02月10日
    瀏覽(18)
  • QT-使用QTcpSocket建立TCP客戶端連接

    QT-使用QTcpSocket建立TCP客戶端連接

    使用QT的QTcpSocket建立TCP客戶端方式,十分的簡(jiǎn)單,上手也快,代碼量不多,并且還自動(dòng)支持重連接機(jī)制,也就是說如果你的服務(wù)端突然死機(jī)了,然后服務(wù)端又重啟,那么我們的客戶端這個(gè)時(shí)候是會(huì)自動(dòng)去再連接的,不需要你的程序再做重連接的機(jī)制,所以我們應(yīng)用起來是十分

    2024年02月14日
    瀏覽(22)
  • TCP/IP客戶端和服務(wù)器端建立通信過程

    TCP/IP客戶端和服務(wù)器端建立通信過程

    使用Qt提供的類進(jìn)行基于 TCP 的套接字通信需要用到兩個(gè)類: QTcpServer 類用于監(jiān)聽客戶端連接以及和客戶端建立連接,在使用之前先介紹一下這個(gè)類提供的一些常用API函數(shù): 構(gòu)造函數(shù) 給監(jiān)聽的套接字設(shè)置監(jiān)聽 listen() 函數(shù) 在代碼中 通過啟動(dòng)監(jiān)聽按鈕 設(shè)置監(jiān)聽 參數(shù): address :

    2024年02月07日
    瀏覽(23)
  • 【OPC UA】使用C#讀取OPC UA電液控?cái)?shù)據(jù)

    OPC UA與OPC DA協(xié)議常見于工業(yè)生產(chǎn)中使用,例如煤礦的綜采支架電液控系統(tǒng)。OPC UA 是OPC 的后繼標(biāo)準(zhǔn),只是后面增加了UA ,意指”統(tǒng)一架構(gòu)”(Unified Architecture).它的主要目的是擺脫windows! 實(shí)現(xiàn)與平臺(tái)無關(guān)的OPC.從OPC 演進(jìn)到OPC UA,它的目的并沒有改變,依然是為了實(shí)現(xiàn)分布式控制系統(tǒng)中

    2024年02月15日
    瀏覽(21)
  • AI對(duì)話交互場(chǎng)景使用WebSocket建立H5客戶端和服務(wù)端的信息實(shí)時(shí)雙向通信

    AI對(duì)話交互場(chǎng)景使用WebSocket建立H5客戶端和服務(wù)端的信息實(shí)時(shí)雙向通信

    WebSocket使得客戶端和服務(wù)器之間的數(shù)據(jù)交換變得更加簡(jiǎn)單,允許 服務(wù)端主動(dòng)向客戶端推送數(shù)據(jù) 。在WebSocket API中,瀏覽器和服務(wù)器只需要完成一次握手,兩者之間就可以創(chuàng)建持久性的連接,并進(jìn)行雙向數(shù)據(jù)傳輸。 初次接觸 WebSocket 的人,都會(huì)問同樣的問題:我們已經(jīng)有了 HT

    2024年02月03日
    瀏覽(24)
  • (學(xué)習(xí)筆記-TCP連接斷開)建立了連接,但是客戶端或服務(wù)端出現(xiàn)問題,會(huì)怎么樣?

    (學(xué)習(xí)筆記-TCP連接斷開)建立了連接,但是客戶端或服務(wù)端出現(xiàn)問題,會(huì)怎么樣?

    客戶端出現(xiàn)故障指的是客戶端的主機(jī)發(fā)生了宕機(jī)或者斷電的場(chǎng)景。發(fā)生這種情況的時(shí)候,如果服務(wù)端一直不會(huì)發(fā)送數(shù)據(jù)給客戶端,那么服務(wù)端是永遠(yuǎn)無法感知到客戶端宕機(jī)這件事的,也就是服務(wù)端的TCP連接將一直處于 ESTABLISH 狀態(tài),占用著資源。 為了避免這種情況,TCP有一個(gè)

    2024年02月16日
    瀏覽(27)
  • C# Socket編程(服務(wù)端、客戶端)

    1.最直白的Socket代碼 服務(wù)端 客戶端 2.封裝過有點(diǎn)繞的Socket代碼 服務(wù)端 客戶端 3.GitHub代碼 https://github.com/harrylsp/AndroidADBDriver

    2024年02月16日
    瀏覽(23)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包