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

C#上位機(jī)與西門子PLC數(shù)據(jù)交互

這篇具有很好參考價(jià)值的文章主要介紹了C#上位機(jī)與西門子PLC數(shù)據(jù)交互。希望對大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。

C#通過S7.NET庫實(shí)現(xiàn)與西門子PLC數(shù)據(jù)交互

.net與西門子plc通訊,西門子PLC,C#上位機(jī),c#,visualstudio
拉了換一個(gè)簡單的界面

PLC端設(shè)置

.net與西門子plc通訊,西門子PLC,C#上位機(jī),c#,visualstudio
我新建了一個(gè)DB數(shù)據(jù)塊【DB1】,右鍵【DB1】,點(diǎn)擊【屬性】項(xiàng),【優(yōu)化的塊訪問】默認(rèn)是勾選,要想顯示數(shù)據(jù)塊中地址偏移量,需要把【優(yōu)化的塊訪問】勾選取消

PLC與C#數(shù)據(jù)類型對應(yīng)

Bit  	=> 	bool
Byte 	=> 	byte
word 	=> 	ushort
DWord 	=> 	uint
Int 	=> 	short
DInt 	=> 	int
Real 	=> 	float
LReal 	=> 	double
String 	=> 	string

VS2019添加S7.NET庫引用

.net與西門子plc通訊,西門子PLC,C#上位機(jī),c#,visualstudio
1、右鍵項(xiàng)目名,選擇圖中【管理NuGet程序包】
.net與西門子plc通訊,西門子PLC,C#上位機(jī),c#,visualstudio2、在搜索框輸入【S7netplus】,我安裝的是第一個(gè)。
.net與西門子plc通訊,西門子PLC,C#上位機(jī),c#,visualstudio
3、安裝完成引用里面會(huì)自動(dòng)添加【S7.NET】引用,如上圖所示。

連接PLC

public void Open();

                this.myPlc.Open();
                if (this.myPlc.PlcObject.IsConnected)
                {
                    this.btnOpen.Enabled = false;
                    this.btnClose.Enabled = true;
                    this.tsslblIsConnected.BackColor = Color.Green;
                    this.tsslblIsConnected.Text = "PLC已連接";

                    this.tsslblIP.Text = this.myPlc.PlcObject.IP.ToString();

                    this.btnRead.Enabled = true;
                    this.btnWrite.Enabled = true;

                    switch (this.myPlc.PlcObject.CPU)
                    {
                        case CpuType.S7300:
                            this.tsslblCpuType.Text = "S7-300";
                            break;
                        case CpuType.S7400:
                            this.tsslblCpuType.Text = "S7-400";
                            break;
                        case CpuType.S71200:
                            this.tsslblCpuType.Text = "S7-1200";
                            break;
                        case CpuType.S71500:
                            this.tsslblCpuType.Text = "S7-1500";
                            break;
                    }
                }

對于S7-1200和S7-1500,默認(rèn)為機(jī)架= 0,槽位= 0;對于S7-300和S7-400是默認(rèn)的機(jī)架= 0,槽位= 2;端口號默認(rèn)為102。

斷開PLC

public void Close();

                this.myPlc.Close();
                if (!this.myPlc.PlcObject.IsConnected)
                {
                    this.btnOpen.Enabled = true;
                    this.btnClose.Enabled = false;
                    this.tsslblIsConnected.BackColor = Color.Red;
                    this.tsslblIsConnected.Text = "PLC未連接";

                    this.tsslblIP.Text = "***********";
                    this.tsslblCpuType.Text = "******";

                    this.btnRead.Enabled = false;
                    this.btnWrite.Enabled = false;
                }

讀取單個(gè)數(shù)據(jù)

public object? Read(string variable);

            if (this.tabControlRead.SelectedTab == this.tabControlRead.TabPages[0])  //讀取單個(gè)數(shù)據(jù)
            {
                try
                {
                    this.txtReadResult.Text = DateTime.Now.ToString() + ":" + this.myPlc.Read(this.txtReadSingleAdr.Text.Trim().ToUpper()).ToString();
                }
                catch (Exception ex)
                {
                    MessageBox.Show("讀取單個(gè)數(shù)據(jù)出現(xiàn)錯(cuò)誤!" + ex.Message, "提示信息");
                }
            }

