0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

教程-西门子S7协议转换为HTTP协议

IOTRouter 来源:IOTRouter 作者:IOTRouter 2024-10-12 16:18 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

需求概述

本章要实现一个流程:EG8200采集西门子S7-200Smart的数据,并组装成JSON格式通过HTTP上报应用平台。

源-(S7转Modbus-https://www.iotrouter.com/news/2150.html)

要采集的PLC点位表如下:

PLC S7-200 Smart
IP 192.168.0.34/102
点表(DB1)
地址 数据类型 属性 名称
V0.0 Boolean 只读 风机1接触器异常
V0.6 Boolean 只读 风机2接触器异常
V1.6 Boolean 只读 风机3接触器异常
V2.5 Boolean 只读 变频器通讯故障
I0.0 Boolean 只读 电机高温报警
I0.1 Boolean 只读 温度状态异常
VD4 Float 只读 油压工程值
VD8 Float 只读 吸入压力工程值
VD12 Float 只读 燃油油位工程值
VD16 Float 只读 机柜温度值
VD20 Float 只读 发动机电压值
VD24 Float 只读 发动机电流值
VD28 Float 只读 发动机工作时间
VD32 Float 只读 泵压工程值
VW120 Unsigned16 只读 本机编号
VW750 Unsigned16 只读 本机组号
VW2402 Unsigned16 只读 电机1温度
VW2404 Unsigned16 只读 电机2温度
VW2406 Unsigned16 只读 电机3温度
VW2408 Unsigned16 只读 风机1温度
VW2410 Unsigned16 只读 风机2温度
VW2412 Unsigned16 只读 风机3温度

HTTP通信相关参数格式如下:

##数据推送
url:192.168.0.32:1880/api/device/reportData
method:POST

JSON格式:
{
  "deviceInfo": {
    "machineNumber": 9301,
    "machineGroupNumber": 1
  },
  "status": {
    "fan1ContactError": true,
    "fan2ContactError": false,
    "fan3ContactError": false,
    "inverterCommError": false,
    "motorHighTempAlarm": false,
    "temperatureStatusError": false
  },
  "data": {
    "oilPressure": 17.83,
    "suctionPressure": 3.7,
    "fuelLevel": 0.23,
    "cabinetTemperature": 237.2,
    "engineVoltage": 415.64,
    "engineCurrent": 65.1,
    "engineRuntime": 72.6,
    "pumpPressure": 85.3,
    "motor1Temperature": 20,
    "motor2Temperature": 19,
    "motor3Temperature": 19,
    "fan1Temperature": 21,
    "fan2Temperature": 33,
    "fan3Temperature": 26
  },
  "timestamp": "2022-7-08 11:28:55"
}

需求分析

在制作流程时,基础的逻辑是根据数据走向来制作流程。其中主要工作分为三步:

第一步:通过S7协议读取PLC变量数据,得到的数据存储在内存中(西门子节点)

第二步:将数据按照JSON格式进行格式化(函数节点)

第三步:配置HTTP 请求参数

wKgZoWcKMT2AIXGSAAAUBcZlQlY587.png

需求实现

1. 采集PLC数据

从节点库拖入一个西门子节点,以及一个调试节点,调试节点用于查看读取到的PLC数据集,方便定位问

wKgZombDBMSAXaAwAAzV2crvgmE057.png

双击西门子节点,根据需求概述的内容填写对应的设置参数,如下图所示:

IP:PLC的IP
端口:102(S7协议通信默认端口102)
采集周期:1000ms(默认2000ms,可自定义)
超时周期:2000ms(默认2000ms,可自定义)

数据点配置(根据帮助文档可以找到对应关系)
V0.0
V0.6
V1.6
V2.5
I0.0
I0.1
VD4
VD8
VD12
VD16
VD20
VD24
VD28
VD32
VW120
VW750
VW2402
VW2404
VW2408
VW2410
VW2412

如果是连续地址,可配置起始地址并填写读取长度即可

如果设置正确,调试窗口会有日志打印,显示的是读取到的数据内容:

wKgaombDBV6AGjboAAz30bMjHmA001.png

有的时候PLC数据点比较多,手动依次录入比较繁琐。节点支持数据点的导入导出或者参数传递的方式来读取:

wKgZoWcKMZWAemq1ABG6MpMXYKA822.png

本例程用到的传参方案,函数节点内的代码如下:

msg.payload = [
    { func: "ReadBoolArray", body: { name: "", address: "V0", length: 8 } },
    { func: "ReadBoolArray", body: { name: "", address: "V1", length: 8 } },
    { func: "ReadBoolArray", body: { name: "", address: "V2", length: 8 } },
    { func: "ReadFloatArray", body: { name: "", address: "VD4", length: 8 } },
    { func: "ReadUInt16", body: { name: "", address: "VW120" } },
    { func: "ReadUInt16", body: { name: "", address: "VW750" } },
    { func: "ReadUInt16Array", body: { name: "", address: "VW2402", length: 6 } },
    { func: "ReadBoolArray", body: { name: "", address: "I0", length: 8 } }
]
return msg;

2. 数据格式化

根据步骤引导,在调试窗口可以看到读到的PLC数据如下:

wKgZoWcKMbSABcQeAAGpKSe5_oI754.png

因为应用平台已经规定了数据必须按照JSON格式上报。接下来使用函数节点Javascrip代码将数据进行格式化,代码如下:

class DeviceReport {
    constructor(machineNumber, machineGroupNumber) {
        this.deviceInfo = {
            machineNumber: machineNumber,
            machineGroupNumber: machineGroupNumber
        };
        this.status = {
            fan1ContactError: 0,
            fan2ContactError: 0,
            fan3ContactError: 0,
            inverterCommError: 0,
            motorHighTempAlarm: 0,
            temperatureStatusError: 0
        };
        this.data = {
            oilPressure: 0,
            suctionPressure: 0,
            fuelLevel: 0,
            cabinetTemperature: 0,
            engineVoltage: 0,
            engineCurrent: 0,
            engineRuntime: 0,
            pumpPressure: 0,
            motor1Temperature: 0,
            motor2Temperature: 0,
            motor3Temperature: 0,
            fan1Temperature: 0,
            fan2Temperature: 0,
            fan3Temperature: 0
        };
        this.timestamp = null;
    }

    // 设置状态数据(1表示异常,0表示正常)
    setStatusData(statusData) {
        this.status = statusData;
    }

    // 设置传感器数据
    setSensorData(sensorData) {
        this.data = sensorData;
    }

    // 设置时间戳
    setTimestamp(timestamp) {
        this.timestamp = timestamp;
    }
    generateReport() {
        return {
            deviceInfo: this.deviceInfo,
            status: this.status,
            data: this.data,
            timestamp: this.timestamp
        };
    }
}

function dateFormat(fmt, timestamp) {
    let ret;
    const opt = {
        "Y+": timestamp.getFullYear().toString(), // 年
        "m+": (timestamp.getMonth() + 1).toString(),  // 月
        "d+": timestamp.getDate().toString(), // 日
        "H+": timestamp.getHours().toString(), // 时
        "M+": timestamp.getMinutes().toString(), // 分
        "S+": timestamp.getSeconds().toString() // 秒
    };
    for (let k in opt) {
        ret = new RegExp("(" + k + ")").exec(fmt);
        if (ret) {
            fmt = fmt.replace(ret[1], (ret[1].length == 1) ? (opt[k]) : (opt[k].padStart(ret[1].length, "0")))
        };
    };
    return fmt;
}
function setValue(data) {
    var myDeviceReport = new DeviceReport(data.VW120, data.VW750)
    var v0 = data.V0
    var v1 = data.V1
    var v2 = data.V2
    var i0 = data.I0
    var vd4 = data.VD4
    var vd2402 = data.VW2402
    const fmt = dateFormat("YYYY-mm-dd HH:MM:SS", new Date())
    try {
        // 设置状态数据
        const statusData = {
            fan1ContactError: v0[0],
            fan2ContactError: v0[6],
            fan3ContactError: v1[6],
            inverterCommError: v2[5],
            motorHighTempAlarm: i0[0],
            temperatureStatusError: i0[1]
        }
        myDeviceReport.setStatusData(statusData)

        // 设置传感器数据
        const sensorData = {
            oilPressure: vd4[0],
            suctionPressure: vd4[1],
            fuelLevel: vd4[2],
            cabinetTemperature: vd4[3],
            engineVoltage: vd4[4],
            engineCurrent: vd4[5],
            engineRuntime: vd4[6],
            pumpPressure: vd4[7],
            motor1Temperature: vd2402[0],
            motor2Temperature: vd2402[1],
            motor3Temperature: vd2402[2],
            fan1Temperature: vd2402[3],
            fan2Temperature: vd2402[4],
            fan3Temperature: vd2402[5]
        }
        myDeviceReport.setSensorData(sensorData)
        // 设置时间戳
        myDeviceReport.setTimestamp(fmt)
        //生成JSON对象返回
        return myDeviceReport.generateReport()
    } catch (err) {
        node.error(err.message);
        return null
    }

}
var plcData = msg.payload
if (setValue(plcData)){
    msg.payload = JSON.stringify(setValue(plcData),null,2)
    return msg
}

复制以上代码,粘贴到函数节点内,部署后即可看到效果:

wKgaoWcKMciAHmhAABAECOnz8Go273.png

可以看到,已经将读到的PLC数据,按照需求要求转换成了最终的JSON格式,且对数据进行了一定程度的计算(两位小数)。此处只是函数节点的冰山一角,因为支持Javascrip语言编程,几乎你能想到的任何功能都可以在这里实现。

3. 通过http周期上报

拖入一个HTTP节点,根据提示进行配置地址和请求方式,即可实现数据上报:

wKgaoWcKMdOAaHycAA5n4n7XdF0777.png

服务端返回成功,至此,数据上报已经完成,很简单几步即可实现:采集PLC数据并按照自定义JSON格式上报。

源码

所有的流程支持以json格式导入导出,方便与其他人分享做好的流程。本章节的流程json文件如下,复制后在菜单栏右上角选择导入粘贴即可,导出同理

[{"id":"edf0c4c538469caa","type":"Siemens","z":"5bb1b94e3403e2f2","name":"","protocol":"iplink_SiemensS7","IPAddress":"192.168.0.34","DestPort":"102","IPLinkTimeout":"2000","IPCommTimeout":"2000","Spname":"COM10","Baudrate":"9600","Databits":"8","Stopbit":"1","Paritybit":"0","RTSEnable":false,"SpLinktimeout":"2000","SpIntertimeout":"-1","workMode":"read","readMode":"trigger","readCyc":"1000","vartable":[],"SiemensS7Model":"5","SiemensS7ConnectionType":"1","SiemensS7Rack":"0","SiemensS7Slot":"0","SiemensS7LocalTSAP":"102","SiemensS7DestTSAP":"4D57","SiemensPPIStation":"2","stringvar":[],"customName":"Siemens:S7-S200Smart","x":510,"y":1080,"wires":[["be890e0383a04306"]]},{"id":"90be80aa485c48ae","type":"debug","z":"5bb1b94e3403e2f2","name":"调试 22","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"false","statusVal":"","statusType":"auto","x":1020,"y":1080,"wires":[]},{"id":"2485d94e74e61614","type":"function","z":"5bb1b94e3403e2f2","name":"函数计算 18","func":"msg.payload = [n    { func: "ReadBoolArray", body: { name: "", address: "V0", length: 8 } },n    { func: "ReadBoolArray", body: { name: "", address: "V1", length: 8 } },n    { func: "ReadBoolArray", body: { name: "", address: "V2", length: 8 } },n    { func: "ReadFloatArray", body: { name: "", address: "VD4", length: 8 } },n    { func: "ReadUInt16", body: { name: "", address: "VW120" } },n    { func: "ReadUInt16", body: { name: "", address: "VW750" } },n    { func: "ReadUInt16Array", body: { name: "", address: "VW2402", length: 6 } },n    { func: "ReadBoolArray", body: { name: "", address: "I0", length: 8 } }n]nreturn msg;","outputs":1,"noerr":0,"initialize":"","finalize":"","libs":[],"x":310,"y":1080,"wires":[["edf0c4c538469caa"]]},{"id":"8db3c718ecac3ed7","type":"inject","z":"5bb1b94e3403e2f2","name":"","props":[{"p":"payload"},{"p":"topic","vt":"str"}],"repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"","payload":"","payloadType":"date","x":150,"y":1080,"wires":[["2485d94e74e61614"]]},{"id":"be890e0383a04306","type":"function","z":"5bb1b94e3403e2f2","name":"函数计算 19","func":"class DeviceReport {n    constructor(machineNumber, machineGroupNumber) {n        this.deviceInfo = {n            machineNumber: machineNumber,n            machineGroupNumber: machineGroupNumbern        };n        this.status = {n            fan1ContactError: 0,n            fan2ContactError: 0,n            fan3ContactError: 0,n            inverterCommError: 0,n            motorHighTempAlarm: 0,n            temperatureStatusError: 0n        };n        this.data = {n            oilPressure: 0,n            suctionPressure: 0,n            fuelLevel: 0,n            cabinetTemperature: 0,n            engineVoltage: 0,n            engineCurrent: 0,n            engineRuntime: 0,n            pumpPressure: 0,n            motor1Temperature: 0,n            motor2Temperature: 0,n            motor3Temperature: 0,n            fan1Temperature: 0,n            fan2Temperature: 0,n            fan3Temperature: 0n        };n        this.timestamp = null;n    }nn    // 设置状态数据(1表示异常,0表示正常)n    setStatusData(statusData) {n        this.status = statusData;n    }nn    // 设置传感器数据n    setSensorData(sensorData) {n        this.data = sensorData;n    }nn    // 设置时间戳n    setTimestamp(timestamp) {n        this.timestamp = timestamp;n    }n    generateReport() {n        return {n            deviceInfo: this.deviceInfo,n            status: this.status,n            data: this.data,n            timestamp: this.timestampn        };n    }n}nnfunction dateFormat(fmt, timestamp) {n    let ret;n    const opt = {n        "Y+": timestamp.getFullYear().toString(), // 年n        "m+": (timestamp.getMonth() + 1).toString(),  // 月n        "d+": timestamp.getDate().toString(), // 日n        "H+": timestamp.getHours().toString(), // 时n        "M+": timestamp.getMinutes().toString(), // 分n        "S+": timestamp.getSeconds().toString() // 秒n    };n    for (let k in opt) {n        ret = new RegExp("(" + k + ")").exec(fmt);n        if (ret) {n            fmt = fmt.replace(ret[1], (ret[1].length == 1) ? (opt[k]) : (opt[k].padStart(ret[1].length, "0")))n        };n    };n    return fmt;n}nfunction setValue(data) {n    var myDeviceReport = new DeviceReport(data.VW120, data.VW750)n    var v0 = data.V0n    var v1 = data.V1n    var v2 = data.V2n    var i0 = data.I0n    var vd4 = data.VD4n    var vd2402 = data.VW2402n    const fmt = dateFormat("YYYY-mm-dd HH:MM:SS", new Date())n    try {n        // 设置状态数据n        const statusData = {n            fan1ContactError: v0[0],n            fan2ContactError: v0[6],n            fan3ContactError: v1[6],n            inverterCommError: v2[5],n            motorHighTempAlarm: i0[0],n            temperatureStatusError: i0[1]n        }n        myDeviceReport.setStatusData(statusData)nn        // 设置传感器数据n        const sensorData = {n            oilPressure: vd4[0],n            suctionPressure: vd4[1],n            fuelLevel: vd4[2],n            cabinetTemperature: vd4[3],n            engineVoltage: vd4[4],n            engineCurrent: vd4[5],n            engineRuntime: vd4[6],n            pumpPressure: vd4[7],n            motor1Temperature: vd2402[0],n            motor2Temperature: vd2402[1],n            motor3Temperature: vd2402[2],n            fan1Temperature: vd2402[3],n            fan2Temperature: vd2402[4],n            fan3Temperature: vd2402[5]n        }n        myDeviceReport.setSensorData(sensorData)n        // 设置时间戳n        myDeviceReport.setTimestamp(fmt)n        //生成JSON对象返回n        return myDeviceReport.generateReport()n    } catch (err) {n        node.error(err.message);n        return nulln    }nn}nvar plcData = msg.payloadnif (setValue(plcData)) {n    msg.payload = JSON.stringify(setValue(plcData), null, 2)n    return msgn}n","outputs":1,"noerr":0,"initialize":"","finalize":"","libs":[],"x":710,"y":1080,"wires":[["d140dc012c0cd68f"]]},{"id":"d140dc012c0cd68f","type":"http request","z":"5bb1b94e3403e2f2","name":"","method":"POST","ret":"txt","paytoqs":"ignore","url":"192.168.0.32:1880/api/device/reportData","tls":"","persist":false,"proxy":"","insecureHTTPParser":false,"authType":"","senderr":false,"headers":[],"x":860,"y":1080,"wires":[["90be80aa485c48ae"]]}]


审核编辑 黄宇

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 西门子
    +关注

    关注

    98

    文章

    3371

    浏览量

    120691
  • HTTP
    +关注

    关注

    0

    文章

    538

    浏览量

    35552
  • 边缘计算
    +关注

    关注

    22

    文章

    3559

    浏览量

    53681
收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    基于以太网协议转换S7-200多设备并行通讯系统搭建指南

    ,广泛应用于医药车间配料、搅拌工序,但该型号仅配备MPI 9针DP口,无以太网接口,采用西门子专有MPI串口协议S7-1200 PLC标配Profinet以太网接口,采用TCP/IP协议
    的头像 发表于 04-18 09:18 1998次阅读
    基于以太网<b class='flag-5'>协议</b><b class='flag-5'>转换</b>的<b class='flag-5'>S7</b>-200多设备并行通讯系统搭建指南

    西门子S7-200PLC借助于以太网转换模块同时与S7-1200PLC和西门子触摸屏通讯案例

    高,广泛应用于光伏组件串焊、层压工序,但其仅配备PPI 9针DP口,无以太网接口,采用西门子专有PPI串口协议S7-1200 PLC标配Profinet以太网接口,采用TCP/IP协议
    的头像 发表于 03-23 14:26 702次阅读
    <b class='flag-5'>西门子</b><b class='flag-5'>S7</b>-200PLC借助于以太网<b class='flag-5'>转换</b>模块同时与<b class='flag-5'>S7</b>-1200PLC和<b class='flag-5'>西门子</b>触摸屏通讯案例

    工业智能网关落地西门子S7-1200与欧姆龙FINS伺服通讯案例

    一、项目背景与通讯痛点 某新能源电机制造企业的定子装配产线,以支持S7协议西门子S7-1200PLC作为主控核心,负责定子上料、压装、检测全流程自动化控制;核心的定子绕线工序配备4台支
    的头像 发表于 03-09 10:27 402次阅读

    协议转换网关:3C电子产线西门子与欧姆龙PLC通讯方案

    一、项目背景与通讯痛点 某3C电子企业对手机主板组装产线进行自动化升级,产线主控采用支持 S7协议西门子S7-1500PLC ,负责产线整体节拍调控、工位联动及成品全检;贴片、点胶等
    的头像 发表于 03-07 14:01 595次阅读
    <b class='flag-5'>协议</b><b class='flag-5'>转换</b>网关:3C电子产线<b class='flag-5'>西门子</b>与欧姆龙PLC通讯方案

    西门子S7-1200/1500 PLC数据采集上云实战指南

    一、背景与挑战:S7协议解析与数据采集难点 西门子S7 Communication协议作为其私有通信协议
    的头像 发表于 02-28 16:42 670次阅读

    钡铼技术BL118 Node-Red边缘计算网关西门子PLC S7协议使用方法

    一、概述 node-red-contrib-s7用于与 Siemens S7 PLC 交互的 Node-RED 节点。S7读数据 S7写数据 S7
    的头像 发表于 12-03 16:48 1128次阅读
    钡铼技术BL118 Node-Red边缘计算网关<b class='flag-5'>西门子</b>PLC <b class='flag-5'>S7</b><b class='flag-5'>协议</b>使用方法

    风电场智能化管控:EtherCAT转ProfiNet协议助力贝加莱X20CP3586与西门子S7-1500协同

    某大型能源企业旗下现代化风电场,以贝加莱 X20CP3586 控制器(EtherCAT 主站)控制风机,西门子 S7-1500 系列 PLC(ProfiNet 主站)构建中央监控系统,塔讯 TX 161-RE-ECS/PNS 协议
    的头像 发表于 09-12 14:09 569次阅读
    风电场智能化管控:EtherCAT转ProfiNet<b class='flag-5'>协议</b>助力贝加莱X20CP3586与<b class='flag-5'>西门子</b><b class='flag-5'>S7</b>-1500协同

    承担CANOPEN转PROFINET协议转换功能的网关与台达伺服器的连接

    西门子S7 - 1200系列PLC可编程逻辑控制器(PLC),需与具备CANOPEN通讯功能的伺服驱动器设备进行连接。西门子的PLC采用PROFINET实时以太网通讯协议,若要连接CA
    的头像 发表于 07-24 18:01 640次阅读
    承担CANOPEN转PROFINET<b class='flag-5'>协议</b><b class='flag-5'>转换</b>功能的网关与台达伺服器的连接

    Profibus DP转DeviceNet实现西门子S7–300与罗克韦尔PLC在汽车制造车间的跨协议协同控制案例

    汽车制造是一个高度自动化且设备众多的行业,不同设备常采用不同通信协议。在某汽车装配车间,生产线的部分设备由西门子 S7 - 300 系列 PLC 通过 Profibus DP 主站进行控制,如自动化
    的头像 发表于 07-23 21:48 592次阅读
    Profibus DP转DeviceNet实现<b class='flag-5'>西门子</b><b class='flag-5'>S7</b>–300与罗克韦尔PLC在汽车制造车间的跨<b class='flag-5'>协议</b>协同控制案例

    ProfibusDP转DeviceNet施耐德PLC联合西门子S7–1200提升物流仓储货物分拣效率技术案例

    DeviceNet转 ProfibusDP网关在物流仓储中心的自动化程度不断提升,众多设备协同作业。某大型物流仓库,其货物分拣区由西门子 S7 - 1200 系列 PLC 通过 Profibus
    的头像 发表于 07-23 21:45 701次阅读
    ProfibusDP转DeviceNet施耐德PLC联合<b class='flag-5'>西门子</b><b class='flag-5'>S7</b>–1200提升物流仓储货物分拣效率技术案例

    西门子PLC(S7-1200/1500/300/400)的数据采集与监控方案

    西门子PLC S7-1200、S7-1500、S7-300/400型号设备,常用协议:PPI(Process Communication I
    的头像 发表于 07-04 10:13 1743次阅读

    CANopen转PROFINET网关:西门子S7-1200 PLC与欧姆龙NJ系列PLC通信方案

    进行通信,而另一部分则依赖 CANopen协议 。为实现不同协议设备之间的无缝通信与协同工作,引入高效可靠的 协议转换网关 成为当务之急。 二、设备选型 1. ROFINET
    的头像 发表于 06-12 15:25 818次阅读
    CANopen转PROFINET网关:<b class='flag-5'>西门子</b><b class='flag-5'>S7</b>-1200 PLC与欧姆龙NJ系列PLC通信方案

    如何破解三菱PLC与西门子PLC的通讯难题

    在工业自动化领域,不同品牌PLC之间的通讯一直是工程师们关注的焦点。三菱PLC与西门子PLC作为市场主流设备,常因协议差异导致数据交互困难。当现场需要将三菱FX系列PLC通过485接口与西门子
    的头像 发表于 06-09 17:14 1541次阅读
    如何破解三菱PLC与<b class='flag-5'>西门子</b>PLC的通讯难题

    工业智能网关可以采集西门子PLC吗

    、台达等。 具体而言,工业智能网关采集西门子PLC数据的过程如下: 连接方式:通过串口或网口将工业智能网关与西门子PLC连接,并确保两者处于同一网段内。 协议支持:物通博联工业智能网关支持多种通信
    的头像 发表于 05-26 09:14 1939次阅读

    西门子S7 PLC通过深控技术无点表工业网关实现数据采集与智能决策方案

    深控技术“不需要点表的工业数采网关”针对西门子S7系列PLC(包括S7-300、S7-400、S7-1200、
    的头像 发表于 05-23 10:44 967次阅读