我這里把輸入的地址的轉(zhuǎn)換為大寫字母;如果不轉(zhuǎn)換,輸入小寫字母會(huì)出現(xiàn)報(bào)錯(cuò)。

讀取數(shù)組數(shù)據(jù)

public object? Read(DataType dataType, int db, int startByteAdr, VarType varType, int varCount, byte bitAdr = 0);

switch (this.cboReadVarType.Text.Trim())
{
    case "Bit":
        foreach (var item in (System.Collections.BitArray)this.myPlc.Read(dataType, db, startByteAdr, VarType.Bit, varCount, bitAdr))
        {
            this.rtxtReadResult.Text += item.ToString() + " ";
        }
        break;
    case "Byte":
        foreach (var item in (byte[])this.myPlc.Read(dataType, db, startByteAdr, VarType.Byte, varCount, bitAdr))
        {
            this.rtxtReadResult.Text += item.ToString() + " ";
        }
        break;
    case "Word":
        foreach (var item in (ushort[])this.myPlc.Read(dataType, db, startByteAdr, VarType.Word, varCount, bitAdr))
        {
            this.rtxtReadResult.Text += item.ToString() + " ";
        }
        break;
    case "DWord":
        foreach (var item in (uint[])this.myPlc.Read(dataType, db, startByteAdr, VarType.DWord, varCount, bitAdr))
        {
            this.rtxtReadResult.Text += item.ToString() + " ";
        }
        break;
    case "Int":
        foreach (var item in (short[])this.myPlc.Read(dataType, db, startByteAdr, VarType.Int, varCount, bitAdr))
        {
            this.rtxtReadResult.Text += item.ToString() + " ";
        }
        break;
    case "DInt":
        foreach (var item in (int[])this.myPlc.Read(dataType, db, startByteAdr, VarType.DInt, varCount, bitAdr))
        {
            this.rtxtReadResult.Text += item.ToString() + " ";
        }
        break;
    case "Real":
        foreach (var item in (float[])this.myPlc.Read(dataType, db, startByteAdr, VarType.Real, varCount, bitAdr))
        {
            this.rtxtReadResult.Text += item.ToString() + " ";
        }
        break;
    case "LReal":
        foreach (var item in (double[])this.myPlc.Read(dataType, db, startByteAdr, VarType.LReal, varCount, bitAdr))
        {
            this.rtxtReadResult.Text += item.ToString() + " ";
        }
        break;
    case "String":
        foreach (var item in (string)this.myPlc.Read(dataType, db, startByteAdr, VarType.String, varCount, bitAdr))
        {
            this.rtxtReadResult.Text += item.ToString() + " ";
        }
        break;
    case "S7String":
        foreach (var item in (string[])this.myPlc.Read(dataType, db, startByteAdr, VarType.S7String, varCount, bitAdr))
        {
            this.rtxtReadResult.Text += item.ToString() + " ";
        }
        break;
    case "S7WString":
        foreach (var item in (string[])this.myPlc.Read(dataType, db, startByteAdr, VarType.S7WString, varCount, bitAdr))
        {
            this.rtxtReadResult.Text += item.ToString() + " ";
        }
        break;
    case "DateTime":
        foreach (var item in (DateTime[])this.myPlc.Read(dataType, db, startByteAdr, VarType.DateTime, varCount, bitAdr))
        {
            this.rtxtReadResult.Text += item.ToString() + " ";
        }
        break;
    case "DateTimeLong":
        foreach (var item in (DateTime[])this.myPlc.Read(dataType, db, startByteAdr, VarType.DateTimeLong, varCount, bitAdr))
        {
            this.rtxtReadResult.Text += item.ToString() + " ";
        }
        break;
}

讀取BIT數(shù)組時(shí)我這里使用【System.Collections.BitArray】強(qiáng)制轉(zhuǎn)換

讀取字節(jié)數(shù)組

public byte[] ReadBytes(DataType dataType, int db, int startByteAdr, int count);

var bytes = this.myPlc.PlcObject.ReadBytes(DataType.DataBlock, 1, 0, 120);
string str = string.Empty;

str  = "DB1.DBX0.0:\t" + Convert.ToBoolean(bytes[0].SelectBit(0)).ToString() + "\n";
str += "DB1.DBX0.1:\t" + Convert.ToBoolean(bytes[0].SelectBit(1)).ToString() + "\n";
str += "DB1.DBX0.2:\t" + Convert.ToBoolean(bytes[0].SelectBit(2)).ToString() + "\n";

str += "DB1.DBB1.0:\t" + Convert.ToString(S7.Net.Types.Byte.FromByteArray(bytes.Skip(1).Take(1).ToArray()), 16) + "\n";
str += "DB1.DBB2.0:\t" + Convert.ToString(S7.Net.Types.Byte.FromByteArray(bytes.Skip(2).Take(1).ToArray()), 16) + "\n";
str += "DB1.DBB3.0:\t" + Convert.ToString(S7.Net.Types.Byte.FromByteArray(bytes.Skip(3).Take(1).ToArray()), 16) + "\n";

str += "DB1.DBW4.0:\t" + Convert.ToInt16(S7.Net.Types.Int.FromByteArray(bytes.Skip(4).Take(2).ToArray())) + "\n";
str += "DB1.DBW6.0:\t" + Convert.ToInt16(S7.Net.Types.Int.FromByteArray(bytes.Skip(6).Take(2).ToArray())) + "\n";
str += "DB1.DBW8.0:\t" + Convert.ToInt16(S7.Net.Types.Int.FromByteArray(bytes.Skip(8).Take(2).ToArray())) + "\n";

str += "DB1.DBW10.0\t:" + Convert.ToUInt16(S7.Net.Types.Word.FromByteArray(bytes.Skip(10).Take(2).ToArray())) + "\n";
str += "DB1.DBW12.0\t:" + Convert.ToUInt16(S7.Net.Types.Word.FromByteArray(bytes.Skip(12).Take(2).ToArray())) + "\n";
str += "DB1.DBW14.0\t:" + Convert.ToUInt16(S7.Net.Types.Word.FromByteArray(bytes.Skip(14).Take(2).ToArray())) + "\n";

str += "DB1.DBW16.0:\t" + Convert.ToString(S7.Net.Types.Word.FromByteArray(bytes.Skip(16).Take(2).ToArray()), 16) + "\n";
str += "DB1.DBW18.0:\t" + Convert.ToString(S7.Net.Types.Word.FromByteArray(bytes.Skip(18).Take(2).ToArray()), 16) + "\n";
str += "DB1.DBW20.0:\t" + Convert.ToString(S7.Net.Types.Word.FromByteArray(bytes.Skip(20).Take(2).ToArray()), 16) + "\n";

str += "DB1.DBD22.0:\t" + Convert.ToString(S7.Net.Types.DWord.FromByteArray(bytes.Skip(22).Take(4).ToArray()), 16) + "\n";
str += "DB1.DBD26.0:\t" + Convert.ToString(S7.Net.Types.DWord.FromByteArray(bytes.Skip(26).Take(4).ToArray()), 16) + "\n";
str += "DB1.DBD30.0:\t" + Convert.ToString(S7.Net.Types.DWord.FromByteArray(bytes.Skip(30).Take(4).ToArray()), 16) + "\n";

str += "DB1.DBD34.0:\t" + Convert.ToInt32(S7.Net.Types.DInt.FromByteArray(bytes.Skip(34).Take(4).ToArray())) + "\n";
str += "DB1.DBD38.0:\t" + Convert.ToInt32(S7.Net.Types.DInt.FromByteArray(bytes.Skip(38).Take(4).ToArray())) + "\n";
str += "DB1.DBD42.0:\t" + Convert.ToInt32(S7.Net.Types.DInt.FromByteArray(bytes.Skip(42).Take(4).ToArray())) + "\n";

str += "DB1.DBD46.0:\t" + Convert.ToUInt32(S7.Net.Types.DWord.FromByteArray(bytes.Skip(46).Take(4).ToArray())) + "\n";
str += "DB1.DBD50.0:\t" + Convert.ToUInt32(S7.Net.Types.DWord.FromByteArray(bytes.Skip(50).Take(4).ToArray())) + "\n";
str += "DB1.DBD54.0:\t" + Convert.ToUInt32(S7.Net.Types.DWord.FromByteArray(bytes.Skip(54).Take(4).ToArray())) + "\n";

str += "DB1.DBD58.0:\t" + Convert.ToSingle(S7.Net.Types.Real.FromByteArray(bytes.Skip(58).Take(4).ToArray())) + "\n";
str += "DB1.DBD62.0:\t" + Convert.ToSingle(S7.Net.Types.Real.FromByteArray(bytes.Skip(62).Take(4).ToArray())) + "\n";
str += "DB1.DBD66.0:\t" + Convert.ToSingle(S7.Net.Types.Real.FromByteArray(bytes.Skip(66).Take(4).ToArray())) + "\n";

str += "DB1.DBD70.0:\t" + Convert.ToDouble(S7.Net.Types.LReal.FromByteArray(bytes.Skip(70).Take(8).ToArray())) + "\n";
str += "DB1.DBD78.0:\t" + Convert.ToDouble(S7.Net.Types.LReal.FromByteArray(bytes.Skip(78).Take(8).ToArray())) + "\n";
str += "DB1.DBD86.0:\t" + Convert.ToDouble(S7.Net.Types.LReal.FromByteArray(bytes.Skip(86).Take(8).ToArray())) + "\n";

str += "LocalTime:\t" + Convert.ToDateTime(S7.Net.Types.DateTimeLong.FromByteArray(bytes.Skip(96).Take(12).ToArray())) + "\n";
str += "SYSTime: \t\t" + Convert.ToDateTime(S7.Net.Types.DateTimeLong.FromByteArray(bytes.Skip(108).Take(12).ToArray())) + "\n";
str += "----------***********************-----------------\n";

我這里是讀取DB1數(shù)據(jù)塊的前120個(gè)字節(jié)的數(shù)據(jù),我這里使用了Skip()和Take()函數(shù),要使用這兩個(gè)函數(shù)需要添加
using System.Linq;文章來源地址http://www.zghlxwxcb.cn/news/detail-635689.html

修改單個(gè)數(shù)據(jù)

if (this.tabControlWrite.SelectedTab == this.tabControlWrite.TabPages[0])   //寫入單個(gè)數(shù)據(jù)
{
    try
    {
        switch (this.cboWriteVarType.Text.Trim())
        {
            case "Bit":
                this.myPlc.Write(this.txtWriteSingleAdr.Text.Trim(), Convert.ToBoolean(this.rtxtWriteData.Text.Trim()));
                break;
            case "Byte":
                this.myPlc.Write(this.txtWriteSingleAdr.Text.Trim(), Convert.ToByte(this.rtxtWriteData.Text.Trim()));
                break;
            case "Word":
            case "Int":
                this.myPlc.Write(this.txtWriteSingleAdr.Text.Trim(), Convert.ToInt16(this.rtxtWriteData.Text.Trim()));
                break;
            case "DWord":
            case "DInt":
                this.myPlc.Write(this.txtWriteSingleAdr.Text.Trim(), Convert.ToInt32(this.rtxtWriteData.Text.Trim()));
                break;
            case "Real":
                this.myPlc.Write(this.txtWriteSingleAdr.Text.Trim(), Convert.ToSingle(this.rtxtWriteData.Text.Trim()));
                break;
            case "LReal":
                this.myPlc.Write(this.txtWriteSingleAdr.Text.Trim(), Convert.ToDouble(this.rtxtWriteData.Text.Trim()));
                break;
            case "String":
            case "S7String":
            case "S7WString":
                this.myPlc.Write(this.txtWriteSingleAdr.Text.Trim(), this.rtxtWriteData.Text.Trim());
                break;
            case "Timer":
                break;
            case "Counter":
                break;
            case "DateTime":
            case "DateTimeLong":
                this.myPlc.Write(this.txtWriteSingleAdr.Text.Trim(), Convert.ToDateTime(this.rtxtWriteData.Text.Trim()));
                break;
        }
    }
    catch (Exception ex)
    {
        MessageBox.Show("寫入單個(gè)數(shù)據(jù)出現(xiàn)錯(cuò)誤!" + ex.Message, "提示信息");
    }

到了這里,關(guān)于C#上位機(jī)與西門子PLC數(shù)據(jù)交互的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

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

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

相關(guān)文章

  • C#與西門子PLC通訊——手搓S7通訊協(xié)議

    C#與西門子PLC通訊——手搓S7通訊協(xié)議

    本文將嘗試從源碼角度,使用Tcp/Ip的方式直接與西門子PLC進(jìn)行交互通訊。 往期博客參考 C#與西門子PLC通訊——新手快速入門 C#與西門子PLC通訊——熟手快速入門 建議先看一下這兩篇,了解預(yù)設(shè)背景。 知其然,知其所以然。 這篇文章,我們就嘗試重復(fù)造一個(gè)輪子。通過對通訊

    2024年02月04日
    瀏覽(28)
  • C#通過ModbusTcp協(xié)議讀寫西門子PLC中的浮點(diǎn)數(shù)

    C#通過ModbusTcp協(xié)議讀寫西門子PLC中的浮點(diǎn)數(shù)

    MODBUS/TCP是簡單的、中立廠商的用于管理和控制自動(dòng)化設(shè)備的MODBUS系列通訊協(xié)議的派生產(chǎn)品,顯而易見,它覆蓋了使用TCP/IP協(xié)議的“Intranet”和“Internet”環(huán)境中MODBUS報(bào)文的用途。協(xié)議的最通用用途是為諸如PLC,I/O模塊,以及連接其它簡單域總線或I/O模塊的網(wǎng)關(guān)服務(wù)的。 Modbus

    2024年02月09日
    瀏覽(58)
  • C#語言使用EasyModbus做客戶端和西門子1511PLC通信

    C#語言使用EasyModbus做客戶端和西門子1511PLC通信

    之前一直使用開源庫NModbus,它是一個(gè)非常優(yōu)秀的Modbus通信類庫,偶然機(jī)會(huì)下我發(fā)現(xiàn)了EasyModbus,發(fā)現(xiàn)EasyModbus的代碼非常精煉、間接,一兩行代碼就可以創(chuàng)建一個(gè)Modbus TCP Client。 EasyModbus官網(wǎng):http://easymodbustcp.net/en/ 在官網(wǎng)下載DLL文件,在項(xiàng)目中添加引用。 代碼如下(示例):

    2023年04月11日
    瀏覽(23)
  • C++上位軟件通過LibModbus開源庫和西門子S7-1200/S7-1500/S7-200 PLC進(jìn)行ModbusTcp 和ModbusRTU 通信

    C++上位軟件通過LibModbus開源庫和西門子S7-1200/S7-1500/S7-200 PLC進(jìn)行ModbusTcp 和ModbusRTU 通信

    ? ? ? ? 一直以來上位軟件比如C++等和西門子等其他品牌PLC之間的數(shù)據(jù)交換都是大家比較頭疼的問題,尤其是C++上位軟件程序員。傳統(tǒng)的方法一般有OPC、Socket 等,直到LibModbus 開源庫出現(xiàn)后這種途徑對程序袁來說又有了新的選擇。 ??????? ? 1?)使用簡單, 利用MUDBUS庫文件

    2024年02月03日
    瀏覽(45)
  • C#與西門子PLC1500的ModbusTcp服務(wù)器通信1--項(xiàng)目背景

    C#與西門子PLC1500的ModbusTcp服務(wù)器通信1--項(xiàng)目背景

    最近在一個(gè)120萬元的項(xiàng)目中,涉及到modbustcp通信,我作為軟件總工負(fù)責(zé)項(xiàng)目的通信程序開發(fā),modbus是一個(gè)在工業(yè)自動(dòng)化領(lǐng)域中的通信協(xié)議,可以是modbusrtu,modbusascii,modbustcp三個(gè)形式,具體來說是三個(gè)不同的數(shù)據(jù)包結(jié)構(gòu),具體的細(xì)節(jié)請讀者自行熟悉,這里只講項(xiàng)目中應(yīng)用過程

    2024年02月12日
    瀏覽(20)
  • 編寫C#程序?qū)崿F(xiàn)和西門子1500PLC進(jìn)行Modbus Tcp通訊仿真

    編寫C#程序?qū)崿F(xiàn)和西門子1500PLC進(jìn)行Modbus Tcp通訊仿真

    前言 本文章的主題是介紹Modbus Tcp通訊仿真,其中C#編寫的程序充當(dāng)客戶端(Client),西門子1500PLC充當(dāng)?shù)姆?wù)器端(Server),有關(guān)Modbus Tcp協(xié)議的具體內(nèi)容在此也不再贅述,大家可以自行閱讀官方文檔。 注:在實(shí)現(xiàn)其基本功能的條件下,本文的代碼編寫以及軟件配置均簡化。

    2024年02月11日
    瀏覽(84)
  • C#與西門子PLC1500的ModbusTcp服務(wù)器通信2--ModbusTcp協(xié)議

    C#與西門子PLC1500的ModbusTcp服務(wù)器通信2--ModbusTcp協(xié)議

    Modbus TCP是近年來越來越流行的工業(yè)控制系統(tǒng)通信協(xié)議之一,與其他通信協(xié)議相比,Modbus TCP通信速度快、可靠性高、兼容性強(qiáng)、適用于模擬或數(shù)字量信號的傳輸,閱讀本文前你必須比較熟悉Modbus協(xié)議,了解tcp網(wǎng)絡(luò)。 Modbus TCP是一種以太網(wǎng)協(xié)議,它將Modbus通信協(xié)議封裝在TCP/IP包內(nèi)

    2024年02月11日
    瀏覽(23)
  • C#與西門子PLC1500的ModbusTcp服務(wù)器通信3--搭建ModbusTcp服務(wù)器

    C#與西門子PLC1500的ModbusTcp服務(wù)器通信3--搭建ModbusTcp服務(wù)器

    ?注意,這個(gè)IP地址必須與西門子虛擬網(wǎng)卡的IP地址及虛擬機(jī)的網(wǎng)卡IP地址同一網(wǎng)段 ? ? ? ? ? 找到程序塊main,找到右邊的指令,找到通信,找到其它,拖到MB_SERVER到程序段1中 ? ?重點(diǎn)看mb_hold_reg和connect參數(shù),disconnet為false表示被動(dòng)連接,意思是說服務(wù)器等待客戶機(jī)來連接,而

    2024年02月11日
    瀏覽(31)
  • C#與西門子PLC1500的ModbusTcp服務(wù)器通信4--搭建ModbusTcp客戶端

    C#與西門子PLC1500的ModbusTcp服務(wù)器通信4--搭建ModbusTcp客戶端

    客戶端可以是一個(gè)程序或一個(gè)設(shè)備,這里我以C#WINFORM程序來實(shí)現(xiàn)客戶機(jī)與PLC的Modbustcp服務(wù)器通信,開發(fā)環(huán)境是VS2019,.NET Framework版本是4.7.2 ?創(chuàng)建類庫 ? 編寫C#各種類的轉(zhuǎn)換庫,該庫由我提供,不用操心,文章最后提供。 項(xiàng)目引入這個(gè)類庫? 找到項(xiàng)目,找到引用,右鍵“管理

    2024年02月11日
    瀏覽(22)
  • 西門子plc使用MQTT把數(shù)據(jù)上傳騰訊云端

    西門子plc使用MQTT把數(shù)據(jù)上傳騰訊云端

    使用1500系列的plc仿真接入騰訊云,實(shí)現(xiàn)可以上傳數(shù)據(jù)和下放數(shù)據(jù),可實(shí)現(xiàn)報(bào)警微信推送功能,作為筆記在此儲存。 1.博圖v16 2.S7-PLCSIM Advanced V4.0 3.西門子官方實(shí)例庫 西門子官方實(shí)例庫 https://support.industry.siemens.com/cs/document/109748872/use-the-simatic-controller-as-an-mqtt-client?dti=0lc=en-US 注

    2023年04月11日
    瀏覽(23)

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

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

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

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包